diff --git a/resources/celerity/map.php b/resources/celerity/map.php
--- a/resources/celerity/map.php
+++ b/resources/celerity/map.php
@@ -836,1325 +836,1325 @@
   ),
   'requires' => array(
     '00861799' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-stratcom',
-      2 => 'javelin-dom',
-      3 => 'javelin-util',
-      4 => 'javelin-vector',
-      5 => 'differential-inline-comment-editor',
+      'javelin-behavior',
+      'javelin-stratcom',
+      'javelin-dom',
+      'javelin-util',
+      'javelin-vector',
+      'differential-inline-comment-editor',
     ),
     '029a133d' => array(
-      0 => 'aphront-dialog-view-css',
+      'aphront-dialog-view-css',
     ),
     '03d6ed07' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-stratcom',
-      2 => 'javelin-dom',
-      3 => 'javelin-vector',
-      4 => 'javelin-install',
+      'javelin-behavior',
+      'javelin-stratcom',
+      'javelin-dom',
+      'javelin-vector',
+      'javelin-install',
     ),
     '065227cc' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-stratcom',
-      3 => 'javelin-workflow',
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-stratcom',
+      'javelin-workflow',
     ),
     '06e05112' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-stratcom',
-      2 => 'javelin-dom',
-      3 => 'javelin-vector',
+      'javelin-behavior',
+      'javelin-stratcom',
+      'javelin-dom',
+      'javelin-vector',
     ),
     '0720f2cf' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-stratcom',
-      2 => 'javelin-dom',
-      3 => 'javelin-mask',
-      4 => 'javelin-util',
-      5 => 'phabricator-busy',
+      'javelin-behavior',
+      'javelin-stratcom',
+      'javelin-dom',
+      'javelin-mask',
+      'javelin-util',
+      'phabricator-busy',
     ),
     '09eee344' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-stratcom',
-      2 => 'javelin-workflow',
-      3 => 'javelin-dom',
-      4 => 'phabricator-draggable-list',
+      'javelin-behavior',
+      'javelin-stratcom',
+      'javelin-workflow',
+      'javelin-dom',
+      'phabricator-draggable-list',
     ),
     '0a3f3021' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-stratcom',
-      2 => 'javelin-workflow',
-      3 => 'javelin-dom',
-      4 => 'javelin-router',
+      'javelin-behavior',
+      'javelin-stratcom',
+      'javelin-workflow',
+      'javelin-dom',
+      'javelin-router',
     ),
     '0c33c1a0' => array(
-      0 => 'javelin-view',
-      1 => 'javelin-install',
-      2 => 'javelin-dom',
+      'javelin-view',
+      'javelin-install',
+      'javelin-dom',
     ),
     '0c6946e7' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-dom',
-      2 => 'javelin-stratcom',
-      3 => 'javelin-util',
-      4 => 'phabricator-notification-css',
+      'javelin-install',
+      'javelin-dom',
+      'javelin-stratcom',
+      'javelin-util',
+      'phabricator-notification-css',
     ),
     '0ec56e1d' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-stratcom',
-      3 => 'phuix-dropdown-menu',
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-stratcom',
+      'phuix-dropdown-menu',
     ),
     '0f764c35' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-util',
+      'javelin-install',
+      'javelin-util',
     ),
     '0f81f8df' => array(
-      0 => 'javelin-util',
-      1 => 'javelin-uri',
-      2 => 'javelin-install',
+      'javelin-util',
+      'javelin-uri',
+      'javelin-install',
     ),
     '127f2018' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-stratcom',
-      2 => 'javelin-dom',
-      3 => 'javelin-request',
-      4 => 'javelin-util',
-      5 => 'phabricator-shaped-request',
+      'javelin-behavior',
+      'javelin-stratcom',
+      'javelin-dom',
+      'javelin-request',
+      'javelin-util',
+      'phabricator-shaped-request',
     ),
     '14a827de' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-stratcom',
-      2 => 'javelin-dom',
-      3 => 'javelin-json',
-      4 => 'phabricator-draggable-list',
+      'javelin-behavior',
+      'javelin-stratcom',
+      'javelin-dom',
+      'javelin-json',
+      'phabricator-draggable-list',
     ),
     '14d7a8b8' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-behavior-device',
-      2 => 'javelin-stratcom',
-      3 => 'javelin-dom',
-      4 => 'javelin-magical-init',
-      5 => 'javelin-vector',
-      6 => 'javelin-request',
-      7 => 'javelin-util',
+      'javelin-behavior',
+      'javelin-behavior-device',
+      'javelin-stratcom',
+      'javelin-dom',
+      'javelin-magical-init',
+      'javelin-vector',
+      'javelin-request',
+      'javelin-util',
     ),
     '152178f0' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-util',
-      2 => 'javelin-stratcom',
-      3 => 'javelin-dom',
-      4 => 'javelin-vector',
-      5 => 'javelin-magical-init',
-      6 => 'javelin-request',
-      7 => 'javelin-history',
-      8 => 'javelin-workflow',
-      9 => 'javelin-mask',
-      10 => 'javelin-behavior-device',
-      11 => 'phabricator-keyboard-shortcut',
+      'javelin-behavior',
+      'javelin-util',
+      'javelin-stratcom',
+      'javelin-dom',
+      'javelin-vector',
+      'javelin-magical-init',
+      'javelin-request',
+      'javelin-history',
+      'javelin-workflow',
+      'javelin-mask',
+      'javelin-behavior-device',
+      'phabricator-keyboard-shortcut',
     ),
     '1693a296' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'phortune-credit-card-form',
+      'javelin-behavior',
+      'javelin-dom',
+      'phortune-credit-card-form',
     ),
     '1ae869f2' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-util',
-      2 => 'phabricator-keyboard-shortcut-manager',
+      'javelin-install',
+      'javelin-util',
+      'phabricator-keyboard-shortcut-manager',
     ),
     '1d8ad5c3' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-util',
-      2 => 'javelin-request',
-      3 => 'javelin-dom',
-      4 => 'javelin-uri',
-      5 => 'phabricator-file-upload',
+      'javelin-install',
+      'javelin-util',
+      'javelin-request',
+      'javelin-dom',
+      'javelin-uri',
+      'phabricator-file-upload',
     ),
     '1def2711' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-dom',
-      2 => 'javelin-reactor-dom',
+      'javelin-install',
+      'javelin-dom',
+      'javelin-reactor-dom',
     ),
     '1ffb3a9c' => array(
-      0 => 'javelin-util',
-      1 => 'javelin-magical-init',
+      'javelin-util',
+      'javelin-magical-init',
     ),
     '2290aeef' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-dom',
-      2 => 'javelin-json',
-      3 => 'javelin-workflow',
-      4 => 'javelin-util',
+      'javelin-install',
+      'javelin-dom',
+      'javelin-json',
+      'javelin-workflow',
+      'javelin-util',
     ),
     '22e16ae7' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-vector',
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-vector',
     ),
     '23cbb8ac' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-event',
+      'javelin-install',
+      'javelin-event',
     ),
     '2926fff2' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
+      'javelin-behavior',
+      'javelin-dom',
     ),
     '29274e2b' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-util',
+      'javelin-install',
+      'javelin-util',
     ),
     '2b228192' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-util',
-      3 => 'javelin-workflow',
-      4 => 'javelin-json',
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-util',
+      'javelin-workflow',
+      'javelin-json',
     ),
     '2cad29d1' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-dom',
-      2 => 'javelin-stratcom',
-      3 => 'javelin-util',
-      4 => 'javelin-vector',
-      5 => 'javelin-magical-init',
+      'javelin-install',
+      'javelin-dom',
+      'javelin-stratcom',
+      'javelin-util',
+      'javelin-vector',
+      'javelin-magical-init',
     ),
     '2fa810fc' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-view-renderer',
-      3 => 'javelin-install',
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-view-renderer',
+      'javelin-install',
     ),
     '316b8fa1' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-typeahead-source',
+      'javelin-install',
+      'javelin-typeahead-source',
     ),
     '357b6e9b' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-stratcom',
-      2 => 'javelin-util',
-      3 => 'javelin-dom',
-      4 => 'javelin-request',
-      5 => 'phabricator-keyboard-shortcut',
+      'javelin-behavior',
+      'javelin-stratcom',
+      'javelin-util',
+      'javelin-dom',
+      'javelin-request',
+      'phabricator-keyboard-shortcut',
     ),
     '361e3ed3' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
+      'javelin-behavior',
+      'javelin-dom',
     ),
     '3672899b' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-uri',
-      3 => 'javelin-mask',
-      4 => 'phabricator-drag-and-drop-file-upload',
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-uri',
+      'javelin-mask',
+      'phabricator-drag-and-drop-file-upload',
     ),
     '3915d490' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-util',
-      2 => 'javelin-dom',
-      3 => 'javelin-vector',
+      'javelin-install',
+      'javelin-util',
+      'javelin-dom',
+      'javelin-vector',
     ),
     '39841ead' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-request',
-      3 => 'javelin-util',
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-request',
+      'javelin-util',
     ),
     '3ab51e2c' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-behavior-device',
-      2 => 'javelin-stratcom',
-      3 => 'javelin-vector',
-      4 => 'javelin-dom',
-      5 => 'javelin-magical-init',
+      'javelin-behavior',
+      'javelin-behavior-device',
+      'javelin-stratcom',
+      'javelin-vector',
+      'javelin-dom',
+      'javelin-magical-init',
     ),
     '3b1557b3' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-stratcom',
-      2 => 'javelin-dom',
+      'javelin-behavior',
+      'javelin-stratcom',
+      'javelin-dom',
     ),
     '3b3e1664' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'phortune-credit-card-form',
+      'javelin-behavior',
+      'javelin-dom',
+      'phortune-credit-card-form',
     ),
     '3d51a746' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-stratcom',
-      3 => 'javelin-workflow',
-      4 => 'javelin-util',
-      5 => 'javelin-uri',
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-stratcom',
+      'javelin-workflow',
+      'javelin-util',
+      'javelin-uri',
     ),
     '3ee3408b' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-behavior-device',
-      2 => 'javelin-stratcom',
-      3 => 'phabricator-tooltip',
+      'javelin-behavior',
+      'javelin-behavior-device',
+      'javelin-stratcom',
+      'phabricator-tooltip',
     ),
     '3fc2c8f2' => array(
-      0 => 'multirow-row-manager',
-      1 => 'javelin-install',
-      2 => 'javelin-util',
-      3 => 'javelin-dom',
-      4 => 'javelin-stratcom',
-      5 => 'javelin-json',
-      6 => 'phabricator-prefab',
+      'multirow-row-manager',
+      'javelin-install',
+      'javelin-util',
+      'javelin-dom',
+      'javelin-stratcom',
+      'javelin-json',
+      'phabricator-prefab',
     ),
     '40a6a403' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-dom',
