ui: Run ./ui/eslint-all --fix

Pure application of:
$ ./ui/eslint-all --fix
$ git cl format --js

Should be a noop assuming no bugs in --fix.

Change-Id: Iabd070ecb9381c9ee5db5aa44964b89a11a297f1
diff --git a/ui/src/base/http_utils.ts b/ui/src/base/http_utils.ts
index 8e54718..d036751 100644
--- a/ui/src/base/http_utils.ts
+++ b/ui/src/base/http_utils.ts
@@ -20,8 +20,8 @@
             new Error(`fetch(${input}) timed out after ${timeoutMs} ms`)),
         timeoutMs);
     fetch(input, init)
-        .then(response => resolve(response))
-        .catch(err => reject(err))
+        .then((response) => resolve(response))
+        .catch((err) => reject(err))
         .finally(() => clearTimeout(timer));
   });
 }
diff --git a/ui/src/base/string_utils.ts b/ui/src/base/string_utils.ts
index 0a70791..5a3fb18 100644
--- a/ui/src/base/string_utils.ts
+++ b/ui/src/base/string_utils.ts
@@ -15,12 +15,12 @@
 import {
   decode as b64Decode,
   encode as b64Encode,
-  length as b64Len
+  length as b64Len,
 } from '@protobufjs/base64';
 import {
   length as utf8Len,
   read as utf8Read,
-  write as utf8Write
+  write as utf8Write,
 } from '@protobufjs/utf8';
 
 import {assertTrue} from './logging';
@@ -46,7 +46,7 @@
       const written = utf8Write(str, arr, 0);
       assertTrue(written === arr.length);
       return arr;
-    }
+    },
   };
 }
 
diff --git a/ui/src/base/string_utils_unittest.ts b/ui/src/base/string_utils_unittest.ts
index 4265a62..b3b3c09 100644
--- a/ui/src/base/string_utils_unittest.ts
+++ b/ui/src/base/string_utils_unittest.ts
@@ -23,7 +23,7 @@
 } from './string_utils';
 
 test('string_utils.stringToBase64', () => {
-  const bytes = [...'Hello, world'].map(c => c.charCodeAt(0));
+  const bytes = [...'Hello, world'].map((c) => c.charCodeAt(0));
   const buffer = new Uint8Array(bytes);
   const b64Encoded = base64Encode(buffer);
   expect(b64Encoded).toEqual('SGVsbG8sIHdvcmxk');
@@ -57,7 +57,7 @@
     114,
     108,
     100,
-    33
+    33,
   ]));
   expect(utf8Decode(buffer)).toEqual(testString);
 });
diff --git a/ui/src/base/utils/index-browser.js b/ui/src/base/utils/index-browser.js
index 491c8f2..ff47055 100644
--- a/ui/src/base/utils/index-browser.js
+++ b/ui/src/base/utils/index-browser.js
@@ -13,4 +13,4 @@
 // limitations under the License.
 
 export const _TextDecoder = TextDecoder;
-export const _TextEncoder = TextEncoder;
\ No newline at end of file
+export const _TextEncoder = TextEncoder;
diff --git a/ui/src/chrome_extension/chrome_tracing_controller.ts b/ui/src/chrome_extension/chrome_tracing_controller.ts
index 412ef0c..8dd364e 100644
--- a/ui/src/chrome_extension/chrome_tracing_controller.ts
+++ b/ui/src/chrome_extension/chrome_tracing_controller.ts
@@ -20,13 +20,13 @@
 import {
   browserSupportsPerfettoConfig,
   extractTraceConfig,
-  hasSystemDataSourceConfig
+  hasSystemDataSourceConfig,
 } from '../base/trace_config_utils';
 import {TraceConfig} from '../common/protos';
 import {
   ConsumerPortResponse,
   GetTraceStatsResponse,
-  ReadBuffersResponse
+  ReadBuffersResponse,
 } from '../controller/consumer_port_types';
 import {RpcConsumerPort} from '../controller/record_controller_interfaces';
 import {perfetto} from '../gen/protos';
@@ -53,7 +53,7 @@
           this.uiPort.postMessage({type: 'ChromeExtensionError', error}),
 
       onStatus: (status) =>
-          this.uiPort.postMessage({type: 'ChromeExtensionStatus', status})
+          this.uiPort.postMessage({type: 'ChromeExtensionStatus', status}),
     });
     this.uiPort = port;
     this.devtoolsSocket = new DevToolsSocket();
@@ -116,7 +116,7 @@
   // tslint:disable-next-line: no-any
   convertDictKeys(obj: any): any {
     if (Array.isArray(obj)) {
-      return obj.map(v => this.convertDictKeys(v));
+      return obj.map((v) => this.convertDictKeys(v));
     }
     if (typeof obj === 'object' && obj !== null) {
       // tslint:disable-next-line: no-any
@@ -177,7 +177,7 @@
     // takes place on the other side of the port.
     const response: ReadBuffersResponse = {
       type: 'ReadBuffersResponse',
-      slices: [{data: chunk as {} as Uint8Array, lastSliceForPacket: res.eof}]
+      slices: [{data: chunk as {} as Uint8Array, lastSliceForPacket: res.eof}],
     };
     this.sendMessage(response);
     if (res.eof) return;
@@ -206,11 +206,11 @@
     }
     const stats: perfetto.protos.ITraceStats = {
       bufferStats:
-          [{bufferSize: 1000, bytesWritten: Math.round(percentFull * 1000)}]
+          [{bufferSize: 1000, bytesWritten: Math.round(percentFull * 1000)}],
     };
     const response: GetTraceStatsResponse = {
       type: 'GetTraceStatsResponse',
-      traceStats: stats
+      traceStats: stats,
     };
     this.sendMessage(response);
   }
@@ -265,7 +265,7 @@
         streamFormat: 'proto',
         transferMode: 'ReturnAsStream',
         streamCompression: 'gzip',
-        bufferUsageReportingInterval: 200
+        bufferUsageReportingInterval: 200,
       };
 
       const traceConfig = TraceConfig.decode(traceConfigProto);