-      2 => 'javelin-reactor-dom',
+      'javelin-install',
+      'javelin-dom',
+      'javelin-reactor-dom',
     ),
     '40b1ff90' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-stratcom',
-      3 => 'javelin-workflow',
-      4 => 'javelin-util',
-      5 => 'phabricator-notification',
-      6 => 'javelin-behavior-device',
-      7 => 'phuix-dropdown-menu',
-      8 => 'phuix-action-list-view',
-      9 => 'phuix-action-view',
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-stratcom',
+      'javelin-workflow',
+      'javelin-util',
+      'phabricator-notification',
+      'javelin-behavior-device',
+      'phuix-dropdown-menu',
+      'phuix-action-list-view',
+      'phuix-action-view',
     ),
     '41e47dea' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-stratcom',
-      2 => 'javelin-dom',
-      3 => 'javelin-util',
+      'javelin-install',
+      'javelin-stratcom',
+      'javelin-dom',
+      'javelin-util',
     ),
     '44168bad' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'phabricator-prefab',
+      'javelin-behavior',
+      'javelin-dom',
+      'phabricator-prefab',
     ),
     '453c5375' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
+      'javelin-behavior',
+      'javelin-dom',
     ),
     '469c0d9e' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-workflow',
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-workflow',
     ),
     '47c794d8' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-dom',
-      2 => 'javelin-reactor-dom',
+      'javelin-install',
+      'javelin-dom',
+      'javelin-reactor-dom',
     ),
     '4a07e8e3' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-util',
+      'javelin-install',
+      'javelin-util',
     ),
     '4d94d9c3' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-stratcom',
-      2 => 'javelin-dom',
-      3 => 'phuix-dropdown-menu',
+      'javelin-behavior',
+      'javelin-stratcom',
+      'javelin-dom',
+      'phuix-dropdown-menu',
     ),
     '4e3e79a6' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-stratcom',
-      2 => 'javelin-dom',
+      'javelin-behavior',
+      'javelin-stratcom',
+      'javelin-dom',
     ),
     '4e9b766b' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-util',
-      3 => 'javelin-stratcom',
-      4 => 'javelin-request',
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-util',
+      'javelin-stratcom',
+      'javelin-request',
     ),
     '4fdb476d' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-stratcom',
-      2 => 'javelin-dom',
+      'javelin-behavior',
+      'javelin-stratcom',
+      'javelin-dom',
     ),
     '503e17fd' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-typeahead-source',
-      2 => 'javelin-util',
+      'javelin-install',
+      'javelin-typeahead-source',
+      'javelin-util',
     ),
     '519705ea' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-dom',
-      2 => 'javelin-reactor-dom',
+      'javelin-install',
+      'javelin-dom',
+      'javelin-reactor-dom',
     ),
     '54b612ba' => array(
-      0 => 'javelin-color',
-      1 => 'javelin-install',
-      2 => 'javelin-util',
+      'javelin-color',
+      'javelin-install',
+      'javelin-util',
     ),
     '54f314a0' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-util',
-      2 => 'javelin-request',
-      3 => 'javelin-typeahead-source',
+      'javelin-install',
+      'javelin-util',
+      'javelin-request',
+      'javelin-typeahead-source',
     ),
     '558829c2' => array(
-      0 => 'javelin-stratcom',
-      1 => 'javelin-behavior',
-      2 => 'javelin-vector',
-      3 => 'javelin-dom',
+      'javelin-stratcom',
+      'javelin-behavior',
+      'javelin-vector',
+      'javelin-dom',
     ),
     '58f7803f' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-aphlict',
-      2 => 'phabricator-phtize',
-      3 => 'javelin-dom',
+      'javelin-behavior',
+      'javelin-aphlict',
+      'phabricator-phtize',
+      'javelin-dom',
     ),
     '59b251eb' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-stratcom',
-      2 => 'javelin-vector',
-      3 => 'javelin-dom',
+      'javelin-behavior',
+      'javelin-stratcom',
+      'javelin-vector',
+      'javelin-dom',
     ),
     '5bc2cb21' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-stratcom',
+      'javelin-behavior',
+      'javelin-stratcom',
     ),
     '5fefb143' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-workflow',
-      3 => 'javelin-stratcom',
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-workflow',
+      'javelin-stratcom',
     ),
     '60821bc7' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-stratcom',
-      2 => 'javelin-dom',
+      'javelin-behavior',
+      'javelin-stratcom',
+      'javelin-dom',
     ),
     '6153c708' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-stratcom',
-      2 => 'javelin-dom',
-      3 => 'javelin-workflow',
+      'javelin-behavior',
+      'javelin-stratcom',
+      'javelin-dom',
+      'javelin-workflow',
     ),
     '61cbc29a' => array(
-      0 => 'javelin-magical-init',
-      1 => 'javelin-util',
+      'javelin-magical-init',
+      'javelin-util',
     ),
     '6453c869' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-dom',
-      2 => 'javelin-fx',
+      'javelin-install',
+      'javelin-dom',
+      'javelin-fx',
     ),
     '69adf288' => array(
-      0 => 'javelin-install',
+      'javelin-install',
     ),
     '6b3dcf44' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-util',
+      'javelin-install',
+      'javelin-util',
     ),
     '6c2b09a2' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-util',
+      'javelin-install',
+      'javelin-util',
     ),
     '6d3e1947' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-diffusion-locate-file-source',
-      2 => 'javelin-dom',
-      3 => 'javelin-typeahead',
-      4 => 'javelin-uri',
+      'javelin-behavior',
+      'javelin-diffusion-locate-file-source',
+      'javelin-dom',
+      'javelin-typeahead',
+      'javelin-uri',
     ),
     '6e8cefa4' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-dom',
-      2 => 'javelin-util',
+      'javelin-install',
+      'javelin-dom',
+      'javelin-util',
     ),
     '6eff08aa' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-util',
-      2 => 'javelin-stratcom',
+      'javelin-install',
+      'javelin-util',
+      'javelin-stratcom',
     ),
     '710f209e' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-util',
-      3 => 'javelin-stratcom',
-      4 => 'javelin-workflow',
-      5 => 'phuix-dropdown-menu',
-      6 => 'phuix-action-list-view',
-      7 => 'phuix-action-view',
-      8 => 'phabricator-phtize',
-      9 => 'changeset-view-manager',
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-util',
+      'javelin-stratcom',
+      'javelin-workflow',
+      'phuix-dropdown-menu',
+      'phuix-action-list-view',
+      'phuix-action-view',
+      'phabricator-phtize',
+      'changeset-view-manager',
     ),
     '71f66c08' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-stratcom',
-      2 => 'javelin-workflow',
-      3 => 'javelin-dom',
-      4 => 'javelin-uri',
-      5 => 'phabricator-textareautils',
+      'javelin-behavior',
+      'javelin-stratcom',
+      'javelin-workflow',
+      'javelin-dom',
+      'javelin-uri',
+      'phabricator-textareautils',
     ),
     '7319e029' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
+      'javelin-behavior',
+      'javelin-dom',
     ),
     '76b9fc3e' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-stratcom',
-      2 => 'javelin-workflow',
-      3 => 'javelin-dom',
-      4 => 'phabricator-draggable-list',
+      'javelin-behavior',
+      'javelin-stratcom',
+      'javelin-workflow',
+      'javelin-dom',
+      'phabricator-draggable-list',
     ),
     '76f4ebed' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-reactor',
-      2 => 'javelin-util',
+      'javelin-install',
+      'javelin-reactor',
+      'javelin-util',
     ),
     '77b1cf6f' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-util',
+      'javelin-install',
+      'javelin-util',
     ),
     '7814b593' => array(
-      0 => 'javelin-request',
-      1 => 'javelin-behavior',
-      2 => 'javelin-dom',
-      3 => 'javelin-router',
-      4 => 'javelin-util',
-      5 => 'phabricator-busy',
+      'javelin-request',
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-router',
+      'javelin-util',
+      'phabricator-busy',
     ),
     '7a68dda3' => array(
-      0 => 'owners-path-editor',
-      1 => 'javelin-behavior',
+      'owners-path-editor',
+      'javelin-behavior',
     ),
     '7a9677fc' => array(
-      0 => 'phabricator-notification',
-      1 => 'javelin-stratcom',
-      2 => 'javelin-behavior',
+      'phabricator-notification',
+      'javelin-stratcom',
+      'javelin-behavior',
     ),
     '7b98d7c5' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-stratcom',
-      3 => 'javelin-util',
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-stratcom',
+      'javelin-util',
     ),
     '7c273581' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-stratcom',
-      2 => 'javelin-dom',
+      'javelin-behavior',
+      'javelin-stratcom',
+      'javelin-dom',
     ),
     '7cbe244b' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-util',
-      2 => 'javelin-request',
-      3 => 'javelin-router',
+      'javelin-install',
+      'javelin-util',
+      'javelin-request',
+      'javelin-router',
     ),
     '7e41274a' => array(
-      0 => 'javelin-install',
+      'javelin-install',
     ),
     '7e8468ae' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-dom',
-      2 => 'javelin-vector',
-      3 => 'javelin-request',
-      4 => 'javelin-uri',
+      'javelin-install',
+      'javelin-dom',
+      'javelin-vector',
+      'javelin-request',
+      'javelin-uri',
     ),
     '7ebaeed3' => array(
-      0 => 'herald-rule-editor',
-      1 => 'javelin-behavior',
+      'herald-rule-editor',
+      'javelin-behavior',
     ),
     '7ee2b591' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-history',
+      'javelin-behavior',
+      'javelin-history',
     ),
     '82ce2142' => array(
-      0 => 'aphront-typeahead-control-css',
+      'aphront-typeahead-control-css',
     ),
     '84845b5b' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-stratcom',
-      3 => 'javelin-workflow',
-      4 => 'phabricator-draggable-list',
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-stratcom',
+      'javelin-workflow',
+      'phabricator-draggable-list',
     ),
     '85ab3c8e' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-util',
-      3 => 'javelin-workflow',
-      4 => 'javelin-stratcom',
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-util',
+      'javelin-workflow',
+      'javelin-stratcom',
     ),
     '85ea0626' => array(
-      0 => 'javelin-install',
+      'javelin-install',
     ),
     '88236f00' => array(
-      0 => 'javelin-behavior',
-      1 => 'phabricator-keyboard-shortcut',
-      2 => 'javelin-stratcom',
+      'javelin-behavior',
+      'phabricator-keyboard-shortcut',
+      'javelin-stratcom',
     ),
     '886fd850' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-reactor-dom',
-      2 => 'javelin-view-html',
-      3 => 'javelin-view-interpreter',
-      4 => 'javelin-view-renderer',
+      'javelin-install',
+      'javelin-reactor-dom',
+      'javelin-view-html',
+      'javelin-view-interpreter',
+      'javelin-view-renderer',
     ),
     '8a41885b' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-dom',