diff --git a/ui/src/chrome_extension/devtools_socket.ts b/ui/src/chrome_extension/devtools_socket.ts
index bb40f5c..55cadfc 100644
--- a/ui/src/chrome_extension/devtools_socket.ts
+++ b/ui/src/chrome_extension/devtools_socket.ts
@@ -70,7 +70,7 @@
 
   private attachToTarget(
       target: chrome.debugger.Debuggee, then: (error?: string) => void) {
-    chrome.debugger.attach(target, /*requiredVersion=*/ '1.3', () => {
+    chrome.debugger.attach(target, /* requiredVersion=*/ '1.3', () => {
       if (chrome.runtime.lastError) {
         then(chrome.runtime.lastError.message);
         return;
diff --git a/ui/src/chrome_extension/index.ts b/ui/src/chrome_extension/index.ts
index 6a55b21..b4906c2 100644
--- a/ui/src/chrome_extension/index.ts
+++ b/ui/src/chrome_extension/index.ts
@@ -21,7 +21,7 @@
 
 // Listen for messages from the perfetto ui.
 if (window.chrome) {
-  chrome.runtime.onConnectExternal.addListener(port => {
+  chrome.runtime.onConnectExternal.addListener((port) => {
     chromeTraceController = new ChromeTracingController(port);
     port.onMessage.addListener(onUIMessage);
   });
@@ -49,7 +49,7 @@
       conditions: [new chrome.declarativeContent.PageStateMatcher({
         pageUrl: {hostSuffix: suffix},
       })],
-      actions: [new chrome.declarativeContent.ShowPageAction()]
+      actions: [new chrome.declarativeContent.ShowPageAction()],
     };
   }
   chrome.declarativeContent.onPageChanged.removeRules(undefined, () => {
diff --git a/ui/src/common/actions_unittest.ts b/ui/src/common/actions_unittest.ts
index 66689b8..3ae3a70 100644
--- a/ui/src/common/actions_unittest.ts
+++ b/ui/src/common/actions_unittest.ts
@@ -18,7 +18,7 @@
 import {SLICE_TRACK_KIND} from '../tracks/chrome_slices/common';
 import {HEAP_PROFILE_TRACK_KIND} from '../tracks/heap_profile/common';
 import {
-  PROCESS_SCHEDULING_TRACK_KIND
+  PROCESS_SCHEDULING_TRACK_KIND,
 } from '../tracks/process_scheduling/common';
 import {THREAD_STATE_TRACK_KIND} from '../tracks/thread_state/common';
 
@@ -39,7 +39,7 @@
   name?: string,
   tid?: string
 }): State {
-  return produce(state, draft => {
+  return produce(state, (draft) => {
     StateActions.addTrack(draft, {
       id: args.id,
       engineId: '0',
@@ -49,20 +49,20 @@
           TrackKindPriority.ORDINARY :
           args.trackKindPriority,
       trackGroup: args.trackGroup || SCROLLING_TRACK_GROUP,
-      config: {tid: args.tid || '0'}
+      config: {tid: args.tid || '0'},
     });
   });
 }
 
 function fakeTrackGroup(
     state: State, args: {id: string, summaryTrackId: string}): State {
-  return produce(state, draft => {
+  return produce(state, (draft) => {
     StateActions.addTrackGroup(draft, {
       name: 'A group',
       id: args.id,
       engineId: '0',
       collapsed: false,
-      summaryTrackId: args.summaryTrackId
+      summaryTrackId: args.summaryTrackId,
     });
   });
 }
@@ -75,7 +75,7 @@
   for (const id of ids) {
     state = fakeTrack(state, {id});
   }
-  state = produce(state, draft => {
+  state = produce(state, (draft) => {
     draft.pinnedTracks = pinnedTracks;
     draft.scrollingTracks = scrollingTracks;
   });
@@ -83,7 +83,7 @@
 }
 
 test('add scrolling tracks', () => {
-  const once = produce(createEmptyState(), draft => {
+  const once = produce(createEmptyState(), (draft) => {
     StateActions.addTrack(draft, {
       engineId: '1',
       kind: 'cpu',
@@ -93,7 +93,7 @@
       config: {},
     });
   });
-  const twice = produce(once, draft => {
+  const twice = produce(once, (draft) => {
     StateActions.addTrack(draft, {
       engineId: '2',
       kind: 'cpu',
@@ -112,7 +112,7 @@
   let state = createEmptyState();
   state = fakeTrack(state, {id: 's'});
 
-  const afterGroup = produce(state, draft => {
+  const afterGroup = produce(state, (draft) => {
     StateActions.addTrackGroup(draft, {
       engineId: '1',
       name: 'A track group',
@@ -122,7 +122,7 @@
     });
   });
 
-  const afterTrackAdd = produce(afterGroup, draft => {
+  const afterTrackAdd = produce(afterGroup, (draft) => {
     StateActions.addTrack(draft, {
       id: '1',
       engineId: '1',
@@ -139,7 +139,7 @@
 });
 
 test('reorder tracks', () => {
-  const once = produce(createEmptyState(), draft => {
+  const once = produce(createEmptyState(), (draft) => {
     StateActions.addTrack(draft, {
       engineId: '1',
       kind: 'cpu',
@@ -159,7 +159,7 @@
   const firstTrackId = once.scrollingTracks[0];
   const secondTrackId = once.scrollingTracks[1];
 
-  const twice = produce(once, draft => {
+  const twice = produce(once, (draft) => {
     StateActions.moveTrack(draft, {
       srcId: `${firstTrackId}`,
       op: 'after',
@@ -175,7 +175,7 @@
   let state = createEmptyState();
   state = pinnedAndScrollingTracks(state, ['a', 'b', 'c'], ['a', 'b'], ['c']);
 
-  const after = produce(state, draft => {
+  const after = produce(state, (draft) => {
     StateActions.moveTrack(draft, {
       srcId: 'b',
       op: 'before',
@@ -191,7 +191,7 @@
   let state = createEmptyState();
   state = pinnedAndScrollingTracks(state, ['a', 'b', 'c'], ['a'], ['b', 'c']);
 
-  const after = produce(state, draft => {
+  const after = produce(state, (draft) => {
     StateActions.moveTrack(draft, {
       srcId: 'b',
       op: 'after',
@@ -207,7 +207,7 @@
   let state = createEmptyState();
   state = pinnedAndScrollingTracks(state, ['a', 'b', 'c'], ['a', 'b'], ['c']);
 
-  const after = produce(state, draft => {
+  const after = produce(state, (draft) => {
     StateActions.moveTrack(draft, {
       srcId: 'a',
       op: 'before',
@@ -221,7 +221,7 @@
   let state = createEmptyState();
   state = pinnedAndScrollingTracks(state, ['a', 'b', 'c'], ['a'], ['b', 'c']);
 
-  const after = produce(state, draft => {
+  const after = produce(state, (draft) => {
     StateActions.moveTrack(draft, {
       srcId: 'c',
       op: 'after',
@@ -235,7 +235,7 @@
   let state = createEmptyState();
   state = pinnedAndScrollingTracks(state, ['a', 'b', 'c'], ['a'], ['b', 'c']);
 
-  const after = produce(state, draft => {
+  const after = produce(state, (draft) => {
     StateActions.toggleTrackPinned(draft, {
       trackId: 'c',
     });
@@ -248,7 +248,7 @@
   let state = createEmptyState();
   state = pinnedAndScrollingTracks(state, ['a', 'b', 'c'], ['a', 'b'], ['c']);
 
-  const after = produce(state, draft => {
+  const after = produce(state, (draft) => {
     StateActions.toggleTrackPinned(draft, {
       trackId: 'a',
     });
@@ -260,7 +260,7 @@
 test('open trace', () => {
   const state = createEmptyState();
   const recordConfig = state.recordConfig;
-  const after = produce(state, draft => {
+  const after = produce(state, (draft) => {
     StateActions.openTraceFromUrl(draft, {
       url: 'https://example.com/bar',
     });
@@ -274,13 +274,13 @@
 });
 
 test('open second trace from file', () => {
-  const once = produce(createEmptyState(), draft => {
+  const once = produce(createEmptyState(), (draft) => {
     StateActions.openTraceFromUrl(draft, {
       url: 'https://example.com/bar',
     });
   });
 
-  const twice = produce(once, draft => {
+  const twice = produce(once, (draft) => {
     StateActions.addTrack(draft, {
       engineId: '1',
       kind: 'cpu',
@@ -290,7 +290,7 @@
     });
   });
 
-  const thrice = produce(twice, draft => {
+  const thrice = produce(twice, (draft) => {
     StateActions.openTraceFromUrl(draft, {
       url: 'https://example.com/foo',
     });
@@ -306,7 +306,7 @@
 
 test('setEngineReady with missing engine is ignored', () => {
   const state = createEmptyState();
-  produce(state, draft => {
+  produce(state, (draft) => {
     StateActions.setEngineReady(
         draft, {engineId: '1', ready: true, mode: 'WASM'});
   });
@@ -316,7 +316,7 @@
   const state = createEmptyState();
   let latestEngineId = 'dummy value will be replaced';
   state.currentEngineId = '100';
-  const after = produce(state, draft => {
+  const after = produce(state, (draft) => {
     StateActions.openTraceFromUrl(draft, {
       url: 'https://example.com/bar',
     });
@@ -335,7 +335,7 @@
   state = fakeTrack(
       state, {id: 'a', kind: PROCESS_SCHEDULING_TRACK_KIND, trackGroup: 'g'});
 
-  const after = produce(state, draft => {
+  const after = produce(state, (draft) => {
     StateActions.sortThreadTracks(draft, {});
   });
 
@@ -353,19 +353,19 @@
     id: 'b',
     kind: SLICE_TRACK_KIND,
     trackGroup: 'g',
-    trackKindPriority: TrackKindPriority.MAIN_THREAD
+    trackKindPriority: TrackKindPriority.MAIN_THREAD,
   });
   state = fakeTrack(state, {
     id: 'c',
     kind: SLICE_TRACK_KIND,
     trackGroup: 'g',
-    trackKindPriority: TrackKindPriority.RENDER_THREAD
+    trackKindPriority: TrackKindPriority.RENDER_THREAD,
   });
   state = fakeTrack(state, {
     id: 'd',
     kind: SLICE_TRACK_KIND,
     trackGroup: 'g',
-    trackKindPriority: TrackKindPriority.GPU_COMPLETION
+    trackKindPriority: TrackKindPriority.GPU_COMPLETION,
   });
   state = fakeTrack(
       state, {id: 'e', kind: HEAP_PROFILE_TRACK_KIND, trackGroup: 'g'});
@@ -374,7 +374,7 @@
   state = fakeTrack(
       state, {id: 'g', kind: SLICE_TRACK_KIND, trackGroup: 'g', name: 'T10'});
 
-  const after = produce(state, draft => {
+  const after = produce(state, (draft) => {
     StateActions.sortThreadTracks(draft, {});
   });
 
@@ -395,24 +395,24 @@
     kind: SLICE_TRACK_KIND,
     trackGroup: 'g',
     name: 'aaa',
-    tid: '1'
+    tid: '1',
   });
   state = fakeTrack(state, {
     id: 'b',
     kind: SLICE_TRACK_KIND,
     trackGroup: 'g',
     name: 'bbb',
-    tid: '2'
+    tid: '2',
   });
   state = fakeTrack(state, {
     id: 'c',
     kind: THREAD_STATE_TRACK_KIND,
     trackGroup: 'g',
     name: 'ccc',
-    tid: '1'
+    tid: '1',
   });
 
-  const after = produce(state, draft => {
+  const after = produce(state, (draft) => {
     StateActions.sortThreadTracks(draft, {});
   });
 
@@ -423,7 +423,7 @@
   const state = createEmptyState();
   const perfType = 'perf';
 
-  const afterSelectingPerf = produce(state, draft => {
+  const afterSelectingPerf = produce(state, (draft) => {
     StateActions.selectPerfSamples(
         draft, {id: 0, upid: 0, ts: 0, type: perfType});
   });
@@ -436,7 +436,7 @@
   const state = createEmptyState();
   const heapType = 'graph';
 
-  const afterSelectingPerf = produce(state, draft => {
+  const afterSelectingPerf = produce(state, (draft) => {
     StateActions.selectHeapProfile(
         draft, {id: 0, upid: 0, ts: 0, type: heapType});
   });
diff --git a/ui/src/common/aggregation_data.ts b/ui/src/common/aggregation_data.ts
index 28f761f..96a9a47 100644
--- a/ui/src/common/aggregation_data.ts
+++ b/ui/src/common/aggregation_data.ts
@@ -64,4 +64,4 @@
   states: string[];
   values: Float64Array;
   totalMs: number;
-}
\ No newline at end of file
+}
diff --git a/ui/src/common/cache_manager.ts b/ui/src/common/cache_manager.ts
index d946253..e804ff0 100644
--- a/ui/src/common/cache_manager.ts
+++ b/ui/src/common/cache_manager.ts
@@ -26,8 +26,12 @@
 
 export async function cacheTrace(
     traceSource: TraceSource, traceUuid: string): Promise<boolean> {
-  let trace, title = '', fileName = '', url = '', contentLength = 0,
-             localOnly = false;
+  let trace;
+  let title = '';
+  let fileName = '';
+  let url = '';
+  let contentLength = 0;
+  let localOnly = false;
   switch (traceSource.type) {
     case 'ARRAY_BUFFER':
       trace = traceSource.buffer;
@@ -58,8 +62,8 @@
       'expires',
       // Expires in a week from now (now = upload time)
       (new Date((new Date()).getTime() + (1000 * 60 * 60 * 24 * 7)))
-          .toUTCString()
-    ]
+          .toUTCString(),
+    ],
   ]);
   const traceCache = await caches.open(TRACE_CACHE_NAME);
   await deleteStaleEntries(traceCache);
@@ -82,7 +86,7 @@
     fileName: response.headers.get('x-trace-filename') || undefined,
     url: response.headers.get('x-trace-url') || undefined,
     uuid: traceUuid,
-    localOnly: response.headers.get('x-trace-local-only') === 'true'
+    localOnly: response.headers.get('x-trace-local-only') === 'true',
   };
 }
 
diff --git a/ui/src/common/canvas_utils_unittest.ts b/ui/src/common/canvas_utils_unittest.ts
index 19363bf..3aa005f 100644
--- a/ui/src/common/canvas_utils_unittest.ts
+++ b/ui/src/common/canvas_utils_unittest.ts
@@ -19,8 +19,8 @@
   const emoji = '\uD83D\uDE00';
   expect(cropText(
              'com.android.camera [4096]',
-             /*charWidth=*/ 5,
-             /*rectWidth=*/ 2 * 5))
+             /* charWidth=*/ 5,
+             /* rectWidth=*/ 2 * 5))
       .toBe('c');
   expect(cropText('com.android.camera [4096]', 5, 4 * 5 + 2))
       .toBe('co' + tripleDot);
diff --git a/ui/src/common/colorizer.ts b/ui/src/common/colorizer.ts
index 0c30df8..cd74412 100644
--- a/ui/src/common/colorizer.ts
+++ b/ui/src/common/colorizer.ts
@@ -47,7 +47,7 @@
   c: 'grey',
   h: 0,
   s: 0,
-  l: 62
+  l: 62,
 };
 
 function hash(s: string, max: number): number {
@@ -67,19 +67,19 @@
   c: 'desat red',
   h: 3,
   s: 30,
-  l: 49
+  l: 49,
 };
 const DARK_GREEN: Color = {
   c: 'dark green',
   h: 120,
   s: 44,
-  l: 34
+  l: 34,
 };
 const LIME_GREEN: Color = {
   c: 'lime green',
   h: 75,
   s: 55,
-  l: 47
+  l: 47,
 };
 const TRANSPARENT_WHITE: Color = {
   c: 'white',
@@ -92,13 +92,13 @@
   c: 'orange',
   h: 36,
   s: 100,
-  l: 50
+  l: 50,
 };
 const INDIGO: Color = {
   c: 'indigo',
   h: 231,
   s: 48,
-  l: 48
+  l: 48,
 };
 
 export function colorForState(state: string): Readonly<Color> {
diff --git a/ui/src/common/empty_state.ts b/ui/src/common/empty_state.ts
index 4dc263c..3910773 100644
--- a/ui/src/common/empty_state.ts
+++ b/ui/src/common/empty_state.ts
@@ -17,7 +17,7 @@
 import {TableColumn} from '../frontend/pivot_table_redux_query_generator';
 import {
   autosaveConfigStore,
-  recordTargetStore
+  recordTargetStore,
 } from '../frontend/record_config';
 
 import {featureFlags} from './feature_flags';
@@ -25,7 +25,7 @@
   defaultTraceTime,
   NonSerializableState,
   State,
-  STATE_VERSION
+  STATE_VERSION,
 } from './state';
 
 const AUTOLOAD_STARTED_CONFIG_FLAG = featureFlags.register({
@@ -136,6 +136,6 @@
 
     fetchChromeCategories: false,
     chromeCategories: undefined,
-    nonSerializableState: createEmptyNonSerializableState()
+    nonSerializableState: createEmptyNonSerializableState(),
   };
-}
\ No newline at end of file
+}
diff --git a/ui/src/common/feature_flags.ts b/ui/src/common/feature_flags.ts
index 9db51fa..cb22c07 100644
--- a/ui/src/common/feature_flags.ts
+++ b/ui/src/common/feature_flags.ts
@@ -84,7 +84,7 @@
     const includeDevFlags =
         ['127.0.0.1', '::1', 'localhost'].includes(window.location.hostname);
     return [...this.flags.values()].filter(
-        flag => includeDevFlags || !flag.devOnly);
+        (flag) => includeDevFlags || !flag.devOnly);
   }
 
   resetAll() {
@@ -232,12 +232,12 @@
   id: 'perfSampleFlamegraph',
   name: 'Perf Sample Flamegraph',
   description: 'Show flamegraph generated by a perf sample.',
-  defaultValue: true
+  defaultValue: true,
 });
 
 export const RECORDING_V2_FLAG = featureFlags.register({
   id: 'recordingv2',
   name: 'Recording V2',
   description: 'Record using V2 interface',
-  defaultValue: false
+  defaultValue: false,
 });
diff --git a/ui/src/common/flamegraph_unittest.ts b/ui/src/common/flamegraph_unittest.ts
index d25464c..a9034bf 100644
--- a/ui/src/common/flamegraph_unittest.ts
+++ b/ui/src/common/flamegraph_unittest.ts
@@ -26,7 +26,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 2,
@@ -37,7 +37,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 3,
@@ -48,7 +48,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 4,
@@ -59,7 +59,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
   ];
 
@@ -80,7 +80,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 2,
@@ -91,7 +91,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 3,
@@ -102,7 +102,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 4,
@@ -113,7 +113,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 5,
@@ -124,7 +124,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
   ];
 
@@ -145,7 +145,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 2,
@@ -156,7 +156,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 3,
@@ -167,7 +167,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
   ];
 
@@ -183,7 +183,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 2,
@@ -194,7 +194,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: true,
-      highlighted: false
+      highlighted: false,
     },
   ]);
 });
@@ -210,7 +210,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 2,
@@ -221,7 +221,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 3,
@@ -232,7 +232,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 4,
@@ -243,7 +243,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 5,
@@ -254,7 +254,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 6,
@@ -265,7 +265,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 7,
@@ -276,7 +276,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 8,
@@ -287,7 +287,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
   ];
 
@@ -301,7 +301,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 2,
@@ -312,7 +312,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 3,
@@ -323,7 +323,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: true,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 6,
@@ -334,7 +334,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: true,
-      highlighted: false
+      highlighted: false,
     },
   ];
 
@@ -357,7 +357,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 2,
@@ -368,7 +368,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 3,
@@ -379,7 +379,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 4,
@@ -390,7 +390,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 5,
@@ -401,7 +401,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 6,
@@ -412,7 +412,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 7,
@@ -423,7 +423,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 8,
@@ -434,7 +434,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
   ];
 
@@ -448,7 +448,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 2,
@@ -459,7 +459,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 3,
@@ -470,7 +470,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: true,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 6,
@@ -481,7 +481,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 7,
@@ -492,7 +492,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 8,
@@ -503,7 +503,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
   ];
 
@@ -527,7 +527,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 2,
@@ -538,7 +538,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 3,
@@ -549,7 +549,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 4,
@@ -560,7 +560,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 5,
@@ -571,7 +571,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
   ];
 
@@ -585,7 +585,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 2,
@@ -596,7 +596,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 3,
@@ -607,7 +607,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: true,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 4,
@@ -618,7 +618,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
   ];
 
@@ -642,7 +642,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 2,
@@ -653,7 +653,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 3,
@@ -664,7 +664,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
   ];
 
@@ -684,7 +684,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 2,
@@ -695,7 +695,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
   ];
 
@@ -711,7 +711,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: true,
-      highlighted: false
+      highlighted: false,
     },
   ]);
 });
@@ -727,7 +727,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 2,
@@ -738,7 +738,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 3,
@@ -749,7 +749,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 4,
@@ -760,7 +760,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 5,
@@ -771,7 +771,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 6,
@@ -782,7 +782,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 7,
@@ -793,7 +793,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 8,
@@ -804,7 +804,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 9,
@@ -815,7 +815,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 10,
@@ -826,7 +826,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 11,
@@ -837,7 +837,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 12,
@@ -848,7 +848,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 13,
@@ -859,7 +859,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 14,
@@ -870,7 +870,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 15,
@@ -881,7 +881,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 16,
@@ -892,7 +892,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 17,
@@ -903,7 +903,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 18,
@@ -914,7 +914,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 19,
@@ -925,7 +925,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 20,
@@ -936,7 +936,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
   ];
 
@@ -950,7 +950,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 2,
@@ -961,7 +961,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 3,
@@ -972,7 +972,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 4,
@@ -983,7 +983,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: true,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 7,
@@ -994,7 +994,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 8,
@@ -1005,7 +1005,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 9,
@@ -1016,7 +1016,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 10,
@@ -1027,7 +1027,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: true,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 15,
@@ -1038,7 +1038,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: true,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 19,
@@ -1049,7 +1049,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
     {
       id: 20,
@@ -1060,7 +1060,7 @@
       selfSize: 0,
       mapping: 'x',
       merged: false,
-      highlighted: false
+      highlighted: false,
     },
   ];
 
diff --git a/ui/src/common/flamegraph_util.ts b/ui/src/common/flamegraph_util.ts
index c8070ff..2658341 100644
--- a/ui/src/common/flamegraph_util.ts
+++ b/ui/src/common/flamegraph_util.ts
@@ -105,7 +105,7 @@
     selfSize: callsite.selfSize,
     merged: callsite.merged,
     highlighted: callsite.highlighted,
-    location: callsite.location
+    location: callsite.location,
   };
 }
 
diff --git a/ui/src/common/http_rpc_engine.ts b/ui/src/common/http_rpc_engine.ts
index 436dd42..ddeec7c 100644
--- a/ui/src/common/http_rpc_engine.ts
+++ b/ui/src/common/http_rpc_engine.ts
@@ -69,7 +69,7 @@
   }
 
   private onWebsocketMessage(e: MessageEvent) {
-    assertExists(e.data as Blob).arrayBuffer().then(buf => {
+    assertExists(e.data as Blob).arrayBuffer().then((buf) => {
       super.onRpcResponseBytes(new Uint8Array(buf));
     });
   }
diff --git a/ui/src/common/proto_ring_buffer_unittest.ts b/ui/src/common/proto_ring_buffer_unittest.ts
index 6c06ae0..343bcdf 100644
--- a/ui/src/common/proto_ring_buffer_unittest.ts
+++ b/ui/src/common/proto_ring_buffer_unittest.ts
@@ -27,7 +27,7 @@
 
 function MakeProtoMessage(fieldId: number, len: number) {
   const writer = protobuf.Writer.create();
-  const tag = (fieldId << 3) | 2 /*length-delimited*/;
+  const tag = (fieldId << 3) | 2;
   assertTrue(tag < 0x80 && (tag & 7) === 2);
   writer.uint32(tag);
   const data = new Uint8Array(len);
@@ -88,7 +88,7 @@
 
   const fragLens = [120, 20, 471, 1];
   let fragSum = 0;
-  fragLens.map(fragLen => {
+  fragLens.map((fragLen) => {
     buf.append(mergedBuf.subarray(fragSum, fragSum + fragLen));
     fragSum += fragLen;
     for (;;) {
diff --git a/ui/src/common/queries.ts b/ui/src/common/queries.ts
index a91b126..e38c816 100644
--- a/ui/src/common/queries.ts
+++ b/ui/src/common/queries.ts
@@ -74,4 +74,4 @@
     statementWithOutputCount: queryRes.statementWithOutputCount(),
   };
   return result;
-}
\ No newline at end of file
+}
diff --git a/ui/src/common/query_result_unittest.ts b/ui/src/common/query_result_unittest.ts
index b71f26b..5fad6fe 100644
--- a/ui/src/common/query_result_unittest.ts
+++ b/ui/src/common/query_result_unittest.ts
@@ -73,7 +73,7 @@
   ];
   const batch = QueryResultProto.CellsBatch.create({
     cells: new Array<number>(numAndExpectedStr.length).fill(T.CELL_VARINT),
-    varintCells: numAndExpectedStr.map(x => x[0]) as number[],
+    varintCells: numAndExpectedStr.map((x) => x[0]) as number[],
     isLastBatch: true,
   });
   const resProto = QueryResultProto.create({
@@ -87,7 +87,7 @@
   for (const iter = qr.iter({n: NUM}); iter.valid(); iter.next()) {
     actual.push(BigInt(iter.n).toString());
   }
-  expect(actual).toEqual(numAndExpectedStr.map(x => x[1]) as string[]);
+  expect(actual).toEqual(numAndExpectedStr.map((x) => x[1]) as string[]);
 });
 
 test('QueryResult.Floats', () => {
@@ -128,7 +128,7 @@
     '',
     'hello world',
     'In einem Bächlein helle da schoß in froher Eil',
-    '色は匂へど散りぬるを我が世誰ぞ常ならん有為の奥山今日越えて浅き夢見じ酔ひもせず'
+    '色は匂へど散りぬるを我が世誰ぞ常ならん有為の奥山今日越えて浅き夢見じ酔ひもせず',
   ];
   const batch = QueryResultProto.CellsBatch.create({
     cells: new Array<number>(strings.length).fill(T.CELL_STRING),
@@ -269,7 +269,7 @@
       T.CELL_STRING,
       T.CELL_FLOAT64,
       T.CELL_STRING,
-      T.CELL_STRING
+      T.CELL_STRING,
     ],
     varintCells: [42],
     stringCells: ['a', 'b', 'c'].join('\0'),
diff --git a/ui/src/common/recordingV2/adb_connection_over_webusb.ts b/ui/src/common/recordingV2/adb_connection_over_webusb.ts
index c3fc689..e6a9c2e 100644
--- a/ui/src/common/recordingV2/adb_connection_over_webusb.ts
+++ b/ui/src/common/recordingV2/adb_connection_over_webusb.ts
@@ -26,7 +26,7 @@
   OnDisconnectCallback,
   OnMessageCallback,
   OnStreamCloseCallback,
-  OnStreamDataCallback
+  OnStreamDataCallback,
 } from './recording_interfaces_v2';
 
 const textEncoder = new _TextEncoder();
@@ -155,7 +155,7 @@
 
   streamClose(stream: AdbOverWebusbStream): void {
     const otherStreamsQueue = this.writeQueue.filter(
-        queueElement => queueElement.localStreamId !== stream.localStreamId);
+        (queueElement) => queueElement.localStreamId !== stream.localStreamId);
     const droppedPacketCount =
         this.writeQueue.length - otherStreamsQueue.length;
     if (droppedPacketCount > 0) {
@@ -200,7 +200,7 @@
     }
     this.connectingStreams.clear();
 
-    this.streams.forEach(stream => stream.close());
+    this.streams.forEach((stream) => stream.close());
     this.onDisconnect(disconnectMessage);
 
     try {
@@ -314,7 +314,8 @@
 
         // This will resolve the promises awaited by
         // "ensureConnectionEstablished".
-        this.pendingConnPromises.forEach(connPromise => connPromise.resolve());
+        this.pendingConnPromises.forEach(
+            (connPromise) => connPromise.resolve());
         this.pendingConnPromises = [];
       } else if (msg.cmd === 'OKAY') {
         if (this.connectingStreams.has(msg.arg1)) {
diff --git a/ui/src/common/recordingV2/adb_over_webusb_utils.ts b/ui/src/common/recordingV2/adb_over_webusb_utils.ts
index 65d6be5..05c627a 100644
--- a/ui/src/common/recordingV2/adb_over_webusb_utils.ts
+++ b/ui/src/common/recordingV2/adb_over_webusb_utils.ts
@@ -21,7 +21,7 @@
 export const ADB_DEVICE_FILTER = {
   classCode: 255,    // USB vendor specific code
   subclassCode: 66,  // Android vendor specific subclass
-  protocolCode: 1    // Adb protocol
+  protocolCode: 1,   // Adb protocol
 };
 
 export function findInterfaceAndEndpoint(device: USBDevice):
@@ -36,7 +36,7 @@
           return {
             configurationValue: config.configurationValue,
             usbInterfaceNumber: interface_.interfaceNumber,
-            endpoints: alt.endpoints
+            endpoints: alt.endpoints,
           };
         }  // if (alternate)
       }    // for (interface.alternates)
diff --git a/ui/src/common/recordingV2/auth/adb_auth.ts b/ui/src/common/recordingV2/auth/adb_auth.ts
index 283ccfc..e7e1ddd 100644
--- a/ui/src/common/recordingV2/auth/adb_auth.ts
+++ b/ui/src/common/recordingV2/auth/adb_auth.ts
@@ -18,7 +18,7 @@
 import {
   base64Decode,
   base64Encode,
-  hexEncode
+  hexEncode,
 } from '../../../base/string_utils';
 
 const WORD_SIZE = 4;
@@ -30,7 +30,7 @@
   name: 'RSASSA-PKCS1-v1_5',
   hash: {name: 'SHA-1'},
   publicExponent: new Uint8Array([0x01, 0x00, 0x01]),  // 65537
-  modulusLength: MODULUS_SIZE_BITS
+  modulusLength: MODULUS_SIZE_BITS,
 };
 
 const ADB_WEB_CRYPTO_EXPORTABLE = true;
@@ -52,7 +52,7 @@
   0x05,
   0x00,
   0x04,
-  0x14
+  0x14,
 ];
 
 const R32 = BigInteger.ONE.shiftLeft(32);  // 1 << 32
diff --git a/ui/src/common/recordingV2/recording_config_utils.ts b/ui/src/common/recordingV2/recording_config_utils.ts
index 3dfa10c..1c69608 100644
--- a/ui/src/common/recordingV2/recording_config_utils.ts
+++ b/ui/src/common/recordingV2/recording_config_utils.ts
@@ -32,7 +32,7 @@
   ProcessStatsConfig,
   SysStatsConfig,
   TraceConfig,
-  VmstatCounters
+  VmstatCounters,
 } from '../protos';
 
 import {RecordingTargetV2, TargetInfo} from './recording_interfaces_v2';
@@ -53,7 +53,7 @@
     if (recordConfig === this.lastConfig) {
       return {
         configProtoText: this.configProtoText,
-        configProtoBase64: this.configProtoBase64
+        configProtoBase64: this.configProtoBase64,
       };
     }
     this.lastConfig = recordConfig;
@@ -64,7 +64,7 @@
     this.configProtoBase64 = base64Encode(configProto);
     return {
       configProtoText: this.configProtoText,
-      configProtoBase64: this.configProtoBase64
+      configProtoBase64: this.configProtoBase64,
     };
   }
 }
@@ -112,9 +112,9 @@
   const atraceCats = new Set<string>(uiCfg.atrace ? uiCfg.atraceCats : []);
   const atraceApps = new Set<string>();
   const chromeCategories = new Set<string>();
-  uiCfg.chromeCategoriesSelected.forEach(it => chromeCategories.add(it));
+  uiCfg.chromeCategoriesSelected.forEach((it) => chromeCategories.add(it));
   uiCfg.chromeHighOverheadCategoriesSelected.forEach(
-      it => chromeCategories.add(it));
+      (it) => chromeCategories.add(it));
 
   let procThreadAssociationPolling = false;
   let procThreadAssociationFtrace = false;
@@ -225,7 +225,7 @@
   if (uiCfg.meminfo) {
     if (sysStatsCfg === undefined) sysStatsCfg = new SysStatsConfig();
     sysStatsCfg.meminfoPeriodMs = uiCfg.meminfoPeriodMs;
-    sysStatsCfg.meminfoCounters = uiCfg.meminfoCounters.map(name => {
+    sysStatsCfg.meminfoCounters = uiCfg.meminfoCounters.map((name) => {
       // tslint:disable-next-line no-any
       return MeminfoCounters[name as any as number] as any as number;
     });
@@ -234,7 +234,7 @@
   if (uiCfg.vmstat) {
     if (sysStatsCfg === undefined) sysStatsCfg = new SysStatsConfig();
     sysStatsCfg.vmstatPeriodMs = uiCfg.vmstatPeriodMs;
-    sysStatsCfg.vmstatCounters = uiCfg.vmstatCounters.map(name => {
+    sysStatsCfg.vmstatCounters = uiCfg.vmstatCounters.map((name) => {
       // tslint:disable-next-line no-any
       return VmstatCounters[name as any as number] as any as number;
     });
@@ -331,7 +331,7 @@
     ds.config = new DataSourceConfig();
     ds.config.name = 'android.log';
     ds.config.androidLogConfig = new AndroidLogConfig();
-    ds.config.androidLogConfig.logIds = uiCfg.androidLogBuffers.map(name => {
+    ds.config.androidLogConfig.logIds = uiCfg.androidLogBuffers.map((name) => {
       // tslint:disable-next-line no-any
       return AndroidLogId[name as any as number] as any as number;
     });
@@ -581,7 +581,7 @@
   const msg = TraceConfig.decode(configBuffer);
   const json = msg.toJSON();
   function snakeCase(s: string): string {
-    return s.replace(/[A-Z]/g, c => '_' + c.toLowerCase());
+    return s.replace(/[A-Z]/g, (c) => '_' + c.toLowerCase());
   }
   // With the ahead of time compiled protos we can't seem to tell which
   // fields are enums.
@@ -602,7 +602,7 @@
       'maxFileSizeBytes',
       'samplingIntervalBytes',
       'shmemSizeBytes',
-      'pid'
+      'pid',
     ].includes(key);
   }
   function* message(msg: {}, indent: number): IterableIterator<string> {
diff --git a/ui/src/common/recordingV2/target_factories/android_webusb_target_factory.ts b/ui/src/common/recordingV2/target_factories/android_webusb_target_factory.ts
index 3a8e38a..6b5d2d1 100644
--- a/ui/src/common/recordingV2/target_factories/android_webusb_target_factory.ts
+++ b/ui/src/common/recordingV2/target_factories/android_webusb_target_factory.ts
@@ -15,12 +15,12 @@
 import {assertExists} from '../../../base/logging';
 import {
   ADB_DEVICE_FILTER,
-  findInterfaceAndEndpoint
+  findInterfaceAndEndpoint,
 } from '../adb_over_webusb_utils';
 import {
   OnTargetChangedCallback,
   RecordingTargetV2,
-  TargetFactory
+  TargetFactory,
 } from '../recording_interfaces_v2';
 import {targetFactoryRegistry} from '../target_factory_registry';
 import {AndroidWebusbTarget} from '../targets/android_webusb_target';
diff --git a/ui/src/common/recordingV2/targets/android_webusb_target.ts b/ui/src/common/recordingV2/targets/android_webusb_target.ts
index 2cfec59..fc4da5a 100644
--- a/ui/src/common/recordingV2/targets/android_webusb_target.ts
+++ b/ui/src/common/recordingV2/targets/android_webusb_target.ts
@@ -19,7 +19,7 @@
   RecordingTargetV2,
   TargetInfo,
   TracingSession,
-  TracingSessionListener
+  TracingSessionListener,
 } from '../recording_interfaces_v2';
 import {TracedTracingSession} from '../traced_tracing_session';
 
diff --git a/ui/src/common/recordingV2/traced_tracing_session.ts b/ui/src/common/recordingV2/traced_tracing_session.ts
index 0509f11..b54fe2a 100644
--- a/ui/src/common/recordingV2/traced_tracing_session.ts
+++ b/ui/src/common/recordingV2/traced_tracing_session.ts
@@ -31,13 +31,13 @@
   ITraceStats,
   ReadBuffersRequest,
   ReadBuffersResponse,
-  TraceConfig
+  TraceConfig,
 } from '../protos';
 
 import {
   ByteStream,
   TracingSession,
-  TracingSessionListener
+  TracingSessionListener,
 } from './recording_interfaces_v2';
 
 // See wire_protocol.proto for more details.
@@ -142,7 +142,7 @@
     const requestId = this.requestId++;
     const frame = new IPCFrame({
       requestId,
-      msgBindService: new IPCFrame.BindService({serviceName: 'ConsumerPort'})
+      msgBindService: new IPCFrame.BindService({serviceName: 'ConsumerPort'}),
     });
     this.writeFrame(frame);
 
@@ -197,7 +197,7 @@
     const frame = new IPCFrame({
       requestId,
       msgInvokeMethod: new IPCFrame.InvokeMethod(
-          {serviceId: this.serviceId, methodId: method.id, argsProto})
+          {serviceId: this.serviceId, methodId: method.id, argsProto}),
     });
     this.requestMethods.set(requestId, methodName);
     this.writeFrame(frame);
diff --git a/ui/src/common/state.ts b/ui/src/common/state.ts
index 71bedda..98adcf2 100644
--- a/ui/src/common/state.ts
+++ b/ui/src/common/state.ts
@@ -547,7 +547,7 @@
     {os: 'O', name: 'Android O-'},
     {os: 'C', name: 'Chrome'},
     {os: 'CrOS', name: 'Chrome OS (system trace)'},
-    {os: 'L', name: 'Linux desktop'}
+    {os: 'L', name: 'Linux desktop'},
   ];
 }
 
diff --git a/ui/src/common/thread_state.ts b/ui/src/common/thread_state.ts
index 5289384..7d61ea9 100644
--- a/ui/src/common/thread_state.ts
+++ b/ui/src/common/thread_state.ts
@@ -26,7 +26,7 @@
   'W': 'Waking',
   'P': 'Parked',
   'N': 'No Load',
-  '+': '(Preempted)'
+  '+': '(Preempted)',
 };
 
 export function translateState(
diff --git a/ui/src/common/time.ts b/ui/src/common/time.ts
index 2a0a45b..7f97d91 100644
--- a/ui/src/common/time.ts
+++ b/ui/src/common/time.ts
@@ -63,9 +63,9 @@
     ['s', 1000000000],
     ['ms', 1000000],
     ['us', 1000],
-    ['ns', 1]
+    ['ns', 1],
   ];
-  unitAndValue.forEach(pair => {
+  unitAndValue.forEach((pair) => {
     const unit = pair[0] as string;
     const val = pair[1] as number;
     if (ns >= val) {
diff --git a/ui/src/common/upload_utils.ts b/ui/src/common/upload_utils.ts
index 8e5e545..89f2217 100644
--- a/ui/src/common/upload_utils.ts
+++ b/ui/src/common/upload_utils.ts
@@ -59,5 +59,5 @@
   // tslint:disable-next-line no-any
   const buffer = new (TextEncoder as any)('utf-8').encode(str);
   const digest = await crypto.subtle.digest('SHA-256', buffer);
-  return Array.from(new Uint8Array(digest)).map(x => x.toString(16)).join('');
+  return Array.from(new Uint8Array(digest)).map((x) => x.toString(16)).join('');
 }
diff --git a/ui/src/controller/adb.ts b/ui/src/controller/adb.ts
index 9bcc708..991a889 100644
--- a/ui/src/controller/adb.ts
+++ b/ui/src/controller/adb.ts
@@ -81,7 +81,7 @@
   private filter = {
     classCode: 255,    // USB vendor specific code
     subclassCode: 66,  // Android vendor specific subclass
-    protocolCode: 1    // Adb protocol
+    protocolCode: 1,   // Adb protocol
   };
 
   async findDevice() {
@@ -173,7 +173,7 @@
             return {
               configValue: config.configurationValue,
               usbInterfaceNumber: interface_.interfaceNumber,
-              endpoints: alt.endpoints
+              endpoints: alt.endpoints,
             };
           }  // if (alternate)
         }    // for (interface.alternates)
@@ -195,11 +195,11 @@
 
   receiveDeviceMessages() {
     this.recv()
-        .then(msg => {
+        .then((msg) => {
           this.onMessage(msg);
           this.receiveDeviceMessages();
         })
-        .catch(e => {
+        .catch((e) => {
           // Ignore error with "DEVICE_NOT_SET_ERROR" message since it is always
           // thrown after the device disconnects.
           if (e.message !== DEVICE_NOT_SET_ERROR) {
@@ -222,7 +222,7 @@
     } else if (this.state === AdbState.CONNECTED && [
                  'OKAY',
                  'WRTE',
-                 'CLSE'
+                 'CLSE',
                ].indexOf(msg.cmd) >= 0) {
       const stream = this.streams.get(msg.arg1);
       if (!stream) {
@@ -312,7 +312,7 @@
 
     return new Promise<string>((resolve, _) => {
       const output: string[] = [];
-      shell.onData = raw => output.push(textDecoder.decode(raw));
+      shell.onData = (raw) => output.push(textDecoder.decode(raw));
       shell.onClose = () => resolve(output.join());
     });
   }
@@ -360,7 +360,7 @@
     };
 
     const key = await crypto.subtle.generateKey(
-        keySpec, /*extractable=*/ true, ['sign', 'verify']);
+        keySpec, /* extractable=*/ true, ['sign', 'verify']);
     return key;
   }
 
@@ -586,7 +586,7 @@
 
 function base64StringToArray(s: string) {
   const decoded = atob(s.replace(/-/g, '+').replace(/_/g, '/'));
-  return [...decoded].map(char => char.charCodeAt(0));
+  return [...decoded].map((char) => char.charCodeAt(0));
 }
 
 const ANDROID_PUBKEY_MODULUS_SIZE = 2048;
@@ -626,13 +626,13 @@
   dv.setUint32(0, MODULUS_SIZE_BYTES / 4, true);
 
   // The Mongomery params (n0inv and rr) are not computed.
-  dv.setUint32(4, 0 /*n0inv*/, true);
+  dv.setUint32(4, 0 /* n0inv*/, true);
   // Modulus
   for (let i = 0; i < MODULUS_SIZE_BYTES; i++) dv.setUint8(8 + i, nArr[i]);
 
   // rr:
   for (let i = 0; i < MODULUS_SIZE_BYTES; i++) {
-    dv.setUint8(8 + MODULUS_SIZE_BYTES + i, 0 /*rr*/);
+    dv.setUint8(8 + MODULUS_SIZE_BYTES + i, 0 /* rr*/);
   }
   // Exponent
   for (let i = 0; i < 4; i++) {
diff --git a/ui/src/controller/adb_base_controller.ts b/ui/src/controller/adb_base_controller.ts
index 2ef2782..4113247 100644
--- a/ui/src/controller/adb_base_controller.ts
+++ b/ui/src/controller/adb_base_controller.ts
@@ -124,7 +124,7 @@
       ReadBuffersResponse {
     return {
       type: 'ReadBuffersResponse',
-      slices: [{data, lastSliceForPacket: last}]
+      slices: [{data, lastSliceForPacket: last}],
     };
   }
 
@@ -133,6 +133,6 @@
     const connectedDevice = globals.state.recordingTarget;
     if (!isAdbTarget(connectedDevice)) return undefined;
     const devices = await navigator.usb.getDevices();
-    return devices.find(d => d.serialNumber === connectedDevice.serial);
+    return devices.find((d) => d.serialNumber === connectedDevice.serial);
   }
-}
\ No newline at end of file
+}
diff --git a/ui/src/controller/adb_interfaces.ts b/ui/src/controller/adb_interfaces.ts
index e4759b8..b347c39 100644
--- a/ui/src/controller/adb_interfaces.ts
+++ b/ui/src/controller/adb_interfaces.ts
@@ -80,4 +80,4 @@
   data: Uint8Array;
   dataLen: number;
   dataChecksum: number;
-}
\ No newline at end of file
+}
diff --git a/ui/src/controller/adb_jsdomtest.ts b/ui/src/controller/adb_jsdomtest.ts
index 83d05fd..ae7cce8 100644
--- a/ui/src/controller/adb_jsdomtest.ts
+++ b/ui/src/controller/adb_jsdomtest.ts
@@ -19,7 +19,7 @@
   AdbOverWebUsb,
   AdbState,
   DEFAULT_MAX_PAYLOAD_BYTES,
-  VERSION_WITH_CHECKSUM
+  VERSION_WITH_CHECKSUM,
 } from './adb';
 
 test('startAuthentication', async () => {
@@ -36,7 +36,7 @@
     arg0: VERSION_WITH_CHECKSUM,
     arg1: DEFAULT_MAX_PAYLOAD_BYTES,
     data: 'host:1:UsbADB',
-    useChecksum: true
+    useChecksum: true,
   });
   await adb.startAuthentication();
 
@@ -59,7 +59,7 @@
     arg0: VERSION_WITH_CHECKSUM,
     arg1: expectedMaxPayload,
     data: new TextEncoder().encode('device'),
-    useChecksum: true
+    useChecksum: true,
   });
   await adb.onMessage(connectedMsg);
 
diff --git a/ui/src/controller/adb_record_controller_jsdomtest.ts b/ui/src/controller/adb_record_controller_jsdomtest.ts
index 23730bd..cfdf1cf 100644
--- a/ui/src/controller/adb_record_controller_jsdomtest.ts
+++ b/ui/src/controller/adb_record_controller_jsdomtest.ts
@@ -25,7 +25,7 @@
   return {
     onConsumerPortResponse: jest.fn(),
     onError: jest.fn(),
-    onStatus: jest.fn()
+    onStatus: jest.fn(),
   };
 }
 const mainCallback = generateMockConsumer();
@@ -66,7 +66,7 @@
   const adbController = new AdbConsumerPort(adbMock, mainCallback);
 
   adbController.sendErrorMessage =
-      jest.fn().mockImplementation(s => console.error(s));
+      jest.fn().mockImplementation((s) => console.error(s));
 
   const findDevice = jest.fn().mockImplementation(() => {
     return Promise.resolve({} as unknown as USBDevice);
diff --git a/ui/src/controller/adb_shell_controller.ts b/ui/src/controller/adb_shell_controller.ts
index 16cf6ba..4c7b6a2 100644
--- a/ui/src/controller/adb_shell_controller.ts
+++ b/ui/src/controller/adb_shell_controller.ts
@@ -85,7 +85,7 @@
     const recordCommand = this.generateStartTracingCommand(configProto);
     this.recordShell = await this.adb.shell(recordCommand);
     const output: string[] = [];
-    this.recordShell.onData = raw => output.push(textDecoder.decode(raw));
+    this.recordShell.onData = (raw) => output.push(textDecoder.decode(raw));
     this.recordShell.onClose = () => {
       const response = output.join();
       if (!this.tracingEndedSuccessfully(response)) {
@@ -109,7 +109,7 @@
 
     const readTraceShell =
         await this.adb.shell(this.generateReadTraceCommand());
-    readTraceShell.onData = raw =>
+    readTraceShell.onData = (raw) =>
         this.sendMessage(this.generateChunkReadResponse(raw));
 
     readTraceShell.onClose = () => {
@@ -123,7 +123,7 @@
         await this.adb.shellOutputAsString(`ps -u shell | grep perfetto`);
     // We used to use awk '{print $2}' but older phones/Go phones don't have
     // awk installed. Instead we implement similar functionality here.
-    const awk = pidStr.split(' ').filter(str => str !== '');
+    const awk = pidStr.split(' ').filter((str) => str !== '');
     if (awk.length < 1) {
       throw Error(`Unabled to find perfetto pid in string "${pidStr}"`);
     }
@@ -167,7 +167,7 @@
       ReadBuffersResponse {
     return {
       type: 'ReadBuffersResponse',
-      slices: [{data, lastSliceForPacket: last}]
+      slices: [{data, lastSliceForPacket: last}],
     };
   }
 
diff --git a/ui/src/controller/adb_socket_controller.ts b/ui/src/controller/adb_socket_controller.ts
index 9bedf30..4c90571 100644
--- a/ui/src/controller/adb_socket_controller.ts
+++ b/ui/src/controller/adb_socket_controller.ts
@@ -118,7 +118,7 @@
     const frame = new perfetto.protos.IPCFrame({
       requestId,
       msgInvokeMethod: new perfetto.protos.IPCFrame.InvokeMethod(
-          {serviceId: this.serviceId, methodId, argsProto})
+          {serviceId: this.serviceId, methodId, argsProto}),
     });
     this.requestMethods.set(requestId, method);
     this.sendFrame(frame);
@@ -300,7 +300,7 @@
     const frame = new perfetto.protos.IPCFrame({
       requestId,
       msgBindService: new perfetto.protos.IPCFrame.BindService(
-          {serviceName: 'ConsumerPort'})
+          {serviceName: 'ConsumerPort'}),
     });
     return new Promise<void>((resolve, _) => {
       this.resolveBindingPromise = resolve;
diff --git a/ui/src/controller/aggregation/aggregation_controller.ts b/ui/src/controller/aggregation/aggregation_controller.ts
index 018191c..0510ca0 100644
--- a/ui/src/controller/aggregation/aggregation_controller.ts
+++ b/ui/src/controller/aggregation/aggregation_controller.ts
@@ -66,7 +66,7 @@
           strings: [],
           columnSums: [],
         },
-        kind: this.args.kind
+        kind: this.args.kind,
       });
       return;
     }
@@ -84,7 +84,7 @@
       this.requestingData = true;
       if (sortingChanged) this.previousSorting = aggregatePreferences.sorting;
       this.getAggregateData(area, hasAreaChanged)
-          .then(data => publishAggregateData({data, kind: this.args.kind}))
+          .then((data) => publishAggregateData({data, kind: this.args.kind}))
           .finally(() => {
             this.requestingData = false;
             if (this.queuedRequest) {
@@ -110,7 +110,7 @@
     }
 
     const defs = this.getColumnDefinitions();
-    const colIds = defs.map(col => col.columnId);
+    const colIds = defs.map((col) => col.columnId);
     const pref = globals.state.aggregatePreferences[this.kind];
     let sorting = `${this.getDefaultSorting().column} ${
         this.getDefaultSorting().direction}`;
@@ -121,8 +121,8 @@
     const result = await this.args.engine.query(query);
 
     const numRows = result.numRows();
-    const columns = defs.map(def => this.columnFromColumnDef(def, numRows));
-    const columnSums = await Promise.all(defs.map(def => this.getSum(def)));
+    const columns = defs.map((def) => this.columnFromColumnDef(def, numRows));
+    const columnSums = await Promise.all(defs.map((def) => this.getSum(def)));
     const extraData = await this.getExtra(this.args.engine, area);
     const extra = extraData ? extraData : undefined;
     const data: AggregateData =
diff --git a/ui/src/controller/aggregation/counter_aggregation_controller.ts b/ui/src/controller/aggregation/counter_aggregation_controller.ts
index 24d4a94..d41a96c 100644
--- a/ui/src/controller/aggregation/counter_aggregation_controller.ts
+++ b/ui/src/controller/aggregation/counter_aggregation_controller.ts
@@ -83,19 +83,19 @@
         title: 'Delta value',
         kind: 'NUMBER',
         columnConstructor: Float64Array,
-        columnId: 'delta_value'
+        columnId: 'delta_value',
       },
       {
         title: 'Rate /s',
         kind: 'Number',
         columnConstructor: Float64Array,
-        columnId: 'rate'
+        columnId: 'rate',
       },
       {
         title: 'Weighted avg value',
         kind: 'Number',
         columnConstructor: Float64Array,
-        columnId: 'avg_value'
+        columnId: 'avg_value',
       },
       {
         title: 'Count',
@@ -108,25 +108,25 @@
         title: 'First value',
         kind: 'NUMBER',
         columnConstructor: Float64Array,
-        columnId: 'first_value'
+        columnId: 'first_value',
       },
       {
         title: 'Last value',
         kind: 'NUMBER',
         columnConstructor: Float64Array,
-        columnId: 'last_value'
+        columnId: 'last_value',
       },
       {
         title: 'Min value',
         kind: 'NUMBER',
         columnConstructor: Float64Array,
-        columnId: 'min_value'
+        columnId: 'min_value',
       },
       {
         title: 'Max value',
         kind: 'NUMBER',
         columnConstructor: Float64Array,
-        columnId: 'max_value'
+        columnId: 'max_value',
       },
 
     ];
diff --git a/ui/src/controller/aggregation/cpu_aggregation_controller.ts b/ui/src/controller/aggregation/cpu_aggregation_controller.ts
index a8b1161..59c0196 100644
--- a/ui/src/controller/aggregation/cpu_aggregation_controller.ts
+++ b/ui/src/controller/aggregation/cpu_aggregation_controller.ts
@@ -75,40 +75,40 @@
         title: 'PID',
         kind: 'NUMBER',
         columnConstructor: Uint16Array,
-        columnId: 'pid'
+        columnId: 'pid',
       },
       {
         title: 'Thread',
         kind: 'STRING',
         columnConstructor: Uint16Array,
-        columnId: 'thread_name'
+        columnId: 'thread_name',
       },
       {
         title: 'TID',
         kind: 'NUMBER',
         columnConstructor: Uint16Array,
-        columnId: 'tid'
+        columnId: 'tid',
       },
       {
         title: 'Wall duration (ms)',
         kind: 'TIMESTAMP_NS',
         columnConstructor: Float64Array,
         columnId: 'total_dur',
-        sum: true
+        sum: true,
       },
       {
         title: 'Avg Wall duration (ms)',
         kind: 'TIMESTAMP_NS',
         columnConstructor: Float64Array,
-        columnId: 'avg_dur'
+        columnId: 'avg_dur',
       },
       {
         title: 'Occurrences',
         kind: 'NUMBER',
         columnConstructor: Uint16Array,
         columnId: 'occurrences',
-        sum: true
-      }
+        sum: true,
+      },
     ];
   }
 }
diff --git a/ui/src/controller/aggregation/cpu_by_process_aggregation_controller.ts b/ui/src/controller/aggregation/cpu_by_process_aggregation_controller.ts
index baf9efe..e81cc55 100644
--- a/ui/src/controller/aggregation/cpu_by_process_aggregation_controller.ts
+++ b/ui/src/controller/aggregation/cpu_by_process_aggregation_controller.ts
@@ -74,28 +74,28 @@
         title: 'PID',
         kind: 'NUMBER',
         columnConstructor: Uint16Array,
-        columnId: 'pid'
+        columnId: 'pid',
       },
       {
         title: 'Wall duration (ms)',
         kind: 'TIMESTAMP_NS',
         columnConstructor: Float64Array,
         columnId: 'total_dur',
-        sum: true
+        sum: true,
       },
       {
         title: 'Avg Wall duration (ms)',
         kind: 'TIMESTAMP_NS',
         columnConstructor: Float64Array,
-        columnId: 'avg_dur'
+        columnId: 'avg_dur',
       },
       {
         title: 'Occurrences',
         kind: 'NUMBER',
         columnConstructor: Uint16Array,
         columnId: 'occurrences',
-        sum: true
-      }
+        sum: true,
+      },
     ];
   }
 }
diff --git a/ui/src/controller/aggregation/frame_aggregation_controller.ts b/ui/src/controller/aggregation/frame_aggregation_controller.ts
index cca2110..b0f6a5e 100644
--- a/ui/src/controller/aggregation/frame_aggregation_controller.ts
+++ b/ui/src/controller/aggregation/frame_aggregation_controller.ts
@@ -18,7 +18,7 @@
 import {toNs} from '../../common/time';
 import {
   ACTUAL_FRAMES_SLICE_TRACK_KIND,
-  Config
+  Config,
 } from '../../tracks/actual_frames/common';
 import {globals} from '../globals';
 
@@ -96,8 +96,8 @@
         kind: 'NUMBER',
         columnConstructor: Uint16Array,
         columnId: 'occurrences',
-        sum: true
-      }
+        sum: true,
+      },
     ];
   }
 }
diff --git a/ui/src/controller/aggregation/slice_aggregation_controller.ts b/ui/src/controller/aggregation/slice_aggregation_controller.ts
index c871729..e27fbad 100644
--- a/ui/src/controller/aggregation/slice_aggregation_controller.ts
+++ b/ui/src/controller/aggregation/slice_aggregation_controller.ts
@@ -18,11 +18,11 @@
 import {toNs} from '../../common/time';
 import {
   ASYNC_SLICE_TRACK_KIND,
-  Config as AsyncSliceConfig
+  Config as AsyncSliceConfig,
 } from '../../tracks/async_slices/common';
 import {
   Config as SliceConfig,
-  SLICE_TRACK_KIND
+  SLICE_TRACK_KIND,
 } from '../../tracks/chrome_slices/common';
 import {globals} from '../globals';
 
@@ -94,21 +94,21 @@
         kind: 'TIMESTAMP_NS',
         columnConstructor: Float64Array,
         columnId: 'total_dur',
-        sum: true
+        sum: true,
       },
       {
         title: 'Avg Wall duration (ms)',
         kind: 'TIMESTAMP_NS',
         columnConstructor: Float64Array,
-        columnId: 'avg_dur'
+        columnId: 'avg_dur',
       },
       {
         title: 'Occurrences',
         kind: 'NUMBER',
         columnConstructor: Uint16Array,
         columnId: 'occurrences',
-        sum: true
-      }
+        sum: true,
+      },
     ];
   }
 }
diff --git a/ui/src/controller/aggregation/thread_aggregation_controller.ts b/ui/src/controller/aggregation/thread_aggregation_controller.ts
index ff7bd6f..06155d7 100644
--- a/ui/src/controller/aggregation/thread_aggregation_controller.ts
+++ b/ui/src/controller/aggregation/thread_aggregation_controller.ts
@@ -20,7 +20,7 @@
 import {toNs} from '../../common/time';
 import {
   Config,
-  THREAD_STATE_TRACK_KIND
+  THREAD_STATE_TRACK_KIND,
 } from '../../tracks/thread_state/common';
 import {globals} from '../globals';
 
@@ -93,7 +93,7 @@
       kind: 'THREAD_STATE',
       states: [],
       values: new Float64Array(result.numRows()),
-      totalMs: 0
+      totalMs: 0,
     };
     summary.totalMs = 0;
     for (let i = 0; it.valid(); ++i, it.next()) {
@@ -119,46 +119,46 @@
         title: 'PID',
         kind: 'NUMBER',
         columnConstructor: Uint16Array,
-        columnId: 'pid'
+        columnId: 'pid',
       },
       {
         title: 'Thread',
         kind: 'STRING',
         columnConstructor: Uint16Array,
-        columnId: 'thread_name'
+        columnId: 'thread_name',
       },
       {
         title: 'TID',
         kind: 'NUMBER',
         columnConstructor: Uint16Array,
-        columnId: 'tid'
+        columnId: 'tid',
       },
       {
         title: 'State',
         kind: 'STATE',
         columnConstructor: Uint16Array,
-        columnId: 'concat_state'
+        columnId: 'concat_state',
       },
       {
         title: 'Wall duration (ms)',
         kind: 'TIMESTAMP_NS',
         columnConstructor: Float64Array,
         columnId: 'total_dur',
-        sum: true
+        sum: true,
       },
       {
         title: 'Avg Wall duration (ms)',
         kind: 'TIMESTAMP_NS',
         columnConstructor: Float64Array,
-        columnId: 'avg_dur'
+        columnId: 'avg_dur',
       },
       {
         title: 'Occurrences',
         kind: 'NUMBER',
         columnConstructor: Uint16Array,
         columnId: 'occurrences',
-        sum: true
-      }
+        sum: true,
+      },
     ];
   }
 
diff --git a/ui/src/controller/area_selection_handler_unittest.ts b/ui/src/controller/area_selection_handler_unittest.ts
index bbc3159..1b49d87 100644
--- a/ui/src/controller/area_selection_handler_unittest.ts
+++ b/ui/src/controller/area_selection_handler_unittest.ts
@@ -39,7 +39,7 @@
   frontendGlobals.state = createEmptyState();
   frontendGlobals.state.currentSelection = {
     kind: 'AREA',
-    areaId: previousAreaId
+    areaId: previousAreaId,
   };
   frontendGlobals.state.areas[previousAreaId] = previous;
   const areaSelectionHandler = new AreaSelectionHandler();
@@ -48,7 +48,7 @@
   const currentAreaId = '1';
   frontendGlobals.state.currentSelection = {
     kind: 'AREA',
-    areaId: currentAreaId
+    areaId: currentAreaId,
   };
   const [hasAreaChanged, selectedArea] = areaSelectionHandler.getAreaChange();
 
@@ -75,7 +75,7 @@
   frontendGlobals.state = createEmptyState();
   frontendGlobals.state.currentSelection = {
     kind: 'AREA',
-    areaId: previousAreaId
+    areaId: previousAreaId,
   };
   frontendGlobals.state.areas[previousAreaId] = previous;
   const areaSelectionHandler = new AreaSelectionHandler();
@@ -86,7 +86,7 @@
       AreaById = {startSec: 1, endSec: 2, tracks: [], id: currentAreaId};
   frontendGlobals.state.currentSelection = {
     kind: 'AREA',
-    areaId: currentAreaId
+    areaId: currentAreaId,
   };
   frontendGlobals.state.areas[currentAreaId] = current;
   const [hasAreaChanged, selectedArea] = areaSelectionHandler.getAreaChange();
@@ -102,7 +102,7 @@
   frontendGlobals.state = createEmptyState();
   frontendGlobals.state.currentSelection = {
     kind: 'AREA',
-    areaId: previousAreaId
+    areaId: previousAreaId,
   };
   frontendGlobals.state.areas[previousAreaId] = previous;
   const areaSelectionHandler = new AreaSelectionHandler();
@@ -113,7 +113,7 @@
       AreaById = {startSec: 0, endSec: 1, tracks: [], id: currentAreaId};
   frontendGlobals.state.currentSelection = {
     kind: 'AREA',
-    areaId: currentAreaId
+    areaId: currentAreaId,
   };
   frontendGlobals.state.areas[currentAreaId] = current;
   const [hasAreaChanged, selectedArea] = areaSelectionHandler.getAreaChange();
diff --git a/ui/src/controller/args_parser.ts b/ui/src/controller/args_parser.ts
index b5e1b56..30afa1e 100644
--- a/ui/src/controller/args_parser.ts
+++ b/ui/src/controller/args_parser.ts
@@ -18,7 +18,7 @@
   ArgsTreeArray,
   ArgsTreeMap,
   isArgTreeArray,
-  isArgTreeMap
+  isArgTreeMap,
 } from '../common/arg_types';
 
 // Converts a flats sequence of key-value pairs into a JSON-like nested
@@ -133,4 +133,4 @@
   const indexStart = segment.indexOf('[');
   const indexString = segment.substring(indexStart + 1, segment.length - 1);
   return [segment.substring(0, indexStart), Math.floor(Number(indexString))];
-}
\ No newline at end of file
+}
diff --git a/ui/src/controller/chrome_proxy_record_controller.ts b/ui/src/controller/chrome_proxy_record_controller.ts
index 5ea3548..2c6571e 100644
--- a/ui/src/controller/chrome_proxy_record_controller.ts
+++ b/ui/src/controller/chrome_proxy_record_controller.ts
@@ -19,7 +19,7 @@
   ConsumerPortResponse,
   hasProperty,
   isReadBuffersResponse,
-  Typed
+  Typed,
 } from './consumer_port_types';
 import {Consumer, RpcConsumerPort} from './record_controller_interfaces';
 
diff --git a/ui/src/controller/controller.ts b/ui/src/controller/controller.ts
index 7249adb..b25fcfb 100644
--- a/ui/src/controller/controller.ts
+++ b/ui/src/controller/controller.ts
@@ -13,7 +13,7 @@
 // limitations under the License.
 
 // tslint:disable-next-line no-any
-export type ControllerAny = Controller</*StateType=*/any>;
+export type ControllerAny = Controller</* StateType=*/ any>;
 
 export interface ControllerFactory<ConstructorArgs> {
   new(args: ConstructorArgs): ControllerAny;
diff --git a/ui/src/controller/cpu_profile_controller.ts b/ui/src/controller/cpu_profile_controller.ts
index 932fb64..8bf031d 100644
--- a/ui/src/controller/cpu_profile_controller.ts
+++ b/ui/src/controller/cpu_profile_controller.ts
@@ -55,7 +55,7 @@
     this.lastSelectedSample = this.copyCpuProfileSample(selection);
 
     this.getSampleData(selectedSample.id)
-        .then(sampleData => {
+        .then((sampleData) => {
           if (sampleData !== undefined && selectedSample &&
               this.lastSelectedSample &&
               this.lastSelectedSample.id === selectedSample.id) {
@@ -154,7 +154,7 @@
       mapping: STR,
     });
 
-    const sampleData: CallsiteInfo[] = new Array();
+    const sampleData: CallsiteInfo[] = [];
     for (; it.valid(); it.next()) {
       sampleData.push({
         id: it.id,
@@ -165,7 +165,7 @@
         selfSize: 0,
         mapping: it.mapping,
         merged: false,
-        highlighted: false
+        highlighted: false,
       });
     }
 
diff --git a/ui/src/controller/flamegraph_controller.ts b/ui/src/controller/flamegraph_controller.ts
index cb74e41..13f793a 100644
--- a/ui/src/controller/flamegraph_controller.ts
+++ b/ui/src/controller/flamegraph_controller.ts
@@ -23,19 +23,19 @@
   OBJECTS_ALLOCATED_KEY,
   OBJECTS_ALLOCATED_NOT_FREED_KEY,
   PERF_SAMPLES_KEY,
-  SPACE_MEMORY_ALLOCATED_NOT_FREED_KEY
+  SPACE_MEMORY_ALLOCATED_NOT_FREED_KEY,
 } from '../common/flamegraph_util';
 import {NUM, STR} from '../common/query_result';
 import {CallsiteInfo, FlamegraphState} from '../common/state';
 import {toNs} from '../common/time';
 import {
   FlamegraphDetails,
-  globals as frontendGlobals
+  globals as frontendGlobals,
 } from '../frontend/globals';
 import {publishFlamegraphDetails} from '../frontend/publish';
 import {
   Config as PerfSampleConfig,
-  PERF_SAMPLES_PROFILE_TRACK_KIND
+  PERF_SAMPLES_PROFILE_TRACK_KIND,
 } from '../tracks/perf_samples_profile/common';
 
 import {AreaSelectionHandler} from './area_selection_handler';
@@ -123,7 +123,7 @@
         startNs: toNs(area.startSec),
         endNs: toNs(area.endSec),
         type: 'perf',
-        viewingOption: PERF_SAMPLES_KEY
+        viewingOption: PERF_SAMPLES_KEY,
       }));
     }
     const selection = frontendGlobals.state.currentFlamegraphState;
@@ -381,7 +381,7 @@
         mapping,
         merged: false,
         highlighted,
-        location
+        location,
       });
     }
     return flamegraphData;
diff --git a/ui/src/controller/flow_events_controller.ts b/ui/src/controller/flow_events_controller.ts
index a2c5bd4..ee1265a 100644
--- a/ui/src/controller/flow_events_controller.ts
+++ b/ui/src/controller/flow_events_controller.ts
@@ -21,11 +21,11 @@
 import {publishConnectedFlows, publishSelectedFlows} from '../frontend/publish';
 import {
   ACTUAL_FRAMES_SLICE_TRACK_KIND,
-  Config as ActualConfig
+  Config as ActualConfig,
 } from '../tracks/actual_frames/common';
 import {
   Config as SliceConfig,
-  SLICE_TRACK_KIND
+  SLICE_TRACK_KIND,
 } from '../tracks/chrome_slices/common';
 
 import {Controller} from './controller';
@@ -54,7 +54,7 @@
   }
 
   queryFlowEvents(query: string, callback: (flows: Flow[]) => void) {
-    this.args.engine.query(query).then(result => {
+    this.args.engine.query(query).then((result) => {
       const flows: Flow[] = [];
       const it = result.iter({
         beginSliceId: NUM,
@@ -125,7 +125,7 @@
             sliceEndTs: beginSliceEndTs,
             depth: beginDepth,
             threadName: beginThreadName,
-            processName: beginProcessName
+            processName: beginProcessName,
           },
           end: {
             trackId: endTrackId,
@@ -136,11 +136,11 @@
             sliceEndTs: endSliceEndTs,
             depth: endDepth,
             threadName: endThreadName,
-            processName: endProcessName
+            processName: endProcessName,
           },
           dur: endSliceStartTs - beginSliceEndTs,
           category,
-          name
+          name,
         });
       }
       callback(flows);
diff --git a/ui/src/controller/logs_controller.ts b/ui/src/controller/logs_controller.ts
index 66dbc6a..38cdf44 100644
--- a/ui/src/controller/logs_controller.ts
+++ b/ui/src/controller/logs_controller.ts
@@ -18,7 +18,7 @@
   LogBoundsKey,
   LogEntries,
   LogEntriesKey,
-  LogExistsKey
+  LogExistsKey,
 } from '../common/logs';
 import {NUM, STR} from '../common/query_result';
 import {fromNs, TimeSpan, toNsCeil, toNsFloor} from '../common/time';
@@ -167,7 +167,7 @@
     this.engine = args.engine;
     this.span = new TimeSpan(0, 10);
     this.pagination = new Pagination(0, 0);
-    this.hasAnyLogs().then(exists => {
+    this.hasAnyLogs().then((exists) => {
       this.hasLogs = exists;
       publishTrackData({
         id: LogExistsKey,
@@ -211,7 +211,7 @@
     // We should avoid enqueuing a request when one is in progress.
     if (needSpanUpdate) {
       this.span = newSpan;
-      updateLogBounds(this.engine, newSpan).then(data => {
+      updateLogBounds(this.engine, newSpan).then((data) => {
         if (!newSpan.equals(this.span)) return;
         publishTrackData({
           id: LogBoundsKey,
@@ -225,7 +225,7 @@
     if (needSpanUpdate || needPaginationUpdate) {
       this.pagination = requestedPagination.grow(100);
 
-      updateLogEntries(this.engine, newSpan, this.pagination).then(data => {
+      updateLogEntries(this.engine, newSpan, this.pagination).then((data) => {
         if (!this.pagination.contains(requestedPagination)) return;
         publishTrackData({
           id: LogEntriesKey,
diff --git a/ui/src/controller/permalink_controller.ts b/ui/src/controller/permalink_controller.ts
index 66cd1dd..b2f1bf2 100644
--- a/ui/src/controller/permalink_controller.ts
+++ b/ui/src/controller/permalink_controller.ts
@@ -19,7 +19,7 @@
 import {ConversionJobStatus} from '../common/conversion_jobs';
 import {
   createEmptyNonSerializableState,
-  createEmptyState
+  createEmptyState,
 } from '../common/empty_state';
 import {State} from '../common/state';
 import {STATE_VERSION} from '../common/state';
@@ -27,7 +27,7 @@
   BUCKET_NAME,
   saveState,
   saveTrace,
-  toSha256
+  toSha256,
 } from '../common/upload_utils';
 import {globals as frontendGlobals} from '../frontend/globals';
 import {publishConversionJobStatusUpdate} from '../frontend/publish';
@@ -64,7 +64,7 @@
       });
 
       PermalinkController.createPermalink(isRecordingConfig)
-          .then(hash => {
+          .then((hash) => {
             globals.dispatch(Actions.setPermalink({requestId, hash}));
           })
           .finally(() => {
@@ -78,7 +78,7 @@
 
     // Otherwise, this is a request to load the permalink.
     PermalinkController.loadState(globals.state.permalink.hash)
-        .then(stateOrConfig => {
+        .then((stateOrConfig) => {
           if (PermalinkController.isRecordConfig(stateOrConfig)) {
             // This permalink state only contains a RecordConfig. Show the
             // recording page with the config, but keep other state as-is.
@@ -152,7 +152,7 @@
         PermalinkController.updateStatus(`Uploading ${traceName}`);
         const url = await saveTrace(dataToUpload);
         // Convert state to use URLs and remove permalink.
-        uploadState = produce(globals.state, draft => {
+        uploadState = produce(globals.state, (draft) => {
           draft.engines[engine.id].source = {type: 'URL', url};
           draft.permalink = {};
         });
diff --git a/ui/src/controller/pivot_table_redux_controller.ts b/ui/src/controller/pivot_table_redux_controller.ts
index 833b7a9..9395713 100644
--- a/ui/src/controller/pivot_table_redux_controller.ts
+++ b/ui/src/controller/pivot_table_redux_controller.ts
@@ -23,11 +23,11 @@
   PivotTableReduxQuery,
   PivotTableReduxQueryMetadata,
   PivotTableReduxResult,
-  PivotTableReduxState
+  PivotTableReduxState,
 } from '../common/state';
 import {
   aggregationIndex,
-  generateQueryFromState
+  generateQueryFromState,
 } from '../frontend/pivot_table_redux_query_generator';
 
 import {Controller} from './controller';
@@ -133,7 +133,7 @@
       children: new Map(),
       rows: [],
     },
-    metadata
+    metadata,
   };
 }
 
@@ -255,4 +255,4 @@
           Actions.togglePivotTableRedux({areaId: selection.areaId}));
     }
   }
-}
\ No newline at end of file
+}
diff --git a/ui/src/controller/query_controller.ts b/ui/src/controller/query_controller.ts
index b551a11..4e9017f 100644
--- a/ui/src/controller/query_controller.ts
+++ b/ui/src/controller/query_controller.ts
@@ -36,7 +36,7 @@
       case 'init':
         const config = assertExists(globals.state.queries[this.args.queryId]);
         runQuery(this.args.queryId, config.query, this.args.engine)
-            .then(result => {
+            .then((result) => {
               console.log(`Query ${config.query} took ${result.durationMs} ms`);
               publishQueryResult({id: this.args.queryId, data: result});
               globals.dispatch(
diff --git a/ui/src/controller/record_config_types.ts b/ui/src/controller/record_config_types.ts
index 1ee3f2a..ebc112e 100644
--- a/ui/src/controller/record_config_types.ts
+++ b/ui/src/controller/record_config_types.ts
@@ -21,7 +21,7 @@
   requiredStr,
   record,
   runValidator,
-  ValidatedType
+  ValidatedType,
 } from './validators';
 
 const recordModes = ['STOP_WHEN_FULL', 'RING_BUFFER', 'LONG_TRACE'] as const;
diff --git a/ui/src/controller/record_controller.ts b/ui/src/controller/record_controller.ts
index e48c731..51a9ad2 100644
--- a/ui/src/controller/record_controller.ts
+++ b/ui/src/controller/record_controller.ts
@@ -27,7 +27,7 @@
   AdbRecordingTarget,
   isAdbTarget,
   isChromeTarget,
-  RecordingTarget
+  RecordingTarget,
 } from '../common/state';
 import {publishBufferUsage, publishTrackData} from '../frontend/publish';
 
@@ -84,7 +84,7 @@
   const msg = TraceConfig.decode(configBuffer);
   const json = msg.toJSON();
   function snakeCase(s: string): string {
-    return s.replace(/[A-Z]/g, c => '_' + c.toLowerCase());
+    return s.replace(/[A-Z]/g, (c) => '_' + c.toLowerCase());
   }
   // With the ahead of time compiled protos we can't seem to tell which
   // fields are enums.
@@ -105,7 +105,7 @@
       'maxFileSizeBytes',
       'samplingIntervalBytes',
       'shmemSizeBytes',
-      'pid'
+      'pid',
     ].includes(key);
   }
   function* message(msg: {}, indent: number): IterableIterator<string> {
@@ -199,8 +199,8 @@
         commandline,
         pbBase64: configProtoBase64,
         pbtxt: configProtoText,
-        traceConfig
-      }
+        traceConfig,
+      },
     });
 
     // If the recordingInProgress boolean state is different, it means that we
@@ -369,7 +369,7 @@
 
   private async hasSocketAccess(target: AdbRecordingTarget) {
     const devices = await navigator.usb.getDevices();
-    const device = devices.find(d => d.serialNumber === target.serial);
+    const device = devices.find((d) => d.serialNumber === target.serial);
     console.assert(device);
     if (!device) return Promise.resolve(false);
     return AdbSocketConsumerPort.hasSocketAccess(device, this.adb);
diff --git a/ui/src/controller/record_controller_jsdomtest.ts b/ui/src/controller/record_controller_jsdomtest.ts
index ef9b0fa..a41e23b 100644
--- a/ui/src/controller/record_controller_jsdomtest.ts
+++ b/ui/src/controller/record_controller_jsdomtest.ts
@@ -212,7 +212,7 @@
   config.chromeHighOverheadCategoriesSelected =
       ['disabled-by-default-cpu_profiler'];
   const decoded =
-    TraceConfig.decode(genConfigProto(config, { os: 'C', name: 'Chrome' }));
+      TraceConfig.decode(genConfigProto(config, {os: 'C', name: 'Chrome'}));
   const sources = assertExists(decoded.dataSources);
 
   const traceConfigSource = assertExists(sources[0].config);
@@ -243,7 +243,7 @@
   config.chromeHighOverheadCategoriesSelected =
       ['disabled-by-default-cpu_profiler.debug'];
   const decoded =
-    TraceConfig.decode(genConfigProto(config, { os: 'C', name: 'Chrome' }));
+      TraceConfig.decode(genConfigProto(config, {os: 'C', name: 'Chrome'}));
   const sources = assertExists(decoded.dataSources);
 
   const traceConfigSource = assertExists(sources[0].config);
diff --git a/ui/src/controller/search_controller.ts b/ui/src/controller/search_controller.ts
index 15582ff..23f27a3 100644
--- a/ui/src/controller/search_controller.ts
+++ b/ui/src/controller/search_controller.ts
@@ -128,13 +128,13 @@
     }
 
     this.updateInProgress = true;
-    const computeSummary =
-        this.update(newSearch, startNs, endNs, newResolution).then(summary => {
-          publishSearch(summary);
-        });
+    const computeSummary = this.update(newSearch, startNs, endNs, newResolution)
+                               .then((summary) => {
+                                 publishSearch(summary);
+                               });
 
     const computeResults =
-        this.specificSearch(newSearch).then(searchResults => {
+        this.specificSearch(newSearch).then((searchResults) => {
           publishSearchResult(searchResults);
         });
 
@@ -198,7 +198,7 @@
     const summary = {
       tsStarts: new Float64Array(numRows),
       tsEnds: new Float64Array(numRows),
-      count: new Uint8Array(numRows)
+      count: new Uint8Array(numRows),
     };
 
     const it = res.iter({tsStart: NUM, tsEnd: NUM, count: NUM});
diff --git a/ui/src/controller/selection_controller.ts b/ui/src/controller/selection_controller.ts
index 5676f5f..b7e9e62 100644
--- a/ui/src/controller/selection_controller.ts
+++ b/ui/src/controller/selection_controller.ts
@@ -28,7 +28,7 @@
 import {
   publishCounterDetails,
   publishSliceDetails,
-  publishThreadStateDetails
+  publishThreadStateDetails,
 } from '../frontend/publish';
 import {SLICE_TRACK_KIND} from '../tracks/chrome_slices/common';
 
@@ -83,7 +83,7 @@
 
     if (selection.kind === 'COUNTER') {
       this.counterDetails(selection.leftTs, selection.rightTs, selection.id)
-          .then(results => {
+          .then((results) => {
             if (results !== undefined && selection &&
                 selection.kind === selectedKind &&
                 selection.id === selectedId) {
@@ -206,7 +206,7 @@
       category,
       args,
       argsTree,
-      description
+      description,
     };
 
     if (trackId !== undefined) {
@@ -232,7 +232,7 @@
             FROM ${columnInfo.leafTrackTable}
             WHERE id = ${trackId};
         `)).firstRow({
-             utid: NUM
+             utid: NUM,
            }).utid;
         Object.assign(selected, await this.computeThreadDetails(utid));
       } else if (hasUpid) {
@@ -241,7 +241,7 @@
             FROM ${columnInfo.leafTrackTable}
             WHERE id = ${trackId};
         `)).firstRow({
-             upid: NUM
+             upid: NUM,
            }).upid;
         Object.assign(selected, await this.computeProcessDetails(upid));
       }
@@ -405,12 +405,12 @@
         cpu,
         id,
         utid,
-        threadStateId
+        threadStateId,
       };
       Object.assign(selected, await this.computeThreadDetails(utid));
 
       this.schedulingDetails(ts, utid)
-          .then(wakeResult => {
+          .then((wakeResult) => {
             Object.assign(selected, wakeResult);
           })
           .finally(() => {
@@ -508,7 +508,7 @@
       `)).firstRow({tid: NUM, name: STR_NULL, upid: NUM_NULL});
     const threadDetails = {
       tid: threadInfo.tid,
-      threadName: threadInfo.name || undefined
+      threadName: threadInfo.name || undefined,
     };
     if (threadInfo.upid) {
       return Object.assign(
diff --git a/ui/src/controller/trace_controller.ts b/ui/src/controller/trace_controller.ts
index 84919bf..0f9f6ac 100644
--- a/ui/src/controller/trace_controller.ts
+++ b/ui/src/controller/trace_controller.ts
@@ -12,74 +12,74 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-import { assertExists, assertTrue } from '../base/logging';
+import {assertExists, assertTrue} from '../base/logging';
 import {
   Actions,
   DeferredAction,
 } from '../common/actions';
-import { cacheTrace } from '../common/cache_manager';
-import { TRACE_MARGIN_TIME_S } from '../common/constants';
-import { Engine } from '../common/engine';
-import { featureFlags, Flag, PERF_SAMPLE_FLAG } from '../common/feature_flags';
-import { HttpRpcEngine } from '../common/http_rpc_engine';
-import { NUM, NUM_NULL, QueryError, STR, STR_NULL } from '../common/query_result';
+import {cacheTrace} from '../common/cache_manager';
+import {TRACE_MARGIN_TIME_S} from '../common/constants';
+import {Engine} from '../common/engine';
+import {featureFlags, Flag, PERF_SAMPLE_FLAG} from '../common/feature_flags';
+import {HttpRpcEngine} from '../common/http_rpc_engine';
+import {NUM, NUM_NULL, QueryError, STR, STR_NULL} from '../common/query_result';
 import {defaultTraceTime, EngineMode} from '../common/state';
-import { TimeSpan, toNs, toNsCeil, toNsFloor } from '../common/time';
-import { resetEngineWorker, WasmEngineProxy } from '../common/wasm_engine_proxy';
+import {TimeSpan, toNs, toNsCeil, toNsFloor} from '../common/time';
+import {resetEngineWorker, WasmEngineProxy} from '../common/wasm_engine_proxy';
 import {
   globals as frontendGlobals,
   QuantizedLoad,
-  ThreadDesc
+  ThreadDesc,
 } from '../frontend/globals';
 import {
   publishHasFtrace,
   publishMetricError,
   publishOverviewData,
-  publishThreads
+  publishThreads,
 } from '../frontend/publish';
-import { Router } from '../frontend/router';
+import {Router} from '../frontend/router';
 
 import {
-  CounterAggregationController
+  CounterAggregationController,
 } from './aggregation/counter_aggregation_controller';
 import {
-  CpuAggregationController
+  CpuAggregationController,
 } from './aggregation/cpu_aggregation_controller';
 import {
-  CpuByProcessAggregationController
+  CpuByProcessAggregationController,
 } from './aggregation/cpu_by_process_aggregation_controller';
 import {
-  FrameAggregationController
+  FrameAggregationController,
 } from './aggregation/frame_aggregation_controller';
 import {
-  SliceAggregationController
+  SliceAggregationController,
 } from './aggregation/slice_aggregation_controller';
 import {
-  ThreadAggregationController
+  ThreadAggregationController,
 } from './aggregation/thread_aggregation_controller';
-import { Child, Children, Controller } from './controller';
+import {Child, Children, Controller} from './controller';
 import {
   CpuProfileController,
-  CpuProfileControllerArgs
+  CpuProfileControllerArgs,
 } from './cpu_profile_controller';
 import {
   FlamegraphController,
-  FlamegraphControllerArgs
+  FlamegraphControllerArgs,
 } from './flamegraph_controller';
 import {
   FlowEventsController,
-  FlowEventsControllerArgs
+  FlowEventsControllerArgs,
 } from './flow_events_controller';
-import { globals } from './globals';
-import { LoadingManager } from './loading_manager';
-import { LogsController } from './logs_controller';
-import { MetricsController } from './metrics_controller';
+import {globals} from './globals';
+import {LoadingManager} from './loading_manager';
+import {LogsController} from './logs_controller';
+import {MetricsController} from './metrics_controller';
 import {PivotTableReduxController} from './pivot_table_redux_controller';
 import {QueryController, QueryControllerArgs} from './query_controller';
 import {SearchController} from './search_controller';
 import {
   SelectionController,
-  SelectionControllerArgs
+  SelectionControllerArgs,
 } from './selection_controller';
 import {
   TraceErrorController,
@@ -88,10 +88,10 @@
   TraceBufferStream,
   TraceFileStream,
   TraceHttpStream,
-  TraceStream
+  TraceStream,
 } from './trace_stream';
-import { TrackControllerArgs, trackControllerRegistry } from './track_controller';
-import { decideTracks } from './track_decider';
+import {TrackControllerArgs, trackControllerRegistry} from './track_controller';
+import {decideTracks} from './track_decider';
 
 type States = 'init' | 'loading_trace' | 'ready';
 
@@ -111,7 +111,7 @@
   'trace_metadata',
   'android_trusty_workqueues',
 ];
-const FLAGGED_METRICS: Array<[Flag, string]> = METRICS.map(m => {
+const FLAGGED_METRICS: Array<[Flag, string]> = METRICS.map((m) => {
   const id = `forceMetric${m}`;
   let name = m.split('_').join(' ') + ' metric';
   name = name[0].toUpperCase() + name.slice(1);
@@ -142,17 +142,17 @@
     switch (this.state) {
       case 'init':
         this.loadTrace()
-          .then(mode => {
-            globals.dispatch(Actions.setEngineReady({
-              engineId: this.engineId,
-              ready: true,
-              mode,
-            }));
-          })
-          .catch(err => {
-            this.updateStatus(`${err}`);
-            throw err;
-          });
+            .then((mode) => {
+              globals.dispatch(Actions.setEngineReady({
+                engineId: this.engineId,
+                ready: true,
+                mode,
+              }));
+            })
+            .catch((err) => {
+              this.updateStatus(`${err}`);
+              throw err;
+            });
         this.updateStatus('Opening trace');
         this.setState('loading_trace');
         break;
@@ -175,7 +175,7 @@
           if (trackCfg.engineId !== this.engineId) continue;
           if (!trackControllerRegistry.has(trackCfg.kind)) continue;
           const trackCtlFactory = trackControllerRegistry.get(trackCfg.kind);
-          const trackArgs: TrackControllerArgs = { trackId, engine };
+          const trackArgs: TrackControllerArgs = {trackId, engine};
           childControllers.push(Child(trackId, trackCtlFactory, trackArgs));
         }
 
@@ -191,49 +191,49 @@
           if (expectedEngineId !== engine.id) {
             continue;
           }
-          const queryArgs: QueryControllerArgs = { queryId, engine };
+          const queryArgs: QueryControllerArgs = {queryId, engine};
           childControllers.push(Child(queryId, QueryController, queryArgs));
         }
 
-        const selectionArgs: SelectionControllerArgs = { engine };
+        const selectionArgs: SelectionControllerArgs = {engine};
         childControllers.push(
           Child('selection', SelectionController, selectionArgs));
 
-        const flowEventsArgs: FlowEventsControllerArgs = { engine };
+        const flowEventsArgs: FlowEventsControllerArgs = {engine};
         childControllers.push(
           Child('flowEvents', FlowEventsController, flowEventsArgs));
 
-        const cpuProfileArgs: CpuProfileControllerArgs = { engine };
+        const cpuProfileArgs: CpuProfileControllerArgs = {engine};
         childControllers.push(
           Child('cpuProfile', CpuProfileController, cpuProfileArgs));
 
-        const flamegraphArgs: FlamegraphControllerArgs = { engine };
+        const flamegraphArgs: FlamegraphControllerArgs = {engine};
         childControllers.push(
           Child('flamegraph', FlamegraphController, flamegraphArgs));
         childControllers.push(Child(
-          'cpu_aggregation',
-          CpuAggregationController,
-          { engine, kind: 'cpu_aggregation' }));
+            'cpu_aggregation',
+            CpuAggregationController,
+            {engine, kind: 'cpu_aggregation'}));
         childControllers.push(Child(
-          'thread_aggregation',
-          ThreadAggregationController,
-          { engine, kind: 'thread_state_aggregation' }));
+            'thread_aggregation',
+            ThreadAggregationController,
+            {engine, kind: 'thread_state_aggregation'}));
         childControllers.push(Child(
-          'cpu_process_aggregation',
-          CpuByProcessAggregationController,
-          { engine, kind: 'cpu_by_process_aggregation' }));
+            'cpu_process_aggregation',
+            CpuByProcessAggregationController,
+            {engine, kind: 'cpu_by_process_aggregation'}));
         childControllers.push(Child(
-          'slice_aggregation',
-          SliceAggregationController,
-          { engine, kind: 'slice_aggregation' }));
+            'slice_aggregation',
+            SliceAggregationController,
+            {engine, kind: 'slice_aggregation'}));
         childControllers.push(Child(
-          'counter_aggregation',
-          CounterAggregationController,
-          { engine, kind: 'counter_aggregation' }));
+            'counter_aggregation',
+            CounterAggregationController,
+            {engine, kind: 'counter_aggregation'}));
         childControllers.push(Child(
-          'frame_aggregation',
-          FrameAggregationController,
-          { engine, kind: 'frame_aggregation' }));
+            'frame_aggregation',
+            FrameAggregationController,
+            {engine, kind: 'frame_aggregation'}));
         childControllers.push(Child('search', SearchController, {
           engine,
           app: globals,
@@ -246,8 +246,8 @@
           app: globals,
         }));
         childControllers.push(
-          Child('traceError', TraceErrorController, { engine }));
-        childControllers.push(Child('metrics', MetricsController, { engine }));
+            Child('traceError', TraceErrorController, {engine}));
+        childControllers.push(Child('metrics', MetricsController, {engine}));
 
         return childControllers;
 
@@ -277,7 +277,7 @@
       engine = new HttpRpcEngine(this.engineId, LoadingManager.getInstance);
       engine.errorHandler = (err) => {
         globals.dispatch(
-          Actions.setEngineFailed({ mode: 'HTTP_RPC', failure: `${err}` }));
+            Actions.setEngineFailed({mode: 'HTTP_RPC', failure: `${err}`}));
         throw err;
       };
     } else {
@@ -353,14 +353,14 @@
     const emptyOmniboxState = {
       omnibox: '',
       mode: frontendGlobals.state.frontendLocalState.omniboxState.mode ||
-        'SEARCH',
-      lastUpdate: Date.now() / 1000
+          'SEARCH',
+      lastUpdate: Date.now() / 1000,
     };
 
     const actions: DeferredAction[] = [
       Actions.setOmnibox(emptyOmniboxState),
-      Actions.setTraceUuid({ traceUuid }),
-      Actions.setTraceTime(traceTimeState)
+      Actions.setTraceUuid({traceUuid}),
+      Actions.setTraceTime(traceTimeState),
     ];
 
     const [startVisibleTime, endVisibleTime] =
@@ -372,7 +372,7 @@
       startSec: startVisibleTime,
       endSec: endVisibleTime,
       lastUpdate: Date.now() / 1000,
-      resolution
+      resolution,
     }));
 
     globals.dispatchMultiple(actions);
@@ -383,7 +383,7 @@
 
     {
       // When we reload from a permalink don't create extra tracks:
-      const { pinnedTracks, tracks } = globals.state;
+      const {pinnedTracks, tracks} = globals.state;
       if (!pinnedTracks.length && !Object.keys(tracks).length) {
         await this.listTracks();
       }
@@ -428,11 +428,11 @@
         order by ts desc limit 1`;
     const profile = await assertExists(this.engine).query(query);
     if (profile.numRows() !== 1) return;
-    const row = profile.firstRow({ ts: NUM, upid: NUM });
+    const row = profile.firstRow({ts: NUM, upid: NUM});
     const ts = row.ts;
     const upid = row.upid;
     globals.dispatch(
-      Actions.selectPerfSamples({ id: 0, upid, ts, type: 'perf' }));
+        Actions.selectPerfSamples({id: 0, upid, ts, type: 'perf'}));
   }
 
   private async selectFirstHeapProfile() {
@@ -444,11 +444,11 @@
         heap_graph_object) order by ts limit 1`;
     const profile = await assertExists(this.engine).query(query);
     if (profile.numRows() !== 1) return;
-    const row = profile.firstRow({ ts: NUM, type: STR, upid: NUM });
+    const row = profile.firstRow({ts: NUM, type: STR, upid: NUM});
     const ts = row.ts;
     const type = row.type;
     const upid = row.upid;
-    globals.dispatch(Actions.selectHeapProfile({ id: 0, upid, ts, type }));
+    globals.dispatch(Actions.selectHeapProfile({id: 0, upid, ts, type}));
   }
 
   private async listTracks() {
@@ -489,7 +489,7 @@
       const threadName = it.threadName;
       const procName = it.procName === null ? undefined : it.procName;
       const cmdline = it.cmdline === null ? undefined : it.cmdline;
-      threads.push({ utid, tid, threadName, pid, procName, cmdline });
+      threads.push({utid, tid, threadName, pid, procName, cmdline});
     }
     publishThreads(threads);
   }
@@ -514,11 +514,11 @@
         `where ts >= ${startNs} and ts < ${endNs} and utid != 0 ` +
         'group by cpu order by cpu');
       const schedData: { [key: string]: QuantizedLoad } = {};
-      const it = schedResult.iter({ load: NUM, cpu: NUM });
+      const it = schedResult.iter({load: NUM, cpu: NUM});
       for (; it.valid(); it.next()) {
         const load = it.load;
         const cpu = it.cpu;
-        schedData[cpu] = { startSec, endSec, load };
+        schedData[cpu] = {startSec, endSec, load};
         hasSchedOverview = true;
       }
       publishOverviewData(schedData);
@@ -549,7 +549,7 @@
          group by bucket, upid`);
 
     const slicesData: { [key: string]: QuantizedLoad[] } = {};
-    const it = sliceResult.iter({ bucket: NUM, upid: NUM, load: NUM });
+    const it = sliceResult.iter({bucket: NUM, upid: NUM, load: NUM});
     for (; it.valid(); it.next()) {
       const bucket = it.bucket;
       const upid = it.upid;
@@ -563,7 +563,7 @@
       if (loadArray === undefined) {
         loadArray = slicesData[upidStr] = [];
       }
-      loadArray.push({ startSec, endSec, load });
+      loadArray.push({startSec, endSec, load});
     }
     publishOverviewData(slicesData);
   }
@@ -576,7 +576,7 @@
       // One of the cases covered is an empty trace.
       return '';
     }
-    const traceUuid = result.firstRow({ uuid: STR }).uuid;
+    const traceUuid = result.firstRow({uuid: STR}).uuid;
     const engineConfig = assertExists(globals.state.engines[engine.id]);
     if (!(await cacheTrace(engineConfig.source, traceUuid))) {
       // If the trace is not cacheable (cacheable means it has been opened from
@@ -676,7 +676,7 @@
         let hasUpid = false;
         let hasValue = false;
         let hasGroupName = false;
-        const it = result.iter({ name: STR });
+        const it = result.iter({name: STR});
         for (; it.valid(); it.next()) {
           const name = it.name;
           hasSliceName = hasSliceName || name === 'slice_name';
@@ -725,7 +725,7 @@
               IFNULL(MAX(value), 0) as maxValue
             FROM ${metric}_event
             WHERE ${upidColumnWhere} != 0`);
-          const row = minMax.firstRow({ minValue: NUM, maxValue: NUM });
+          const row = minMax.firstRow({minValue: NUM, maxValue: NUM});
           await engine.query(`
             INSERT INTO annotation_counter_track(
               name, __metric_name, min_value, max_value, upid)
diff --git a/ui/src/controller/trace_error_controller.ts b/ui/src/controller/trace_error_controller.ts
index 6b6f461..ad491f7 100644
--- a/ui/src/controller/trace_error_controller.ts
+++ b/ui/src/controller/trace_error_controller.ts
@@ -37,7 +37,7 @@
     engine
         .query(
             `SELECT sum(value) as sumValue FROM stats WHERE severity != 'info'`)
-        .then(result => {
+        .then((result) => {
           const errors = result.firstRow({sumValue: NUM}).sumValue;
           publishTraceErrors(errors);
         });
diff --git a/ui/src/controller/track_controller.ts b/ui/src/controller/track_controller.ts
index fd6aae6..626a12a 100644
--- a/ui/src/controller/track_controller.ts
+++ b/ui/src/controller/track_controller.ts
@@ -266,7 +266,7 @@
                   visibleState.endSec + dur,
                   resolution);
             })
-            .then(data => {
+            .then((data) => {
               this.publish(data);
             })
             .finally(() => {
diff --git a/ui/src/controller/track_decider.ts b/ui/src/controller/track_decider.ts
index 3ce5353..cdb1fbb 100644
--- a/ui/src/controller/track_decider.ts
+++ b/ui/src/controller/track_decider.ts
@@ -38,14 +38,14 @@
 import {CPU_PROFILE_TRACK_KIND} from '../tracks/cpu_profile/common';
 import {CPU_SLICE_TRACK_KIND} from '../tracks/cpu_slices/common';
 import {
-  EXPECTED_FRAMES_SLICE_TRACK_KIND
+  EXPECTED_FRAMES_SLICE_TRACK_KIND,
 } from '../tracks/expected_frames/common';
 import {HEAP_PROFILE_TRACK_KIND} from '../tracks/heap_profile/common';
 import {
-  PERF_SAMPLES_PROFILE_TRACK_KIND
+  PERF_SAMPLES_PROFILE_TRACK_KIND,
 } from '../tracks/perf_samples_profile/common';
 import {
-  PROCESS_SCHEDULING_TRACK_KIND
+  PROCESS_SCHEDULING_TRACK_KIND,
 } from '../tracks/process_scheduling/common';
 import {PROCESS_SUMMARY_TRACK} from '../tracks/process_summary/common';
 import {THREAD_STATE_TRACK_KIND} from '../tracks/thread_state/common';
@@ -106,7 +106,7 @@
       pid,
       tid,
       kind,
-      threadTrack
+      threadTrack,
     } = args;
 
     const hasName = name !== undefined && name !== null && name !== '[NULL]';
@@ -177,7 +177,7 @@
         trackGroup: SCROLLING_TRACK_GROUP,
         config: {
           cpu,
-        }
+        },
       });
     }
   }
@@ -232,7 +232,7 @@
             maximumValue: maxCpuFreq,
             freqTrackId,
             idleTrackId,
-          }
+          },
         });
       }
     }
@@ -263,7 +263,7 @@
     for (; it.valid(); it.next()) {
       const name = it.name === null ? undefined : it.name;
       const rawTrackIds = it.trackIds;
-      const trackIds = rawTrackIds.split(',').map(v => Number(v));
+      const trackIds = rawTrackIds.split(',').map((v) => Number(v));
       const maxDepth = it.maxDepth;
       const kind = ASYNC_SLICE_TRACK_KIND;
       const track = {
@@ -312,7 +312,7 @@
           config: {
             trackId,
             maximumValue,
-          }
+          },
         });
       }
     }
@@ -351,7 +351,7 @@
         config: {
           name,
           trackId,
-        }
+        },
       });
     }
   }
@@ -386,7 +386,7 @@
         config: {
           name,
           trackId,
-        }
+        },
       });
     }
   }
@@ -447,7 +447,7 @@
         name: 'Android logs',
         trackKindPriority: TrackKindPriority.ORDINARY,
         trackGroup: SCROLLING_TRACK_GROUP,
-        config: {}
+        config: {},
       });
     }
   }
@@ -564,7 +564,7 @@
           trackId: id,
           minimumValue,
           maximumValue,
-        }
+        },
       });
     }
   }
@@ -612,7 +612,7 @@
         trackGroup: uuid,
         trackKindPriority:
             TrackDecider.inferTrackKindPriority(threadName, tid, pid),
-        config: {utid, tid}
+        config: {utid, tid},
       });
     }
   }
@@ -702,7 +702,7 @@
         name,
         trackKindPriority: TrackDecider.inferTrackKindPriority(threadName),
         trackGroup: uuid,
-        config: {name, trackId, startTs, endTs, tid}
+        config: {name, trackId, startTs, endTs, tid},
       });
     }
   }
@@ -736,7 +736,7 @@
       const upid = it.upid;
       const trackName = it.trackName;
       const rawTrackIds = it.trackIds;
-      const trackIds = rawTrackIds.split(',').map(v => Number(v));
+      const trackIds = rawTrackIds.split(',').map((v) => Number(v));
       const processName = it.processName;
       const pid = it.pid;
 
@@ -761,7 +761,7 @@
         config: {
           trackIds,
           maxDepth,
-        }
+        },
       });
     }
   }
@@ -798,7 +798,7 @@
       const upid = it.upid;
       const trackName = it.trackName;
       const rawTrackIds = it.trackIds;
-      const trackIds = rawTrackIds.split(',').map(v => Number(v));
+      const trackIds = rawTrackIds.split(',').map((v) => Number(v));
       const processName = it.processName;
       const pid = it.pid;
 
@@ -823,7 +823,7 @@
         config: {
           trackIds,
           maxDepth,
-        }
+        },
       });
     }
   }
@@ -861,7 +861,7 @@
       const upid = it.upid;
       const trackName = it.trackName;
       const rawTrackIds = it.trackIds;
-      const trackIds = rawTrackIds.split(',').map(v => Number(v));
+      const trackIds = rawTrackIds.split(',').map((v) => Number(v));
       const processName = it.processName;
       const pid = it.pid;
 
@@ -886,7 +886,7 @@
         config: {
           trackIds,
           maxDepth,
-        }
+        },
       });
     }
   }