+      'javelin-install',
+      'javelin-dom',
     ),
     '8b0ad945' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-event',
-      2 => 'javelin-util',
-      3 => 'javelin-magical-init',
+      'javelin-install',
+      'javelin-event',
+      'javelin-util',
+      'javelin-magical-init',
     ),
     '8b3fd187' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-util',
-      2 => 'javelin-request',
-      3 => 'javelin-typeahead-source',
+      'javelin-install',
+      'javelin-util',
+      'javelin-request',
+      'javelin-typeahead-source',
     ),
     '8d199d97' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-stratcom',
-      3 => 'phabricator-keyboard-shortcut',
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-stratcom',
+      'phabricator-keyboard-shortcut',
     ),
     '8ef9ab58' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-stratcom',
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-stratcom',
     ),
     '8fc1c918' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-uri',
-      2 => 'phabricator-notification',
+      'javelin-behavior',
+      'javelin-uri',
+      'phabricator-notification',
     ),
     '92eb531d' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'phabricator-drag-and-drop-file-upload',
-      3 => 'phabricator-textareautils',
+      'javelin-behavior',
+      'javelin-dom',
+      'phabricator-drag-and-drop-file-upload',
+      'phabricator-textareautils',
     ),
     '9414ff18' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-resource',
-      2 => 'javelin-stratcom',
-      3 => 'javelin-workflow',
-      4 => 'javelin-util',
+      'javelin-behavior',
+      'javelin-resource',
+      'javelin-stratcom',
+      'javelin-workflow',
+      'javelin-util',
     ),
     '97258e55' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-stratcom',
-      2 => 'javelin-util',
-      3 => 'javelin-behavior',
-      4 => 'javelin-json',
-      5 => 'javelin-dom',
-      6 => 'javelin-resource',
-      7 => 'javelin-routable',
+      'javelin-install',
+      'javelin-stratcom',
+      'javelin-util',
+      'javelin-behavior',
+      'javelin-json',
+      'javelin-dom',
+      'javelin-resource',
+      'javelin-routable',
     ),
     '988040b4' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-dom',
-      2 => 'javelin-reactor-dom',
+      'javelin-install',
+      'javelin-dom',
+      'javelin-reactor-dom',
     ),
     '9c2623f4' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-stratcom',
-      2 => 'javelin-dom',
-      3 => 'javelin-workflow',
-      4 => 'phabricator-phtize',
-      5 => 'phabricator-drag-and-drop-file-upload',
-      6 => 'phabricator-draggable-list',
+      'javelin-behavior',
+      'javelin-stratcom',
+      'javelin-dom',
+      'javelin-workflow',
+      'phabricator-phtize',
+      'phabricator-drag-and-drop-file-upload',
+      'phabricator-draggable-list',
     ),
     '9db3d160' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-vector',
-      2 => 'javelin-dom',
+      'javelin-behavior',
+      'javelin-vector',
+      'javelin-dom',
     ),
     '9f7309fb' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-util',
-      3 => 'javelin-request',
-      4 => 'phabricator-shaped-request',
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-util',
+      'javelin-request',
+      'phabricator-shaped-request',
     ),
     'a155550f' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-dom',
-      2 => 'javelin-reactor-dom',
+      'javelin-install',
+      'javelin-dom',
+      'javelin-reactor-dom',
     ),
     'a3e2244e' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-stratcom',
-      2 => 'javelin-dom',
+      'javelin-behavior',
+      'javelin-stratcom',
+      'javelin-dom',
     ),
     'a4ae61bf' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-dom',
-      2 => 'phabricator-notification',
+      'javelin-install',
+      'javelin-dom',
+      'phabricator-notification',
     ),
     'a5573bcd' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-util',
-      2 => 'javelin-dom',
-      3 => 'javelin-stratcom',
-      4 => 'javelin-vector',
+      'javelin-behavior',
+      'javelin-util',
+      'javelin-dom',
+      'javelin-stratcom',
+      'javelin-vector',
     ),
     'a5b67173' => array(
-      0 => 'javelin-dom',
-      1 => 'javelin-util',
-      2 => 'javelin-stratcom',
-      3 => 'javelin-install',
+      'javelin-dom',
+      'javelin-util',
+      'javelin-stratcom',
+      'javelin-install',
     ),
     'a5d7cf86' => array(
-      0 => 'javelin-dom',
+      'javelin-dom',
     ),
     'a80d0378' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-stratcom',
-      2 => 'javelin-dom',
+      'javelin-behavior',
+      'javelin-stratcom',
+      'javelin-dom',
     ),
     'a826c925' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-aphlict',
-      2 => 'javelin-stratcom',
-      3 => 'javelin-request',
-      4 => 'javelin-uri',
-      5 => 'javelin-dom',
-      6 => 'javelin-json',
-      7 => 'javelin-router',
-      8 => 'javelin-util',
-      9 => 'phabricator-notification',
+      'javelin-behavior',
+      'javelin-aphlict',
+      'javelin-stratcom',
+      'javelin-request',
+      'javelin-uri',
+      'javelin-dom',
+      'javelin-json',
+      'javelin-router',
+      'javelin-util',
+      'phabricator-notification',
     ),
     'a8d8459d' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-stratcom',
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-stratcom',
     ),
     'a8da01f0' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-uri',
-      2 => 'phabricator-keyboard-shortcut',
+      'javelin-behavior',
+      'javelin-uri',
+      'phabricator-keyboard-shortcut',
     ),
     'a9f88de2' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-stratcom',
-      3 => 'javelin-workflow',
-      4 => 'javelin-fx',
-      5 => 'javelin-util',
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-stratcom',
+      'javelin-workflow',
+      'javelin-fx',
+      'javelin-util',
     ),
     'aa1733d0' => array(
-      0 => 'multirow-row-manager',
-      1 => 'javelin-install',
-      2 => 'path-typeahead',
-      3 => 'javelin-dom',
-      4 => 'javelin-util',
-      5 => 'phabricator-prefab',
+      'multirow-row-manager',
+      'javelin-install',
+      'path-typeahead',
+      'javelin-dom',
+      'javelin-util',
+      'phabricator-prefab',
     ),
     'aa93c7b0' => array(
-      0 => 'javelin-install',
+      'javelin-install',
     ),
     'ab836011' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-stratcom',
-      3 => 'javelin-workflow',
-      4 => 'javelin-util',
-      5 => 'phabricator-keyboard-shortcut',
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-stratcom',
+      'javelin-workflow',
+      'javelin-util',
+      'phabricator-keyboard-shortcut',
     ),
     'ab8d2723' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'phortune-credit-card-form',
+      'javelin-behavior',
+      'javelin-dom',
+      'phortune-credit-card-form',
     ),
     'ad7a69ca' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-util',
-      2 => 'javelin-stratcom',
-      3 => 'javelin-dom',
-      4 => 'javelin-vector',
+      'javelin-install',
+      'javelin-util',
+      'javelin-stratcom',
+      'javelin-dom',
+      'javelin-vector',
     ),
     'b1f0ccee' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-dom',
-      2 => 'javelin-reactor-dom',
+      'javelin-install',
+      'javelin-dom',
+      'javelin-reactor-dom',
     ),
     'b2b4fbaf' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-uri',
-      3 => 'javelin-request',
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-uri',
+      'javelin-request',
     ),
     'b3a4b884' => array(
-      0 => 'javelin-behavior',
-      1 => 'phabricator-prefab',
+      'javelin-behavior',
+      'phabricator-prefab',
     ),
     'b3e7d692' => array(
-      0 => 'javelin-install',
+      'javelin-install',
     ),
     'b3ec3cfc' => array(
-      0 => 'javelin-install',
+      'javelin-install',
     ),
     'b42eddc7' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-dom',
-      2 => 'javelin-typeahead-preloaded-source',
-      3 => 'javelin-util',
+      'javelin-install',
+      'javelin-dom',
+      'javelin-typeahead-preloaded-source',
+      'javelin-util',
     ),
     'b4c30592' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-reactor',
-      2 => 'javelin-util',
-      3 => 'javelin-reactor-node-calmer',
+      'javelin-install',
+      'javelin-reactor',
+      'javelin-util',
+      'javelin-reactor-node-calmer',
     ),
     'b5c256b8' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-dom',
+      'javelin-install',
+      'javelin-dom',
     ),
     'b6d401d6' => array(
-      0 => 'javelin-dom',
-      1 => 'javelin-dynval',
-      2 => 'javelin-reactor',
-      3 => 'javelin-reactornode',
-      4 => 'javelin-install',
-      5 => 'javelin-util',
+      'javelin-dom',
+      'javelin-dynval',
+      'javelin-reactor',
+      'javelin-reactornode',
+      'javelin-install',
+      'javelin-util',
     ),
     'b716477f' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-stratcom',
-      2 => 'javelin-workflow',
-      3 => 'javelin-dom',
-      4 => 'phabricator-draggable-list',
+      'javelin-behavior',
+      'javelin-stratcom',
+      'javelin-workflow',
+      'javelin-dom',
+      'phabricator-draggable-list',
     ),
     'bba9eedf' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-stratcom',
-      2 => 'javelin-dom',
+      'javelin-behavior',
+      'javelin-stratcom',
+      'javelin-dom',
     ),
     'bbae734c' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-util',
-      2 => 'javelin-dom',
-      3 => 'javelin-typeahead',
-      4 => 'javelin-tokenizer',
-      5 => 'javelin-typeahead-preloaded-source',
-      6 => 'javelin-typeahead-ondemand-source',
-      7 => 'javelin-dom',
-      8 => 'javelin-stratcom',
-      9 => 'javelin-util',
+      'javelin-install',
+      'javelin-util',
+      'javelin-dom',
+      'javelin-typeahead',
+      'javelin-tokenizer',
+      'javelin-typeahead-preloaded-source',
+      'javelin-typeahead-ondemand-source',
+      'javelin-dom',
+      'javelin-stratcom',
+      'javelin-util',
     ),
     'bd4c8dca' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-util',
-      2 => 'javelin-dom',
-      3 => 'javelin-vector',
-      4 => 'javelin-stratcom',
+      'javelin-install',
+      'javelin-util',
+      'javelin-dom',
+      'javelin-vector',
+      'javelin-stratcom',
     ),
     'bdaf4d04' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-util',
-      3 => 'javelin-request',
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-util',
+      'javelin-request',
     ),
     'bdb3e4d0' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-stratcom',
-      3 => 'phabricator-tooltip',
-      4 => 'changeset-view-manager',
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-stratcom',
+      'phabricator-tooltip',
+      'changeset-view-manager',
     ),
     'be807912' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-util',
-      3 => 'phabricator-shaped-request',
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-util',
+      'phabricator-shaped-request',
     ),
     'c4569c05' => array(
-      0 => 'javelin-magical-init',
-      1 => 'javelin-install',
-      2 => 'javelin-util',
-      3 => 'javelin-vector',
-      4 => 'javelin-stratcom',
+      'javelin-magical-init',
+      'javelin-install',
+      'javelin-util',
+      'javelin-vector',
+      'javelin-stratcom',
     ),
     'c60f4327' => array(
-      0 => 'javelin-stratcom',
-      1 => 'javelin-install',
-      2 => 'javelin-uri',
-      3 => 'javelin-util',
+      'javelin-stratcom',
+      'javelin-install',
+      'javelin-uri',
+      'javelin-util',
     ),
     'c6b95cbd' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-util',
-      3 => 'javelin-stratcom',
-      4 => 'javelin-workflow',
-      5 => 'phabricator-draggable-list',
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-util',
+      'javelin-stratcom',
+      'javelin-workflow',
+      'phabricator-draggable-list',
     ),
     'ca3f91eb' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-stratcom',
-      3 => 'phabricator-phtize',
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-stratcom',
+      'phabricator-phtize',
     ),
     'd149e002' => array(
-      0 => 'javelin-stratcom',
-      1 => 'javelin-request',
-      2 => 'javelin-dom',
-      3 => 'javelin-vector',
-      4 => 'javelin-install',
-      5 => 'javelin-util',
-      6 => 'javelin-mask',
-      7 => 'javelin-uri',
-      8 => 'javelin-routable',
+      'javelin-stratcom',
+      'javelin-request',
+      'javelin-dom',
+      'javelin-vector',
+      'javelin-install',
+      'javelin-util',
+      'javelin-mask',
+      'javelin-uri',
+      'javelin-routable',
     ),
     'd19198c8' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-dom',
-      2 => 'javelin-util',
-      3 => 'javelin-dynval',
-      4 => 'javelin-reactor-dom',
+      'javelin-install',
+      'javelin-dom',
+      'javelin-util',
+      'javelin-dynval',
+      'javelin-reactor-dom',
     ),
     'd254d646' => array(
-      0 => 'javelin-util',
+      'javelin-util',
     ),
     'd2907473' => array(
-      0 => 'javelin-dom',
-      1 => 'javelin-util',
-      2 => 'javelin-stratcom',
-      3 => 'javelin-install',
-      4 => 'javelin-workflow',
-      5 => 'javelin-router',
-      6 => 'javelin-behavior-device',
-      7 => 'javelin-vector',
+      'javelin-dom',
+      'javelin-util',
+      'javelin-stratcom',
+      'javelin-install',
+      'javelin-workflow',
+      'javelin-router',
+      'javelin-behavior-device',
+      'javelin-vector',
     ),
     'd4a14807' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-dom',
-      2 => 'javelin-view',
+      'javelin-install',
+      'javelin-dom',
+      'javelin-view',
     ),
     'd4eecc63' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-stratcom',
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-stratcom',
     ),
     'd6f54db0' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-request',
-      2 => 'javelin-stratcom',
-      3 => 'javelin-dom',
+      'javelin-behavior',
+      'javelin-request',
+      'javelin-stratcom',
+      'javelin-dom',
     ),
     'd712ac5f' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-typeahead-ondemand-source',
-      2 => 'javelin-typeahead',
-      3 => 'javelin-dom',
-      4 => 'javelin-uri',
-      5 => 'javelin-util',
-      6 => 'javelin-stratcom',
-      7 => 'phabricator-prefab',
+      'javelin-behavior',
+      'javelin-typeahead-ondemand-source',
+      'javelin-typeahead',
+      'javelin-dom',
+      'javelin-uri',
+      'javelin-util',
+      'javelin-stratcom',
+      'phabricator-prefab',
     ),
     'd75709e6' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-workflow',
-      2 => 'javelin-json',
-      3 => 'javelin-dom',
-      4 => 'phabricator-keyboard-shortcut',
+      'javelin-behavior',
+      'javelin-workflow',
+      'javelin-json',
+      'javelin-dom',
+      'phabricator-keyboard-shortcut',
     ),
     'd835b03a' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-util',
-      3 => 'phabricator-shaped-request',
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-util',
+      'phabricator-shaped-request',
     ),
     'dd7e8ef5' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-workflow',
-      3 => 'javelin-util',
-      4 => 'javelin-stratcom',
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-workflow',
+      'javelin-util',
+      'javelin-stratcom',
     ),
     'de2e896f' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-typeahead',
-      3 => 'javelin-typeahead-ondemand-source',
-      4 => 'javelin-dom',
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-typeahead',
+      'javelin-typeahead-ondemand-source',
+      'javelin-dom',
     ),
     'e10f8e18' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'phabricator-prefab',
+      'javelin-behavior',
+      'javelin-dom',
+      'phabricator-prefab',
     ),
     'e1ff79b1' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-stratcom',
-      2 => 'javelin-dom',
+      'javelin-behavior',
+      'javelin-stratcom',
+      'javelin-dom',
     ),
     'e32d14ab' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-stratcom',
-      2 => 'javelin-dom',
-      3 => 'phabricator-phtize',
-      4 => 'phabricator-textareautils',
-      5 => 'javelin-workflow',
-      6 => 'javelin-vector',
+      'javelin-behavior',
+      'javelin-stratcom',
+      'javelin-dom',
+      'phabricator-phtize',
+      'phabricator-textareautils',
+      'javelin-workflow',
+      'javelin-vector',
     ),
     'e379b58e' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-stratcom',
-      2 => 'javelin-vector',
-      3 => 'javelin-dom',
-      4 => 'javelin-uri',
+      'javelin-behavior',
+      'javelin-stratcom',
+      'javelin-vector',
+      'javelin-dom',
+      'javelin-uri',
     ),
     'e566f52c' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-stratcom',
-      2 => 'javelin-dom',
+      'javelin-behavior',
+      'javelin-stratcom',
+      'javelin-dom',
     ),
     'e5822781' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-json',
-      3 => 'javelin-workflow',
-      4 => 'javelin-magical-init',
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-json',
+      'javelin-workflow',
+      'javelin-magical-init',
     ),
     'e5b406f9' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-dom',
-      2 => 'javelin-view-visitor',
-      3 => 'javelin-util',
+      'javelin-install',
+      'javelin-dom',
+      'javelin-view-visitor',
+      'javelin-util',
     ),
     'e614d22b' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-dom',
-      2 => 'javelin-vector',
-      3 => 'javelin-util',
+      'javelin-install',
+      'javelin-dom',
+      'javelin-vector',
+      'javelin-util',
     ),
     'e9581f08' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-stratcom',
-      2 => 'javelin-workflow',
-      3 => 'javelin-dom',
-      4 => 'phabricator-draggable-list',
+      'javelin-behavior',
+      'javelin-stratcom',
+      'javelin-workflow',
+      'javelin-dom',
+      'phabricator-draggable-list',
     ),
     'efe49472' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-util',
+      'javelin-install',
+      'javelin-util',
     ),
     'f0a41b9f' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-util',
-      3 => 'javelin-stratcom',
-      4 => 'javelin-workflow',
-      5 => 'javelin-behavior-device',
-      6 => 'javelin-history',
-      7 => 'javelin-vector',
-      8 => 'phabricator-shaped-request',
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-util',
+      'javelin-stratcom',
+      'javelin-workflow',
+      'javelin-behavior-device',
+      'javelin-history',
+      'javelin-vector',
+      'phabricator-shaped-request',
     ),
     'f2441746' => array(
-      0 => 'javelin-dom',
-      1 => 'javelin-util',
-      2 => 'javelin-stratcom',
-      3 => 'javelin-install',
-      4 => 'javelin-request',
-      5 => 'javelin-workflow',
+      'javelin-dom',
+      'javelin-util',
+      'javelin-stratcom',
+      'javelin-install',
+      'javelin-request',
+      'javelin-workflow',
     ),
     'f36e01af' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-behavior-device',
-      2 => 'javelin-stratcom',
-      3 => 'javelin-vector',
-      4 => 'phabricator-hovercard',
+      'javelin-behavior',
+      'javelin-behavior-device',
+      'javelin-stratcom',
+      'javelin-vector',
+      'phabricator-hovercard',
     ),
     'f3fef818' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-util',
-      3 => 'phuix-dropdown-menu',
-      4 => 'phuix-action-list-view',
-      5 => 'phuix-action-view',
-      6 => 'javelin-workflow',
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-util',
+      'phuix-dropdown-menu',
+      'phuix-action-list-view',
+      'phuix-action-view',
+      'javelin-workflow',
     ),
     'f51afce0' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-request',
-      2 => 'javelin-stratcom',
-      3 => 'javelin-vector',
-      4 => 'javelin-dom',
-      5 => 'javelin-uri',
-      6 => 'javelin-behavior-device',
+      'javelin-behavior',
+      'javelin-request',
+      'javelin-stratcom',
+      'javelin-vector',
+      'javelin-dom',
+      'javelin-uri',
+      'javelin-behavior-device',
     ),
     'f588412e' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-util',
-      3 => 'phabricator-prefab',
-      4 => 'multirow-row-manager',
-      5 => 'javelin-json',
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-util',
+      'phabricator-prefab',
+      'multirow-row-manager',
+      'javelin-json',
     ),
     'f6555212' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-reactornode',
-      2 => 'javelin-util',
-      3 => 'javelin-reactor',
+      'javelin-install',
+      'javelin-reactornode',
+      'javelin-util',
+      'javelin-reactor',
     ),
     'f726d506' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-stratcom',
-      2 => 'javelin-dom',
-      3 => 'javelin-history',
+      'javelin-behavior',
+      'javelin-stratcom',
+      'javelin-dom',
+      'javelin-history',
     ),
     'f7379f45' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-util',
-      3 => 'phabricator-shaped-request',
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-util',
+      'phabricator-shaped-request',
     ),
     'f7f1289f' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-stratcom',
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-stratcom',
     ),
     'f7fc67ec' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-typeahead',
-      2 => 'javelin-dom',
-      3 => 'javelin-request',
-      4 => 'javelin-typeahead-ondemand-source',
-      5 => 'javelin-util',
+      'javelin-install',
+      'javelin-typeahead',
+      'javelin-dom',
+      'javelin-request',
+      'javelin-typeahead-ondemand-source',
+      'javelin-util',
     ),
     'f8248bc5' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-util',
-      3 => 'javelin-json',
-      4 => 'javelin-stratcom',
-      5 => 'phabricator-shaped-request',
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-util',
+      'javelin-json',
+      'javelin-stratcom',
+      'phabricator-shaped-request',
     ),
     'f9539603' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-stratcom',
-      3 => 'javelin-uri',
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-stratcom',
+      'javelin-uri',
     ),
     'fa0f4fc2' => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-vector',