@@ -946,7 +946,7 @@
         name,
         trackGroup: uuid,
         trackKindPriority,
-        config: {trackId, maxDepth, tid, isThreadSlice: onlyThreadSlice === 1}
+        config: {trackId, maxDepth, tid, isThreadSlice: onlyThreadSlice === 1},
       });
 
       if (TRACKS_V2_FLAG.get()) {
@@ -1007,7 +1007,7 @@
           trackId,
           startTs,
           endTs,
-        }
+        },
       });
     }
   }
@@ -1027,7 +1027,7 @@
         trackKindPriority: TrackKindPriority.ORDINARY,
         name: `Heap Profile`,
         trackGroup: uuid,
-        config: {upid}
+        config: {upid},
       });
     }
   }
@@ -1047,7 +1047,7 @@
         trackKindPriority: TrackKindPriority.ORDINARY,
         name: `Perf Samples`,
         trackGroup: uuid,
-        config: {upid}
+        config: {upid},
       });
     }
   }
@@ -1134,7 +1134,7 @@
       summaryTrackId,
       name: `Kernel threads`,
       id: kthreadGroupUuid,
-      collapsed: true
+      collapsed: true,
     });
     this.addTrackGroupActions.push(addTrackGroup);
 
@@ -1234,7 +1234,7 @@
       processName: STR_NULL,
       hasSched: NUM_NULL,
       hasHeapProfiles: NUM_NULL,