-      3 => 'javelin-magical-init',
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-vector',
+      'javelin-magical-init',
     ),
     'fcba4ecc' => array(
-      0 => 'javelin-install',
-      1 => 'javelin-util',
-      2 => 'javelin-dom',
-      3 => 'javelin-typeahead-normalizer',
+      'javelin-install',
+      'javelin-util',
+      'javelin-dom',
+      'javelin-typeahead-normalizer',
     ),
     'fe9a552f' => array(
-      0 => 'javelin-behavior',
-      1 => 'multirow-row-manager',
-      2 => 'javelin-dom',
-      3 => 'javelin-util',
-      4 => 'phabricator-prefab',
-      5 => 'javelin-json',
+      'javelin-behavior',
+      'multirow-row-manager',
+      'javelin-dom',
+      'javelin-util',
+      'phabricator-prefab',
+      'javelin-json',
     ),
     42126667 => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-request',
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-request',
     ),
     48086888 => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-workflow',
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-workflow',
     ),
     60479091 => array(
-      0 => 'phabricator-busy',
-      1 => 'javelin-behavior',
+      'phabricator-busy',
+      'javelin-behavior',
     ),
     82439934 => array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-util',
-      3 => 'javelin-stratcom',
-      4 => 'javelin-workflow',
-      5 => 'phabricator-draggable-list',
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-util',
+      'javelin-stratcom',
+      'javelin-workflow',
+      'phabricator-draggable-list',
     ),
   ),
   'packages' => array(
     'core.pkg.css' => array(
-      0 => 'phabricator-core-css',
-      1 => 'phabricator-zindex-css',
-      2 => 'phui-button-css',
-      3 => 'phabricator-standard-page-view',
-      4 => 'aphront-dialog-view-css',
-      5 => 'phui-form-view-css',
-      6 => 'aphront-panel-view-css',
-      7 => 'aphront-table-view-css',
-      8 => 'aphront-tokenizer-control-css',
-      9 => 'aphront-typeahead-control-css',
-      10 => 'aphront-list-filter-view-css',
-      11 => 'phabricator-remarkup-css',
-      12 => 'syntax-highlighting-css',
-      13 => 'aphront-pager-view-css',
-      14 => 'phabricator-transaction-view-css',
-      15 => 'aphront-tooltip-css',
-      16 => 'phabricator-flag-css',
-      17 => 'aphront-error-view-css',
-      18 => 'sprite-gradient-css',
-      19 => 'sprite-menu-css',
-      20 => 'sprite-apps-css',
-      21 => 'sprite-apps-large-css',
-      22 => 'phabricator-main-menu-view',
-      23 => 'phabricator-notification-css',
-      24 => 'phabricator-notification-menu-css',
-      25 => 'lightbox-attachment-css',
-      26 => 'phui-header-view-css',
-      27 => 'phabricator-filetree-view-css',
-      28 => 'phabricator-nav-view-css',
-      29 => 'phabricator-side-menu-view-css',
-      30 => 'phabricator-crumbs-view-css',
-      31 => 'phui-object-item-list-view-css',
-      32 => 'global-drag-and-drop-css',
-      33 => 'phui-spacing-css',
-      34 => 'phui-form-css',
-      35 => 'phui-icon-view-css',
-      36 => 'phabricator-application-launch-view-css',
-      37 => 'phabricator-action-list-view-css',
-      38 => 'phui-property-list-view-css',
-      39 => 'phui-tag-view-css',
-      40 => 'phui-list-view-css',
-      41 => 'font-fontawesome',
-      42 => 'phui-font-icon-base-css',
-      43 => 'sprite-main-header-css',
-      44 => 'phui-box-css',
-      45 => 'phui-object-box-css',
-      46 => 'phui-timeline-view-css',
-      47 => 'sprite-tokens-css',
-      48 => 'tokens-css',
-      49 => 'phui-status-list-view-css',
+      'phabricator-core-css',
+      'phabricator-zindex-css',
+      'phui-button-css',
+      'phabricator-standard-page-view',
+      'aphront-dialog-view-css',
+      'phui-form-view-css',
+      'aphront-panel-view-css',
+      'aphront-table-view-css',
+      'aphront-tokenizer-control-css',
+      'aphront-typeahead-control-css',
+      'aphront-list-filter-view-css',
+      'phabricator-remarkup-css',
+      'syntax-highlighting-css',
+      'aphront-pager-view-css',
+      'phabricator-transaction-view-css',
+      'aphront-tooltip-css',
+      'phabricator-flag-css',
+      'aphront-error-view-css',
+      'sprite-gradient-css',
+      'sprite-menu-css',
+      'sprite-apps-css',
+      'sprite-apps-large-css',
+      'phabricator-main-menu-view',
+      'phabricator-notification-css',
+      'phabricator-notification-menu-css',
+      'lightbox-attachment-css',
+      'phui-header-view-css',
+      'phabricator-filetree-view-css',
+      'phabricator-nav-view-css',
+      'phabricator-side-menu-view-css',
+      'phabricator-crumbs-view-css',
+      'phui-object-item-list-view-css',
+      'global-drag-and-drop-css',
+      'phui-spacing-css',
+      'phui-form-css',
+      'phui-icon-view-css',
+      'phabricator-application-launch-view-css',
+      'phabricator-action-list-view-css',
+      'phui-property-list-view-css',
+      'phui-tag-view-css',
+      'phui-list-view-css',
+      'font-fontawesome',
+      'phui-font-icon-base-css',
+      'sprite-main-header-css',
+      'phui-box-css',
+      'phui-object-box-css',
+      'phui-timeline-view-css',
+      'sprite-tokens-css',
+      'tokens-css',
+      'phui-status-list-view-css',
     ),
     'core.pkg.js' => array(
-      0 => 'javelin-util',
-      1 => 'javelin-install',
-      2 => 'javelin-event',
-      3 => 'javelin-stratcom',
-      4 => 'javelin-behavior',
-      5 => 'javelin-resource',
-      6 => 'javelin-request',
-      7 => 'javelin-vector',
-      8 => 'javelin-dom',
-      9 => 'javelin-json',
-      10 => 'javelin-uri',
-      11 => 'javelin-workflow',
-      12 => 'javelin-mask',
-      13 => 'javelin-typeahead',
-      14 => 'javelin-typeahead-normalizer',
-      15 => 'javelin-typeahead-source',
-      16 => 'javelin-typeahead-preloaded-source',
-      17 => 'javelin-typeahead-ondemand-source',
-      18 => 'javelin-tokenizer',
-      19 => 'javelin-history',
-      20 => 'javelin-router',
-      21 => 'javelin-routable',
-      22 => 'javelin-behavior-aphront-basic-tokenizer',
-      23 => 'javelin-behavior-workflow',
-      24 => 'javelin-behavior-aphront-form-disable-on-submit',
-      25 => 'phabricator-keyboard-shortcut-manager',
-      26 => 'phabricator-keyboard-shortcut',
-      27 => 'javelin-behavior-phabricator-keyboard-shortcuts',
-      28 => 'javelin-behavior-refresh-csrf',
-      29 => 'javelin-behavior-phabricator-watch-anchor',
-      30 => 'javelin-behavior-phabricator-autofocus',
-      31 => 'phuix-dropdown-menu',
-      32 => 'phuix-action-list-view',
-      33 => 'phuix-action-view',
-      34 => 'phabricator-phtize',
-      35 => 'javelin-behavior-phabricator-oncopy',
-      36 => 'phabricator-tooltip',
-      37 => 'javelin-behavior-phabricator-tooltips',
-      38 => 'phabricator-prefab',
-      39 => 'javelin-behavior-device',
-      40 => 'javelin-behavior-toggle-class',
-      41 => 'javelin-behavior-lightbox-attachments',
-      42 => 'phabricator-busy',
-      43 => 'javelin-aphlict',
-      44 => 'phabricator-notification',
-      45 => 'javelin-behavior-aphlict-listen',
-      46 => 'javelin-behavior-phabricator-search-typeahead',
-      47 => 'javelin-behavior-konami',
-      48 => 'javelin-behavior-aphlict-dropdown',
-      49 => 'javelin-behavior-history-install',
-      50 => 'javelin-behavior-phabricator-gesture',
-      51 => 'javelin-behavior-phabricator-active-nav',
-      52 => 'javelin-behavior-phabricator-nav',
-      53 => 'javelin-behavior-phabricator-remarkup-assist',
-      54 => 'phabricator-textareautils',
-      55 => 'phabricator-file-upload',
-      56 => 'javelin-behavior-global-drag-and-drop',
-      57 => 'javelin-behavior-phabricator-reveal-content',
-      58 => 'phabricator-hovercard',
-      59 => 'javelin-behavior-phabricator-hovercards',
-      60 => 'javelin-color',
-      61 => 'javelin-fx',
-      62 => 'phabricator-draggable-list',
-      63 => 'javelin-behavior-phabricator-transaction-list',
-      64 => 'javelin-behavior-phabricator-show-all-transactions',
-      65 => 'javelin-behavior-phui-timeline-dropdown-menu',
-      66 => 'javelin-behavior-doorkeeper-tag',
+      'javelin-util',
+      'javelin-install',
+      'javelin-event',
+      'javelin-stratcom',
+      'javelin-behavior',
+      'javelin-resource',
+      'javelin-request',
+      'javelin-vector',
+      'javelin-dom',
+      'javelin-json',
+      'javelin-uri',
+      'javelin-workflow',
+      'javelin-mask',
+      'javelin-typeahead',
+      'javelin-typeahead-normalizer',
+      'javelin-typeahead-source',
+      'javelin-typeahead-preloaded-source',
+      'javelin-typeahead-ondemand-source',
+      'javelin-tokenizer',
+      'javelin-history',
+      'javelin-router',
+      'javelin-routable',
+      'javelin-behavior-aphront-basic-tokenizer',
+      'javelin-behavior-workflow',
+      'javelin-behavior-aphront-form-disable-on-submit',
+      'phabricator-keyboard-shortcut-manager',
+      'phabricator-keyboard-shortcut',
+      'javelin-behavior-phabricator-keyboard-shortcuts',
+      'javelin-behavior-refresh-csrf',
+      'javelin-behavior-phabricator-watch-anchor',
+      'javelin-behavior-phabricator-autofocus',
+      'phuix-dropdown-menu',
+      'phuix-action-list-view',
+      'phuix-action-view',
+      'phabricator-phtize',
+      'javelin-behavior-phabricator-oncopy',
+      'phabricator-tooltip',
+      'javelin-behavior-phabricator-tooltips',
+      'phabricator-prefab',
+      'javelin-behavior-device',
+      'javelin-behavior-toggle-class',
+      'javelin-behavior-lightbox-attachments',
+      'phabricator-busy',
+      'javelin-aphlict',
+      'phabricator-notification',
+      'javelin-behavior-aphlict-listen',
+      'javelin-behavior-phabricator-search-typeahead',
+      'javelin-behavior-konami',
+      'javelin-behavior-aphlict-dropdown',
+      'javelin-behavior-history-install',
+      'javelin-behavior-phabricator-gesture',
+      'javelin-behavior-phabricator-active-nav',
+      'javelin-behavior-phabricator-nav',
+      'javelin-behavior-phabricator-remarkup-assist',
+      'phabricator-textareautils',
+      'phabricator-file-upload',
+      'javelin-behavior-global-drag-and-drop',
+      'javelin-behavior-phabricator-reveal-content',
+      'phabricator-hovercard',
+      'javelin-behavior-phabricator-hovercards',
+      'javelin-color',
+      'javelin-fx',
+      'phabricator-draggable-list',
+      'javelin-behavior-phabricator-transaction-list',
+      'javelin-behavior-phabricator-show-all-transactions',
+      'javelin-behavior-phui-timeline-dropdown-menu',
+      'javelin-behavior-doorkeeper-tag',
     ),
     'darkconsole.pkg.js' => array(
-      0 => 'javelin-behavior-dark-console',
-      1 => 'javelin-behavior-error-log',
+      'javelin-behavior-dark-console',
+      'javelin-behavior-error-log',
     ),
     'differential.pkg.css' => array(
-      0 => 'differential-core-view-css',
-      1 => 'differential-changeset-view-css',
-      2 => 'differential-results-table-css',
-      3 => 'differential-revision-history-css',
-      4 => 'differential-revision-list-css',
-      5 => 'differential-table-of-contents-css',
-      6 => 'differential-revision-comment-css',
-      7 => 'differential-revision-add-comment-css',
-      8 => 'phabricator-object-selector-css',
-      9 => 'phabricator-content-source-view-css',
-      10 => 'inline-comment-summary-css',
+      'differential-core-view-css',
+      'differential-changeset-view-css',
+      'differential-results-table-css',
+      'differential-revision-history-css',
+      'differential-revision-list-css',
+      'differential-table-of-contents-css',
+      'differential-revision-comment-css',
+      'differential-revision-add-comment-css',
+      'phabricator-object-selector-css',
+      'phabricator-content-source-view-css',
+      'inline-comment-summary-css',
     ),
     'differential.pkg.js' => array(
-      0 => 'phabricator-drag-and-drop-file-upload',
-      1 => 'phabricator-shaped-request',
-      2 => 'javelin-behavior-differential-feedback-preview',
-      3 => 'javelin-behavior-differential-edit-inline-comments',
-      4 => 'javelin-behavior-differential-populate',
-      5 => 'javelin-behavior-differential-show-more',
-      6 => 'javelin-behavior-differential-diff-radios',
-      7 => 'javelin-behavior-differential-comment-jump',
-      8 => 'javelin-behavior-differential-add-reviewers-and-ccs',
-      9 => 'javelin-behavior-differential-keyboard-navigation',
-      10 => 'javelin-behavior-aphront-drag-and-drop-textarea',
-      11 => 'javelin-behavior-phabricator-object-selector',
-      12 => 'javelin-behavior-repository-crossreference',
-      13 => 'javelin-behavior-load-blame',
-      14 => 'differential-inline-comment-editor',
-      15 => 'javelin-behavior-differential-dropdown-menus',
-      16 => 'javelin-behavior-differential-toggle-files',
-      17 => 'javelin-behavior-differential-user-select',
-      18 => 'javelin-behavior-aphront-more',
+      'phabricator-drag-and-drop-file-upload',
+      'phabricator-shaped-request',
+      'javelin-behavior-differential-feedback-preview',
+      'javelin-behavior-differential-edit-inline-comments',
+      'javelin-behavior-differential-populate',
+      'javelin-behavior-differential-show-more',
+      'javelin-behavior-differential-diff-radios',
+      'javelin-behavior-differential-comment-jump',
+      'javelin-behavior-differential-add-reviewers-and-ccs',
+      'javelin-behavior-differential-keyboard-navigation',
+      'javelin-behavior-aphront-drag-and-drop-textarea',
+      'javelin-behavior-phabricator-object-selector',
+      'javelin-behavior-repository-crossreference',
+      'javelin-behavior-load-blame',
+      'differential-inline-comment-editor',
+      'javelin-behavior-differential-dropdown-menus',
+      'javelin-behavior-differential-toggle-files',
+      'javelin-behavior-differential-user-select',
+      'javelin-behavior-aphront-more',
     ),
     'diffusion.pkg.css' => array(
-      0 => 'diffusion-commit-view-css',
-      1 => 'diffusion-icons-css',
+      'diffusion-commit-view-css',
+      'diffusion-icons-css',
     ),
     'diffusion.pkg.js' => array(
-      0 => 'javelin-behavior-diffusion-pull-lastmodified',
-      1 => 'javelin-behavior-diffusion-commit-graph',
-      2 => 'javelin-behavior-audit-preview',
+      'javelin-behavior-diffusion-pull-lastmodified',
+      'javelin-behavior-diffusion-commit-graph',
+      'javelin-behavior-audit-preview',
     ),
     'maniphest.pkg.css' => array(
-      0 => 'maniphest-task-summary-css',
+      'maniphest-task-summary-css',
     ),
     'maniphest.pkg.js' => array(
-      0 => 'javelin-behavior-maniphest-batch-selector',
-      1 => 'javelin-behavior-maniphest-transaction-controls',
-      2 => 'javelin-behavior-maniphest-transaction-preview',
-      3 => 'javelin-behavior-maniphest-transaction-expand',
-      4 => 'javelin-behavior-maniphest-subpriority-editor',
-      5 => 'javelin-behavior-maniphest-list-editor',
+      'javelin-behavior-maniphest-batch-selector',
+      'javelin-behavior-maniphest-transaction-controls',
+      'javelin-behavior-maniphest-transaction-preview',
+      'javelin-behavior-maniphest-transaction-expand',
+      'javelin-behavior-maniphest-subpriority-editor',
+      'javelin-behavior-maniphest-list-editor',
     ),
   ),
 );