-      argSetId: NUM_NULL
+      argSetId: NUM_NULL,
     });
     for (; it.valid(); it.next()) {
       const utid = it.utid;
diff --git a/ui/src/controller/validators_unittest.ts b/ui/src/controller/validators_unittest.ts
index 4d54c5c..eec9aa5 100644
--- a/ui/src/controller/validators_unittest.ts
+++ b/ui/src/controller/validators_unittest.ts
@@ -20,7 +20,7 @@
   requiredStr,
   runValidator,
   ValidatedType,
-  ValidationError
+  ValidationError,
 } from './validators';
 
 const colors = ['RED', 'GREEN', 'BLUE'] as const;
@@ -32,7 +32,7 @@
   color: oneOf<Color>(colors, 'RED'),
   x: num(),
   y: num(1),
-  properties: record({mass: num(10)})
+  properties: record({mass: num(10)}),
 });
 
 type Point = ValidatedType<typeof point>;
@@ -79,7 +79,7 @@
     id: 'test',
     x: 'should not be a string',
     extra: 'should not be here',
-    properties: {mass: 'should be a number', weight: 'should not be here'}
+    properties: {mass: 'should be a number', weight: 'should not be here'},
   });
 
   expect(result.extraKeys).toContain('extra');
@@ -96,10 +96,10 @@
       nested: {
         array: [
           {id: 'point1', x: 'should not be a string'},
-          {id: 'point2', extra3: 'should not be here'}
-        ]
-      }
-    }
+          {id: 'point2', extra3: 'should not be here'},
+        ],
+      },
+    },
   });
 
   expect(result.extraKeys).toContain('extra1');
diff --git a/ui/src/engine/wasm_bridge.ts b/ui/src/engine/wasm_bridge.ts
index 79e7e65..123e92a 100644
--- a/ui/src/engine/wasm_bridge.ts
+++ b/ui/src/engine/wasm_bridge.ts
@@ -55,8 +55,8 @@
       const fn = this.connection.addFunction(this.onReply.bind(this), 'vii');
       this.reqBufferAddr = this.connection.ccall(
           'trace_processor_rpc_init',
-          /*return=*/ 'number',
-          /*args=*/['number', 'number'],
+          /* return=*/ 'number',
+          /* args=*/['number', 'number'],
           [fn, REQ_BUF_SIZE]);
     });
   }
@@ -90,7 +90,7 @@
             'trace_processor_on_rpc_request',  // C function name.
             'void',                            // Return type.
             ['number'],                        // Arg types.
-            [sliceLen]                         // Args.
+            [sliceLen],                        // Args.
         );
       } catch (err) {
         this.aborted = true;
diff --git a/ui/src/frontend/analyze_page.ts b/ui/src/frontend/analyze_page.ts
index fc16e53..307acf6 100644
--- a/ui/src/frontend/analyze_page.ts
+++ b/ui/src/frontend/analyze_page.ts
@@ -167,5 +167,5 @@
         m(QueryInput),
         m(QueryTable, {queryId: QUERY_ID}),
     );
-  }
+  },
 });
diff --git a/ui/src/frontend/android_bug_tool.ts b/ui/src/frontend/android_bug_tool.ts
index 4c86873..c36e3d8 100644
--- a/ui/src/frontend/android_bug_tool.ts
+++ b/ui/src/frontend/android_bug_tool.ts
@@ -57,7 +57,7 @@
           case WebContentScriptMessageType.CONVERT_OBJECT_URL_RESPONSE:
           if (response.attachments?.length > 0) {
             const filesBlobPromises =
-                response.attachments.map(async attachment => {
+                response.attachments.map(async (attachment) => {
                   const fileQueryResponse = await fetch(attachment.objectUrl);
                   const blob = await fileQueryResponse.blob();
                   // Note: The blob's media type is always set to "image/png".
diff --git a/ui/src/frontend/base_slice_track.ts b/ui/src/frontend/base_slice_track.ts
index 0b11366..b9e67e1 100644
--- a/ui/src/frontend/base_slice_track.ts
+++ b/ui/src/frontend/base_slice_track.ts
@@ -151,7 +151,7 @@
     // we know about (ts, dur, ...).
     const allCols = Object.keys(this.getRowSpec());
     const baseCols = Object.keys(BASE_SLICE_ROW);
-    this.extraSqlColumns = allCols.filter(key => !baseCols.includes(key));
+    this.extraSqlColumns = allCols.filter((key) => !baseCols.includes(key));
   }
 
   setSliceLayout(sliceLayout: SliceLayout) {
@@ -693,7 +693,7 @@
           c: slice.baseColor.c,
           h: slice.baseColor.h,
           s: slice.baseColor.s,
-          l: 30
+          l: 30,
         };
       } else {
         slice.color = slice.baseColor;
diff --git a/ui/src/frontend/chrome_slice_panel.ts b/ui/src/frontend/chrome_slice_panel.ts
index 71db1a4..9359652 100644
--- a/ui/src/frontend/chrome_slice_panel.ts
+++ b/ui/src/frontend/chrome_slice_panel.ts
@@ -113,7 +113,7 @@
         indentLevel: row[0],
         extraCell: row[1],
         contents: {kind: 'TableHeader', header: prefix},
-        tooltip: completePrefix
+        tooltip: completePrefix,
       });
 
       for (let i = 0; i < record.length; i++) {
@@ -145,7 +145,7 @@
             indentLevel: row[0],
             extraCell: row[1],
             contents: {kind: 'TableHeader', header: prefix},
-            tooltip: completePrefix
+            tooltip: completePrefix,
           });
           this.stack.push('whitespace');
         }
@@ -163,7 +163,7 @@
         indentLevel: row[0],
         extraCell: row[1],
         contents: {kind: 'KVPair', key: prefix, value: record},
-        tooltip: completePrefix
+        tooltip: completePrefix,
       });
     }
   }
@@ -301,7 +301,7 @@
                       // scrolling to ts.
                       verticalScrollToTrack(trackId, true);
                     },
-                    title: 'Go to destination slice'
+                    title: 'Go to destination slice',
                   },
                   'call_made')));
         }
diff --git a/ui/src/frontend/clipboard.ts b/ui/src/frontend/clipboard.ts
index 7c9a61d..453ddfc 100644
--- a/ui/src/frontend/clipboard.ts
+++ b/ui/src/frontend/clipboard.ts
@@ -48,7 +48,7 @@
     }
     lines.push(line);
   }
-  copyToClipboard(lines.map(line => line.join('\t')).join('\n'));
+  copyToClipboard(lines.map((line) => line.join('\t')).join('\n'));
 }
 
 export function download(file: File, name?: string): void {
diff --git a/ui/src/frontend/cookie_consent.ts b/ui/src/frontend/cookie_consent.ts
index 607b46f..6276ca0 100644
--- a/ui/src/frontend/cookie_consent.ts
+++ b/ui/src/frontend/cookie_consent.ts
@@ -41,7 +41,7 @@
             m('a',
               {
                 href: 'https://policies.google.com/technologies/cookies',
-                target: '_blank'
+                target: '_blank',
               },
               'More details')),
           m('button',
@@ -50,7 +50,7 @@
                 this.showCookieConsent = false;
                 localStorage.setItem(COOKIE_ACK_KEY, 'true');
                 globals.rafScheduler.scheduleFullRedraw();
-              }
+              },
             },
             'OK')),
     );
diff --git a/ui/src/frontend/details_panel.ts b/ui/src/frontend/details_panel.ts
index 8aa5dc8..c02e923 100644
--- a/ui/src/frontend/details_panel.ts
+++ b/ui/src/frontend/details_panel.ts
@@ -27,7 +27,7 @@
 import {FlamegraphDetailsPanel} from './flamegraph_panel';
 import {
   FlowEventsAreaSelectedPanel,
-  FlowEventsPanel
+  FlowEventsPanel,
 } from './flow_events_panel';
 import {globals} from './globals';
 import {LogPanel} from './logs_panel';
@@ -126,7 +126,7 @@
           {
             onclick: () => {
               globals.dispatch(Actions.setCurrentTab({tab: tab.key}));
-            }
+            },
           },
           tab.name);
     };
@@ -143,7 +143,7 @@
                 globals.rafScheduler.scheduleFullRedraw();
               },
               title: 'Open fullscreen',
-              disabled: this.isFullscreen
+              disabled: this.isFullscreen,
             },
             'vertical_align_top'),
           m('i.material-icons',
@@ -163,7 +163,7 @@
                 }
                 globals.rafScheduler.scheduleFullRedraw();
               },
-              title
+              title,
             },
             icon)));
   }
@@ -208,7 +208,7 @@
             vnode: m(NotesEditorPanel, {
               key: 'notes',
               id: curSelection.id,
-            })
+            }),
           });
           break;
         case 'AREA':
@@ -219,14 +219,14 @@
               vnode: m(NotesEditorPanel, {
                 key: 'area_notes',
                 id: curSelection.noteId,
-              })
+              }),
             });
           }
           if (globals.flamegraphDetails.isInAreaSelection) {
             detailsPanels.push({
               key: 'flamegraph_selection',
               name: 'Flamegraph Selection',
-              vnode: m(FlamegraphDetailsPanel, {key: 'flamegraph'})
+              vnode: m(FlamegraphDetailsPanel, {key: 'flamegraph'}),
             });
           }
           break;
@@ -236,7 +236,7 @@
             name: 'Current Selection',
             vnode: m(SliceDetailsPanel, {
               key: 'slice',
-            })
+            }),
           });
           break;
         case 'COUNTER':
@@ -245,7 +245,7 @@
             name: 'Current Selection',
             vnode: m(CounterDetailsPanel, {
               key: 'counter',
-            })
+            }),
           });
           break;
         case 'PERF_SAMPLES':
@@ -253,7 +253,7 @@
           detailsPanels.push({
             key: 'current_selection',
             name: 'Current Selection',
-            vnode: m(FlamegraphDetailsPanel, {key: 'flamegraph'})
+            vnode: m(FlamegraphDetailsPanel, {key: 'flamegraph'}),
           });
           break;
         case 'CPU_PROFILE_SAMPLE':
@@ -262,21 +262,21 @@
             name: 'Current Selection',
             vnode: m(CpuProfileDetailsPanel, {
               key: 'cpu_profile_sample',
-            })
+            }),
           });
           break;
         case 'CHROME_SLICE':
           detailsPanels.push({
             key: 'current_selection',
             name: 'Current Selection',
-            vnode: m(ChromeSliceDetailsPanel, {key: 'chrome_slice'})
+            vnode: m(ChromeSliceDetailsPanel, {key: 'chrome_slice'}),
           });
           break;
         case 'THREAD_STATE':
           detailsPanels.push({
             key: 'current_selection',
             name: 'Current Selection',
-            vnode: m(ThreadStatePanel, {key: 'thread_state'})
+            vnode: m(ThreadStatePanel, {key: 'thread_state'}),
           });
           break;
         default:
@@ -287,7 +287,7 @@
       detailsPanels.push({
         key: 'android_logs',
         name: 'Android Logs',
-        vnode: m(LogPanel, {key: 'logs_panel'})
+        vnode: m(LogPanel, {key: 'logs_panel'}),
       });
     }
 
@@ -305,7 +305,7 @@
       detailsPanels.push({
         key: `query_result_${queryId}`,
         name: `${name} (${count})`,
-        vnode: m(QueryTable, {key: `query_${queryId}`, queryId})
+        vnode: m(QueryTable, {key: `query_${queryId}`, queryId}),
       });
     }
 
@@ -318,8 +318,8 @@
         vnode: m(PivotTableRedux, {
           key: 'pivot_table_redux',
           selectionArea:
-              globals.state.nonSerializableState.pivotTableRedux.selectionArea
-        })
+              globals.state.nonSerializableState.pivotTableRedux.selectionArea,
+        }),
       });
     }
 
@@ -327,7 +327,7 @@
       detailsPanels.push({
         key: 'bound_flows',
         name: 'Flow Events',
-        vnode: m(FlowEventsPanel, {key: 'flow_events'})
+        vnode: m(FlowEventsPanel, {key: 'flow_events'}),
       });
     }
 
@@ -336,7 +336,7 @@
         detailsPanels.push({
           key: value.tabName,
           name: value.tabName,
-          vnode: m(AggregationPanel, {kind: key, key, data: value})
+          vnode: m(AggregationPanel, {kind: key, key, data: value}),
         });
       }
     }
@@ -346,12 +346,12 @@
       detailsPanels.push({
         key: 'selected_flows',
         name: 'Flow Events',
-        vnode: m(FlowEventsAreaSelectedPanel, {key: 'flow_events_area'})
+        vnode: m(FlowEventsAreaSelectedPanel, {key: 'flow_events_area'}),
       });
     }
 
     let currentTabDetails =
-        detailsPanels.find(tab => tab.key === globals.state.currentTab);
+        detailsPanels.find((tab) => tab.key === globals.state.currentTab);
     if (currentTabDetails === undefined && detailsPanels.length > 0) {
       currentTabDetails = detailsPanels[0];
     }
@@ -364,18 +364,18 @@
         {
           style: {
             height: `${this.detailsHeight}px`,
-            display: detailsPanels.length > 0 ? null : 'none'
-          }
+            display: detailsPanels.length > 0 ? null : 'none',
+          },
         },
         m(DragHandle, {
           resize: (height: number) => {
             this.detailsHeight = Math.max(height, DRAG_HANDLE_HEIGHT_PX);
           },
           height: this.detailsHeight,
-          tabs: detailsPanels.map(tab => {
+          tabs: detailsPanels.map((tab) => {
             return {key: tab.key, name: tab.name};
           }),
-          currentTabKey: currentTabDetails?.key
+          currentTabKey: currentTabDetails?.key,
         }),
         m('.details-panel-container.x-scrollable',
           m(PanelContainer, {doesScroll: true, panels, kind: 'DETAILS'})));
diff --git a/ui/src/frontend/drag/border_drag_strategy.ts b/ui/src/frontend/drag/border_drag_strategy.ts
index f186d1f..df450fc 100644
--- a/ui/src/frontend/drag/border_drag_strategy.ts
+++ b/ui/src/frontend/drag/border_drag_strategy.ts
@@ -40,4 +40,4 @@
     this.moveStart =
         Math.abs(x - this.pixelBounds[0]) < Math.abs(x - this.pixelBounds[1]);
   }
-}
\ No newline at end of file
+}
diff --git a/ui/src/frontend/drag/outer_drag_strategy.ts b/ui/src/frontend/drag/outer_drag_strategy.ts
index 88d127d..648b50d 100644
--- a/ui/src/frontend/drag/outer_drag_strategy.ts
+++ b/ui/src/frontend/drag/outer_drag_strategy.ts
@@ -27,4 +27,4 @@
   onDragStart(x: number) {
     this.dragStartPx = x;
   }
-}
\ No newline at end of file
+}
diff --git a/ui/src/frontend/error_dialog.ts b/ui/src/frontend/error_dialog.ts
index 26f11a0..4ee522f 100644
--- a/ui/src/frontend/error_dialog.ts
+++ b/ui/src/frontend/error_dialog.ts
@@ -91,7 +91,7 @@
           oninput: (ev: InputEvent) => {
             checked = (ev.target as HTMLInputElement).checked;
             if (checked && engine && engine.source.type === 'FILE') {
-              saveTrace(engine.source.file).then(url => {
+              saveTrace(engine.source.file).then((url) => {
                 const errMessage = createErrorMessage(errLog, checked, url);
                 renderModal(
                     errTitle, errMessage, userDescription, shareTraceSection);
@@ -151,9 +151,9 @@
         action: () => {
           window.open(
               createLink(errTitle, errMessage, userDescription), '_blank');
-        }
+        },
       },
-    ]
+    ],
   });
 }
 
@@ -221,7 +221,7 @@
         m('span', 'For details see '),
         m('a', {href: url, target: '_blank'}, url),
         ),
-    buttons: []
+    buttons: [],
   });
 }
 
@@ -243,7 +243,7 @@
             m('li', 'Ninja build log'),
             ),
         ),
-    buttons: []
+    buttons: [],
   });
 }
 
@@ -260,7 +260,7 @@
         m('span', 'For details see '),
         m('a', {href: 'http://b/159048331', target: '_blank'}, 'b/159048331'),
         ),
-    buttons: []
+    buttons: [],
   });
 }
 
@@ -273,7 +273,7 @@
         'div',
         m('span', `Please connect the device again to restart the recording.`),
         m('br')),
-    buttons: []
+    buttons: [],
   });
 }
 
@@ -289,6 +289,6 @@
         m('p', `Please refresh this tab and ensure that trace processor is used
 at most one tab at a time.`),
         ),
-    buttons: []
+    buttons: [],
   });
 }
diff --git a/ui/src/frontend/flags_page.ts b/ui/src/frontend/flags_page.ts
index 5c04d99..0b98f07 100644
--- a/ui/src/frontend/flags_page.ts
+++ b/ui/src/frontend/flags_page.ts
@@ -51,7 +51,7 @@
                 globals.rafScheduler.scheduleFullRedraw();
               },
             },
-            attrs.options.map(o => {
+            attrs.options.map((o) => {
               const selected = o.id === attrs.selected;
               return m('option', {value: o.id, selected}, o.name);
             }),
@@ -91,7 +91,7 @@
             flag.reset();
             break;
         }
-      }
+      },
     });
   }
 }
@@ -117,7 +117,7 @@
                     href: RELEASE_PROCESS_URL,
                   },
                   'Release Process'),
-                ' for more information.'
+                ' for more information.',
               ],
               options: [
                 {id: 'stable', name: 'Stable (default)'},
@@ -125,7 +125,7 @@
                 {id: 'autopush', name: 'Autopush'},
               ],
               selected: getNextChannel(),
-              onSelect: id => setChannel(id),
+              onSelect: (id) => setChannel(id),
             }),
             m('button',
               {
@@ -136,7 +136,7 @@
               },
               'Reset all below'),
 
-            featureFlags.allFlags().map(flag => m(FlagWidget, {flag})),
+            featureFlags.allFlags().map((flag) => m(FlagWidget, {flag})),
             ));
-  }
+  },
 });
diff --git a/ui/src/frontend/flamegraph.ts b/ui/src/frontend/flamegraph.ts
index afa5f7f..6cf8bf3 100644
--- a/ui/src/frontend/flamegraph.ts
+++ b/ui/src/frontend/flamegraph.ts
@@ -77,7 +77,8 @@
   }
 
   private findMaxDepth() {
-    this.maxDepth = Math.max(...this.flamegraphData.map(value => value.depth));
+    this.maxDepth =
+        Math.max(...this.flamegraphData.map((value) => value.depth));
   }
 
   // Instead of highlighting the interesting nodes, we actually want to
@@ -131,7 +132,6 @@
   draw(
       ctx: CanvasRenderingContext2D, width: number, height: number, x = 0,
       y = 0, unit = 'B') {
-
     if (this.flamegraphData === undefined) {
       return;
     }
@@ -207,14 +207,14 @@
         width,
         nextXForChildren: currentX,
         size: value.totalSize,
-        x: currentX
+        x: currentX,
       });
       // Update next x coordinate in parent.
       nodesMap.set(value.parentId, {
         width: parentNode.width,
         nextXForChildren: currentX + width,
         size: parentNode.size,
-        x: parentNode.x
+        x: parentNode.x,
       });
 
       // Draw name.
@@ -363,7 +363,7 @@
       ['', 1],
       ['K', step],
       ['M', Math.pow(step, 2)],
-      ['G', Math.pow(step, 3)]
+      ['G', Math.pow(step, 3)],
     ];
     let unitsIndex = Math.trunc(Math.log(totalSize) / Math.log(step));
     unitsIndex = unitsIndex > units.length - 1 ? units.length - 1 : unitsIndex;
@@ -418,7 +418,7 @@
 
   searchSmallest(haystack: number[], needle: number): number {
     haystack = haystack.sort((n1, n2) => n1 - n2);
-    const [left, ] = searchSegment(haystack, needle);
+    const [left] = searchSegment(haystack, needle);
     return left === -1 ? -1 : haystack[left];
   }
 
diff --git a/ui/src/frontend/flamegraph_panel.ts b/ui/src/frontend/flamegraph_panel.ts
index 774211c..4aef7fc 100644
--- a/ui/src/frontend/flamegraph_panel.ts
+++ b/ui/src/frontend/flamegraph_panel.ts
@@ -119,7 +119,7 @@
               if (this.flamegraph !== undefined) {
                 this.onMouseOut();
               }
-            }
+            },
           },
           this.maybeShowModal(flamegraphDetails.graphIncomplete),
           m('.details-panel-heading.flamegraph-profile',
@@ -152,11 +152,11 @@
                         {
                           onclick: () => {
                             this.downloadPprof();
-                          }
+                          },
                         },
                         m('i.material-icons', 'file_download'),
                         'Download profile') :
-                      null
+                      null,
                 ]),
             ]),
           m(`div[style=height:${height}px]`),
@@ -245,13 +245,13 @@
     const engine = globals.getCurrentEngine();
     if (!engine) return;
     getCurrentTrace()
-        .then(file => {
+        .then((file) => {
           assertTrue(
               this.pids.length === 1,
               'Native profiles can only contain one pid.');
           convertTraceToPprofAndDownload(file, this.pids[0], this.ts);
         })
-        .catch(error => {
+        .catch((error) => {
           throw new Error(`Failed to get current trace ${error}`);
         });
   }
@@ -298,7 +298,7 @@
         return [
           this.buildButtonComponent(
               SPACE_MEMORY_ALLOCATED_NOT_FREED_KEY, 'space'),
-          this.buildButtonComponent(OBJECTS_ALLOCATED_NOT_FREED_KEY, 'objects')
+          this.buildButtonComponent(OBJECTS_ALLOCATED_NOT_FREED_KEY, 'objects'),
         ];
       case ProfileType.NATIVE_HEAP_PROFILE:
         return [
@@ -307,7 +307,7 @@
           this.buildButtonComponent(OBJECTS_ALLOCATED_NOT_FREED_KEY, 'objects'),
           this.buildButtonComponent(
               ALLOC_SPACE_MEMORY_ALLOCATED_KEY, 'alloc space'),
-          this.buildButtonComponent(OBJECTS_ALLOCATED_KEY, 'alloc objects')
+          this.buildButtonComponent(OBJECTS_ALLOCATED_KEY, 'alloc objects'),
         ];
       default:
         throw new Error(`Unexpected profile type ${profileType}`);
@@ -327,7 +327,7 @@
           onclick: () => {
             globals.dispatch(
                 Actions.changeViewFlamegraphState({viewingOption}));
-          }
+          },
         },
         text);
   }
diff --git a/ui/src/frontend/flamegraph_unittest.ts b/ui/src/frontend/flamegraph_unittest.ts
index 87a327d..0cc463c 100644
--- a/ui/src/frontend/flamegraph_unittest.ts
+++ b/ui/src/frontend/flamegraph_unittest.ts
@@ -21,7 +21,7 @@
 
   expect(lineSplitter).toEqual({
     lines: ['Dummy t', 'ext to ', 'go to m', 'ultiple', ' lines.'],
-    lineWidth: 7
+    lineWidth: 7,
   });
 });
 
@@ -48,6 +48,6 @@
 
   expect(lineSplitter).toEqual({
     lines: ['Dummy text to g', 'o to two lines.'],
-    lineWidth: text.length / 2
+    lineWidth: text.length / 2,
   });
 });
diff --git a/ui/src/frontend/flow_events_panel.ts b/ui/src/frontend/flow_events_panel.ts
index c7783b9..529b7f0 100644
--- a/ui/src/frontend/flow_events_panel.ts
+++ b/ui/src/frontend/flow_events_panel.ts
@@ -55,7 +55,7 @@
 
     // Can happen only for flow events version 1
     const haveCategories =
-        globals.connectedFlows.filter(flow => flow.category).length > 0;
+        globals.connectedFlows.filter((flow) => flow.category).length > 0;
 
     const columns = [
       m('th', 'Direction'),
@@ -65,7 +65,7 @@
       m('th', 'Thread Out'),
       m('th', 'Thread In'),
       m('th', 'Process Out'),
-      m('th', 'Process In')
+      m('th', 'Process In'),
     ];
 
     if (haveCategories) {
@@ -76,7 +76,7 @@
     const rows = [m('tr', columns)];
 
     // Fill the table with all the directly connected flow events
-    globals.connectedFlows.forEach(flow => {
+    globals.connectedFlows.forEach((flow) => {
       if (selection.id !== flow.begin.sliceId &&
           selection.id !== flow.end.sliceId) {
         return;
@@ -101,7 +101,7 @@
         m('td.flow-link', args, flow.begin.threadName),
         m('td.flow-link', args, flow.end.threadName),
         m('td.flow-link', args, flow.begin.processName),
-        m('td.flow-link', args, flow.end.processName)
+        m('td.flow-link', args, flow.end.processName),
       ];
 
       if (haveCategories) {
@@ -114,7 +114,7 @@
 
     return m('.details-panel', [
       m('.details-panel-heading', m('h2', `Flow events`)),
-      m('.flow-events-table', m('table', rows))
+      m('.flow-events-table', m('table', rows)),
     ]);
   }
 
@@ -136,16 +136,16 @@
         m('a.warning',
           m('i.material-icons', 'warning'),
           m('.tooltip',
-            'Showing a large number of flows may impact performance.')))
+            'Showing a large number of flows may impact performance.'))),
     ];
 
     const rows = [m('tr', columns)];
 
     const categoryToFlowsNum = new Map<string, number>();
 
-    globals.selectedFlows.forEach(flow => {
+    globals.selectedFlows.forEach((flow) => {
       const categories = getFlowCategories(flow);
-      categories.forEach(cat => {
+      categories.forEach((cat) => {
         if (!categoryToFlowsNum.has(cat)) {
           categoryToFlowsNum.set(cat, 0);
         }
@@ -172,7 +172,7 @@
               globals.rafScheduler.scheduleFullRedraw();
             },
           },
-          allWasChecked ? CHECKBOX : BLANK_CHECKBOX))
+          allWasChecked ? CHECKBOX : BLANK_CHECKBOX)),
     ]));
 
     categoryToFlowsNum.forEach((num, cat) => {
@@ -192,7 +192,7 @@
                 globals.rafScheduler.scheduleFullRedraw();
               },
             },
-            wasChecked ? CHECKBOX : BLANK_CHECKBOX))
+            wasChecked ? CHECKBOX : BLANK_CHECKBOX)),
       ];
       rows.push(m('tr', data));
     });
diff --git a/ui/src/frontend/flow_events_renderer.ts b/ui/src/frontend/flow_events_renderer.ts
index 1d2a719..909dcb7 100644
--- a/ui/src/frontend/flow_events_renderer.ts
+++ b/ui/src/frontend/flow_events_renderer.ts
@@ -135,7 +135,7 @@
 
     return {
       y: Math.min(Math.max(0, y), args.canvasHeight),
-      connection: 'TRACK'
+      connection: 'TRACK',
     };
   }
 
@@ -159,11 +159,11 @@
     ctx.rect(0, 0, args.canvasWidth - TRACK_SHELL_WIDTH, args.canvasHeight);
     ctx.clip();
 
-    globals.connectedFlows.forEach(flow => {
+    globals.connectedFlows.forEach((flow) => {
       this.drawFlow(ctx, args, flow, CONNECTED_FLOW_HUE);
     });
 
-    globals.selectedFlows.forEach(flow => {
+    globals.selectedFlows.forEach((flow) => {
       const categories = getFlowCategories(flow);
       for (const cat of categories) {
         if (globals.visibleFlowCategories.get(cat) ||
@@ -204,12 +204,12 @@
     const begin = {
       x: this.getXCoordinate(flow.begin.sliceEndTs),
       y: beginYConnection.y,
-      dir: beginDir
+      dir: beginDir,
     };
     const end = {
       x: this.getXCoordinate(flow.end.sliceStartTs),
       y: endYConnection.y,
-      dir: endDir
+      dir: endDir,
     };
     const highlighted = flow.end.sliceId === globals.state.highlightedSliceId ||
         flow.begin.sliceId === globals.state.highlightedSliceId;
diff --git a/ui/src/frontend/frontend_local_state.ts b/ui/src/frontend/frontend_local_state.ts
index b09327b..bcf0937 100644
--- a/ui/src/frontend/frontend_local_state.ts
+++ b/ui/src/frontend/frontend_local_state.ts
@@ -126,7 +126,7 @@
   sendVisibleTracks() {
     if (this.prevVisibleTracks.size !== this.visibleTracks.size ||
         ![...this.prevVisibleTracks].every(
-            value => this.visibleTracks.has(value))) {
+            (value) => this.visibleTracks.has(value))) {
       globals.dispatch(
           Actions.setVisibleTracks({tracks: Array.from(this.visibleTracks)}));
       this.prevVisibleTracks = new Set(this.visibleTracks);
diff --git a/ui/src/frontend/globals.ts b/ui/src/frontend/globals.ts
index 790331a..0066ed6 100644
--- a/ui/src/frontend/globals.ts
+++ b/ui/src/frontend/globals.ts
@@ -18,7 +18,7 @@
 import {Args, ArgsTree} from '../common/arg_types';
 import {
   ConversionJobName,
-  ConversionJobStatus
+  ConversionJobStatus,
 } from '../common/conversion_jobs';
 import {createEmptyState} from '../common/empty_state';
 import {Engine} from '../common/engine';
diff --git a/ui/src/frontend/home_page.ts b/ui/src/frontend/home_page.ts
index 9cf48cf..bf2d5f3 100644
--- a/ui/src/frontend/home_page.ts
+++ b/ui/src/frontend/home_page.ts
@@ -45,7 +45,7 @@
         m('a.privacy',
           {href: 'https://policies.google.com/privacy', target: '_blank'},
           'Privacy policy'));
-  }
+  },
 });
 
 function mkChan(chan: string) {
@@ -54,7 +54,7 @@
     m(`input[type=radio][name=chan][id=chan_${chan}]${checked}`, {
       onchange: () => {
         setChannel(chan);
-      }
+      },
     }),
     m(`label[for=chan_${chan}]`, chan),
   ];
diff --git a/ui/src/frontend/index.ts b/ui/src/frontend/index.ts
index 9766f6a..d6d1937 100644
--- a/ui/src/frontend/index.ts
+++ b/ui/src/frontend/index.ts
@@ -25,7 +25,7 @@
 import {initWasm} from '../common/wasm_engine_proxy';
 import {ControllerWorkerInitMessage} from '../common/worker_messages';
 import {
-  isGetCategoriesResponse
+  isGetCategoriesResponse,
 } from '../controller/chrome_proxy_record_controller';
 import {initController} from '../controller/index';
 
@@ -105,7 +105,7 @@
     // immutable changes to the returned state.
     this.state = produce(
         this.state,
-        draft => {
+        (draft) => {
           // tslint:disable-next-line no-any
           (StateActions as any)[action.type](draft, action.args);
         },
@@ -118,7 +118,6 @@
         });
     return patches;
   }
-
 }
 
 function setExtensionAvailability(available: boolean) {
@@ -202,8 +201,8 @@
 
   // Add Error handlers for JS error and for uncaught exceptions in promises.
   setErrorHandler((err: string) => maybeShowErrorDialog(err));
-  window.addEventListener('error', e => reportError(e));
-  window.addEventListener('unhandledrejection', e => reportError(e));
+  window.addEventListener('error', (e) => reportError(e));
+  window.addEventListener('unhandledrejection', (e) => reportError(e));
 
   const controllerChannel = new MessageChannel();
   const extensionLocalChannel = new MessageChannel();
@@ -255,7 +254,7 @@
   setExtensionAvailability(extensionPort !== undefined);
 
   if (extensionPort) {
-    extensionPort.onDisconnect.addListener(_ => {
+    extensionPort.onDisconnect.addListener((_) => {
       setExtensionAvailability(false);
       // tslint:disable-next-line: no-unused-expression
       void chrome.runtime.lastError;  // Needed to not receive an error log.
diff --git a/ui/src/frontend/keyboard_event_handler.ts b/ui/src/frontend/keyboard_event_handler.ts
index 98f2433..77d6143 100644
--- a/ui/src/frontend/keyboard_event_handler.ts
+++ b/ui/src/frontend/keyboard_event_handler.ts
@@ -19,7 +19,7 @@
 import {toggleHelp} from './help_modal';
 import {
   horizontalScrollAndZoomToRange,
-  verticalScrollToTrack
+  verticalScrollToTrack,
 } from './scroll_helper';
 import {executeSearch} from './search_handler';
 
@@ -109,7 +109,7 @@
   }
 
   const boundFlows = globals.connectedFlows.filter(
-      flow => flow.begin.sliceId === sliceId && direction === 'Forward' ||
+      (flow) => flow.begin.sliceId === sliceId && direction === 'Forward' ||
           flow.end.sliceId === sliceId && direction === 'Backward');
 
   if (direction === 'Backward') {
@@ -150,7 +150,7 @@
           id: flowPoint.sliceId,
           trackId: uiTrackId,
           table: 'slice',
-          scroll: true
+          scroll: true,
         }));
       }
     }
diff --git a/ui/src/frontend/legacy_trace_viewer.ts b/ui/src/frontend/legacy_trace_viewer.ts
index abb7a85..815dbc2 100644
--- a/ui/src/frontend/legacy_trace_viewer.ts
+++ b/ui/src/frontend/legacy_trace_viewer.ts
@@ -47,7 +47,7 @@
         return resolve(reader.result);
       }
     };
-    reader.onerror = err => {
+    reader.onerror = (err) => {
       reject(err);
     };
     reader.readAsText(blob);
@@ -97,7 +97,7 @@
       return openBufferWithLegacyTraceViewer(file.name, str, str.length);
     }
   };
-  reader.onerror = err => {
+  reader.onerror = (err) => {
     console.error(err);
   };
   if (file.name.endsWith('.gz') || file.name.endsWith('.zip') ||
diff --git a/ui/src/frontend/live_reload.ts b/ui/src/frontend/live_reload.ts
index 36306ac..1f36e89 100644
--- a/ui/src/frontend/live_reload.ts
+++ b/ui/src/frontend/live_reload.ts
@@ -22,7 +22,7 @@
   if (!location.origin.startsWith('http://localhost:')) return;
 
   const monitor = new EventSource('/live_reload');
-  monitor.onmessage = msg => {
+  monitor.onmessage = (msg) => {
     const change = msg.data;
     console.log('Live reload:', change);
     changedPaths.add(change);
diff --git a/ui/src/frontend/logs_panel.ts b/ui/src/frontend/logs_panel.ts
index 2a1c664..a0b33ae 100644
--- a/ui/src/frontend/logs_panel.ts
+++ b/ui/src/frontend/logs_panel.ts
@@ -20,7 +20,7 @@
   LogBounds,
   LogBoundsKey,
   LogEntries,
-  LogEntriesKey
+  LogEntriesKey,
 } from '../common/logs';
 import {formatTimestamp} from '../common/time';
 import {TimeSpan} from '../common/time';
@@ -49,13 +49,12 @@
     this.visibleRowCount = Math.ceil(scrollContainer.clientHeight / ROW_H);
 
     if (this.visibleRowOffset !== prevOffset ||
-        this.visibleRowCount !== prevCount)
-       {
-        globals.dispatch(Actions.updateLogsPagination({
-          offset: this.visibleRowOffset,
-          count: this.visibleRowCount,
-        }));
-      }
+        this.visibleRowCount !== prevCount) {
+      globals.dispatch(Actions.updateLogsPagination({
+        offset: this.visibleRowOffset,
+        count: this.visibleRowCount,
+      }));
+    }
   }
 
   oncreate({dom}: m.CVnodeDOM) {
@@ -124,9 +123,9 @@
             m(`.row.${prioClass}`,
               {
                 'class': isStale ? 'stale' : '',
-                style: {top: `${(offset + i) * ROW_H}px`},
-                onmouseover: this.onRowOver.bind(this, ts / 1e9),
-                onmouseout: this.onRowOut.bind(this),
+                'style': {top: `${(offset + i) * ROW_H}px`},
+                'onmouseover': this.onRowOver.bind(this, ts / 1e9),
+                'onmouseout': this.onRowOut.bind(this),
               },
               m('.cell',
                 formatTimestamp(ts / 1e9 - globals.state.traceTime.startSec)),
diff --git a/ui/src/frontend/metrics_page.ts b/ui/src/frontend/metrics_page.ts
index fa85032..1eabd99 100644
--- a/ui/src/frontend/metrics_page.ts
+++ b/ui/src/frontend/metrics_page.ts
@@ -63,7 +63,7 @@
           },
         },
         availableMetrics.map(
-            metric => m('option', {value: metric, key: metric}, metric))),
+            (metric) => m('option', {value: metric, key: metric}, metric))),
       m('button.metric-run-button',
         {onclick: () => globals.dispatch(Actions.requestSelectedMetric({}))},
         'Run'),
@@ -78,5 +78,5 @@
         m(MetricPicker),
         m(MetricResult),
     );
-  }
+  },
 });
diff --git a/ui/src/frontend/named_slice_track.ts b/ui/src/frontend/named_slice_track.ts
index 90534ad..ac1ba8e 100644
--- a/ui/src/frontend/named_slice_track.ts
+++ b/ui/src/frontend/named_slice_track.ts
@@ -60,7 +60,7 @@
     // Ignore PIDs or numeric arguments when hashing.
     const name = row.name || '';
     const nameForHashing = name.replace(/\s?\d+/g, '');
-    const hsl = hslForSlice(nameForHashing, /*isSelected=*/ false);
+    const hsl = hslForSlice(nameForHashing, /* isSelected=*/ false);
     // We cache the color so we hash only once per query.
     const baseColor: Color = {c: '', h: hsl[0], s: hsl[1], l: hsl[2]};
     return {...baseSlice, title: name, baseColor};
diff --git a/ui/src/frontend/notes_panel.ts b/ui/src/frontend/notes_panel.ts
index 44489cb..4dc8d08 100644
--- a/ui/src/frontend/notes_panel.ts
+++ b/ui/src/frontend/notes_panel.ts
@@ -80,7 +80,7 @@
                   e.preventDefault();
                   globals.dispatch(
                       Actions.toggleAllTrackGroups({collapsed: !allCollapsed}));
-                }
+                },
               },
               m('i.material-icons',
                 {title: allCollapsed ? 'Expand all' : 'Collapse all'},
@@ -302,7 +302,7 @@
                 globals.dispatch(Actions.removeNote({id: attrs.id}));
                 globals.dispatch(Actions.setCurrentTab({tab: undefined}));
                 globals.rafScheduler.scheduleFullRedraw();
-              }
+              },
             },
             'Remove')),
     );
diff --git a/ui/src/frontend/overview_timeline_panel.ts b/ui/src/frontend/overview_timeline_panel.ts
index d870729..0931c24 100644
--- a/ui/src/frontend/overview_timeline_panel.ts
+++ b/ui/src/frontend/overview_timeline_panel.ts
@@ -201,7 +201,7 @@
     const vizTime = globals.frontendLocalState.getVisibleStateBounds();
     return [
       Math.floor(timeScale.timeToPx(vizTime[0])),
-      Math.ceil(timeScale.timeToPx(vizTime[1]))
+      Math.ceil(timeScale.timeToPx(vizTime[1])),
     ];
   }
 
diff --git a/ui/src/frontend/pan_and_zoom_handler.ts b/ui/src/frontend/pan_and_zoom_handler.ts
index cbbb0ae..755c79f 100644
--- a/ui/src/frontend/pan_and_zoom_handler.ts
+++ b/ui/src/frontend/pan_and_zoom_handler.ts
@@ -106,7 +106,7 @@
     onZoomed,
     editSelection,
     onSelection,
-    endSelection
+    endSelection,
   }: {
     element: HTMLElement,
     contentOffsetX: number,
diff --git a/ui/src/frontend/panel_container.ts b/ui/src/frontend/panel_container.ts
index cb64467..a2703cd 100644
--- a/ui/src/frontend/panel_container.ts
+++ b/ui/src/frontend/panel_container.ts
@@ -19,7 +19,7 @@
 import {TOPBAR_HEIGHT, TRACK_SHELL_WIDTH} from './css_constants';
 import {
   FlowEventsRenderer,
-  FlowEventsRendererArgs
+  FlowEventsRendererArgs,
 } from './flow_events_renderer';
 import {globals} from './globals';
 import {isPanelVNode, Panel, PanelSize} from './panel';
@@ -28,7 +28,7 @@
   perfDebug,
   perfDisplay,
   RunningStatistics,
-  runningStatStr
+  runningStatStr,
 } from './perf';
 import {TrackGroupAttrs} from './viewer_page';
 
@@ -264,7 +264,7 @@
           '.scroll-limiter',
           m('canvas.main-canvas'),
           ),
-      m('.panels', children)
+      m('.panels', children),
     ];
   }
 
@@ -343,7 +343,7 @@
     this.panelContainerTop = domRect.y;
     this.panelContainerHeight = domRect.height;
 
-    dom.parentElement!.querySelectorAll('.panel').forEach(panel => {
+    dom.parentElement!.querySelectorAll('.panel').forEach((panel) => {
       const key = assertExists(panel.getAttribute('data-key'));
       const vnode = assertExists(this.panelByKey.get(key));
 
@@ -356,7 +356,7 @@
         width: rect.width,
         x: rect.x,
         y: rect.y,
-        vnode
+        vnode,
       });
       this.totalPanelHeight += rect.height;
     });
@@ -506,7 +506,7 @@
         m('div',
           `${this.perfStats.totalPanels} panels, ` +
               `${this.perfStats.panelsOnCanvas} on canvas.`),
-        m('div', runningStatStr(this.perfStats.renderStats)), )];
+        m('div', runningStatStr(this.perfStats.renderStats)))];
   }
 
   private getCanvasOverdrawHeightPerSide() {
diff --git a/ui/src/frontend/perf.ts b/ui/src/frontend/perf.ts
index d884a5f..d10bd66 100644
--- a/ui/src/frontend/perf.ts
+++ b/ui/src/frontend/perf.ts
@@ -117,7 +117,7 @@
           onclick: () => globals.dispatch(Actions.togglePerfDebug({})),
         },
         m('i.material-icons', 'close')),
-      this.containers.map((c, i) => m('section', c.renderPerfStats(i)))
+      this.containers.map((c, i) => m('section', c.renderPerfStats(i))),
     ]);
   }
 }
diff --git a/ui/src/frontend/pivot_table_redux.ts b/ui/src/frontend/pivot_table_redux.ts
index 6a034a0..1eb9192 100644
--- a/ui/src/frontend/pivot_table_redux.ts
+++ b/ui/src/frontend/pivot_table_redux.ts
@@ -24,12 +24,12 @@
   PivotTableReduxAreaState,
   PivotTableReduxQuery,
   PivotTableReduxResult,
-  SortDirection
+  SortDirection,
 } from '../common/state';
 import {fromNs, timeToCode} from '../common/time';
 import {
   PivotTableReduxController,
-  PivotTree
+  PivotTree,
 } from '../controller/pivot_table_redux_controller';
 
 import {globals} from './globals';
@@ -45,7 +45,7 @@
   TableColumn,
   tableColumnEquals,
   tables,
-  threadSliceAggregationColumns
+  threadSliceAggregationColumns,
 } from './pivot_table_redux_query_generator';
 import {PopupMenuButton, PopupMenuItem} from './popup_menu';
 
@@ -100,7 +100,7 @@
             attrs.set({column: attrs.setKey, selected: target.checked}));
         globals.rafScheduler.scheduleFullRedraw();
       },
-      checked: attrs.get.has(columnKey(attrs.setKey))
+      checked: attrs.get.has(columnKey(attrs.setKey)),
     });
   }
 }