diff --git a/resources/sql/autopatches/20140721.phortune.1.cart.sql b/resources/sql/autopatches/20140721.phortune.1.cart.sql
new file mode 100644
--- /dev/null
+++ b/resources/sql/autopatches/20140721.phortune.1.cart.sql
@@ -0,0 +1,11 @@
+CREATE TABLE {$NAMESPACE}_phortune.phortune_cart (
+  id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
+  phid VARCHAR(64) NOT NULL COLLATE utf8_bin,
+  accountPHID VARCHAR(64) NOT NULL COLLATE utf8_bin,
+  authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin,
+  metadata LONGTEXT NOT NULL COLLATE utf8_bin,
+  dateCreated INT UNSIGNED NOT NULL,
+  dateModified INT UNSIGNED NOT NULL,
+  UNIQUE KEY `key_phid` (phid),
+  KEY `key_account` (accountPHID)
+) ENGINE=InnoDB, COLLATE utf8_general_ci;
diff --git a/resources/sql/autopatches/20140721.phortune.2.purchase.sql b/resources/sql/autopatches/20140721.phortune.2.purchase.sql
new file mode 100644
--- /dev/null
+++ b/resources/sql/autopatches/20140721.phortune.2.purchase.sql
@@ -0,0 +1,17 @@
+CREATE TABLE {$NAMESPACE}_phortune.phortune_purchase (
+  id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
+  phid VARCHAR(64) NOT NULL COLLATE utf8_bin,
+  productPHID VARCHAR(64) NOT NULL COLLATE utf8_bin,
+  accountPHID VARCHAR(64) NOT NULL COLLATE utf8_bin,
+  authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin,
+  cartPHID VARCHAR(64) COLLATE utf8_bin,
+  basePriceInCents INT NOT NULL,
+  quantity INT UNSIGNED NOT NULL,
+  totalPriceInCents INT NOT NULL,
+  status VARCHAR(32) NOT NULL COLLATE utf8_bin,
+  metadata LONGTEXT NOT NULL COLLATE utf8_bin,
+  dateCreated INT UNSIGNED NOT NULL,
+  dateModified INT UNSIGNED NOT NULL,
+  UNIQUE KEY `key_phid` (phid),
+  KEY `key_cart` (cartPHID)
+) ENGINE=InnoDB, COLLATE utf8_general_ci;
diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php
--- a/src/__phutil_library_map__.php
+++ b/src/__phutil_library_map__.php
@@ -2496,6 +2496,7 @@
     'PhortuneAccountViewController' => 'applications/phortune/controller/PhortuneAccountViewController.php',
     'PhortuneBalancedPaymentProvider' => 'applications/phortune/provider/PhortuneBalancedPaymentProvider.php',
     'PhortuneCart' => 'applications/phortune/storage/PhortuneCart.php',
+    'PhortuneCartQuery' => 'applications/phortune/query/PhortuneCartQuery.php',
     'PhortuneCharge' => 'applications/phortune/storage/PhortuneCharge.php',
     'PhortuneConstants' => 'applications/phortune/constants/PhortuneConstants.php',
     'PhortuneController' => 'applications/phortune/controller/PhortuneController.php',
@@ -2521,12 +2522,14 @@
     'PhortuneProductEditController' => 'applications/phortune/controller/PhortuneProductEditController.php',
     'PhortuneProductEditor' => 'applications/phortune/editor/PhortuneProductEditor.php',
     'PhortuneProductListController' => 'applications/phortune/controller/PhortuneProductListController.php',
+    'PhortuneProductPurchaseController' => 'applications/phortune/controller/PhortuneProductPurchaseController.php',
     'PhortuneProductQuery' => 'applications/phortune/query/PhortuneProductQuery.php',
     'PhortuneProductTransaction' => 'applications/phortune/storage/PhortuneProductTransaction.php',
     'PhortuneProductTransactionQuery' => 'applications/phortune/query/PhortuneProductTransactionQuery.php',
     'PhortuneProductViewController' => 'applications/phortune/controller/PhortuneProductViewController.php',
     'PhortuneProviderController' => 'applications/phortune/controller/PhortuneProviderController.php',
     'PhortunePurchase' => 'applications/phortune/storage/PhortunePurchase.php',
+    'PhortunePurchaseQuery' => 'applications/phortune/query/PhortunePurchaseQuery.php',
     'PhortuneStripePaymentProvider' => 'applications/phortune/provider/PhortuneStripePaymentProvider.php',
     'PhortuneTestExtraPaymentProvider' => 'applications/phortune/provider/__tests__/PhortuneTestExtraPaymentProvider.php',
     'PhortuneTestPaymentProvider' => 'applications/phortune/provider/PhortuneTestPaymentProvider.php',
@@ -5374,7 +5377,11 @@
     'PhortuneAccountTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
     'PhortuneAccountViewController' => 'PhortuneController',
     'PhortuneBalancedPaymentProvider' => 'PhortunePaymentProvider',
-    'PhortuneCart' => 'PhortuneDAO',
+    'PhortuneCart' => array(
+      'PhortuneDAO',
+      'PhabricatorPolicyInterface',
+    ),
+    'PhortuneCartQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
     'PhortuneCharge' => 'PhortuneDAO',
     'PhortuneController' => 'PhabricatorController',
     'PhortuneCurrencyTestCase' => 'PhabricatorTestCase',
@@ -5402,12 +5409,17 @@
     'PhortuneProductEditController' => 'PhabricatorController',
     'PhortuneProductEditor' => 'PhabricatorApplicationTransactionEditor',
     'PhortuneProductListController' => 'PhabricatorController',
+    'PhortuneProductPurchaseController' => 'PhortuneController',
     'PhortuneProductQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
     'PhortuneProductTransaction' => 'PhabricatorApplicationTransaction',
     'PhortuneProductTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
     'PhortuneProductViewController' => 'PhortuneController',
     'PhortuneProviderController' => 'PhortuneController',
-    'PhortunePurchase' => 'PhortuneDAO',
+    'PhortunePurchase' => array(
+      'PhortuneDAO',
+      'PhabricatorPolicyInterface',
+    ),
+    'PhortunePurchaseQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
     'PhortuneStripePaymentProvider' => 'PhortunePaymentProvider',
     'PhortuneTestExtraPaymentProvider' => 'PhortunePaymentProvider',
     'PhortuneTestPaymentProvider' => 'PhortunePaymentProvider',
diff --git a/src/applications/phortune/application/PhabricatorApplicationPhortune.php b/src/applications/phortune/application/PhabricatorApplicationPhortune.php
--- a/src/applications/phortune/application/PhabricatorApplicationPhortune.php
+++ b/src/applications/phortune/application/PhabricatorApplicationPhortune.php
@@ -35,8 +35,9 @@
           'paymentmethod/' => array(
             'edit/' => 'PhortunePaymentMethodEditController',
           ),
-          'buy/(?P<id>\d+)/' => 'PhortuneAccountBuyController',
+          'buy/(?P<productID>\d+)/' => 'PhortuneProductPurchaseController',
         ),