@@ -193,7 +193,7 @@
         t.name,
         m('ul',
           t.columns.map(
-              col =>
+              (col) =>
                   m('li',
                     m(ColumnSetCheckbox, {
                       get: this.selectedPivotsMap,
@@ -211,7 +211,7 @@
             onclick: () => {
               globals.dispatch(Actions.setPivotTableEditMode({editMode: true}));
               globals.rafScheduler.scheduleFullRedraw();
-            }
+            },
           },
           'Edit'),
         this.renderResultsTable(attrs));
@@ -240,7 +240,7 @@
                     PivotTableReduxController.detailsCount++}`,
                 query,
               }));
-            }
+            },
           },
           m('i.material-icons', 'arrow_right')));
   }
@@ -261,7 +261,7 @@
             onclick: () => {
               tree.isCollapsed = !tree.isCollapsed;
               globals.rafScheduler.scheduleFullRedraw();
-            }
+            },
           },
           m('i.material-icons',
             tree.isCollapsed ? 'expand_more' : 'expand_less'));
@@ -279,7 +279,7 @@
     for (let i = 0; i < path.length; i++) {
       drillFilters.push({
         value: `${path[i].nextKey}`,
-        column: result.metadata.pivotColumns[i]
+        column: result.metadata.pivotColumns[i],
       });
     }
 
@@ -375,7 +375,7 @@
         globals.dispatch(Actions.setPivotTableSortColumn({column, order}));
         globals.dispatch(
             Actions.setPivotTableQueryRequested({queryRequested: true}));
-      }
+      },
     };
   }
 
@@ -453,7 +453,7 @@
             globals.dispatch(
                 Actions.setPivotTableQueryRequested({queryRequested: true}));
           }
-        }
+        },
       }];
       if (state.queryResult.metadata.pivotColumns.length > 1) {
         items.push({
@@ -463,7 +463,7 @@
                 {column: pivot, selected: false}));
             globals.dispatch(
                 Actions.setPivotTableQueryRequested({queryRequested: true}));
-          }
+          },
         });
       }
       pivotTableHeaders.push(
@@ -474,7 +474,7 @@
 
     const aggregationTableHeaders =
         state.queryResult.metadata.aggregationColumns.map(
-            aggregation => this.renderAggregationHeaderCell(aggregation));
+            (aggregation) => this.renderAggregationHeaderCell(aggregation));
 
     return m(
         'table.query-table.pivot-table',
@@ -496,7 +496,7 @@
           onclick: () => {
             globals.dispatch(Actions.setPivotTableEditMode({editMode: false}));
             globals.rafScheduler.scheduleFullRedraw();
-          }
+          },
         },
         'Execute');
     try {
@@ -521,7 +521,7 @@
               const checkbox = e.target as HTMLInputElement;
               globals.dispatch(Actions.setPivotTableReduxConstrainToArea(
                   {constrain: checkbox.checked}));
-            }
+            },
           }),
           m('label',
             {
@@ -544,7 +544,7 @@
           m('h2', 'Pivots'),
           m('ul',
             tables.map(
-                t => this.renderTablePivotColumns(t),
+                (t) => this.renderTablePivotColumns(t),
                 ))),
         m('div',
           m('h2', 'Aggregations'),
@@ -553,11 +553,11 @@
               m(ColumnSetCheckbox, {
                 get: this.selectedAggregations,
                 set: Actions.setPivotTableAggregationSelected,
-                setKey: {kind: 'count'}
+                setKey: {kind: 'count'},
               }),
               'count'),
             ...sliceAggregationColumns.map(
-                t =>
+                (t) =>
                     m('li',
                       m(ColumnSetCheckbox, {
                         get: this.selectedAggregations,
@@ -566,7 +566,7 @@
                       }),
                       t)),
             ...threadSliceAggregationColumns.map(
-                t =>
+                (t) =>
                     m('li',
                       m(ColumnSetCheckbox, {
                         get: this.selectedAggregations,
diff --git a/ui/src/frontend/pivot_table_redux_query_generator.ts b/ui/src/frontend/pivot_table_redux_query_generator.ts
index 6d523ec..ca28bdb 100644
--- a/ui/src/frontend/pivot_table_redux_query_generator.ts
+++ b/ui/src/frontend/pivot_table_redux_query_generator.ts
@@ -18,11 +18,11 @@
 import {
   Area,
   PivotTableReduxQuery,
-  PivotTableReduxState
+  PivotTableReduxState,
 } from '../common/state';
 import {toNs} from '../common/time';
 import {
-  getSelectedTrackIds
+  getSelectedTrackIds,
 } from '../controller/aggregation/slice_aggregation_controller';
 
 import {globals} from './globals';
@@ -34,7 +34,7 @@
 
 export const sliceTable = {
   name: 'slice',
-  columns: ['type', 'ts', 'dur', 'category', 'name']
+  columns: ['type', 'ts', 'dur', 'category', 'name'],
 };
 
 // Columns of `slice` table available for aggregation.
@@ -45,7 +45,7 @@
   'thread_ts',
   'thread_dur',
   'thread_instruction_count',
-  'thread_instruction_delta'
+  'thread_instruction_delta',
 ];
 
 // List of available tables to query, used to populate selectors of pivot
@@ -61,8 +61,8 @@
       'parent_upid',
       'uid',
       'android_appid',
-      'cmdline'
-    ]
+      'cmdline',
+    ],
   },
   {name: 'thread', columns: ['type', 'name', 'tid', 'upid', 'is_main_thread']},
   {name: 'thread_track', columns: ['type', 'name', 'utid']},
@@ -222,7 +222,7 @@
     // be the base table for the pivot table query. Otherwise, `slice` is used.
     // This later is going to be controllable by a UI element.
     tableName: hasThreadSliceColumn ? 'thread_slice' : 'slice',
-    flatAggregations: allColumns
+    flatAggregations: allColumns,
   };
 }
 
@@ -300,9 +300,9 @@
       constrainToArea);
 
   const prefixedSlicePivots =
-      innerQuery.groupByColumns.map(p => `preaggregated.${p}`);
+      innerQuery.groupByColumns.map((p) => `preaggregated.${p}`);
   const renderedNonSlicePivots =
-      nonSlicePivots.map(pivot => `${pivot.table}.${pivot.column}`);
+      nonSlicePivots.map((pivot) => `${pivot.table}.${pivot.column}`);
   const totalPivotsArray = renderedNonSlicePivots.concat(prefixedSlicePivots);
   const sortCriteria =
       globals.state.nonSerializableState.pivotTableRedux.sortCriteria;
@@ -363,7 +363,7 @@
     metadata: {
       tableName: sliceTableAggregations.tableName,
       pivotColumns: (nonSlicePivots as TableColumn[]).concat(slicePivots),
-      aggregationColumns: sliceTableAggregations.flatAggregations
-    }
+      aggregationColumns: sliceTableAggregations.flatAggregations,
+    },
   };
 }
diff --git a/ui/src/frontend/popup_menu.ts b/ui/src/frontend/popup_menu.ts
index 775f21b..ccb96a2 100644
--- a/ui/src/frontend/popup_menu.ts
+++ b/ui/src/frontend/popup_menu.ts
@@ -101,19 +101,19 @@
           {
             onclick: () => {
               this.setVisible(!this.popupShown);
-            }
+            },
           },
           vnode.attrs.icon),
         m(this.popupShown ? '.popup-menu.opened' : '.popup-menu.closed',
           vnode.attrs.items.map(
-              item =>
+              (item) =>
                   m('button',
                     {
                       onclick: () => {
                         item.callback();
                         // Hide the menu item after the action has been invoked
                         this.setVisible(false);
-                      }
+                      },
                     },
                     item.text))));
   }
diff --git a/ui/src/frontend/post_message_handler.ts b/ui/src/frontend/post_message_handler.ts
index f821aed..8d00d40 100644
--- a/ui/src/frontend/post_message_handler.ts
+++ b/ui/src/frontend/post_message_handler.ts
@@ -133,7 +133,7 @@
 function sanitizePostedTrace(postedTrace: PostedTrace): PostedTrace {
   const result: PostedTrace = {
     title: sanitizeString(postedTrace.title),
-    buffer: postedTrace.buffer
+    buffer: postedTrace.buffer,
   };
   if (postedTrace.url !== undefined) {
     result.url = sanitizeString(postedTrace.url);
diff --git a/ui/src/frontend/publish.ts b/ui/src/frontend/publish.ts
index 53339c0..bcbc813 100644
--- a/ui/src/frontend/publish.ts
+++ b/ui/src/frontend/publish.ts
@@ -19,7 +19,7 @@
   LogBoundsKey,
   LogEntriesKey,
   LogExists,
-  LogExistsKey
+  LogExistsKey,
 } from '../common/logs';
 import {MetricResult} from '../common/metric_data';
 import {CurrentSearchResults, SearchSummary} from '../common/search_data';
@@ -33,7 +33,7 @@
   QuantizedLoad,
   SliceDetails,
   ThreadDesc,
-  ThreadStateDetails
+  ThreadStateDetails,
 } from './globals';
 import {findCurrentSelection} from './keyboard_event_handler';
 
@@ -153,7 +153,7 @@
 
 export function publishThreads(data: ThreadDesc[]) {
   globals.threads.clear();
-  data.forEach(thread => {
+  data.forEach((thread) => {
     globals.threads.set(thread.utid, thread);
   });
   globals.publishRedraw();
diff --git a/ui/src/frontend/query_table.ts b/ui/src/frontend/query_table.ts
index a70f9fb..9737f28 100644
--- a/ui/src/frontend/query_table.ts
+++ b/ui/src/frontend/query_table.ts
@@ -26,7 +26,7 @@
 import {Router} from './router';
 import {
   horizontalScrollAndZoomToRange,
-  verticalScrollToTrack
+  verticalScrollToTrack,
 } from './scroll_helper';
 
 interface QueryTableRowAttrs {
@@ -93,11 +93,11 @@
     return m(
         'tr',
         {
-          onclick: maybeOnClick,
+          'onclick': maybeOnClick,
           // TODO(altimin): Consider improving the logic here (e.g. delay?) to
           // account for cases when dblclick fires late.
-          ondblclick: maybeOnDblClick,
-          'clickable': containsSliceLocation
+          'ondblclick': maybeOnDblClick,
+          'clickable': containsSliceLocation,
         },
         cells);
   }
@@ -153,7 +153,7 @@
               onclick: () => {
                 globals.queryResults.delete(queryId);
                 globals.rafScheduler.scheduleFullRedraw();
-              }
+              },
             },
             'Close'),
           ),
diff --git a/ui/src/frontend/raf_scheduler.ts b/ui/src/frontend/raf_scheduler.ts
index eccf094..cdf3dad 100644
--- a/ui/src/frontend/raf_scheduler.ts
+++ b/ui/src/frontend/raf_scheduler.ts
@@ -24,7 +24,7 @@
   perfDebug,
   perfDisplay,
   RunningStatistics,
-  runningStatStr
+  runningStatStr,
 } from './perf';
 
 function statTableHeader() {
@@ -33,7 +33,7 @@
       m('th', ''),
       m('th', 'Last (ms)'),
       m('th', 'Avg (ms)'),
-      m('th', 'Avg-10 (ms)'), );
+      m('th', 'Avg-10 (ms)'));
 }
 
 function statTableRow(title: string, stat: RunningStatistics) {
@@ -42,7 +42,7 @@
       m('td', title),
       m('td', stat.last.toFixed(2)),
       m('td', stat.mean.toFixed(2)),
-      m('td', stat.bufferMean.toFixed(2)), );
+      m('td', stat.bufferMean.toFixed(2)));
 }
 
 export type ActionCallback = (nowMs: number) => void;
@@ -59,7 +59,7 @@
 export class RafScheduler {
   private actionCallbacks = new Set<ActionCallback>();
   private canvasRedrawCallbacks = new Set<RedrawCallback>();
-  private _syncDomRedraw: RedrawCallback = _ => {};
+  private _syncDomRedraw: RedrawCallback = (_) => {};
   private hasScheduledNextFrame = false;
   private requestedFullRedraw = false;
   private isRedrawing = false;
@@ -99,7 +99,7 @@
   }
 
   set domRedraw(cb: RedrawCallback|null) {
-    this._syncDomRedraw = cb || (_ => {});
+    this._syncDomRedraw = cb || ((_) => {});
   }
 
   scheduleFullRedraw() {
@@ -196,10 +196,10 @@
           statTableRow('Actions', this.perfStats.rafActions),
           statTableRow('Dom', this.perfStats.rafDom),
           statTableRow('Canvas', this.perfStats.rafCanvas),
-          statTableRow('Total', this.perfStats.rafTotal), ),
+          statTableRow('Total', this.perfStats.rafTotal)),
         m('div',
           'Dom redraw: ' +
               `Count: ${this.perfStats.domRedraw.count} | ` +
-              runningStatStr(this.perfStats.domRedraw)), );
+              runningStatStr(this.perfStats.domRedraw)));
   }
 }
diff --git a/ui/src/frontend/record_config.ts b/ui/src/frontend/record_config.ts
index a200b47..5346595 100644
--- a/ui/src/frontend/record_config.ts
+++ b/ui/src/frontend/record_config.ts
@@ -18,7 +18,7 @@
   NamedRecordConfig,
   namedRecordConfigValidator,
   RecordConfig,
-  recordConfigValidator
+  recordConfigValidator,
 } from '../controller/record_config_types';
 import {runValidator, ValidationResult} from '../controller/validators';
 
@@ -51,7 +51,7 @@
     const config: NamedRecordConfig = {
       title: savedTitle,
       config: recordConfig,
-      key: new Date().toJSON()
+      key: new Date().toJSON(),
     };
 
     this.recordConfigs.push({result: config, invalidKeys: [], extraKeys: []});
diff --git a/ui/src/frontend/record_page.ts b/ui/src/frontend/record_page.ts
index f7d3f3d..e149f08 100644
--- a/ui/src/frontend/record_page.ts
+++ b/ui/src/frontend/record_page.ts
@@ -33,12 +33,12 @@
   LoadedConfig,
   MAX_TIME,
   RecordingTarget,
-  RecordMode
+  RecordMode,
 } from '../common/state';
 import {AdbOverWebUsb} from '../controller/adb';
 import {
   createEmptyRecordConfig,
-  RecordConfig
+  RecordConfig,
 } from '../controller/record_config_types';
 
 import {globals} from './globals';
@@ -46,7 +46,7 @@
 import {
   autosaveConfigStore,
   recordConfigStore,
-  recordTargetStore
+  recordTargetStore,
 } from './record_config';
 import {
   CategoriesCheckboxList,
@@ -61,7 +61,7 @@
   Textarea,
   TextareaAttrs,
   Toggle,
-  ToggleAttrs
+  ToggleAttrs,
 } from './record_widgets';
 
 export const PERSIST_CONFIG_FLAG = featureFlags.register({
@@ -146,7 +146,7 @@
       onchange: (e: InputEvent) => {
         const checked = (e.target as HTMLInputElement).checked;
         if (!checked) return;
-        const traceCfg = produce(globals.state.recordConfig, draft => {
+        const traceCfg = produce(globals.state.recordConfig, (draft) => {
           draft.mode = mode;
         });
         globals.dispatch(Actions.setRecordConfig({config: traceCfg}));
@@ -173,7 +173,7 @@
         values: [4, 8, 16, 32, 64, 128, 256, 512],
         unit: 'MB',
         set: (cfg, val) => cfg.bufferSizeMb = val,
-        get: (cfg) => cfg.bufferSizeMb
+        get: (cfg) => cfg.bufferSizeMb,
       } as SliderAttrs),
 
       m(Slider, {
@@ -183,7 +183,7 @@
         isTime: true,
         unit: 'h:m:s',
         set: (cfg, val) => cfg.durationMs = val,
-        get: (cfg) => cfg.durationMs
+        get: (cfg) => cfg.durationMs,
       } as SliderAttrs),
       m(Slider, {
         title: 'Max file size',
@@ -192,7 +192,7 @@
         values: [5, 25, 50, 100, 500, 1000, 1000 * 5, 1000 * 10],
         unit: 'MB',
         set: (cfg, val) => cfg.maxFileSizeMb = val,
-        get: (cfg) => cfg.maxFileSizeMb
+        get: (cfg) => cfg.maxFileSizeMb,
       } as SliderAttrs),
       m(Slider, {
         title: 'Flush on disk every',
@@ -201,7 +201,7 @@
         values: [100, 250, 500, 1000, 2500, 5000],
         unit: 'ms',
         set: (cfg, val) => cfg.fileWritePeriodMs = val,
-        get: (cfg) => cfg.fileWritePeriodMs || 0
+        get: (cfg) => cfg.fileWritePeriodMs || 0,
       } as SliderAttrs));
 }
 
@@ -233,7 +233,7 @@
           img: 'rec_battery_counters.png',
           descr,
           setEnabled: (cfg, val) => cfg.batteryDrain = val,
-          isEnabled: (cfg) => cfg.batteryDrain
+          isEnabled: (cfg) => cfg.batteryDrain,
         } as ProbeAttrs,
         m(Slider, {
           title: 'Poll interval',
@@ -241,14 +241,14 @@
           values: POLL_INTERVAL_MS,
           unit: 'ms',
           set: (cfg, val) => cfg.batteryDrainPollMs = val,
-          get: (cfg) => cfg.batteryDrainPollMs
+          get: (cfg) => cfg.batteryDrainPollMs,
         } as SliderAttrs)),
       m(Probe, {
         title: 'Board voltages & frequencies',
         img: 'rec_board_voltage.png',
         descr: 'Tracks voltage and frequency changes from board sensors',
         setEnabled: (cfg, val) => cfg.boardSensors = val,
-        isEnabled: (cfg) => cfg.boardSensors
+        isEnabled: (cfg) => cfg.boardSensors,
       } as ProbeAttrs));
 }
 
@@ -260,7 +260,7 @@
         img: 'rec_cpu_freq.png',
         descr: 'Records gpu frequency via ftrace',
         setEnabled: (cfg, val) => cfg.gpuFreq = val,
-        isEnabled: (cfg) => cfg.gpuFreq
+        isEnabled: (cfg) => cfg.gpuFreq,
       } as ProbeAttrs),
       m(Probe, {
         title: 'GPU memory',
@@ -268,7 +268,7 @@
         descr: `Allows to track per process and global total GPU memory usages.
                 (Available on recent Android 12+ kernels)`,
         setEnabled: (cfg, val) => cfg.gpuMemTotal = val,
-        isEnabled: (cfg) => cfg.gpuMemTotal
+        isEnabled: (cfg) => cfg.gpuMemTotal,
       } as ProbeAttrs));
 }
 
@@ -282,7 +282,7 @@
           descr: `Lightweight polling of CPU usage counters via /proc/stat.
                     Allows to periodically monitor CPU usage.`,
           setEnabled: (cfg, val) => cfg.cpuCoarse = val,
-          isEnabled: (cfg) => cfg.cpuCoarse
+          isEnabled: (cfg) => cfg.cpuCoarse,
         } as ProbeAttrs,
         m(Slider, {
           title: 'Poll interval',
@@ -290,21 +290,21 @@
           values: POLL_INTERVAL_MS,
           unit: 'ms',
           set: (cfg, val) => cfg.cpuCoarsePollMs = val,
-          get: (cfg) => cfg.cpuCoarsePollMs
+          get: (cfg) => cfg.cpuCoarsePollMs,
         } as SliderAttrs)),
       m(Probe, {
         title: 'Scheduling details',
         img: 'rec_cpu_fine.png',
         descr: 'Enables high-detailed tracking of scheduling events',
         setEnabled: (cfg, val) => cfg.cpuSched = val,
-        isEnabled: (cfg) => cfg.cpuSched
+        isEnabled: (cfg) => cfg.cpuSched,
       } as ProbeAttrs),
       m(Probe, {
         title: 'CPU frequency and idle states',
         img: 'rec_cpu_freq.png',
         descr: 'Records cpu frequency and idle state changes via ftrace',
         setEnabled: (cfg, val) => cfg.cpuFreq = val,
-        isEnabled: (cfg) => cfg.cpuFreq
+        isEnabled: (cfg) => cfg.cpuFreq,
       } as ProbeAttrs),
       m(Probe, {
         title: 'Syscalls',
@@ -312,7 +312,7 @@
         descr: `Tracks the enter and exit of all syscalls. On Android
                 requires a userdebug or eng build.`,
         setEnabled: (cfg, val) => cfg.cpuSyscall = val,
-        isEnabled: (cfg) => cfg.cpuSyscall
+        isEnabled: (cfg) => cfg.cpuSyscall,
       } as ProbeAttrs));
 }
 
@@ -326,7 +326,7 @@
     5 * 60 * 1000,
     10 * 60 * 1000,
     30 * 60 * 1000,
-    60 * 60 * 1000
+    60 * 60 * 1000,
   ];
   const valuesForShMemBuff = [
     0,
@@ -345,7 +345,7 @@
     64 * 1024 * 1024,
     128 * 1024 * 1024,
     256 * 1024 * 1024,
-    512 * 1024 * 1024
+    512 * 1024 * 1024,
   ];
 
   return m(
@@ -359,20 +359,20 @@
             'com.google.android.apps.photos\n' +
             '1503',
         set: (cfg, val) => cfg.hpProcesses = val,
-        get: (cfg) => cfg.hpProcesses
+        get: (cfg) => cfg.hpProcesses,
       } as TextareaAttrs),
       m(Slider, {
         title: 'Sampling interval',
         cssClass: '.thin',
         values: [
-          0,     1,     2,      4,      8,      16,     32,   64,
-          128,   256,   512,    1024,   2048,   4096,   8192, 16384,
-          32768, 65536, 131072, 262144, 524288, 1048576
+          0,     1,     2,      4,      8,      16,      32,   64,
+          128,   256,   512,    1024,   2048,   4096,    8192, 16384,
+          32768, 65536, 131072, 262144, 524288, 1048576,
         ],
         unit: 'B',
         min: 0,
         set: (cfg, val) => cfg.hpSamplingIntervalBytes = val,
-        get: (cfg) => cfg.hpSamplingIntervalBytes
+        get: (cfg) => cfg.hpSamplingIntervalBytes,
       } as SliderAttrs),
       m(Slider, {
         title: 'Continuous dumps interval ',
@@ -384,7 +384,7 @@
         set: (cfg, val) => {
           cfg.hpContinuousDumpsInterval = val;
         },
-        get: (cfg) => cfg.hpContinuousDumpsInterval
+        get: (cfg) => cfg.hpContinuousDumpsInterval,
       } as SliderAttrs),
       m(Slider, {
         title: 'Continuous dumps phase',
@@ -398,24 +398,24 @@
         min: 0,
         disabled: globals.state.recordConfig.hpContinuousDumpsInterval === 0,
         set: (cfg, val) => cfg.hpContinuousDumpsPhase = val,
-        get: (cfg) => cfg.hpContinuousDumpsPhase
+        get: (cfg) => cfg.hpContinuousDumpsPhase,
       } as SliderAttrs),
       m(Slider, {
         title: `Shared memory buffer`,
         cssClass: '.thin',
         values: valuesForShMemBuff.filter(
-            value => value === 0 || value >= 8192 && value % 4096 === 0),
+            (value) => value === 0 || value >= 8192 && value % 4096 === 0),
         unit: 'B',
         min: 0,
         set: (cfg, val) => cfg.hpSharedMemoryBuffer = val,
-        get: (cfg) => cfg.hpSharedMemoryBuffer
+        get: (cfg) => cfg.hpSharedMemoryBuffer,
       } as SliderAttrs),
       m(Toggle, {
         title: 'Block client',
         cssClass: '.thin',
         descr: `Slow down target application if profiler cannot keep up.`,
         setEnabled: (cfg, val) => cfg.hpBlockClient = val,
-        isEnabled: (cfg) => cfg.hpBlockClient
+        isEnabled: (cfg) => cfg.hpBlockClient,
       } as ToggleAttrs),
       m(Toggle, {
         title: 'All custom allocators (Q+)',
@@ -423,8 +423,8 @@
         descr: `If the target application exposes custom allocators, also
 sample from those.`,
         setEnabled: (cfg, val) => cfg.hpAllHeaps = val,
-        isEnabled: (cfg) => cfg.hpAllHeaps
-      } as ToggleAttrs)
+        isEnabled: (cfg) => cfg.hpAllHeaps,
+      } as ToggleAttrs),
       // TODO(hjd): Add advanced options.
   );
 }
@@ -439,7 +439,7 @@
     5 * 60 * 1000,
     10 * 60 * 1000,
     30 * 60 * 1000,
-    60 * 60 * 1000
+    60 * 60 * 1000,
   ];
 
   return m(
@@ -450,7 +450,7 @@
             'com.android.vending\n' +
             '1503',
         set: (cfg, val) => cfg.jpProcesses = val,
-        get: (cfg) => cfg.jpProcesses
+        get: (cfg) => cfg.jpProcesses,
       } as TextareaAttrs),
       m(Slider, {
         title: 'Continuous dumps interval ',
@@ -462,7 +462,7 @@
         set: (cfg, val) => {
           cfg.jpContinuousDumpsInterval = val;
         },
-        get: (cfg) => cfg.jpContinuousDumpsInterval
+        get: (cfg) => cfg.jpContinuousDumpsInterval,
       } as SliderAttrs),
       m(Slider, {
         title: 'Continuous dumps phase',
@@ -476,7 +476,7 @@
         min: 0,
         disabled: globals.state.recordConfig.jpContinuousDumpsInterval === 0,
         set: (cfg, val) => cfg.jpContinuousDumpsPhase = val,
-        get: (cfg) => cfg.jpContinuousDumpsPhase
+        get: (cfg) => cfg.jpContinuousDumpsPhase,
       } as SliderAttrs),
   );
 }
@@ -505,7 +505,7 @@
           descr: `Track native heap allocations & deallocations of an Android
                process. (Available on Android 10+)`,
           setEnabled: (cfg, val) => cfg.heapProfiling = val,
-          isEnabled: (cfg) => cfg.heapProfiling
+          isEnabled: (cfg) => cfg.heapProfiling,
         } as ProbeAttrs,
         HeapSettings(cssClass)),
       m(Probe,
@@ -515,7 +515,7 @@
           descr: `Dump information about the Java object graph of an
           Android app. (Available on Android 11+)`,
           setEnabled: (cfg, val) => cfg.javaHeapDump = val,
-          isEnabled: (cfg) => cfg.javaHeapDump
+          isEnabled: (cfg) => cfg.javaHeapDump,
         } as ProbeAttrs,
         JavaHeapDumpSettings(cssClass)),
       m(Probe,
@@ -524,7 +524,7 @@
           img: 'rec_meminfo.png',
           descr: 'Polling of /proc/meminfo',
           setEnabled: (cfg, val) => cfg.meminfo = val,
-          isEnabled: (cfg) => cfg.meminfo
+          isEnabled: (cfg) => cfg.meminfo,
         } as ProbeAttrs,
         m(Slider, {
           title: 'Poll interval',
@@ -532,14 +532,14 @@
           values: POLL_INTERVAL_MS,
           unit: 'ms',
           set: (cfg, val) => cfg.meminfoPeriodMs = val,
-          get: (cfg) => cfg.meminfoPeriodMs
+          get: (cfg) => cfg.meminfoPeriodMs,
         } as SliderAttrs),
         m(Dropdown, {
           title: 'Select counters',
           cssClass: '.multicolumn',
           options: meminfoOpts,
           set: (cfg, val) => cfg.meminfoCounters = val,
-          get: (cfg) => cfg.meminfoCounters
+          get: (cfg) => cfg.meminfoCounters,
         } as DropdownAttrs)),
       m(Probe, {
         title: 'High-frequency memory events',
@@ -548,7 +548,7 @@
                 ftrace's mm_event, rss_stat and ion events. Available only
                 on recent Android Q+ kernels`,
         setEnabled: (cfg, val) => cfg.memHiFreq = val,
-        isEnabled: (cfg) => cfg.memHiFreq
+        isEnabled: (cfg) => cfg.memHiFreq,
       } as ProbeAttrs),
       m(Probe, {
         title: 'Low memory killer',
@@ -557,7 +557,7 @@
                 and the newer userspace lmkd. It also tracks OOM score
                 adjustments.`,
         setEnabled: (cfg, val) => cfg.memLmk = val,
-        isEnabled: (cfg) => cfg.memLmk
+        isEnabled: (cfg) => cfg.memLmk,
       } as ProbeAttrs),
       m(Probe,
         {
@@ -567,7 +567,7 @@
                     their thread list, memory counters (RSS, swap and other
                     /proc/status counters) and oom_score_adj.`,
           setEnabled: (cfg, val) => cfg.procStats = val,
-          isEnabled: (cfg) => cfg.procStats
+          isEnabled: (cfg) => cfg.procStats,
         } as ProbeAttrs,
         m(Slider, {
           title: 'Poll interval',
@@ -575,7 +575,7 @@
           values: POLL_INTERVAL_MS,
           unit: 'ms',
           set: (cfg, val) => cfg.procStatsPeriodMs = val,
-          get: (cfg) => cfg.procStatsPeriodMs
+          get: (cfg) => cfg.procStatsPeriodMs,
         } as SliderAttrs)),
       m(Probe,
         {
@@ -585,7 +585,7 @@
                     Allows to gather statistics about swap, eviction,
                     compression and pagecache efficiency`,
           setEnabled: (cfg, val) => cfg.vmstat = val,
-          isEnabled: (cfg) => cfg.vmstat
+          isEnabled: (cfg) => cfg.vmstat,
         } as ProbeAttrs,
         m(Slider, {
           title: 'Poll interval',
@@ -593,14 +593,14 @@
           values: POLL_INTERVAL_MS,
           unit: 'ms',
           set: (cfg, val) => cfg.vmstatPeriodMs = val,
-          get: (cfg) => cfg.vmstatPeriodMs
+          get: (cfg) => cfg.vmstatPeriodMs,
         } as SliderAttrs),
         m(Dropdown, {
           title: 'Select counters',
           cssClass: '.multicolumn',
           options: vmstatOpts,
           set: (cfg, val) => cfg.vmstatCounters = val,
-          get: (cfg) => cfg.vmstatCounters
+          get: (cfg) => cfg.vmstatCounters,
         } as DropdownAttrs)));
 }
 
@@ -630,14 +630,14 @@
           descr: `Enables C++ / Java codebase annotations (ATRACE_BEGIN() /
                     os.Trace())`,
           setEnabled: (cfg, val) => cfg.atrace = val,
-          isEnabled: (cfg) => cfg.atrace
+          isEnabled: (cfg) => cfg.atrace,
         } as ProbeAttrs,
         m(Dropdown, {
           title: 'Categories',
           cssClass: '.multicolumn.atrace-categories',
           options: ATRACE_CATEGORIES,
           set: (cfg, val) => cfg.atraceCats = val,
-          get: (cfg) => cfg.atraceCats
+          get: (cfg) => cfg.atraceCats,
         } as DropdownAttrs),
         m(Toggle, {
           title: 'Record events from all Android apps and services',
@@ -653,14 +653,14 @@
           descr: `Streams the event log into the trace. If no buffer filter is
                     specified, all buffers are selected.`,
           setEnabled: (cfg, val) => cfg.androidLogs = val,
-          isEnabled: (cfg) => cfg.androidLogs
+          isEnabled: (cfg) => cfg.androidLogs,
         } as ProbeAttrs,
         m(Dropdown, {
           title: 'Buffers',
           cssClass: '.multicolumn',
           options: LOG_BUFFERS,
           set: (cfg, val) => cfg.androidLogBuffers = val,
-          get: (cfg) => cfg.androidLogBuffers
+          get: (cfg) => cfg.androidLogBuffers,
         } as DropdownAttrs)),
       m(Probe, {
         title: 'Frame timeline',
@@ -668,7 +668,7 @@
         descr: `Records expected/actual frame timings from surface_flinger.
                     Requires Android 12 (S) or above.`,
         setEnabled: (cfg, val) => cfg.androidFrameTimeline = val,
-        isEnabled: (cfg) => cfg.androidFrameTimeline
+        isEnabled: (cfg) => cfg.androidFrameTimeline,
       } as ProbeAttrs));
 }
 
@@ -684,37 +684,37 @@
       CompactProbe({
         title: 'IPC flows',
         setEnabled: (cfg, val) => cfg.ipcFlows = val,
-        isEnabled: (cfg) => cfg.ipcFlows
+        isEnabled: (cfg) => cfg.ipcFlows,
       }),
       CompactProbe({
         title: 'Javascript execution',
         setEnabled: (cfg, val) => cfg.jsExecution = val,
-        isEnabled: (cfg) => cfg.jsExecution
+        isEnabled: (cfg) => cfg.jsExecution,
       }),
       CompactProbe({
         title: 'Web content rendering, layout and compositing',
         setEnabled: (cfg, val) => cfg.webContentRendering = val,
-        isEnabled: (cfg) => cfg.webContentRendering
+        isEnabled: (cfg) => cfg.webContentRendering,
       }),
       CompactProbe({
         title: 'UI rendering & surface compositing',
         setEnabled: (cfg, val) => cfg.uiRendering = val,
-        isEnabled: (cfg) => cfg.uiRendering
+        isEnabled: (cfg) => cfg.uiRendering,
       }),
       CompactProbe({
         title: 'Input events',
         setEnabled: (cfg, val) => cfg.inputEvents = val,
-        isEnabled: (cfg) => cfg.inputEvents
+        isEnabled: (cfg) => cfg.inputEvents,
       }),
       CompactProbe({
         title: 'Navigation & Loading',
         setEnabled: (cfg, val) => cfg.navigationAndLoading = val,
-        isEnabled: (cfg) => cfg.navigationAndLoading
+        isEnabled: (cfg) => cfg.navigationAndLoading,
       }),
       CompactProbe({
         title: 'Chrome Logs',
         setEnabled: (cfg, val) => cfg.chromeLogs = val,
-        isEnabled: (cfg) => cfg.chromeLogs
+        isEnabled: (cfg) => cfg.chromeLogs,
       }),
       ChromeCategoriesSelection());
 }
@@ -731,7 +731,7 @@
   const defaultCategories = new Map<string, string>();
   const disabledByDefaultCategories = new Map<string, string>();
   const disabledPrefix = 'disabled-by-default-';
-  categories.forEach(cat => {
+  categories.forEach((cat) => {
     if (cat.startsWith(disabledPrefix)) {
       disabledByDefaultCategories.set(cat, cat.replace(disabledPrefix, ''));
     } else {
@@ -766,7 +766,7 @@
                   module. The events enabled here are in addition to those from
                   enabled by other probes.`,
           setEnabled: (cfg, val) => cfg.ftrace = val,
-          isEnabled: (cfg) => cfg.ftrace
+          isEnabled: (cfg) => cfg.ftrace,
         } as ProbeAttrs,
         m(Toggle, {
           title: 'Resolve kernel symbols',
@@ -774,7 +774,7 @@
           descr: `Enables lookup via /proc/kallsyms for workqueue,
               sched_blocked_reason and other events (userdebug/eng builds only).`,
           setEnabled: (cfg, val) => cfg.symbolizeKsyms = val,
-          isEnabled: (cfg) => cfg.symbolizeKsyms
+          isEnabled: (cfg) => cfg.symbolizeKsyms,
         } as ToggleAttrs),
         m(Slider, {
           title: 'Buf size',
@@ -783,7 +783,7 @@
           unit: 'KB',
           zeroIsDefault: true,
           set: (cfg, val) => cfg.ftraceBufferSizeKb = val,
-          get: (cfg) => cfg.ftraceBufferSizeKb
+          get: (cfg) => cfg.ftraceBufferSizeKb,
         } as SliderAttrs),
         m(Slider, {
           title: 'Drain rate',
@@ -792,21 +792,21 @@
           unit: 'ms',
           zeroIsDefault: true,
           set: (cfg, val) => cfg.ftraceDrainPeriodMs = val,
-          get: (cfg) => cfg.ftraceDrainPeriodMs
+          get: (cfg) => cfg.ftraceDrainPeriodMs,
         } as SliderAttrs),
         m(Dropdown, {
           title: 'Event groups',
           cssClass: '.multicolumn.ftrace-events',
           options: FTRACE_CATEGORIES,
           set: (cfg, val) => cfg.ftraceEvents = val,
-          get: (cfg) => cfg.ftraceEvents
+          get: (cfg) => cfg.ftraceEvents,
         } as DropdownAttrs),
         m(Textarea, {
           placeholder: 'Add extra events, one per line, e.g.:\n' +
               'sched/sched_switch\n' +
               'kmem/*',
           set: (cfg, val) => cfg.ftraceExtraEvents = val,
-          get: (cfg) => cfg.ftraceExtraEvents
+          get: (cfg) => cfg.ftraceExtraEvents,
         } as TextareaAttrs)));
 }
 