+        'cart/(?P<id>\d+)/' => 'PhortuneAccountBuyController',
         'account/' => array(
           '' => 'PhortuneAccountListController',
           'edit/(?:(?P<id>\d+)/)?' => 'PhortuneAccountEditController',
diff --git a/src/applications/phortune/controller/PhortuneAccountBuyController.php b/src/applications/phortune/controller/PhortuneAccountBuyController.php
--- a/src/applications/phortune/controller/PhortuneAccountBuyController.php
+++ b/src/applications/phortune/controller/PhortuneAccountBuyController.php
@@ -3,11 +3,9 @@
 final class PhortuneAccountBuyController
   extends PhortuneController {
 
-  private $accountID;
   private $id;
 
   public function willProcessRequest(array $data) {
-    $this->accountID = $data['accountID'];
     $this->id = $data['id'];
   }
 
@@ -15,47 +13,23 @@
     $request = $this->getRequest();
     $user = $request->getUser();
 
-    $account = id(new PhortuneAccountQuery())
-      ->setViewer($user)
-      ->withIDs(array($this->accountID))
-      ->executeOne();
-    if (!$account) {
-      return new Aphront404Response();
-    }
-
-    $account_uri = $this->getApplicationURI($account->getID().'/');
-
-    $product = id(new PhortuneProductQuery())
+    $cart = id(new PhortuneCartQuery())
       ->setViewer($user)
       ->withIDs(array($this->id))
+      ->needPurchases(true)
       ->executeOne();
-    if (!$product) {
+    if (!$cart) {
       return new Aphront404Response();
     }
 
-    $purchase = new PhortunePurchase();
-    $purchase->setProductPHID($product->getPHID());
-    $purchase->setAccountPHID($account->getPHID());
-    $purchase->setPurchaseName($product->getProductName());
-    $purchase->setBasePriceInCents($product->getPriceInCents());
-    $purchase->setQuantity(1);
-    $purchase->setTotalPriceInCents(
-      $purchase->getBasePriceInCents() * $purchase->getQuantity());
-    $purchase->setStatus(PhortunePurchase::STATUS_PENDING);
-
-    $cart = new PhortuneCart();
-    $cart->setAccountPHID($account->getPHID());
-    $cart->setOwnerPHID($user->getPHID());
-    $cart->attachPurchases(
-      array(
-        $purchase,
-      ));
+    $account = $cart->getAccount();
+    $account_uri = $this->getApplicationURI($account->getID().'/');
 
     $rows = array();
     $total = 0;
     foreach ($cart->getPurchases() as $purchase) {
       $rows[] = array(
-        $purchase->getPurchaseName(),
+        pht('A Purchase'),
         PhortuneCurrency::newFromUSDCents($purchase->getBasePriceInCents())
           ->formatForDisplay(),
         $purchase->getQuantity(),
diff --git a/src/applications/phortune/controller/PhortunePaymentMethodEditController.php b/src/applications/phortune/controller/PhortunePaymentMethodEditController.php
--- a/src/applications/phortune/controller/PhortunePaymentMethodEditController.php
+++ b/src/applications/phortune/controller/PhortunePaymentMethodEditController.php
@@ -211,7 +211,8 @@
             'as a payment method.');
           break;
         default:
-          $message = $provider->getCreatePaymentErrorMessage($client_error);
+          $message = $provider->getCreatePaymentMethodErrorMessage(
+            $client_error);
           if (!$message) {
             $message = pht(
               "There was an unexpected error ('%s') processing payment ".
diff --git a/src/applications/phortune/controller/PhortuneProductEditController.php b/src/applications/phortune/controller/PhortuneProductEditController.php
--- a/src/applications/phortune/controller/PhortuneProductEditController.php
+++ b/src/applications/phortune/controller/PhortuneProductEditController.php
@@ -142,15 +142,14 @@
       $is_create ? pht('Create') : pht('Edit'),
       $request->getRequestURI());
 
-    $header = id(new PHUIHeaderView())
-      ->setHeader(pht('Edit Product'));
+    $box = id(new PHUIObjectBoxView())
+      ->setHeaderText(pht('Edit Product'))
+      ->appendChild($form);
 
     return $this->buildApplicationPage(
       array(
         $crumbs,
-        $header,
-        $errors,
-        $form,
+        $box,
       ),
       array(
         'title' => $title,
diff --git a/src/applications/phortune/controller/PhortuneProductPurchaseController.php b/src/applications/phortune/controller/PhortuneProductPurchaseController.php
new file mode 100644
--- /dev/null
+++ b/src/applications/phortune/controller/PhortuneProductPurchaseController.php
@@ -0,0 +1,70 @@
+<?php
+
+final class PhortuneProductPurchaseController
+  extends PhortuneController {
+
+  private $accountID;
+  private $productID;
+
+  public function willProcessRequest(array $data) {
+    $this->accountID = $data['accountID'];
+    $this->productID = $data['productID'];
+  }
+
+  public function processRequest() {
+    $request = $this->getRequest();
+    $user = $request->getUser();
+
+    $account = id(new PhortuneAccountQuery())
+      ->setViewer($user)
+      ->withIDs(array($this->accountID))
+      ->executeOne();
+    if (!$account) {
+      return new Aphront404Response();
+    }
+
+    $account_uri = $this->getApplicationURI($account->getID().'/');
+
+    $product = id(new PhortuneProductQuery())
+      ->setViewer($user)
+      ->withIDs(array($this->productID))
+      ->executeOne();
+    if (!$product) {
+      return new Aphront404Response();
+    }
+
+    if ($request->isFormPost()) {
+      // TODO: Use ApplicationTransations.
+
+      $cart = new PhortuneCart();
+      $cart->openTransaction();
+
+        $cart->setAccountPHID($account->getPHID());
+        $cart->setAuthorPHID($user->getPHID());
+        $cart->save();
+
+        $purchase = new PhortunePurchase();
+        $purchase->setProductPHID($product->getPHID());
+        $purchase->setAccountPHID($account->getPHID());
+        $purchase->setAuthorPHID($user->getPHID());
+        $purchase->setCartPHID($cart->getPHID());
+        $purchase->setBasePriceInCents($product->getPriceInCents());
+        $purchase->setQuantity(1);
+        $purchase->setTotalPriceInCents(
+          $purchase->getBasePriceInCents() * $purchase->getQuantity());
+        $purchase->setStatus(PhortunePurchase::STATUS_PENDING);
+        $purchase->save();
+
+      $cart->saveTransaction();
+
+      $cart_uri = $this->getApplicationURI('/cart/'.$cart->getID().'/');
+      return id(new AphrontRedirectResponse())->setURI($cart_uri);
+    }
+
+    return $this->newDialog()
+      ->setTitle(pht('Purchase Product'))
+      ->appendParagraph(pht('Really purchase this stuff?'))
+      ->addSubmitButton(pht('Checkout'))
+      ->addCancelButton($account_uri);
+  }
+}
diff --git a/src/applications/phortune/controller/PhortuneProductViewController.php b/src/applications/phortune/controller/PhortuneProductViewController.php
--- a/src/applications/phortune/controller/PhortuneProductViewController.php
+++ b/src/applications/phortune/controller/PhortuneProductViewController.php
@@ -46,7 +46,7 @@
           ->setName(pht('Purchase'))
           ->setHref($cart_uri)
           ->setIcon('fa-shopping-cart')
-          ->setRenderAsForm(true));
+          ->setWorkflow(true));
 
     $crumbs = $this->buildApplicationCrumbs();
     $crumbs->setActionList($actions);
diff --git a/src/applications/phortune/currency/PhortuneCurrency.php b/src/applications/phortune/currency/PhortuneCurrency.php
--- a/src/applications/phortune/currency/PhortuneCurrency.php
+++ b/src/applications/phortune/currency/PhortuneCurrency.php
@@ -54,7 +54,8 @@
 
   public static function newFromUSDCents($cents) {
     if (!is_int($cents)) {
-      throw new Exception('USDCents value is not an integer!');
+      throw new Exception(
+        pht('USDCents value "%s" is not an integer!', $cents));
     }
 
     $obj = new PhortuneCurrency();
diff --git a/src/applications/phortune/provider/PhortuneStripePaymentProvider.php b/src/applications/phortune/provider/PhortuneStripePaymentProvider.php
--- a/src/applications/phortune/provider/PhortuneStripePaymentProvider.php
+++ b/src/applications/phortune/provider/PhortuneStripePaymentProvider.php
@@ -110,8 +110,9 @@
     $customer = Stripe_Customer::create($params, $secret_key);
 
     $card = $info->card;
+
     $method
-      ->setBrand($card->type)
+      ->setBrand($card->brand)
       ->setLastFourDigits($card->last4)
       ->setExpires($card->exp_year, $card->exp_month)
       ->setMetadata(
diff --git a/src/applications/phortune/query/PhortuneCartQuery.php b/src/applications/phortune/query/PhortuneCartQuery.php
new file mode 100644
--- /dev/null
+++ b/src/applications/phortune/query/PhortuneCartQuery.php
@@ -0,0 +1,102 @@
+<?php
+
+final class PhortuneCartQuery
+  extends PhabricatorCursorPagedPolicyAwareQuery {
+
+  private $ids;
+  private $phids;
+
+  private $needPurchases;
+
+  public function withIDs(array $ids) {
+    $this->ids = $ids;
+    return $this;
+  }
+
+  public function withPHIDs(array $phids) {
+    $this->phids = $phids;
+    return $this;
+  }
+
+  public function needPurchases($need_purchases) {
+    $this->needPurchases = $need_purchases;
+    return $this;
+  }
+
+  protected function loadPage() {
+    $table = new PhortuneCart();
+    $conn = $table->establishConnection('r');
+
+    $rows = queryfx_all(
+      $conn,
+      'SELECT cart.* FROM %T cart %Q %Q %Q',
+      $table->getTableName(),
+      $this->buildWhereClause($conn),
+      $this->buildOrderClause($conn),
+      $this->buildLimitClause($conn));
+
+    return $table->loadAllFromArray($rows);
+  }
+
+  protected function willFilterPage(array $carts) {
+    $accounts = id(new PhortuneAccountQuery())
+      ->setViewer($this->getViewer())
+      ->withPHIDs(mpull($carts, 'getAccountPHID'))
+      ->execute();
+    $accounts = mpull($accounts, null, 'getPHID');
+
+    foreach ($carts as $key => $cart) {
+      $account = idx($accounts, $cart->getAccountPHID());
+      if (!$account) {
+        unset($carts[$key]);
+      }
+      $cart->attachAccount($account);
+    }
+
+    return $carts;
+  }
+
+  protected function didFilterPage(array $carts) {
+    if ($this->needPurchases) {
+      $purchases = id(new PhortunePurchaseQuery())
+        ->setViewer($this->getViewer())
+        ->setParentQuery($this)
+        ->withCartPHIDs(mpull($carts, 'getPHID'))
+        ->execute();
+
+      $purchases = mgroup($purchases, 'getCartPHID');
+      foreach ($carts as $cart) {
+        $cart->attachPurchases(idx($purchases, $cart->getPHID(), array()));
+      }
+    }
+
+    return $carts;
+  }
+
+  private function buildWhereClause(AphrontDatabaseConnection $conn) {
+    $where = array();
+
+    $where[] = $this->buildPagingClause($conn);
+
+    if ($this->ids !== null) {
+      $where[] = qsprintf(
+        $conn,
+        'cart.id IN (%Ld)',
+        $this->ids);
+    }
+
+    if ($this->phids !== null) {
+      $where[] = qsprintf(
+        $conn,
+        'cart.phid IN (%Ls)',
+        $this->phids);
+    }
+
+    return $this->formatWhereClause($where);
+  }
+
+  public function getQueryApplicationClass() {
+    return 'PhabricatorApplicationPhortune';
+  }
+
+}
diff --git a/src/applications/phortune/query/PhortunePurchaseQuery.php b/src/applications/phortune/query/PhortunePurchaseQuery.php
new file mode 100644
--- /dev/null
+++ b/src/applications/phortune/query/PhortunePurchaseQuery.php
@@ -0,0 +1,91 @@
+<?php
+
+final class PhortunePurchaseQuery
+  extends PhabricatorCursorPagedPolicyAwareQuery {
+
+  private $ids;
+  private $phids;
+  private $cartPHIDs;
+
+  public function withIDs(array $ids) {
+    $this->ids = $ids;
+    return $this;
+  }
+
+  public function withPHIDs(array $phids) {
+    $this->phids = $phids;
+    return $this;
+  }
+
+  public function withCartPHIDs(array $cart_phids) {
+    $this->cartPHIDs = $cart_phids;
+    return $this;
+  }
+
+  protected function loadPage() {
+    $table = new PhortunePurchase();
+    $conn = $table->establishConnection('r');
+
+    $rows = queryfx_all(
+      $conn,
+      'SELECT purchase.* FROM %T purchase %Q %Q %Q',
+      $table->getTableName(),
+      $this->buildWhereClause($conn),
+      $this->buildOrderClause($conn),
+      $this->buildLimitClause($conn));
+
+    return $table->loadAllFromArray($rows);
+  }
+
+  protected function willFilterPage(array $purchases) {
+    $carts = id(new PhabricatorObjectQuery())
+      ->setViewer($this->getViewer())
+      ->setParentQuery($this)
+      ->withPHIDs(mpull($purchases, 'getCartPHID'))
+      ->execute();
+
+    foreach ($purchases as $key => $purchase) {
+      $cart = idx($carts, $purchase->getCartPHID());
+      if (!$cart) {
+        unset($purchases[$key]);
+      }
+      $purchase->attachCart($cart);
+    }
+
+    return $purchases;
+  }
+
+  private function buildWhereClause(AphrontDatabaseConnection $conn) {
+    $where = array();
+
+    $where[] = $this->buildPagingClause($conn);
+
+    if ($this->ids !== null) {
+      $where[] = qsprintf(
+        $conn,
+        'purchase.id IN (%Ld)',
+        $this->ids);
+    }
+
+    if ($this->phids !== null) {
+      $where[] = qsprintf(
+        $conn,
+        'purchase.phid IN (%Ls)',
+        $this->phids);
+    }
+
+    if ($this->cartPHIDs !== null) {
+      $where[] = qsprintf(
+        $conn,
+        'purchase.cartPHID IN (%Ls)',
+        $this->cartPHIDs);
+    }
+
+    return $this->formatWhereClause($where);
+  }
+
+  public function getQueryApplicationClass() {
+    return 'PhabricatorApplicationPhortune';
+  }
+
+}
diff --git a/src/applications/phortune/storage/PhortuneCart.php b/src/applications/phortune/storage/PhortuneCart.php
--- a/src/applications/phortune/storage/PhortuneCart.php
+++ b/src/applications/phortune/storage/PhortuneCart.php
@@ -1,11 +1,13 @@
 <?php
 
-final class PhortuneCart extends PhortuneDAO {
+final class PhortuneCart extends PhortuneDAO
+  implements PhabricatorPolicyInterface {
 
   protected $accountPHID;
-  protected $ownerPHID;
+  protected $authorPHID;
   protected $metadata;
 
+  private $account = self::ATTACHABLE;
   private $purchases = self::ATTACHABLE;
 
   public function getConfiguration() {
@@ -22,18 +24,50 @@
       PhabricatorPHIDConstants::PHID_TYPE_CART);
   }
 
+  public function getTotalInCents() {
+    return 123;
+  }
+
   public function attachPurchases(array $purchases) {
     assert_instances_of($purchases, 'PhortunePurchase');
     $this->purchases = $purchases;
     return $this;
   }
 
-  public function getTotalInCents() {
-    return 123;
-  }
-
   public function getPurchases() {
     return $this->assertAttached($this->purchases);
   }
 
+  public function attachAccount(PhortuneAccount $account) {
+    $this->account = $account;
+    return $this;
+  }
+
+  public function getAccount() {
+    return $this->assertAttached($this->account);
+  }
+
+
+/* -(  PhabricatorPolicyInterface  )----------------------------------------- */
+
+
+  public function getCapabilities() {
+    return array(
+      PhabricatorPolicyCapability::CAN_VIEW,
+      PhabricatorPolicyCapability::CAN_EDIT,
+    );
+  }
+
+  public function getPolicy($capability) {
+    return $this->getAccount()->getPolicy($capability);
+  }
+
+  public function hasAutomaticCapability($capability, PhabricatorUser $viewer) {
+    return $this->getAccount()->hasAutomaticCapability($capability, $viewer);
+  }
+
+  public function describeAutomaticCapability($capability) {
+    return pht('Carts inherit the policies of the associated account.');
+  }
+
 }
diff --git a/src/applications/phortune/storage/PhortunePurchase.php b/src/applications/phortune/storage/PhortunePurchase.php
--- a/src/applications/phortune/storage/PhortunePurchase.php
+++ b/src/applications/phortune/storage/PhortunePurchase.php
@@ -3,7 +3,8 @@
 /**
  * A purchase represents a user buying something or a subscription to a plan.
  */
-final class PhortunePurchase extends PhortuneDAO {
+final class PhortunePurchase extends PhortuneDAO
+  implements PhabricatorPolicyInterface {
 
   const STATUS_PENDING      = 'purchase:pending';
   const STATUS_PROCESSING   = 'purchase:processing';
@@ -15,17 +16,15 @@
   protected $productPHID;
   protected $accountPHID;
   protected $authorPHID;
-  protected $purchaseName;
-  protected $purchaseURI;
-  protected $paymentMethodPHID;
+  protected $cartPHID;
   protected $basePriceInCents;
-  protected $priceAdjustmentInCents;
-  protected $finalPriceInCents;
   protected $quantity;
   protected $totalPriceInCents;
   protected $status;
   protected $metadata;
 
+  private $cart = self::ATTACHABLE;
+
   public function getConfiguration() {
     return array(
       self::CONFIG_AUX_PHID => true,
@@ -40,4 +39,42 @@
       PhabricatorPHIDConstants::PHID_TYPE_PRCH);
   }
 
+  public function attachCart(PhortuneCart $cart) {
+    $this->cart = $cart;
+    return $this;
+  }
+
+  public function getCart() {
+    return $this->assertAttached($this->cart);
+  }
+
+  protected function didReadData() {
+    // The payment processing code is strict about types.
+    $this->basePriceInCents = (int)$this->basePriceInCents;
+    $this->totalPriceInCents = (int)$this->totalPriceInCents;
+  }
+
+
+/* -(  PhabricatorPolicyInterface  )----------------------------------------- */
+
+
+  public function getCapabilities() {
+    return array(
+      PhabricatorPolicyCapability::CAN_VIEW,
+      PhabricatorPolicyCapability::CAN_EDIT,
+    );
+  }
+
+  public function getPolicy($capability) {
+    return $this->getCart()->getPolicy($capability);
+  }
+
+  public function hasAutomaticCapability($capability, PhabricatorUser $viewer) {
+    return $this->getCart()->hasAutomaticCapability($capability, $viewer);
+  }
+
+  public function describeAutomaticCapability($capability) {
+    return pht('Purchases have the policies of their cart.');
+  }
+
 }