@@ -837,8 +837,8 @@
   }
 
   const selectedIndex = isAdbTarget(recordingTarget) ?
-      targets.findIndex(node => node.attrs.value === recordingTarget.serial) :
-      targets.findIndex(node => node.attrs.value === recordingTarget.os);
+      targets.findIndex((node) => node.attrs.value === recordingTarget.serial) :
+      targets.findIndex((node) => node.attrs.value === recordingTarget.os);
 
   return m(
       '.target',
@@ -861,7 +861,7 @@
                 // select's options at that time, we have to reselect the
                 // correct index here after any new children were added.
                 (select.dom as HTMLSelectElement).selectedIndex = selectedIndex;
-              }
+              },
             },
             ...targets),
           ),
@@ -874,8 +874,8 @@
 // |target| can be the TargetOs or the android serial.
 function onTargetChange(target: string) {
   const recordingTarget: RecordingTarget =
-      globals.state.availableAdbDevices.find(d => d.serial === target) ||
-      getDefaultRecordingTargets().find(t => t.os === target) ||
+      globals.state.availableAdbDevices.find((d) => d.serial === target) ||
+      getDefaultRecordingTargets().find((t) => t.os === target) ||
       getDefaultRecordingTargets()[0];
 
   if (isChromeTarget(recordingTarget)) {
@@ -925,7 +925,7 @@
         onclick: () => {
           globals.dispatch(Actions.setRecordConfig({config, configType}));
           globals.rafScheduler.scheduleFullRedraw();
-        }
+        },
       },
       m('i.material-icons', 'file_upload'));
 }
@@ -953,11 +953,11 @@
               recordConfigStore.overwrite(globals.state.recordConfig, item.key);
               globals.dispatch(Actions.setRecordConfig({
                 config: item.config,
-                configType: {type: 'NAMED', name: item.title}
+                configType: {type: 'NAMED', name: item.title},
               }));
               globals.rafScheduler.scheduleFullRedraw();
             }
-          }
+          },
         },
         m('i.material-icons', 'save')),
       m('button',
@@ -967,7 +967,7 @@
           onclick: () => {
             recordConfigStore.delete(item.key);
             globals.rafScheduler.scheduleFullRedraw();
-          }
+          },
         },
         m('i.material-icons', 'delete')),
     ]));
@@ -1002,7 +1002,7 @@
   },
   clearTitle: () => {
     ConfigTitleState.title = '';
-  }
+  },
 };
 
 export function Configurations(cssClass: string) {
@@ -1018,7 +1018,7 @@
             oninput() {
               ConfigTitleState.setTitle(this.value);
               globals.rafScheduler.scheduleFullRedraw();
-            }
+            },
           }),
           m('button',
             {
@@ -1031,7 +1031,7 @@
                     globals.state.recordConfig, ConfigTitleState.getTitle());
                 globals.rafScheduler.scheduleFullRedraw();
                 ConfigTitleState.clearTitle();
-              }
+              },
             },
             m('i.material-icons', 'save')),
           m('button',
@@ -1044,13 +1044,13 @@
                         'Are you sure?')) {
                   globals.dispatch(Actions.setRecordConfig({
                     config: createEmptyRecordConfig(),
-                    configType: {type: 'NONE'}
+                    configType: {type: 'NONE'},
                   }));
                   globals.rafScheduler.scheduleFullRedraw();
                 }
-              }
+              },
             },
-            m('i.material-icons', 'delete_forever'))
+            m('i.material-icons', 'delete_forever')),
         ]),
       displayRecordConfigs());
 }
@@ -1217,7 +1217,7 @@
       m(`button`,
         {
           class: recInProgress ? '' : 'selected',
-          onclick: onStartRecordingPressed
+          onclick: onStartRecordingPressed,
         },
         'Start Recording');
 
@@ -1312,7 +1312,7 @@
   let recordingTarget: AdbRecordingTarget|undefined = undefined;
 
   const availableAdbDevices: AdbRecordingTarget[] = [];
-  devices.forEach(d => {
+  devices.forEach((d) => {
     if (d.productName && d.serialNumber) {
       // TODO(nicomazz): At this stage, we can't know the OS version, so we
       // assume it is 'Q'. This can create problems with devices with an old
@@ -1342,8 +1342,8 @@
   const deviceConnected = isAdbTarget(recordingTarget);
   const connectedDeviceDisconnected = deviceConnected &&
       availableAdbDevices.find(
-          e => e.serial === (recordingTarget as AdbRecordingTarget).serial) ===
-          undefined;
+          (e) => e.serial ===
+              (recordingTarget as AdbRecordingTarget).serial) === undefined;
 
   if (availableAdbDevices.length) {
     // If there's an Android device available and the current selection isn't
@@ -1432,7 +1432,7 @@
       '.record-menu',
       {
         class: recInProgress ? 'disabled' : '',
-        onclick: () => globals.rafScheduler.scheduleFullRedraw()
+        onclick: () => globals.rafScheduler.scheduleFullRedraw(),
       },
       m('header', 'Trace config'),
       m('ul',
@@ -1451,7 +1451,7 @@
               {
                 onclick: () => {
                   recordConfigStore.reloadFromLocalStorage();
-                }
+                },
               },
               m(`li${routePage === 'config' ? '.active' : ''}`,
                 m('i.material-icons', 'save'),
@@ -1493,5 +1493,5 @@
         '.record-page',
         globals.state.recordingInProgress ? m('.hider') : [],
         m('.record-container', RecordHeader(), recordMenu(routePage), pages));
-  }
+  },
 });
diff --git a/ui/src/frontend/record_page_v2.ts b/ui/src/frontend/record_page_v2.ts
index 75d819c..29c9466 100644
--- a/ui/src/frontend/record_page_v2.ts
+++ b/ui/src/frontend/record_page_v2.ts
@@ -20,19 +20,19 @@
 import {TRACE_SUFFIX} from '../common/constants';
 import {
   genTraceConfig,
-  RecordingConfigUtils
+  RecordingConfigUtils,
 } from '../common/recordingV2/recording_config_utils';
 import {
   OnTargetChangedCallback,
   RecordingTargetV2,
   TargetInfo,
-  TracingSession
+  TracingSession,
 } from '../common/recordingV2/recording_interfaces_v2';
 import {
-  ANDROID_WEBUSB_TARGET_FACTORY
+  ANDROID_WEBUSB_TARGET_FACTORY,
 } from '../common/recordingV2/target_factories/android_webusb_target_factory';
 import {
-  targetFactoryRegistry
+  targetFactoryRegistry,
 } from '../common/recordingV2/target_factory_registry';
 import {hasActiveProbes} from '../common/state';
 
@@ -51,7 +51,7 @@
   PERSIST_CONFIG_FLAG,
   PowerSettings,
   RecordingStatusLabel,
-  RecSettings
+  RecSettings,
 } from './record_page';
 import {CodeSnippet} from './record_widgets';
 
@@ -111,7 +111,7 @@
               // select's options at that time, we have to reselect the
               // correct index here after any new children were added.
               (select.dom as HTMLSelectElement).selectedIndex = selectedIndex;
-            }
+            },
           },
           ...targets),
         ));
@@ -140,7 +140,7 @@
 function onTargetChange(targetName: string): void {
   const allTargets = targetFactoryRegistry.listTargets();
   recordingTargetV2 =
-      allTargets.find(t => t.getInfo().name === targetName) || allTargets[0];
+      allTargets.find((t) => t.getInfo().name === targetName) || allTargets[0];
   globals.rafScheduler.scheduleFullRedraw();
 }
 
@@ -167,7 +167,7 @@
 function BufferUsageProgressBar() {
   if (!tracingSession) return [];
 
-  tracingSession.then(session => session.getTraceBufferUsage())
+  tracingSession.then((session) => session.getTraceBufferUsage())
       .then((percentage) => {
         publishBufferUsage({percentage});
       });
@@ -237,7 +237,7 @@
     notes.push(msgZeroProbes);
   }
 
-  targetFactoryRegistry.listRecordingProblems().map(recordingProblem => {
+  targetFactoryRegistry.listRecordingProblems().map((recordingProblem) => {
     notes.push(m('.note', recordingProblem));
   });
 
@@ -323,7 +323,7 @@
       m(`button`,
         {
           class: tracingSession ? '' : 'selected',
-          onclick: onStartRecordingPressed
+          onclick: onStartRecordingPressed,
         },
         'Start Recording');
 
@@ -346,7 +346,7 @@
       m(`button.selected`,
         {
           onclick: async () => {
-            assertExists(tracingSession).then(async session => {
+            assertExists(tracingSession).then(async (session) => {
               // If this tracing session is not the one currently in focus,
               // then we interpret 'Stop' as 'Cancel'. Otherwise, this
               // trace will be processed and rendered even though the user
@@ -359,7 +359,7 @@
             });
             tracingSession = undefined;
             globals.dispatch(Actions.setRecordingStatus({status: undefined}));
-          }
+          },
         },
         'Stop');
 
@@ -367,12 +367,12 @@
       m(`button`,
         {
           onclick: async () => {
-            assertExists(tracingSession).then(session => session.cancel());
+            assertExists(tracingSession).then((session) => session.cancel());
             tracingSession = undefined;
             globals.dispatch(
                 Actions.setLastRecordingError({error: 'Recording cancelled.'}));
             publishBufferUsage({percentage: 0});
-          }
+          },
         },
         'Cancel');
 
@@ -505,7 +505,7 @@
       '.record-menu',
       {
         class: tracingSession ? 'disabled' : '',
-        onclick: () => globals.rafScheduler.scheduleFullRedraw()
+        onclick: () => globals.rafScheduler.scheduleFullRedraw(),
       },
       m('header', 'Trace config'),
       m('ul',
@@ -524,7 +524,7 @@
               {
                 onclick: () => {
                   recordConfigStore.reloadFromLocalStorage();
-                }
+                },
               },
               m(`li${routePage === 'config' ? '.active' : ''}`,
                 m('i.material-icons', 'save'),
@@ -543,48 +543,49 @@
 
 export const RecordPageV2 = createPage({
   view({attrs}: m.Vnode<PageAttrs>): void |
-  m.Children {
-    if (!recordingTargetV2) {
-      recordingTargetV2 = targetFactoryRegistry.listTargets()[0];
-    }
+      m.Children {
+        if (!recordingTargetV2) {
+          recordingTargetV2 = targetFactoryRegistry.listTargets()[0];
+        }
 
-    const androidWebusbTarget =
-        targetFactoryRegistry.get(ANDROID_WEBUSB_TARGET_FACTORY);
-    if (!androidWebusbTarget.onDevicesChanged) {
-      androidWebusbTarget.onDevicesChanged = onDevicesChanged;
-    }
+        const androidWebusbTarget =
+            targetFactoryRegistry.get(ANDROID_WEBUSB_TARGET_FACTORY);
+        if (!androidWebusbTarget.onDevicesChanged) {
+          androidWebusbTarget.onDevicesChanged = onDevicesChanged;
+        }
 
-    const components: m.Children[] = [RecordHeader()];
-    if (recordingTargetV2) {
-      const SECTIONS: {[property: string]: (cssClass: string) => m.Child} = {
-        buffers: RecSettings,
-        instructions: Instructions,
-        config: Configurations,
-        cpu: CpuSettings,
-        gpu: GpuSettings,
-        power: PowerSettings,
-        memory: MemorySettings,
-        android: AndroidSettings,
-        advanced: AdvancedSettings,
-      };
+        const components: m.Children[] = [RecordHeader()];
+        if (recordingTargetV2) {
+          const SECTIONS:
+              {[property: string]: (cssClass: string) => m.Child} = {
+                buffers: RecSettings,
+                instructions: Instructions,
+                config: Configurations,
+                cpu: CpuSettings,
+                gpu: GpuSettings,
+                power: PowerSettings,
+                memory: MemorySettings,
+                android: AndroidSettings,
+                advanced: AdvancedSettings,
+              };
 
-      const pages: m.Children = [];
-      // we need to remove the `/` character from the route
-      let routePage = attrs.subpage ? attrs.subpage.substr(1) : '';
-      if (!Object.keys(SECTIONS).includes(routePage)) {
-        routePage = 'buffers';
-      }
-      for (const key of Object.keys(SECTIONS)) {
-        const cssClass = routePage === key ? '.active' : '';
-        pages.push(SECTIONS[key](cssClass));
-      }
-      components.push(recordMenu(routePage));
-      components.push(...pages);
-    }
+          const pages: m.Children = [];
+          // we need to remove the `/` character from the route
+          let routePage = attrs.subpage ? attrs.subpage.substr(1) : '';
+          if (!Object.keys(SECTIONS).includes(routePage)) {
+            routePage = 'buffers';
+          }
+          for (const key of Object.keys(SECTIONS)) {
+            const cssClass = routePage === key ? '.active' : '';
+            pages.push(SECTIONS[key](cssClass));
+          }
+          components.push(recordMenu(routePage));
+          components.push(...pages);
+        }
 
-    return m(
-        '.record-page',
-        tracingSession ? m('.hider') : [],
-        m('.record-container', components));
-  }
+        return m(
+            '.record-page',
+            tracingSession ? m('.hider') : [],
+            m('.record-container', components));
+      },
 });
diff --git a/ui/src/frontend/record_widgets.ts b/ui/src/frontend/record_widgets.ts
index 663ae24..469852f 100644
--- a/ui/src/frontend/record_widgets.ts
+++ b/ui/src/frontend/record_widgets.ts
@@ -63,7 +63,7 @@
 export class Probe implements m.ClassComponent<ProbeAttrs> {
   view({attrs, children}: m.CVnode<ProbeAttrs>) {
     const onToggle = (enabled: boolean) => {
-      const traceCfg = produce(globals.state.recordConfig, draft => {
+      const traceCfg = produce(globals.state.recordConfig, (draft) => {
         attrs.setEnabled(draft, enabled);
       });
       globals.dispatch(Actions.setRecordConfig({config: traceCfg}));
@@ -102,7 +102,7 @@
     compact: true,
     descr: '',
     isEnabled: args.isEnabled,
-    setEnabled: args.setEnabled
+    setEnabled: args.setEnabled,
   } as ProbeAttrs);
 }
 
@@ -121,7 +121,7 @@
 export class Toggle implements m.ClassComponent<ToggleAttrs> {
   view({attrs}: m.CVnode<ToggleAttrs>) {
     const onToggle = (enabled: boolean) => {
-      const traceCfg = produce(globals.state.recordConfig, draft => {
+      const traceCfg = produce(globals.state.recordConfig, (draft) => {
         attrs.setEnabled(draft, enabled);
       });
       globals.dispatch(Actions.setRecordConfig({config: traceCfg}));
@@ -164,7 +164,7 @@
 
 export class Slider implements m.ClassComponent<SliderAttrs> {
   onValueChange(attrs: SliderAttrs, newVal: number) {
-    const traceCfg = produce(globals.state.recordConfig, draft => {
+    const traceCfg = produce(globals.state.recordConfig, (draft) => {
       attrs.set(draft, newVal);
     });
     globals.dispatch(Actions.setRecordConfig({config: traceCfg}));
@@ -266,7 +266,7 @@
       const item = assertExists(dom.selectedOptions.item(i));
       selKeys.push(item.value);
     }
-    const traceCfg = produce(globals.state.recordConfig, draft => {
+    const traceCfg = produce(globals.state.recordConfig, (draft) => {
       attrs.set(draft, selKeys);
     });
     globals.dispatch(Actions.setRecordConfig({config: traceCfg}));
@@ -317,7 +317,7 @@
 
 export class Textarea implements m.ClassComponent<TextareaAttrs> {
   onChange(attrs: TextareaAttrs, dom: HTMLTextAreaElement) {
-    const traceCfg = produce(globals.state.recordConfig, draft => {
+    const traceCfg = produce(globals.state.recordConfig, (draft) => {
       attrs.set(draft, dom.value);
     });
     globals.dispatch(Actions.setRecordConfig({config: traceCfg}));
@@ -333,7 +333,7 @@
           onchange: (e: Event) =>
               this.onChange(attrs, e.target as HTMLTextAreaElement),
           placeholder: attrs.placeholder,
-          value: attrs.get(globals.state.recordConfig)
+          value: attrs.get(globals.state.recordConfig),
         }));
   }
 }
@@ -374,7 +374,7 @@
     m.ClassComponent<CategoriesCheckboxListParams> {
   updateValue(
       attrs: CategoriesCheckboxListParams, value: string, enabled: boolean) {
-    const traceCfg = produce(globals.state.recordConfig, draft => {
+    const traceCfg = produce(globals.state.recordConfig, (draft) => {
       const values = attrs.get(draft);
       const index = values.indexOf(value);
       if (enabled && index === -1) {
@@ -396,17 +396,17 @@
           m('button.config-button',
             {
               onclick: () => {
-                const config = produce(globals.state.recordConfig, draft => {
+                const config = produce(globals.state.recordConfig, (draft) => {
                   attrs.set(draft, Array.from(attrs.categories.keys()));
                 });
                 globals.dispatch(Actions.setRecordConfig({config}));
-              }
+              },
             },
             'All'),
           m('button.config-button',
             {
               onclick: () => {
-                const config = produce(globals.state.recordConfig, draft => {
+                const config = produce(globals.state.recordConfig, (draft) => {
                   attrs.set(draft, []);
                 });
                 globals.dispatch(Actions.setRecordConfig({config}));
@@ -426,7 +426,7 @@
                     onclick: (e: InputEvent) => {
                       const target = e.target as HTMLInputElement;
                       this.updateValue(attrs, key, target.checked);
-                    }
+                    },
                   }),
                   value));
           })));
diff --git a/ui/src/frontend/router_unittest.ts b/ui/src/frontend/router_unittest.ts
index 28bf107..612347c 100644
--- a/ui/src/frontend/router_unittest.ts
+++ b/ui/src/frontend/router_unittest.ts
@@ -15,7 +15,7 @@
 import {Router} from './router';
 
 const mockComponent = {
-  view() {}
+  view() {},
 };
 
 beforeEach(() => {
diff --git a/ui/src/frontend/rpc_http_dialog.ts b/ui/src/frontend/rpc_http_dialog.ts
index 37bca61..e05cd34 100644
--- a/ui/src/frontend/rpc_http_dialog.ts
+++ b/ui/src/frontend/rpc_http_dialog.ts
@@ -111,14 +111,14 @@
         action: () => {
           globals.dispatch(
               Actions.setNewEngineMode({mode: 'FORCE_BUILTIN_WASM'}));
-        }
+        },
       },
       {
         text: 'Use old version regardless (might crash)',
         primary: false,
         action: () => {
           forceUseOldVersion = true;
-        }
+        },
       },
     ],
   });
@@ -136,7 +136,7 @@
         primary: true,
         action: () => {
           globals.dispatch(Actions.openTraceFromHttpRpc({}));
-        }
+        },
       },
       {
         text: 'YES, but reset state',
@@ -146,7 +146,7 @@
         action: () => {
           globals.dispatch(
               Actions.setNewEngineMode({mode: 'FORCE_BUILTIN_WASM'}));
-        }
+        },
       },
     ],
   });
diff --git a/ui/src/frontend/search_handler.ts b/ui/src/frontend/search_handler.ts
index 1655c69..722c0ef 100644
--- a/ui/src/frontend/search_handler.ts
+++ b/ui/src/frontend/search_handler.ts
@@ -40,8 +40,8 @@
   // select the first/last item in the viewport.
   if (index === -1 || currentTs < startNs || currentTs > endNs) {
     if (reverse) {
-      const [smaller,] =
-        searchSegment(globals.currentSearchResults.tsStarts, endNs);
+      const [smaller] =
+          searchSegment(globals.currentSearchResults.tsStarts, endNs);
       // If there is no item in the viewport just go to the previous.
       if (smaller === -1) {
         setToPrevious(index);
diff --git a/ui/src/frontend/service_worker_controller.ts b/ui/src/frontend/service_worker_controller.ts
index 66abfc9..56fa088 100644
--- a/ui/src/frontend/service_worker_controller.ts
+++ b/ui/src/frontend/service_worker_controller.ts
@@ -104,7 +104,7 @@
     // version code).
     const versionDir = globals.root.split('/').slice(-2)[0];
     const swUri = `/service_worker.js?v=${versionDir}`;
-    navigator.serviceWorker.register(swUri).then(registration => {
+    navigator.serviceWorker.register(swUri).then((registration) => {
       this._initialWorker = registration.active;
 
       // At this point there are two options:
@@ -128,4 +128,4 @@
   get installing() {
     return this._installing;
   }
-}
\ No newline at end of file
+}
diff --git a/ui/src/frontend/sidebar.ts b/ui/src/frontend/sidebar.ts
index 50cea8d..2dcd361 100644
--- a/ui/src/frontend/sidebar.ts
+++ b/ui/src/frontend/sidebar.ts
@@ -36,7 +36,7 @@
 import {
   convertToJson,
   convertTraceToJsonAndDownload,
-  convertTraceToSystraceAndDownload
+  convertTraceToSystraceAndDownload,
 } from './trace_converter';
 
 const ALL_PROCESSES_QUERY = 'select name, pid from process order by name;';
@@ -177,7 +177,7 @@
       {
         t: 'Open with legacy UI',
         a: popupFileSelectionDialogOldUI,
-        i: 'filter_none'
+        i: 'filter_none',
       },
       {t: 'Record new trace', a: navigateRecord, i: 'fiber_smart_record'},
     ],
@@ -254,12 +254,12 @@
       {
         t: 'Open Android example',
         a: openTraceUrl(EXAMPLE_ANDROID_TRACE_URL),
-        i: 'description'
+        i: 'description',
       },
       {
         t: 'Open Chrome example',
         a: openTraceUrl(EXAMPLE_CHROME_TRACE_URL),
-        i: 'description'
+        i: 'description',
       },
     ],
   },
@@ -275,7 +275,7 @@
       {
         t: 'Report a bug',
         a: () => window.open(getBugReportUrl()),
-        i: 'bug_report'
+        i: 'bug_report',
       },
     ],
   },
@@ -288,32 +288,32 @@
       {
         t: 'All Processes',
         a: createCannedQuery(ALL_PROCESSES_QUERY),
-        i: 'search'
+        i: 'search',
       },
       {
         t: 'CPU Time by process',
         a: createCannedQuery(CPU_TIME_FOR_PROCESSES),
-        i: 'search'
+        i: 'search',
       },
       {
         t: 'Cycles by p-state by CPU',
         a: createCannedQuery(CYCLES_PER_P_STATE_PER_CPU),
-        i: 'search'
+        i: 'search',
       },
       {
         t: 'CPU Time by CPU by process',
         a: createCannedQuery(CPU_TIME_BY_CPU_BY_PROCESS),
-        i: 'search'
+        i: 'search',
       },
       {
         t: 'Heap Graph: Bytes per type',
         a: createCannedQuery(HEAP_GRAPH_BYTES_PER_TYPE),
-        i: 'search'
+        i: 'search',
       },
       {
         t: 'Debug SQL performance',
         a: createCannedQuery(SQL_STATS),
-        i: 'bug_report'
+        i: 'bug_report',
       },
     ],
   },
@@ -348,9 +348,9 @@
     url,
     // TODO(hjd): Once mithril is updated we can use responseType here rather
     // than using config and remove the extract below.
-    config: xhr => {
+    config: (xhr) => {
       xhr.responseType = 'blob';
-      xhr.onprogress = progress => {
+      xhr.onprogress = (progress) => {
         const percent = (100 * progress.loaded / progress.total).toFixed(1);
         globals.dispatch(Actions.updateStatus({
           msg: `Downloading trace ${percent}%`,
@@ -358,9 +358,9 @@
         }));
       };
     },
-    extract: xhr => {
+    extract: (xhr) => {
       return xhr.response;
-    }
+    },
   });
 }
 
@@ -385,10 +385,10 @@
   globals.logging.logEvent('Trace Actions', 'Open current trace in legacy UI');
   if (!isTraceLoaded) return;
   getCurrentTrace()
-      .then(file => {
+      .then((file) => {
         openInOldUIWithSizeCheck(file);
       })
-      .catch(error => {
+      .catch((error) => {
         throw new Error(`Failed to get current trace ${error}`);
       });
 }
@@ -399,10 +399,10 @@
   globals.logging.logEvent('Trace Actions', 'Convert to .systrace');
   if (!isTraceLoaded) return;
   getCurrentTrace()
-      .then(file => {
+      .then((file) => {
         convertTraceToSystraceAndDownload(file);
       })
-      .catch(error => {
+      .catch((error) => {
         throw new Error(`Failed to get current trace ${error}`);
       });
 }
@@ -413,10 +413,10 @@
   globals.logging.logEvent('Trace Actions', 'Convert to .json');
   if (!isTraceLoaded) return;
   getCurrentTrace()
-      .then(file => {
+      .then((file) => {
         convertTraceToJsonAndDownload(file);
       })
-      .catch(error => {
+      .catch((error) => {
         throw new Error(`Failed to get current trace ${error}`);
       });
 }
@@ -426,7 +426,7 @@
 }
 
 function openTraceUrl(url: string): (e: Event) => void {
-  return e => {
+  return (e) => {
     globals.logging.logEvent('Trace Actions', 'Open example trace');
     e.preventDefault();
     globals.dispatch(Actions.openTraceFromUrl({url}));
@@ -482,7 +482,7 @@
             m('a',
               {
                 href: 'https://goto.google.com/opening-large-traces',
-                target: '_blank'
+                target: '_blank',
               },
               'go/opening-large-traces'),
             '.')),
@@ -493,14 +493,14 @@
       },
       {
         text: 'Open beginning of trace',
-        action: () => convertToJson(trace, /*truncate*/ 'start'),
+        action: () => convertToJson(trace, /* truncate*/ 'start'),
       },
       {
         text: 'Open end of trace',
         primary: true,
-        action: () => convertToJson(trace, /*truncate*/ 'end'),
+        action: () => convertToJson(trace, /* truncate*/ 'end'),
       },
-    ]
+    ],
   });
   return;
 }
@@ -657,7 +657,7 @@
         {title},
         m('div', label),
         m('div', `${failed ? 'FAIL' : globals.numQueuedQueries}`));
-  }
+  },
 };
 
 const ServiceWorkerWidget: m.Component = {
@@ -711,10 +711,10 @@
             action: () => {
               globals.serviceWorkerController.setBypass(true).then(
                   () => location.reload());
-            }
+            },
           },
           {text: 'Cancel'},
-        ]
+        ],
       });
     };
 
@@ -723,7 +723,7 @@
         {title, ondblclick: toggle},
         m('div', 'SW'),
         m('div', label));
-  }
+  },
 };
 
 const SidebarFooter: m.Component = {
@@ -750,7 +750,7 @@
               `${version.VERSION.substr(0, 11)}`),
             ),
     );
-  }
+  },
 };
 
 class HiringBanner implements m.ClassComponent {
@@ -784,10 +784,10 @@
           href: typeof item.a === 'string' ? item.a : '#',
           target: typeof item.a === 'string' ? '_blank' : null,
           disabled: false,
-          id: item.t.toLowerCase().replace(/[^\w]/g, '_')
+          id: item.t.toLowerCase().replace(/[^\w]/g, '_'),
         };
         if (item.isPending && item.isPending()) {
-          attrs.onclick = e => e.preventDefault();
+          attrs.onclick = (e) => e.preventDefault();
           css = '.pending';
         }
         if (item.internalUserOnly && !globals.isInternalUser) {
@@ -795,14 +795,14 @@
         }
         if (item.checkDownloadDisabled && !isDownloadable()) {
           attrs = {
-            onclick: e => {
+            onclick: (e) => {
               e.preventDefault();
               alert('Can not download external trace.');
             },
             href: '#',
             target: null,
             disabled: true,
-            id: ''
+            id: '',
           };
         }
         vdomItems.push(m(
@@ -850,7 +850,7 @@
                 onclick: () => {
                   section.expanded = !section.expanded;
                   globals.rafScheduler.scheduleFullRedraw();
-                }
+                },
               },
               m('h1', {title: section.summary}, section.title),
               m('h2', section.summary)),
@@ -901,7 +901,7 @@
     href: url,
     title: 'Click to copy the URL',
     target: '_blank',
-    onclick: onClickCopy(url)
+    onclick: onClickCopy(url),
   };
   return m('a.trace-file-name', linkProps, title);
 }
diff --git a/ui/src/frontend/slice_details_panel.ts b/ui/src/frontend/slice_details_panel.ts
index 48a4e43..0521ea8 100644
--- a/ui/src/frontend/slice_details_panel.ts
+++ b/ui/src/frontend/slice_details_panel.ts
@@ -74,7 +74,7 @@
           m('td', translateState(sliceInfo.endState))),
         m('tr',
           m('th', `Slice ID`),
-          m('td', sliceInfo.id ? sliceInfo.id.toString() : 'Unknown'))
+          m('td', sliceInfo.id ? sliceInfo.id.toString() : 'Unknown')),
       ];
 
       for (const [key, value] of this.getProcessThreadDetails(sliceInfo)) {
diff --git a/ui/src/frontend/slice_panel.ts b/ui/src/frontend/slice_panel.ts
index 65beeb2..17b4aeb 100644
--- a/ui/src/frontend/slice_panel.ts
+++ b/ui/src/frontend/slice_panel.ts
@@ -48,8 +48,8 @@
       ['Package name', sliceInfo.packageName],
       [
         'Version code',
-        sliceInfo.versionCode ? String(sliceInfo.versionCode) : undefined
-      ]
+        sliceInfo.versionCode ? String(sliceInfo.versionCode) : undefined,
+      ],
     ]);
   }
 }
diff --git a/ui/src/frontend/task_tracker_unittest.ts b/ui/src/frontend/task_tracker_unittest.ts
index f869843..ec7d2f5 100644
--- a/ui/src/frontend/task_tracker_unittest.ts
+++ b/ui/src/frontend/task_tracker_unittest.ts
@@ -25,10 +25,10 @@
   const tracker = new TaskTracker();
   const deferred = defer();
 
-  tracker.trackPromise(deferred, "Some task");
+  tracker.trackPromise(deferred, 'Some task');
 
   expect(tracker.hasPendingTasks()).toEqual(true);
-  expect(tracker.progressMessage()).toEqual("Some task (0s)");
+  expect(tracker.progressMessage()).toEqual('Some task (0s)');
   deferred.resolve();
 });
 
diff --git a/ui/src/frontend/thread_state_panel.ts b/ui/src/frontend/thread_state_panel.ts
index 164b3a5..286235f 100644
--- a/ui/src/frontend/thread_state_panel.ts
+++ b/ui/src/frontend/thread_state_panel.ts
@@ -94,9 +94,9 @@
                     trackId, toNs(ts + globals.state.traceTime.startSec));
               }
             },
-            title: 'Go to CPU slice'
+            title: 'Go to CPU slice',
           },
-          'call_made')
+          'call_made'),
     ];
   }
 
diff --git a/ui/src/frontend/time_selection_panel.ts b/ui/src/frontend/time_selection_panel.ts
index 65ac83e..f1391da 100644
--- a/ui/src/frontend/time_selection_panel.ts
+++ b/ui/src/frontend/time_selection_panel.ts
@@ -179,7 +179,7 @@
           x: TRACK_SHELL_WIDTH + xLeft,
           y: 0,
           width: xRight - xLeft,
-          height: size.height
+          height: size.height,
         },
         this.bounds(size),
         label);
@@ -190,7 +190,7 @@
       x: TRACK_SHELL_WIDTH,
       y: 0,
       width: size.width - TRACK_SHELL_WIDTH,
-      height: size.height
+      height: size.height,
     };
   }
 }
diff --git a/ui/src/frontend/topbar.ts b/ui/src/frontend/topbar.ts
index ccb3a56..1c76a8b 100644
--- a/ui/src/frontend/topbar.ts
+++ b/ui/src/frontend/topbar.ts
@@ -27,7 +27,7 @@
 
 const PLACEHOLDER = {
   [SEARCH]: 'Search',
-  [COMMAND]: 'e.g. select * from sched left join thread using(utid) limit 10'
+  [COMMAND]: 'e.g. select * from sched left join thread using(utid) limit 10',
 };
 
 export const DISMISSED_PANNING_HINT_KEY = 'dismissedPanningHint';
@@ -138,7 +138,7 @@
                     disabled: globals.state.searchIndex <= 0,
                     onclick: () => {
                       executeSearch(true /* reverse direction */);
-                    }
+                    },
                   },
                   m('i.material-icons.left', 'keyboard_arrow_left')),
                 m('button',
@@ -147,7 +147,7 @@
                         globals.currentSearchResults.totalResults - 1,
                     onclick: () => {
                       executeSearch();
-                    }
+                    },
                   },
                   m('i.material-icons.right', 'keyboard_arrow_right')),
                 ) :
@@ -199,7 +199,7 @@
             onclick: () => {
               globals.frontendLocalState.newVersionAvailable = false;
               globals.rafScheduler.scheduleFullRedraw();
-            }
+            },
           },
           'Dismiss'),
     );
@@ -224,7 +224,7 @@
               globals.frontendLocalState.showPanningHint = false;
               localStorage.setItem(DISMISSED_PANNING_HINT_KEY, 'true');
               globals.rafScheduler.scheduleFullRedraw();
-            }
+            },
           },
           'Dismiss'),
     );
diff --git a/ui/src/frontend/trace_attrs.ts b/ui/src/frontend/trace_attrs.ts
index c10d6fb..25c8b60 100644
--- a/ui/src/frontend/trace_attrs.ts
+++ b/ui/src/frontend/trace_attrs.ts
@@ -30,4 +30,4 @@
     return false;
   }
   return true;
-}
\ No newline at end of file
+}
diff --git a/ui/src/frontend/trace_converter.ts b/ui/src/frontend/trace_converter.ts
index 237e39d..c854bee 100644
--- a/ui/src/frontend/trace_converter.ts
+++ b/ui/src/frontend/trace_converter.ts
@@ -15,11 +15,11 @@
 import {Actions} from '../common/actions';
 import {
   ConversionJobName,
-  ConversionJobStatus
+  ConversionJobStatus,
 } from '../common/conversion_jobs';
 
-import {maybeShowErrorDialog} from './error_dialog';
 import {download} from './clipboard';
+import {maybeShowErrorDialog} from './error_dialog';
 import {globals} from './globals';
 import {openBufferWithLegacyTraceViewer} from './legacy_trace_viewer';
 
diff --git a/ui/src/frontend/trace_info_page.ts b/ui/src/frontend/trace_info_page.ts
index 78e2e7b..b56370e 100644
--- a/ui/src/frontend/trace_info_page.ts
+++ b/ui/src/frontend/trace_info_page.ts
@@ -119,7 +119,7 @@
           )
           select name, value
           from metadata_with_priorities 
-          order by priority desc, name`
+          order by priority desc, name`,
       }));
     }
 
@@ -234,5 +234,5 @@
 
         }),
     );
-  }
+  },
 });
diff --git a/ui/src/frontend/trace_url_handler.ts b/ui/src/frontend/trace_url_handler.ts
index 9315104..2c495b7 100644
--- a/ui/src/frontend/trace_url_handler.ts
+++ b/ui/src/frontend/trace_url_handler.ts
@@ -182,7 +182,7 @@
         action: () => {
           hasOpenedNewTrace = true;
           globals.dispatch(Actions.openTraceFromBuffer(maybeTrace));
-        }
+        },
       },
       {text: 'Cancel'},
     ],
@@ -207,13 +207,13 @@
     // when users click on share we don't fail the re-fetch().
     const fileName = url.split('/').pop() || 'local_trace.pftrace';
     const request = fetch(url)
-                        .then(response => response.blob())
-                        .then(blob => {
+                        .then((response) => response.blob())
+                        .then((blob) => {
                           globals.dispatch(Actions.openTraceFromFile({
                             file: new File([blob], fileName),
                           }));
                         })
-                        .catch(e => alert(`Could not load local trace ${e}`));
+                        .catch((e) => alert(`Could not load local trace ${e}`));
     taskTracker.trackPromise(request, 'Downloading local trace');
   } else {
     globals.dispatch(Actions.openTraceFromUrl({url}));
@@ -227,12 +227,12 @@
   const loadInfo = loadAndroidBugToolInfo();
   taskTracker.trackPromise(loadInfo, 'Loading trace from ABT extension');
   loadInfo
-      .then(info => {
+      .then((info) => {
         globals.dispatch(Actions.openTraceFromFile({
           file: info.file,
         }));
       })
-      .catch(e => {
+      .catch((e) => {
         console.error(e);
       });
 }
diff --git a/ui/src/frontend/track_group_panel.ts b/ui/src/frontend/track_group_panel.ts
index e078a55..c89d1d1 100644
--- a/ui/src/frontend/track_group_panel.ts
+++ b/ui/src/frontend/track_group_panel.ts
@@ -20,7 +20,7 @@
 import {
   getContainingTrackId,
   TrackGroupState,
-  TrackState
+  TrackState,
 } from '../common/state';
 
 import {globals} from './globals';
@@ -30,7 +30,7 @@
   CHECKBOX,
   EXPAND_DOWN,
   EXPAND_UP,
-  INDETERMINATE_CHECKBOX
+  INDETERMINATE_CHECKBOX,
 } from './icons';
 import {Panel, PanelSize} from './panel';
 import {Track} from './track';
@@ -97,11 +97,11 @@
     if (selection !== null && selection.kind === 'AREA') {
       const selectedArea = globals.state.areas[selection.areaId];
       if (selectedArea.tracks.includes(attrs.trackGroupId) &&
-          trackGroup.tracks.every(id => selectedArea.tracks.includes(id))) {
+          trackGroup.tracks.every((id) => selectedArea.tracks.includes(id))) {
         checkBox = CHECKBOX;
       } else if (
           selectedArea.tracks.includes(attrs.trackGroupId) ||
-          trackGroup.tracks.some(id => selectedArea.tracks.includes(id))) {
+          trackGroup.tracks.some((id) => selectedArea.tracks.includes(id))) {
         checkBox = INDETERMINATE_CHECKBOX;
       }
     }
@@ -141,7 +141,7 @@
                     globals.dispatch(Actions.toggleTrackSelection(
                         {id: attrs.trackGroupId, isTrackGroup: true}));
                     e.stopPropagation();
-                  }
+                  },
                 },
                 checkBox) :
               ''),
diff --git a/ui/src/frontend/track_panel.ts b/ui/src/frontend/track_panel.ts
index e479628..baa816d 100644
--- a/ui/src/frontend/track_panel.ts
+++ b/ui/src/frontend/track_panel.ts
@@ -226,7 +226,7 @@
               e.stopPropagation();
             }
             globals.rafScheduler.scheduleRedraw();
-          }
+          },
         },
         node.children);
   }
@@ -248,7 +248,7 @@
         },
         [
           m(TrackShell, {track: attrs.track, trackState: attrs.trackState}),
-          m(TrackContent, {track: attrs.track})
+          m(TrackContent, {track: attrs.track}),
         ]);
   }
 
diff --git a/ui/src/frontend/viewer_page.ts b/ui/src/frontend/viewer_page.ts
index f2370a9..3affb0e 100644
--- a/ui/src/frontend/viewer_page.ts
+++ b/ui/src/frontend/viewer_page.ts
@@ -212,7 +212,7 @@
         globals.frontendLocalState.deselectArea();
         // Full redraw to color track shell.
         globals.rafScheduler.scheduleFullRedraw();
-      }
+      },
     });
   }
 
@@ -223,13 +223,13 @@
 
   view() {
     const scrollingPanels: AnyAttrsVnode[] = globals.state.scrollingTracks.map(
-        id => m(TrackPanel, {key: id, id, selectable: true}));
+        (id) => m(TrackPanel, {key: id, id, selectable: true}));
 
     for (const group of Object.values(globals.state.trackGroups)) {
       const headerPanel = m(TrackGroupPanel, {
         trackGroupId: group.id,
         key: `trackgroup-${group.id}`,
-        selectable: true
+        selectable: true,
       });
 
       const childTracks: AnyAttrsVnode[] = [];
@@ -264,7 +264,7 @@
                   return;
                 }
                 globals.makeSelection(Actions.deselect({}));
-              }
+              },
             },
             m('.pinned-panel-container', m(PanelContainer, {
                 doesScroll: false,
@@ -275,7 +275,7 @@
                   m(NotesPanel, {key: 'notes'}),
                   m(TickmarkPanel, {key: 'searchTickmarks'}),
                   ...globals.state.pinnedTracks.map(
-                      id => m(TrackPanel, {key: id, id, selectable: true})),
+                      (id) => m(TrackPanel, {key: id, id, selectable: true})),
                 ],
                 kind: 'OVERVIEW',
               })),
@@ -291,5 +291,5 @@
 export const ViewerPage = createPage({
   view() {
     return m(TraceViewer);
-  }
+  },
 });
diff --git a/ui/src/service_worker/service_worker.ts b/ui/src/service_worker/service_worker.ts
index b3b3476..b1d9a79 100644
--- a/ui/src/service_worker/service_worker.ts
+++ b/ui/src/service_worker/service_worker.ts
@@ -40,7 +40,7 @@
 // 6. The 'activate' handler is triggered. The old v1 cache is deleted at this
 //    point.
 
-declare var self: ServiceWorkerGlobalScope;
+declare let self: ServiceWorkerGlobalScope;
 export {};
 
 const LOG_TAG = `ServiceWorker: `;
@@ -65,7 +65,7 @@
 // The service_worker.js script itself never changes, but the browser
 // re-installs it because the version in the V? query-string argument changes.
 // The reinstallation will cache the new files from the v.1.2-sha/manifest.json.
-self.addEventListener('install', event => {
+self.addEventListener('install', (event) => {
   const doInstall = async () => {
     if (await caches.has('BYPASS_SERVICE_WORKER')) {
       // Throw will prevent the installation.
@@ -112,7 +112,7 @@
   event.waitUntil(doActivate());
 });
 
-self.addEventListener('fetch', event => {
+self.addEventListener('fetch', (event) => {
   // The early return here will cause the browser to fall back on standard
   // network-based fetch.
   if (!shouldHandleHttpRequest(event.request)) {
@@ -210,7 +210,7 @@
       const reqOpts: RequestInit = {
         cache: 'no-cache',
         mode: 'same-origin',
-        integrity: `${integrity}`
+        integrity: `${integrity}`,
       };
       urlsToCache.push(new Request(`${version}/${resource}`, reqOpts));
     }
@@ -229,7 +229,7 @@
     const timerId = setTimeout(() => {
       reject(`Timed out while fetching ${url}`);
     }, timeoutMs);
-    fetch(req).then(resp => {
+    fetch(req).then((resp) => {
       clearTimeout(timerId);
       if (resp.ok) {
         resolve(resp);
diff --git a/ui/src/test/perfetto_ui_test_helper.ts b/ui/src/test/perfetto_ui_test_helper.ts
index dafebe8..44e927c 100644
--- a/ui/src/test/perfetto_ui_test_helper.ts
+++ b/ui/src/test/perfetto_ui_test_helper.ts
@@ -43,7 +43,7 @@
   let consecutiveIdleTicks = 0;
   let reasons: string[] = [];
   for (let ticks = 0; ticks < timeoutTicks; ticks++) {
-    await new Promise(r => setTimeout(r, tickMs));
+    await new Promise((r) => setTimeout(r, tickMs));
     const isShowingMsg = !!(await page.$('.omnibox.message-mode'));
     const isShowingAnim = !!(await page.$('.progress.progress-anim'));
     const hasPendingRedraws =
@@ -97,7 +97,7 @@
   const diffPng = new PNG({width, height});
   const diff = await pixelmatch(
       actualImg.data, expectedImg.data, diffPng.data, width, height, {
-        threshold: DIFF_PER_PIXEL_THRESHOLD
+        threshold: DIFF_PER_PIXEL_THRESHOLD,
       });
   if (diff > DIFF_MAX_PIXELS) {
     const diffFilename = actualFilename.replace('.png', '-diff.png');
diff --git a/ui/src/test/ui_integrationtest.ts b/ui/src/test/ui_integrationtest.ts
index f6a442f..973888d 100644
--- a/ui/src/test/ui_integrationtest.ts
+++ b/ui/src/test/ui_integrationtest.ts
@@ -22,10 +22,10 @@
   compareScreenshots,
   failIfTraceProcessorHttpdIsActive,
   getTestTracePath,
-  waitForPerfettoIdle
+  waitForPerfettoIdle,
 } from './perfetto_ui_test_helper';
 
-declare var global: {__BROWSER__: puppeteer.Browser;};
+declare let global: {__BROWSER__: puppeteer.Browser;};
 const browser = assertExists(global.__BROWSER__);
 const expectedScreenshotPath = path.join('test', 'data', 'ui-screenshots');
 
@@ -104,7 +104,7 @@
   //    await page.keyboard.type('\n');
   //  }
   //  await waitForPerfettoIdle(page);
-  //});
+  // });
 });
 
 describe('chrome_rendering_desktop', () => {
diff --git a/ui/src/traceconv/index.ts b/ui/src/traceconv/index.ts
index 0b8c35c..9f30afe 100644
--- a/ui/src/traceconv/index.ts
+++ b/ui/src/traceconv/index.ts
@@ -16,7 +16,7 @@
 import {assertExists, reportError, setErrorHandler} from '../base/logging';
 import {
   ConversionJobName,
-  ConversionJobStatus
+  ConversionJobStatus,
 } from '../common/conversion_jobs';
 import * as traceconv from '../gen/traceconv';
 
@@ -78,7 +78,7 @@
     locateFile: (s: string) => s,
     print: updateStatus,
     printErr: updateStatus,
-    onRuntimeInitialized: () => deferredRuntimeInitialized.resolve()
+    onRuntimeInitialized: () => deferredRuntimeInitialized.resolve(),
   });
   await deferredRuntimeInitialized;
   module.FS.mkdir('/fs');
@@ -196,7 +196,7 @@
     `${pid}`,
     `--timestamps`,
     `${ts}`,
-    '/fs/trace.proto'
+    '/fs/trace.proto',
   ];
 
   try {
@@ -219,8 +219,8 @@
 }
 
 selfWorker.onmessage = (msg: MessageEvent) => {
-  self.addEventListener('error', e => reportError(e));
-  self.addEventListener('unhandledrejection', e => reportError(e));
+  self.addEventListener('error', (e) => reportError(e));
+  self.addEventListener('unhandledrejection', (e) => reportError(e));
   setErrorHandler((err: string) => forwardError(err));
   const args = msg.data as Args;
   if (isConvertTraceAndDownload(args)) {
diff --git a/ui/src/tracks/async_slices/controller.ts b/ui/src/tracks/async_slices/controller.ts
index fa81905..27a1ee4 100644
--- a/ui/src/tracks/async_slices/controller.ts
+++ b/ui/src/tracks/async_slices/controller.ts
@@ -98,7 +98,7 @@
       name: STR,
       id: NUM,
       isInstant: NUM,
-      isIncomplete: NUM
+      isIncomplete: NUM,
     });
     for (let row = 0; it.valid(); it.next(), row++) {
       const startNsQ = it.tsq;
diff --git a/ui/src/tracks/chrome_slices/controller.ts b/ui/src/tracks/chrome_slices/controller.ts
index 5c2cc06..cf07ce5 100644
--- a/ui/src/tracks/chrome_slices/controller.ts
+++ b/ui/src/tracks/chrome_slices/controller.ts
@@ -94,7 +94,7 @@
       titles: new Uint16Array(numRows),
       isInstant: new Uint16Array(numRows),
       isIncomplete: new Uint16Array(numRows),
-      cpuTimeRatio: new Float64Array(numRows)
+      cpuTimeRatio: new Float64Array(numRows),
     };
 
     const stringIndexes = new Map<string, number>();
@@ -116,7 +116,7 @@
       name: STR,
       isInstant: NUM,
       isIncomplete: NUM,
-      threadDur: NUM
+      threadDur: NUM,
     });
     for (let row = 0; it.valid(); it.next(), row++) {
       const startNsQ = it.tsq;
diff --git a/ui/src/tracks/chrome_slices/frontend.ts b/ui/src/tracks/chrome_slices/frontend.ts
index dc286ff..fd1c9ee 100644
--- a/ui/src/tracks/chrome_slices/frontend.ts
+++ b/ui/src/tracks/chrome_slices/frontend.ts
@@ -187,7 +187,7 @@
       ctx.fillStyle = lightness > 65 ? '#404040' : 'white';
       const displayText = cropText(title, charWidth, rect.width);
       const rectXCenter = rect.left + rect.width / 2;
-      ctx.textBaseline = "middle";
+      ctx.textBaseline = 'middle';
       ctx.fillText(displayText, rectXCenter, rect.top + SLICE_HEIGHT / 2);
     }
     drawRectOnSelected();
@@ -261,7 +261,7 @@
       globals.makeSelection(Actions.selectChromeSlice({
         id: sliceId,
         trackId: this.trackState.id,
-        table: this.config.namespace
+        table: this.config.namespace,
       }));
       return true;
     }
@@ -284,7 +284,7 @@
       top: TRACK_PADDING + depth * SLICE_HEIGHT,
       height: SLICE_HEIGHT,
       visible:
-          !(tEnd <= visibleWindowTime.start || tStart >= visibleWindowTime.end)
+          !(tEnd <= visibleWindowTime.start || tStart >= visibleWindowTime.end),
     };
   }
 }
diff --git a/ui/src/tracks/counter/controller.ts b/ui/src/tracks/counter/controller.ts
index 016a9e7..8ffb936 100644
--- a/ui/src/tracks/counter/controller.ts
+++ b/ui/src/tracks/counter/controller.ts
@@ -16,7 +16,7 @@
 import {fromNs, toNs} from '../../common/time';
 import {
   TrackController,
-  trackControllerRegistry
+  trackControllerRegistry,
 } from '../../controller/track_controller';
 
 import {
diff --git a/ui/src/tracks/counter/frontend.ts b/ui/src/tracks/counter/frontend.ts
index 45908a6..abe8901 100644
--- a/ui/src/tracks/counter/frontend.ts
+++ b/ui/src/tracks/counter/frontend.ts
@@ -64,7 +64,7 @@
       return {
         follower: 'DELTA_FROM_PREVIOUS',
         tooltip: 'min/max',
-        icon: 'show_chart'
+        icon: 'show_chart',
       };
     case 'DELTA_FROM_PREVIOUS':
       return {follower: 'ZERO_BASED', tooltip: 'delta', icon: 'bar_chart'};
@@ -73,7 +73,7 @@
       return {
         follower: 'MIN_MAX',
         tooltip: 'zero based',
-        icon: 'waterfall_chart'
+        icon: 'waterfall_chart',
       };
   }
 }
@@ -256,7 +256,8 @@
 
       // Draw change marker.
       ctx.beginPath();
-      ctx.arc(xStart, y, 3 /*r*/, 0 /*start angle*/, 2 * Math.PI /*end angle*/);
+      ctx.arc(
+          xStart, y, 3 /* r*/, 0 /* start angle*/, 2 * Math.PI /* end angle*/);
       ctx.fill();
       ctx.stroke();
 
@@ -332,7 +333,7 @@
         leftTs: toNs(data.timestamps[left]),
         rightTs: right !== -1 ? toNs(data.timestamps[right]) : -1,
         id: counterId,
-        trackId: this.trackState.id
+        trackId: this.trackState.id,
       }));
       return true;
     }
diff --git a/ui/src/tracks/cpu_freq/controller.ts b/ui/src/tracks/cpu_freq/controller.ts
index d5a29de..595f478 100644
--- a/ui/src/tracks/cpu_freq/controller.ts
+++ b/ui/src/tracks/cpu_freq/controller.ts
@@ -17,7 +17,7 @@
 import {fromNs, toNs} from '../../common/time';
 import {
   TrackController,
-  trackControllerRegistry
+  trackControllerRegistry,
 } from '../../controller/track_controller';
 
 import {
diff --git a/ui/src/tracks/cpu_freq/frontend.ts b/ui/src/tracks/cpu_freq/frontend.ts
index c8b2d74..3d123f8 100644
--- a/ui/src/tracks/cpu_freq/frontend.ts
+++ b/ui/src/tracks/cpu_freq/frontend.ts
@@ -95,8 +95,8 @@
       return zeroY - Math.round((value / yMax) * RECT_HEIGHT);
     };
 
-    const [rawStartIdx,] =
-      searchSegment(data.timestamps, visibleWindowTime.start);
+    const [rawStartIdx] =
+        searchSegment(data.timestamps, visibleWindowTime.start);
     const startIdx = rawStartIdx === -1 ? 0 : rawStartIdx;
 
     const [, rawEndIdx] = searchSegment(data.timestamps, visibleWindowTime.end);
@@ -181,7 +181,8 @@
 
       // Draw change marker.
       ctx.beginPath();
-      ctx.arc(xStart, y, 3 /*r*/, 0 /*start angle*/, 2 * Math.PI /*end angle*/);
+      ctx.arc(
+          xStart, y, 3 /* r*/, 0 /* start angle*/, 2 * Math.PI /* end angle*/);
       ctx.fill();
       ctx.stroke();
 
diff --git a/ui/src/tracks/cpu_profile/controller.ts b/ui/src/tracks/cpu_profile/controller.ts
index 4e68e5f..a91970f 100644
--- a/ui/src/tracks/cpu_profile/controller.ts
+++ b/ui/src/tracks/cpu_profile/controller.ts
@@ -15,7 +15,7 @@
 import {NUM} from '../../common/query_result';
 import {
   TrackController,
-  trackControllerRegistry
+  trackControllerRegistry,
 } from '../../controller/track_controller';
 
 import {
diff --git a/ui/src/tracks/cpu_slices/controller.ts b/ui/src/tracks/cpu_slices/controller.ts
index be1640d..5499ee4 100644
--- a/ui/src/tracks/cpu_slices/controller.ts
+++ b/ui/src/tracks/cpu_slices/controller.ts
@@ -17,7 +17,7 @@
 import {fromNs, toNs} from '../../common/time';
 import {
   TrackController,
-  trackControllerRegistry
+  trackControllerRegistry,
 } from '../../controller/track_controller';
 
 import {Config, CPU_SLICE_TRACK_KIND, Data} from './common';
@@ -127,7 +127,7 @@
       starts: new Float64Array(numRows),
       ends: new Float64Array(numRows),
       utids: new Uint32Array(numRows),
-      isIncomplete: new Uint8Array(numRows)
+      isIncomplete: new Uint8Array(numRows),
     };
 
     const it = queryRes.iter(
diff --git a/ui/src/tracks/cpu_slices/frontend.ts b/ui/src/tracks/cpu_slices/frontend.ts
index 944dcb7..64a4c68 100644
--- a/ui/src/tracks/cpu_slices/frontend.ts
+++ b/ui/src/tracks/cpu_slices/frontend.ts
@@ -18,7 +18,7 @@
 import {
   cropText,
   drawDoubleHeadedArrow,
-  drawIncompleteSlice
+  drawIncompleteSlice,
 } from '../../common/canvas_utils';
 import {colorForThread} from '../../common/colorizer';
 import {timeToString} from '../../common/time';
@@ -84,7 +84,7 @@
     const charWidth = ctx.measureText('dbpqaouk').width / 8;
 
     const rawStartIdx =
-        data.ends.findIndex(end => end >= visibleWindowTime.start);
+        data.ends.findIndex((end) => end >= visibleWindowTime.start);
     const startIdx = rawStartIdx === -1 ? 0 : rawStartIdx;
 
     const [, rawEndIdx] = searchSegment(data.starts, visibleWindowTime.end);
diff --git a/ui/src/tracks/debug_slices/controller.ts b/ui/src/tracks/debug_slices/controller.ts
index 0b761a3..b3447b5 100644
--- a/ui/src/tracks/debug_slices/controller.ts
+++ b/ui/src/tracks/debug_slices/controller.ts
@@ -75,7 +75,8 @@
     const it = queryRes.iter(
         {id: NUM, name: STR, ts: NUM_NULL, dur: NUM_NULL, depth: NUM});
     for (let row = 0; it.valid(); it.next(), row++) {
-      let sliceStart: number, sliceEnd: number;
+      let sliceStart: number;
+      let sliceEnd: number;
       if (it.ts === null || it.dur === null) {
         sliceStart = sliceEnd = -1;
       } else {
diff --git a/ui/src/tracks/generic_slice_track/index.ts b/ui/src/tracks/generic_slice_track/index.ts
index aaff6ff..3c66953 100644
--- a/ui/src/tracks/generic_slice_track/index.ts
+++ b/ui/src/tracks/generic_slice_track/index.ts
@@ -14,7 +14,7 @@
 
 import {
   NamedSliceTrack,
-  NamedSliceTrackTypes
+  NamedSliceTrackTypes,
 } from '../../frontend/named_slice_track';
 import {NewTrackArgs} from '../../frontend/track';
 import {trackRegistry} from '../../frontend/track_registry';
diff --git a/ui/src/tracks/heap_profile/controller.ts b/ui/src/tracks/heap_profile/controller.ts
index a79dc3d..a2be709 100644
--- a/ui/src/tracks/heap_profile/controller.ts
+++ b/ui/src/tracks/heap_profile/controller.ts
@@ -15,7 +15,7 @@
 import {NUM, STR} from '../../common/query_result';
 import {
   TrackController,
-  trackControllerRegistry
+  trackControllerRegistry,
 } from '../../controller/track_controller';
 
 import {
@@ -35,7 +35,7 @@
         resolution,
         length: 0,
         tsStarts: new Float64Array(),
-        types: new Array<string>()
+        types: new Array<string>(),
       };
     }
     const queryRes = await this.query(`
diff --git a/ui/src/tracks/perf_samples_profile/controller.ts b/ui/src/tracks/perf_samples_profile/controller.ts
index 5122d15..d282bbd 100644
--- a/ui/src/tracks/perf_samples_profile/controller.ts
+++ b/ui/src/tracks/perf_samples_profile/controller.ts
@@ -15,7 +15,7 @@
 import {NUM} from '../../common/query_result';
 import {
   TrackController,
-  trackControllerRegistry
+  trackControllerRegistry,
 } from '../../controller/track_controller';
 
 import {
@@ -34,7 +34,7 @@
         end,
         resolution,
         length: 0,
-        tsStartsNs: new Float64Array()
+        tsStartsNs: new Float64Array(),
       };
     }
     const queryRes = await this.query(`
@@ -48,7 +48,7 @@
       end,
       resolution,
       length: numRows,
-      tsStartsNs: new Float64Array(numRows)
+      tsStartsNs: new Float64Array(numRows),
     };
 
     const it = queryRes.iter({ts: NUM});
diff --git a/ui/src/tracks/process_scheduling/controller.ts b/ui/src/tracks/process_scheduling/controller.ts
index 13ecee9..7d8c098 100644
--- a/ui/src/tracks/process_scheduling/controller.ts
+++ b/ui/src/tracks/process_scheduling/controller.ts
@@ -17,7 +17,7 @@
 import {fromNs, toNs} from '../../common/time';
 import {
   TrackController,
-  trackControllerRegistry
+  trackControllerRegistry,
 } from '../../controller/track_controller';
 
 import {
diff --git a/ui/src/tracks/process_scheduling/frontend.ts b/ui/src/tracks/process_scheduling/frontend.ts
index b83b1289..a224952 100644
--- a/ui/src/tracks/process_scheduling/frontend.ts
+++ b/ui/src/tracks/process_scheduling/frontend.ts
@@ -69,7 +69,7 @@
     assertTrue(data.starts.length === data.utids.length);
 
     const rawStartIdx =
-        data.ends.findIndex(end => end >= visibleWindowTime.start);
+        data.ends.findIndex((end) => end >= visibleWindowTime.start);
     const startIdx = rawStartIdx === -1 ? data.starts.length : rawStartIdx;
 
     const [, rawEndIdx] = searchSegment(data.starts, visibleWindowTime.end);
diff --git a/ui/src/tracks/process_summary/controller.ts b/ui/src/tracks/process_summary/controller.ts
index 8241562..93dc99b 100644
--- a/ui/src/tracks/process_summary/controller.ts
+++ b/ui/src/tracks/process_summary/controller.ts
@@ -17,7 +17,7 @@
 import {LIMIT} from '../../common/track_data';
 import {
   TrackController,
-  trackControllerRegistry
+  trackControllerRegistry,
 } from '../../controller/track_controller';
 
 import {
diff --git a/ui/src/tracks/thread_state/controller.ts b/ui/src/tracks/thread_state/controller.ts
index da8ff02..9a324d1 100644
--- a/ui/src/tracks/thread_state/controller.ts
+++ b/ui/src/tracks/thread_state/controller.ts
@@ -18,7 +18,7 @@
 import {fromNs, toNs} from '../../common/time';
 import {
   TrackController,
-  trackControllerRegistry
+  trackControllerRegistry,
 } from '../../controller/track_controller';
 
 import {