diff --git a/resources/sprite/manifest/icon.json b/resources/sprite/manifest/icon.json
new file mode 100644
index 000000000..c12971f2e
--- /dev/null
+++ b/resources/sprite/manifest/icon.json
@@ -0,0 +1,196 @@
+{
+  "sprites" : [
+    "action-arrow_left",
+    "action-arrow_left-grey",
+    "action-arrow_left-white",
+    "action-arrow_right",
+    "action-arrow_right-grey",
+    "action-arrow_right-white",
+    "action-attach",
+    "action-attach-grey",
+    "action-attach-white",
+    "action-blame",
+    "action-blame-grey",
+    "action-blame-white",
+    "action-check",
+    "action-check-grey",
+    "action-check-white",
+    "action-comment",
+    "action-comment-grey",
+    "action-comment-white",
+    "action-computer",
+    "action-computer-grey",
+    "action-computer-white",
+    "action-create",
+    "action-create-grey",
+    "action-create-white",
+    "action-delete",
+    "action-delete-grey",
+    "action-delete-white",
+    "action-disable",
+    "action-disable-grey",
+    "action-disable-white",
+    "action-dislike",
+    "action-dislike-grey",
+    "action-dislike-white",
+    "action-download",
+    "action-download-grey",
+    "action-download-white",
+    "action-edit",
+    "action-edit-grey",
+    "action-edit-white",
+    "action-enable",
+    "action-enable-grey",
+    "action-enable-white",
+    "action-file",
+    "action-file-grey",
+    "action-file-white",
+    "action-flag",
+    "action-flag-0",
+    "action-flag-0-grey",
+    "action-flag-0-white",
+    "action-flag-1",
+    "action-flag-1-grey",
+    "action-flag-1-white",
+    "action-flag-2",
+    "action-flag-2-grey",
+    "action-flag-2-white",
+    "action-flag-3",
+    "action-flag-3-grey",
+    "action-flag-3-white",
+    "action-flag-4",
+    "action-flag-4-grey",
+    "action-flag-4-white",
+    "action-flag-5",
+    "action-flag-5-grey",
+    "action-flag-5-white",
+    "action-flag-6",
+    "action-flag-6-grey",
+    "action-flag-6-white",
+    "action-flag-7",
+    "action-flag-7-grey",
+    "action-flag-7-white",
+    "action-flag-ghost",
+    "action-flag-ghost-grey",
+    "action-flag-ghost-white",
+    "action-flag-grey",
+    "action-flag-white",
+    "action-folder-open",
+    "action-folder-open-grey",
+    "action-folder-open-white",
+    "action-fork",
+    "action-fork-grey",
+    "action-fork-white",
+    "action-herald",
+    "action-herald-grey",
+    "action-herald-white",
+    "action-highlight",
+    "action-highlight-grey",
+    "action-highlight-white",
+    "action-history",
+    "action-history-grey",
+    "action-history-white",
+    "action-image",
+    "action-image-grey",
+    "action-image-white",
+    "action-like",
+    "action-like-grey",
+    "action-like-white",
+    "action-link",
+    "action-link-grey",
+    "action-link-white",
+    "action-lint-info",
+    "action-lint-info-grey",
+    "action-lint-info-white",
+    "action-lint-ok",
+    "action-lint-ok-grey",
+    "action-lint-ok-white",
+    "action-lint-warning",
+    "action-lint-warning-grey",
+    "action-lint-warning-white",
+    "action-lock",
+    "action-lock-grey",
+    "action-lock-white",
+    "action-love",
+    "action-love-grey",
+    "action-love-white",
+    "action-merge",
+    "action-merge-grey",
+    "action-merge-white",
+    "action-message",
+    "action-message-grey",
+    "action-message-white",
+    "action-meta-mta",
+    "action-meta-mta-grey",
+    "action-meta-mta-white",
+    "action-move",
+    "action-move-grey",
+    "action-move-white",
+    "action-new",
+    "action-new-grey",
+    "action-new-white",
+    "action-perflab",
+    "action-perflab-grey",
+    "action-perflab-white",
+    "action-preview",
+    "action-preview-grey",
+    "action-preview-white",
+    "action-refresh",
+    "action-refresh-grey",
+    "action-refresh-white",
+    "action-remove",
+    "action-remove-grey",
+    "action-remove-white",
+    "action-search",
+    "action-search-grey",
+    "action-search-white",
+    "action-start-sandcastle",
+    "action-start-sandcastle-grey",
+    "action-start-sandcastle-white",
+    "action-subscribe-add",
+    "action-subscribe-add-grey",
+    "action-subscribe-add-white",
+    "action-subscribe-auto",
+    "action-subscribe-auto-grey",
+    "action-subscribe-auto-white",
+    "action-subscribe-delete",
+    "action-subscribe-delete-grey",
+    "action-subscribe-delete-white",
+    "action-tag",
+    "action-tag-grey",
+    "action-tag-white",
+    "action-transcript",
+    "action-transcript-grey",
+    "action-transcript-white",
+    "action-undo",
+    "action-undo-grey",
+    "action-undo-white",
+    "action-unlock",
+    "action-unlock-grey",
+    "action-unlock-white",
+    "action-unmerge",
+    "action-unmerge-grey",
+    "action-unmerge-white",
+    "action-unpublish",
+    "action-unpublish-grey",
+    "action-unpublish-white",
+    "action-warning",
+    "action-warning-grey",
+    "action-warning-white",
+    "action-world",
+    "action-world-grey",
+    "action-world-white",
+    "remarkup-assist-text_b",
+    "remarkup-assist-text_code",
+    "remarkup-assist-text_help",
+    "remarkup-assist-text_i",
+    "remarkup-assist-text_image",
+    "remarkup-assist-text_larger",
+    "remarkup-assist-text_meme",
+    "remarkup-assist-text_ol",
+    "remarkup-assist-text_table",
+    "remarkup-assist-text_tag",
+    "remarkup-assist-text_tt",
+    "remarkup-assist-text_ul"
+  ]
+}
diff --git a/scripts/celerity/generate_sprites.php b/scripts/celerity/generate_sprites.php
index 6605c4d2d..0a101eed4 100755
--- a/scripts/celerity/generate_sprites.php
+++ b/scripts/celerity/generate_sprites.php
@@ -1,201 +1,204 @@
 #!/usr/bin/env php
 <?php
 
 require_once dirname(dirname(__FILE__)).'/__init_script__.php';
 
 $args = new PhutilArgumentParser($argv);
 $args->setTagline('regenerate CSS sprite sheets');
 $args->setSynopsis(<<<EOHELP
 **sprites**
     Rebuild CSS sprite sheets.
 
 EOHELP
 );
 $args->parseStandardArguments();
 $args->parse(
   array(
     array(
       'name'  => 'source',
       'param' => 'directory',
       'help'  => 'Directory with sprite sources.',
     )
   ));
 
 $srcroot = $args->getArg('source');
 if (!$srcroot) {
   throw new Exception(
     "You must specify a source directory with '--source'.");
 }
 
-$webroot = dirname(phutil_get_library_root('phabricator')).'/webroot/rsrc';
+$root = dirname(phutil_get_library_root('phabricator'));
+$webroot = $root.'/webroot/rsrc';
 $webroot = Filesystem::readablePath($webroot);
 
 function glx($x) {
   return (60 + (48 * $x));
 }
 
 function gly($y) {
   return (110 + (48 * $y));
 }
 
 $sheet = new PhutilSpriteSheet();
 $at = '@';
 $sheet->setCSSHeader(<<<EOCSS
 /**
  * @provides autosprite-css
  * {$at}generated
  */
 
 .autosprite {
   background-image: url(/rsrc/image/autosprite.png);
   background-repeat: no-repeat;
 }
 EOCSS
 );
 
 $menu_normal_template = id(new PhutilSprite())
   ->setSourceFile($srcroot.'/menu_normal_1x.png')
   ->setSourceSize(30, 30);
 
 $menu_hover_template = id(new PhutilSprite())
   ->setSourceFile($srcroot.'/menu_hover_1x.png')
   ->setSourceSize(30, 30);
 
 $menu_selected_template = id(new PhutilSprite())
   ->setSourceFile($srcroot.'/menu_selected_1x.png')
   ->setSourceSize(30, 30);
 
 $menu_map = array(
   ''          => $menu_normal_template,
   '-selected' => $menu_selected_template,
   ':hover'    => $menu_hover_template,
 );
 
 $icon_map = array(
   'help'          => array(4, 19),
   'settings'      => array(0, 28),
   'logout'        => array(3, 6),
   'notifications' => array(5, 20),
   'task'          => array(1, 15),
 );
 
 foreach ($icon_map as $icon => $coords) {
   list($x, $y) = $coords;
   foreach ($menu_map as $suffix => $template) {
     $sheet->addSprite(
       id(clone $template)
         ->setSourcePosition(glx($x), gly($y))
         ->setTargetCSS('.main-menu-item-icon-'.$icon.$suffix));
   }
 }
 
 $app_template_large = id(new PhutilSprite())
   ->setSourceFile($srcroot.'/application_large_1x.png')
   ->setSourceSize(60, 60);
 
 $app_template_large_hover = id(new PhutilSprite())
   ->setSourceFile($srcroot.'/application_large_hover_1x.png')
   ->setSourceSize(60, 60);
 
 $app_template_small = id(new PhutilSprite())
   ->setSourceFile($srcroot.'/menu_normal_1x.png')
   ->setSourceSize(30, 30);
 
 $app_template_small_hover = id(new PhutilSprite())
   ->setSourceFile($srcroot.'/menu_hover_1x.png')
   ->setSourceSize(30, 30);
 
 $app_template_small_selected = id(new PhutilSprite())
   ->setSourceFile($srcroot.'/menu_selected_1x.png')
   ->setSourceSize(30, 30);
 
 $app_source_map = array(
   '-large'          => array($app_template_large, 2),
 
   // For the application launch view, we only show hover state on the desktop
   // because it looks glitchy on touch devices. We show the hover state when
   // the surrounding <a> is hovered, not the icon itself.
   '-large /* hover */'    => array(
     $app_template_large_hover,
     2,
     '.device-desktop .phabricator-application-launch-container:hover '),
 
   ''                => array($app_template_small, 1),
 
   // Show hover state only for the desktop.
   ':hover'          => array(
     $app_template_small_hover,
     1,
     '.device-desktop  ',
   ),
   '-selected'       => array($app_template_small_selected, 1),
 );
 
 $app_map = array(
   'differential'    => array(9, 1),
   'fact'            => array(2, 4),
   'mail'            => array(0, 1),
   'diffusion'       => array(7, 13),
   'slowvote'        => array(1, 4),
   'phriction'       => array(1, 7),
   'maniphest'       => array(3, 24),
   'flags'           => array(6, 26),
   'settings'        => array(9, 11),
   'applications'    => array(0, 34),
   'default'         => array(9, 9),
   'people'          => array(3, 0),
   'ponder'          => array(4, 35),
   'calendar'        => array(5, 4),
   'files'           => array(6, 3),
   'projects'        => array(7, 35),
   'daemons'         => array(7, 6),
   'herald'          => array(1, 5),
   'countdown'       => array(7, 5),
   'conduit'         => array(7, 30),
   'feed'            => array(3, 11),
   'paste'           => array(9, 2),
   'audit'           => array(8, 19),
   'uiexample'       => array(7, 28),
   'phpast'          => array(6, 31),
   'owners'          => array(5, 32),
   'phid'            => array(9, 25),
   'diviner'         => array(1, 35),
   'repositories'    => array(8, 13),
   'phame'           => array(8, 4),
   'macro'           => array(0, 31),
   'releeph'         => array(5, 18),
   'drydock'         => array(5, 25),
 );
 
 $xadj = -1;
 foreach ($app_map as $icon => $coords) {
   list($x, $y) = $coords;
   foreach ($app_source_map as $suffix => $spec) {
     list($template, $scale) = $spec;
     if (isset($spec[2])) {
       $prefix = $spec[2];
     } else {
       $prefix = '';
     }
     $sheet->addSprite(
       id(clone $template)
         ->setSourcePosition(($xadj + glx($x)) * $scale, gly($y) * $scale)
         ->setTargetCSS($prefix.'.app-'.$icon.$suffix));
   }
 }
 
 $sheet->generateImage($webroot.'/image/autosprite.png');
 $sheet->generateCSS($webroot.'/css/autosprite.css');
 
 
 /* -(  Icons Sheet  )-------------------------------------------------------- */
 
 $generator = new CeleritySpriteGenerator();
 
-$icon_sheet = $generator->buildIconSheet();
-$icon_sheet->setScales(array(1, 2));
-$icon_sheet->generateImage($webroot.'/image/sprite-icon.png', 1);
-$icon_sheet->generateImage($webroot.'/image/sprite-icon-X2.png', 2);
-$icon_sheet->generateCSS($webroot.'/css/sprite-icon.css');
+$generator
+  ->buildIconSheet()
+  ->setScales(array(1, 2))
+  ->generateImage($webroot.'/image/sprite-icon.png', 1)
+  ->generateImage($webroot.'/image/sprite-icon-X2.png', 2)
+  ->generateCSS($webroot.'/css/sprite-icon.css')
+  ->generateManifest($root.'/resources/sprite/manifest/icon.json');
 
 echo "Done.\n";
diff --git a/scripts/celerity_mapper.php b/scripts/celerity_mapper.php
index 72c528f1e..5febbfee4 100755
--- a/scripts/celerity_mapper.php
+++ b/scripts/celerity_mapper.php
@@ -1,396 +1,397 @@
 #!/usr/bin/env php
 <?php
 
 $package_spec = array(
   'javelin.pkg.js' => array(
     '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-fx',
     'javelin-color',
   ),
   'core.pkg.js' => array(
     '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',
     'phabricator-paste-file-upload',
     'phabricator-menu-item',
     'phabricator-dropdown-menu',
     '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-phabricator-active-nav',
     'javelin-behavior-phabricator-nav',
     'javelin-behavior-phabricator-remarkup-assist',
     'phabricator-textareautils',
     'phabricator-file-upload',
   ),
   'core.pkg.css' => array(
     'phabricator-core-css',
     'phabricator-core-buttons-css',
     'phabricator-standard-page-view',
     'aphront-dialog-view-css',
     'aphront-form-view-css',
     'aphront-panel-view-css',
     'aphront-side-nav-view-css',
     'aphront-table-view-css',
     'aphront-crumbs-view-css',
     'aphront-tokenizer-control-css',
     'aphront-typeahead-control-css',
     'aphront-list-filter-view-css',
 
     'phabricator-directory-css',
     'phabricator-jump-nav',
     'phabricator-app-buttons-css',
 
     'phabricator-remarkup-css',
     'syntax-highlighting-css',
     'aphront-pager-view-css',
     'phabricator-transaction-view-css',
     'aphront-tooltip-css',
     'aphront-headsup-view-css',
     'phabricator-flag-css',
     'aphront-error-view-css',
     'autosprite-css',
+    'sprite-icon-css',
     'phabricator-main-menu-view',
     'phabricator-notification-css',
     'phabricator-notification-menu-css',
     'lightbox-attachment-css',
     'phabricator-header-view-css',
     'phabricator-form-view-css',
     'phabricator-filetree-view-css',
     'phabricator-nav-view-css',
   ),
   'differential.pkg.css' => array(
     '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',
     'differential-revision-comment-list-css',
     'phabricator-object-selector-css',
     'aphront-headsup-action-list-view-css',
     'phabricator-content-source-view-css',
     'differential-local-commits-view-css',
     'inline-comment-summary-css',
   ),
   'differential.pkg.js' => array(
     '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-accept-with-errors',
     'javelin-behavior-differential-comment-jump',
     'javelin-behavior-differential-add-reviewers-and-ccs',
     'javelin-behavior-differential-keyboard-navigation',
     'javelin-behavior-aphront-drag-and-drop',
     'javelin-behavior-aphront-drag-and-drop-textarea',
     'javelin-behavior-phabricator-object-selector',
     'javelin-behavior-repository-crossreference',
 
     'differential-inline-comment-editor',
     'javelin-behavior-differential-dropdown-menus',
     'javelin-behavior-differential-toggle-files',
     'javelin-behavior-differential-user-select',
   ),
   'diffusion.pkg.css' => array(
     'diffusion-commit-view-css',
     'diffusion-icons-css',
   ),
   'diffusion.pkg.js' => array(
     'javelin-behavior-diffusion-pull-lastmodified',
     'javelin-behavior-diffusion-commit-graph',
     'javelin-behavior-audit-preview',
   ),
   'maniphest.pkg.css' => array(
     'maniphest-task-summary-css',
     'maniphest-transaction-detail-css',
     'aphront-attached-file-view-css',
     'phabricator-project-tag-css',
   ),
   'maniphest.pkg.js' => array(
     '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',
   ),
   'darkconsole.pkg.js' => array(
     'javelin-behavior-dark-console-ajax',
     'javelin-behavior-dark-console',
     'javelin-behavior-error-log',
   ),
 );
 
 
 require_once dirname(__FILE__).'/__init_script__.php';
 
 $args = new PhutilArgumentParser($argv);
 $args->setTagline('map static resources');
 $args->setSynopsis(
   "**celerity_mapper.php** [--output __path__] [--with-custom] <webroot>");
 $args->parse(
   array(
     array(
       'name'     => 'output',
       'param'    => 'path',
       'default'  => '../src/__celerity_resource_map__.php',
       'help'     => "Set the path for resource map. It is usually useful for ".
                     "'celerity.resource-path' configuration.",
     ),
     array(
       'name'     => 'with-custom',
       'help'     => 'Include resources in <webroot>/rsrc/custom/.',
     ),
     array(
       'name'     => 'webroot',
       'wildcard' => true,
     ),
   ));
 
 $root = $args->getArg('webroot');
 if (count($root) != 1 || !is_dir(reset($root))) {
   $args->printHelpAndExit();
 }
 $root = Filesystem::resolvePath(reset($root));
 
 $celerity_path = Filesystem::resolvePath($args->getArg('output'), $root);
 $with_custom = $args->getArg('with-custom');
 
 $resource_hash = PhabricatorEnv::getEnvConfig('celerity.resource-hash');
 $runtime_map = array();
 
 echo "Finding raw static resources...\n";
 $finder = id(new FileFinder($root))
   ->withType('f')
   ->withSuffix('png')
   ->withSuffix('jpg')
   ->withSuffix('gif')
   ->withSuffix('swf')
   ->withFollowSymlinks(true)
   ->setGenerateChecksums(true);
 if (!$with_custom) {
   $finder->excludePath('./rsrc/custom');
 }
 $raw_files = $finder->find();
 
 echo "Processing ".count($raw_files)." files";
 foreach ($raw_files as $path => $hash) {
   echo ".";
   $path = '/'.Filesystem::readablePath($path, $root);
   $type = CelerityResourceTransformer::getResourceType($path);
 
   $hash = md5($hash.$path.$resource_hash);
   $uri  = '/res/'.substr($hash, 0, 8).$path;
 
   $runtime_map[$path] = array(
     'hash' => $hash,
     'uri'  => $uri,
     'disk' => $path,
     'type' => $type,
   );
 }
 echo "\n";
 
 $xformer = id(new CelerityResourceTransformer())
   ->setMinify(false)
   ->setRawResourceMap($runtime_map);
 
 echo "Finding transformable static resources...\n";
 $finder = id(new FileFinder($root))
   ->withType('f')
   ->withSuffix('js')
   ->withSuffix('css')
   ->withFollowSymlinks(true)
   ->setGenerateChecksums(true);
 if (!$with_custom) {
   $finder->excludePath('./rsrc/custom');
 }
 $files = $finder->find();
 
 echo "Processing ".count($files)." files";
 
 $file_map = array();
 foreach ($files as $path => $raw_hash) {
   echo ".";
   $path = '/'.Filesystem::readablePath($path, $root);
   $data = Filesystem::readFile($root.$path);
 
   $data = $xformer->transformResource($path, $data);
   $hash = md5($data);
   $hash = md5($hash.$path.$resource_hash);
 
   $file_map[$path] = array(
     'hash' => $hash,
     'disk' => $path,
   );
 }
 echo "\n";
 
 $resource_graph = array();
 $hash_map = array();
 
 $parser = new PhutilDocblockParser();
 foreach ($file_map as $path => $info) {
   $type = CelerityResourceTransformer::getResourceType($path);
 
   $data = Filesystem::readFile($root.$info['disk']);
   $matches = array();
   $ok = preg_match('@/[*][*].*?[*]/@s', $data, $matches);
   if (!$ok) {
     throw new Exception(
       "File {$path} does not have a header doc comment. Encode dependency ".
       "data in a header docblock.");
   }
 
   list($description, $metadata) = $parser->parse($matches[0]);
 
   $provides = preg_split('/\s+/', trim(idx($metadata, 'provides')));
   $requires = preg_split('/\s+/', trim(idx($metadata, 'requires')));
   $provides = array_filter($provides);
   $requires = array_filter($requires);
 
   if (!$provides) {
     // Tests and documentation-only JS is permitted to @provide no targets.
     continue;
   }
 
   if (count($provides) > 1) {
     throw new Exception(
       "File {$path} must @provide at most one Celerity target.");
   }
 
   $provides = reset($provides);
 
   $uri = '/res/'.substr($info['hash'], 0, 8).$path;
 
   $hash_map[$provides] = $info['hash'];
 
   $resource_graph[$provides] = $requires;
 
   $runtime_map[$provides] = array(
     'uri'       => $uri,
     'type'      => $type,
     'requires'  => $requires,
     'disk'      => $path,
   );
 }
 
 $celerity_resource_graph = new CelerityResourceGraph();
 $celerity_resource_graph->addNodes($resource_graph);
 $celerity_resource_graph->setResourceGraph($resource_graph);
 $celerity_resource_graph->loadGraph();
 
 foreach ($resource_graph as $provides => $requires) {
   $cycle = $celerity_resource_graph->detectCycles($provides);
   if ($cycle) {
     throw new Exception(
       "Cycle detected in resource graph: ". implode($cycle, " => ")
     );
   }
 }
 
 $package_map = array();
 foreach ($package_spec as $name => $package) {
   $hashes = array();
   $type = null;
   foreach ($package as $symbol) {
     if (empty($hash_map[$symbol])) {
       throw new Exception(
         "Package specification for '{$name}' includes '{$symbol}', but that ".
         "symbol is not defined anywhere.");
     }
     if ($type === null) {
       $type = $runtime_map[$symbol]['type'];
     } else {
       $ntype = $runtime_map[$symbol]['type'];
       if ($type !== $ntype) {
         throw new Exception(
           "Package specification for '{$name}' mixes resources of type ".
           "'{$type}' with resources of type '{$ntype}'. Each package may only ".
           "contain one type of resource.");
       }
     }
     $hashes[] = $symbol.':'.$hash_map[$symbol];
   }
   $key = substr(md5(implode("\n", $hashes)), 0, 8);
   $package_map['packages'][$key] = array(
     'name'    => $name,
     'symbols' => $package,
     'uri'     => '/res/pkg/'.$key.'/'.$name,
     'type'    => $type,
   );
   foreach ($package as $symbol) {
     $package_map['reverse'][$symbol] = $key;
   }
 }
 
 ksort($runtime_map);
 $runtime_map = var_export($runtime_map, true);
 $runtime_map = preg_replace('/\s+$/m', '', $runtime_map);
 $runtime_map = preg_replace('/array \(/', 'array(', $runtime_map);
 
 $package_map['packages'] = isort($package_map['packages'], 'name');
 ksort($package_map['reverse']);
 $package_map = var_export($package_map, true);
 $package_map = preg_replace('/\s+$/m', '', $package_map);
 $package_map = preg_replace('/array \(/', 'array(', $package_map);
 
 $generated = '@'.'generated';
 $resource_map = <<<EOFILE
 <?php
 
 /**
  * This file is automatically generated. Use 'celerity_mapper.php' to rebuild
  * it.
  * {$generated}
  */
 
 celerity_register_resource_map({$runtime_map}, {$package_map});
 
 EOFILE;
 
 echo "Writing map...\n";
 Filesystem::writeFile($celerity_path, $resource_map);
 echo "Done.\n";
diff --git a/src/__celerity_resource_map__.php b/src/__celerity_resource_map__.php
index e90acfa9d..2e05e93cc 100644
--- a/src/__celerity_resource_map__.php
+++ b/src/__celerity_resource_map__.php
@@ -1,3480 +1,3505 @@
 <?php
 
 /**
  * This file is automatically generated. Use 'celerity_mapper.php' to rebuild
  * it.
  * @generated
  */
 
 celerity_register_resource_map(array(
   '/rsrc/image/2x/header_logo.png' =>
   array(
     'hash' => '89ac510efefeffb048a3d7e85161b7b6',
     'uri' => '/res/89ac510e/rsrc/image/2x/header_logo.png',
     'disk' => '/rsrc/image/2x/header_logo.png',
     'type' => 'png',
   ),
   '/rsrc/image/app/app_audit.png' =>
   array(
     'hash' => '53340003d1daf306b64ed5ebb08bc204',
     'uri' => '/res/53340003/rsrc/image/app/app_audit.png',
     'disk' => '/rsrc/image/app/app_audit.png',
     'type' => 'png',
   ),
   '/rsrc/image/apps.png' =>
   array(
     'hash' => 'f7cb4abeb73245fea4098a02fd784653',
     'uri' => '/res/f7cb4abe/rsrc/image/apps.png',
     'disk' => '/rsrc/image/apps.png',
     'type' => 'png',
   ),
   '/rsrc/image/appstatus_empty.png' =>
   array(
     'hash' => '2f8102e0a0f5a0980d87d4ab4ba8c8fd',
     'uri' => '/res/2f8102e0/rsrc/image/appstatus_empty.png',
     'disk' => '/rsrc/image/appstatus_empty.png',
     'type' => 'png',
   ),
   '/rsrc/image/appstatus_info.png' =>
   array(
     'hash' => '407de6daf2edc4a8b68e2e369f4fc8cb',
     'uri' => '/res/407de6da/rsrc/image/appstatus_info.png',
     'disk' => '/rsrc/image/appstatus_info.png',
     'type' => 'png',
   ),
   '/rsrc/image/appstatus_needs.png' =>
   array(
     'hash' => '2c1e193bc786ca4fca0b851ed9cd3d92',
     'uri' => '/res/2c1e193b/rsrc/image/appstatus_needs.png',
     'disk' => '/rsrc/image/appstatus_needs.png',
     'type' => 'png',
   ),
   '/rsrc/image/appstatus_okay.png' =>
   array(
     'hash' => 'd00e683ee1c61d0ccced1200775cdbb5',
     'uri' => '/res/d00e683e/rsrc/image/appstatus_okay.png',
     'disk' => '/rsrc/image/appstatus_okay.png',
     'type' => 'png',
   ),
   '/rsrc/image/autosprite.png' =>
   array(
-    'hash' => 'bc9479b2a610a3ecee18dc88744c4ce6',
-    'uri' => '/res/bc9479b2/rsrc/image/autosprite.png',
+    'hash' => '0b1fd04e70272fe946dff765237d132a',
+    'uri' => '/res/0b1fd04e/rsrc/image/autosprite.png',
     'disk' => '/rsrc/image/autosprite.png',
     'type' => 'png',
   ),
   '/rsrc/image/avatar.png' =>
   array(
     'hash' => '1c5f255071537f05406adee86717ff27',
     'uri' => '/res/1c5f2550/rsrc/image/avatar.png',
     'disk' => '/rsrc/image/avatar.png',
     'type' => 'png',
   ),
   '/rsrc/image/button_apps.png' =>
   array(
     'hash' => 'cc29f793afd01b15af613562225118f3',
     'uri' => '/res/cc29f793/rsrc/image/button_apps.png',
     'disk' => '/rsrc/image/button_apps.png',
     'type' => 'png',
   ),
   '/rsrc/image/button_content.png' =>
   array(
     'hash' => '87cc5797352097b4b3d7541e6c46f032',
     'uri' => '/res/87cc5797/rsrc/image/button_content.png',
     'disk' => '/rsrc/image/button_content.png',
     'type' => 'png',
   ),
   '/rsrc/image/button_gradients.png' =>
   array(
     'hash' => '9157bc3cc3321e0d04e94532dfe50ce7',
     'uri' => '/res/9157bc3c/rsrc/image/button_gradients.png',
     'disk' => '/rsrc/image/button_gradients.png',
     'type' => 'png',
   ),
   '/rsrc/image/button_menu.png' =>
   array(
     'hash' => '5742857c7734d9d25be1125f5737fe0e',
     'uri' => '/res/5742857c/rsrc/image/button_menu.png',
     'disk' => '/rsrc/image/button_menu.png',
     'type' => 'png',
   ),
   '/rsrc/image/checker_dark.png' =>
   array(
     'hash' => '640f795343df76ebe5409aae6187e57f',
     'uri' => '/res/640f7953/rsrc/image/checker_dark.png',
     'disk' => '/rsrc/image/checker_dark.png',
     'type' => 'png',
   ),
   '/rsrc/image/checker_light.png' =>
   array(
     'hash' => '7f8f3ef8beb0f2cc4cc69efb9e1c3308',
     'uri' => '/res/7f8f3ef8/rsrc/image/checker_light.png',
     'disk' => '/rsrc/image/checker_light.png',
     'type' => 'png',
   ),
   '/rsrc/image/credit_cards.png' =>
   array(
     'hash' => '681448de424ea159b6ea68af04c046ae',
     'uri' => '/res/681448de/rsrc/image/credit_cards.png',
     'disk' => '/rsrc/image/credit_cards.png',
     'type' => 'png',
   ),
   '/rsrc/image/divot.png' =>
   array(
     'hash' => '3be267bd11ea375bf68e808893718e0e',
     'uri' => '/res/3be267bd/rsrc/image/divot.png',
     'disk' => '/rsrc/image/divot.png',
     'type' => 'png',
   ),
   '/rsrc/image/grippy_texture.png' =>
   array(
     'hash' => 'a8945e12ceeaddd5b491a8d81cfa19c1',
     'uri' => '/res/a8945e12/rsrc/image/grippy_texture.png',
     'disk' => '/rsrc/image/grippy_texture.png',
     'type' => 'png',
   ),
   '/rsrc/image/header_logo.png' =>
   array(
     'hash' => '96a289484c7a0e2bf1553e422f4d33bd',
     'uri' => '/res/96a28948/rsrc/image/header_logo.png',
     'disk' => '/rsrc/image/header_logo.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/fatcow/arrow_branch.png' =>
   array(
     'hash' => 'f27b67520766e3d971722bcff703f3a8',
     'uri' => '/res/f27b6752/rsrc/image/icon/fatcow/arrow_branch.png',
     'disk' => '/rsrc/image/icon/fatcow/arrow_branch.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/fatcow/arrow_merge.png' =>
   array(
     'hash' => 'c4bd97f3b1257439e2123ef69d2194d0',
     'uri' => '/res/c4bd97f3/rsrc/image/icon/fatcow/arrow_merge.png',
     'disk' => '/rsrc/image/icon/fatcow/arrow_merge.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/fatcow/bullet_black.png' =>
   array(
     'hash' => '718f9c560a13766796f1be7dfaadeeab',
     'uri' => '/res/718f9c56/rsrc/image/icon/fatcow/bullet_black.png',
     'disk' => '/rsrc/image/icon/fatcow/bullet_black.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/fatcow/bullet_orange.png' =>
   array(
     'hash' => 'c3bf91b65baacb27f2af143ab9180119',
     'uri' => '/res/c3bf91b6/rsrc/image/icon/fatcow/bullet_orange.png',
     'disk' => '/rsrc/image/icon/fatcow/bullet_orange.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/fatcow/bullet_red.png' =>
   array(
     'hash' => '00273e4aa6ea3de630295610d6c9560c',
     'uri' => '/res/00273e4a/rsrc/image/icon/fatcow/bullet_red.png',
     'disk' => '/rsrc/image/icon/fatcow/bullet_red.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/fatcow/calendar_edit.png' =>
   array(
     'hash' => 'de249c0f4f37bf5b2c69ff39ec5573fb',
     'uri' => '/res/de249c0f/rsrc/image/icon/fatcow/calendar_edit.png',
     'disk' => '/rsrc/image/icon/fatcow/calendar_edit.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/fatcow/document_black.png' =>
   array(
     'hash' => '44d65a7f05a9c921719deedc160d68f7',
     'uri' => '/res/44d65a7f/rsrc/image/icon/fatcow/document_black.png',
     'disk' => '/rsrc/image/icon/fatcow/document_black.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/fatcow/flag_blue.png' =>
   array(
     'hash' => '75a080492f900fbe489e4b27e403962b',
     'uri' => '/res/75a08049/rsrc/image/icon/fatcow/flag_blue.png',
     'disk' => '/rsrc/image/icon/fatcow/flag_blue.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/fatcow/flag_finish.png' =>
   array(
     'hash' => '4af11fc7fab8e4610cbc3c88a02d4f78',
     'uri' => '/res/4af11fc7/rsrc/image/icon/fatcow/flag_finish.png',
     'disk' => '/rsrc/image/icon/fatcow/flag_finish.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/fatcow/flag_ghost.png' =>
   array(
     'hash' => '14c9f30a37b43f276f27a27a924bf02d',
     'uri' => '/res/14c9f30a/rsrc/image/icon/fatcow/flag_ghost.png',
     'disk' => '/rsrc/image/icon/fatcow/flag_ghost.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/fatcow/flag_green.png' =>
   array(
     'hash' => 'fed01374cd396cb774872762dcc447e1',
     'uri' => '/res/fed01374/rsrc/image/icon/fatcow/flag_green.png',
     'disk' => '/rsrc/image/icon/fatcow/flag_green.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/fatcow/flag_orange.png' =>
   array(
     'hash' => '88008cb8bb99761a37e5a743e2455aeb',
     'uri' => '/res/88008cb8/rsrc/image/icon/fatcow/flag_orange.png',
     'disk' => '/rsrc/image/icon/fatcow/flag_orange.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/fatcow/flag_pink.png' =>
   array(
     'hash' => '2f199f06ffc3dfc81b7561a057e0bc33',
     'uri' => '/res/2f199f06/rsrc/image/icon/fatcow/flag_pink.png',
     'disk' => '/rsrc/image/icon/fatcow/flag_pink.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/fatcow/flag_purple.png' =>
   array(
     'hash' => '16358629dc86c39550b575586eb5df80',
     'uri' => '/res/16358629/rsrc/image/icon/fatcow/flag_purple.png',
     'disk' => '/rsrc/image/icon/fatcow/flag_purple.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/fatcow/flag_red.png' =>
   array(
     'hash' => '210c28b4d93c439a499f5814f5e05772',
     'uri' => '/res/210c28b4/rsrc/image/icon/fatcow/flag_red.png',
     'disk' => '/rsrc/image/icon/fatcow/flag_red.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/fatcow/flag_yellow.png' =>
   array(
     'hash' => 'bdfd73744a80bb80329ae50bc8a5f962',
     'uri' => '/res/bdfd7374/rsrc/image/icon/fatcow/flag_yellow.png',
     'disk' => '/rsrc/image/icon/fatcow/flag_yellow.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/fatcow/folder.png' =>
   array(
     'hash' => '25e46cf9d210dde2242332296f79938c',
     'uri' => '/res/25e46cf9/rsrc/image/icon/fatcow/folder.png',
     'disk' => '/rsrc/image/icon/fatcow/folder.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/fatcow/folder_go.png' =>
   array(
     'hash' => 'ba922ff7959309f51a14cb7ed5124d8b',
     'uri' => '/res/ba922ff7/rsrc/image/icon/fatcow/folder_go.png',
     'disk' => '/rsrc/image/icon/fatcow/folder_go.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/fatcow/key_question.png' =>
   array(
     'hash' => '530a6448a4b91edec091a9292ccfd3d9',
     'uri' => '/res/530a6448/rsrc/image/icon/fatcow/key_question.png',
     'disk' => '/rsrc/image/icon/fatcow/key_question.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/fatcow/link.png' =>
   array(
     'hash' => 'be1bea49b216548433014f3324902928',
     'uri' => '/res/be1bea49/rsrc/image/icon/fatcow/link.png',
     'disk' => '/rsrc/image/icon/fatcow/link.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/fatcow/page_white_edit.png' =>
   array(
     'hash' => 'e7b7e7f2d9730bc80bc5c9eac1f3e36d',
     'uri' => '/res/e7b7e7f2/rsrc/image/icon/fatcow/page_white_edit.png',
     'disk' => '/rsrc/image/icon/fatcow/page_white_edit.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/fatcow/page_white_link.png' =>
   array(
     'hash' => '1cfbad14412bda6c6f132dcc7c8725fd',
     'uri' => '/res/1cfbad14/rsrc/image/icon/fatcow/page_white_link.png',
     'disk' => '/rsrc/image/icon/fatcow/page_white_link.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/fatcow/page_white_put.png' =>
   array(
     'hash' => 'bb7308aa5ac40137a8262da395a267fd',
     'uri' => '/res/bb7308aa/rsrc/image/icon/fatcow/page_white_put.png',
     'disk' => '/rsrc/image/icon/fatcow/page_white_put.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/fatcow/page_white_text.png' =>
   array(
     'hash' => 'e47d590b626f617fb7d1d44e96e8fd11',
     'uri' => '/res/e47d590b/rsrc/image/icon/fatcow/page_white_text.png',
     'disk' => '/rsrc/image/icon/fatcow/page_white_text.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/fatcow/source/conduit.png' =>
   array(
     'hash' => '1cae0656580aa3cd0b54b9d98306b1b9',
     'uri' => '/res/1cae0656/rsrc/image/icon/fatcow/source/conduit.png',
     'disk' => '/rsrc/image/icon/fatcow/source/conduit.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/fatcow/source/email.png' =>
   array(
     'hash' => '93bdb3e168da1ed68f50c42125729d4e',
     'uri' => '/res/93bdb3e1/rsrc/image/icon/fatcow/source/email.png',
     'disk' => '/rsrc/image/icon/fatcow/source/email.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/fatcow/source/fax.png' =>
   array(
     'hash' => 'd7dedf229841f2d041b347afd881596f',
     'uri' => '/res/d7dedf22/rsrc/image/icon/fatcow/source/fax.png',
     'disk' => '/rsrc/image/icon/fatcow/source/fax.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/fatcow/source/mobile.png' =>
   array(
     'hash' => '786e7146d1e7d7318baf76c9d2baad97',
     'uri' => '/res/786e7146/rsrc/image/icon/fatcow/source/mobile.png',
     'disk' => '/rsrc/image/icon/fatcow/source/mobile.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/fatcow/source/tablet.png' =>
   array(
     'hash' => '374cd40e4965be6b2fbdef4059d0ca05',
     'uri' => '/res/374cd40e/rsrc/image/icon/fatcow/source/tablet.png',
     'disk' => '/rsrc/image/icon/fatcow/source/tablet.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/fatcow/source/web.png' =>
   array(
     'hash' => 'f4882a8f5619ba505ca033f72a340635',
     'uri' => '/res/f4882a8f/rsrc/image/icon/fatcow/source/web.png',
     'disk' => '/rsrc/image/icon/fatcow/source/web.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/fatcow/thumbnails/default160x120.png' =>
   array(
     'hash' => '1b52ebd1fe0eee3ed0abfc382991b265',
     'uri' => '/res/1b52ebd1/rsrc/image/icon/fatcow/thumbnails/default160x120.png',
     'disk' => '/rsrc/image/icon/fatcow/thumbnails/default160x120.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/fatcow/thumbnails/default60x45.png' =>
   array(
     'hash' => '048d851d8d1daad4754e891e734c1899',
     'uri' => '/res/048d851d/rsrc/image/icon/fatcow/thumbnails/default60x45.png',
     'disk' => '/rsrc/image/icon/fatcow/thumbnails/default60x45.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/fatcow/thumbnails/image160x120.png' =>
   array(
     'hash' => '434acbd8dbbc2da9f09f6205a396eba1',
     'uri' => '/res/434acbd8/rsrc/image/icon/fatcow/thumbnails/image160x120.png',
     'disk' => '/rsrc/image/icon/fatcow/thumbnails/image160x120.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/fatcow/thumbnails/image60x45.png' =>
   array(
     'hash' => '29f7872dc53588fe0b8f0b330c7ee23a',
     'uri' => '/res/29f7872d/rsrc/image/icon/fatcow/thumbnails/image60x45.png',
     'disk' => '/rsrc/image/icon/fatcow/thumbnails/image60x45.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/fatcow/thumbnails/pdf160x120.png' =>
   array(
     'hash' => '39d2e22541658a3472ba41ae2fa548e5',
     'uri' => '/res/39d2e225/rsrc/image/icon/fatcow/thumbnails/pdf160x120.png',
     'disk' => '/rsrc/image/icon/fatcow/thumbnails/pdf160x120.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/fatcow/thumbnails/pdf60x45.png' =>
   array(
     'hash' => 'b3572e9317cbed5184d12bdfabed2727',
     'uri' => '/res/b3572e93/rsrc/image/icon/fatcow/thumbnails/pdf60x45.png',
     'disk' => '/rsrc/image/icon/fatcow/thumbnails/pdf60x45.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/fatcow/thumbnails/zip160x120.png' =>
   array(
     'hash' => 'e505108688a903b5cfb674707a289bcc',
     'uri' => '/res/e5051086/rsrc/image/icon/fatcow/thumbnails/zip160x120.png',
     'disk' => '/rsrc/image/icon/fatcow/thumbnails/zip160x120.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/fatcow/thumbnails/zip60x45.png' =>
   array(
     'hash' => 'f00716f4e8f7a95e70d43504f06be0a6',
     'uri' => '/res/f00716f4/rsrc/image/icon/fatcow/thumbnails/zip60x45.png',
     'disk' => '/rsrc/image/icon/fatcow/thumbnails/zip60x45.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/lightbox/close-2.png' =>
   array(
     'hash' => '72ff3ddcc1ed5d19a715ed6242114b53',
     'uri' => '/res/72ff3ddc/rsrc/image/icon/lightbox/close-2.png',
     'disk' => '/rsrc/image/icon/lightbox/close-2.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/lightbox/close-hover-2.png' =>
   array(
     'hash' => '6ad4bd4a7820547a1d9041752546ba16',
     'uri' => '/res/6ad4bd4a/rsrc/image/icon/lightbox/close-hover-2.png',
     'disk' => '/rsrc/image/icon/lightbox/close-hover-2.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/lightbox/left-arrow-2.png' =>
   array(
     'hash' => 'd84cbb0d42739f87b8f25b2f1d2f1153',
     'uri' => '/res/d84cbb0d/rsrc/image/icon/lightbox/left-arrow-2.png',
     'disk' => '/rsrc/image/icon/lightbox/left-arrow-2.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/lightbox/left-arrow-hover-2.png' =>
   array(
     'hash' => 'cdf05f98fff3f390cd8df0c89894a3e1',
     'uri' => '/res/cdf05f98/rsrc/image/icon/lightbox/left-arrow-hover-2.png',
     'disk' => '/rsrc/image/icon/lightbox/left-arrow-hover-2.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/lightbox/right-arrow-2.png' =>
   array(
     'hash' => '52021038cb6995c71f62a804bc2d420d',
     'uri' => '/res/52021038/rsrc/image/icon/lightbox/right-arrow-2.png',
     'disk' => '/rsrc/image/icon/lightbox/right-arrow-2.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/lightbox/right-arrow-hover-2.png' =>
   array(
     'hash' => '65d5756b7b9cfcdeb2eb197a9aa6bbd2',
     'uri' => '/res/65d5756b/rsrc/image/icon/lightbox/right-arrow-hover-2.png',
     'disk' => '/rsrc/image/icon/lightbox/right-arrow-hover-2.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/subscribe.png' =>
   array(
     'hash' => '5f47a4b17de245af39a4e7a097e40623',
     'uri' => '/res/5f47a4b1/rsrc/image/icon/subscribe.png',
     'disk' => '/rsrc/image/icon/subscribe.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/tango/attachment.png' =>
   array(
     'hash' => '776fed2de89803fd8a0ba4b9deede230',
     'uri' => '/res/776fed2d/rsrc/image/icon/tango/attachment.png',
     'disk' => '/rsrc/image/icon/tango/attachment.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/tango/edit.png' =>
   array(
     'hash' => 'c0028d99dcf4e9559bbf3c88ce2d8a8d',
     'uri' => '/res/c0028d99/rsrc/image/icon/tango/edit.png',
     'disk' => '/rsrc/image/icon/tango/edit.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/tango/go-down.png' =>
   array(
     'hash' => '96862812cbb0445573c264dc057b8300',
     'uri' => '/res/96862812/rsrc/image/icon/tango/go-down.png',
     'disk' => '/rsrc/image/icon/tango/go-down.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/tango/log.png' =>
   array(
     'hash' => 'a6f72499bef279ff6807a7dbc5148f1e',
     'uri' => '/res/a6f72499/rsrc/image/icon/tango/log.png',
     'disk' => '/rsrc/image/icon/tango/log.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/tango/upload.png' =>
   array(
     'hash' => '8c11b63d6d99db3d7159c5d9a94e3062',
     'uri' => '/res/8c11b63d/rsrc/image/icon/tango/upload.png',
     'disk' => '/rsrc/image/icon/tango/upload.png',
     'type' => 'png',
   ),
   '/rsrc/image/icon/unsubscribe.png' =>
   array(
     'hash' => '29429ad65aa3af50b072b32087057361',
     'uri' => '/res/29429ad6/rsrc/image/icon/unsubscribe.png',
     'disk' => '/rsrc/image/icon/unsubscribe.png',
     'type' => 'png',
   ),
   '/rsrc/image/lines.png' =>
   array(
     'hash' => '0eb5778b34dd4fcee53b9924b88e0828',
     'uri' => '/res/0eb5778b/rsrc/image/lines.png',
     'disk' => '/rsrc/image/lines.png',
     'type' => 'png',
   ),
   '/rsrc/image/loading.gif' =>
   array(
     'hash' => '664297671941142f37d8c89e717ff2ce',
     'uri' => '/res/66429767/rsrc/image/loading.gif',
     'disk' => '/rsrc/image/loading.gif',
     'type' => 'gif',
   ),
   '/rsrc/image/main_texture.png' =>
   array(
     'hash' => 'e34d8143384721be73ec9b7532a977ab',
     'uri' => '/res/e34d8143/rsrc/image/main_texture.png',
     'disk' => '/rsrc/image/main_texture.png',
     'type' => 'png',
   ),
   '/rsrc/image/menu_texture.png' =>
   array(
     'hash' => '42193f24a52bd94be596c442d59a68ce',
     'uri' => '/res/42193f24/rsrc/image/menu_texture.png',
     'disk' => '/rsrc/image/menu_texture.png',
     'type' => 'png',
   ),
   '/rsrc/image/nyan.gif' =>
   array(
     'hash' => '03c40be4e004e6468d62b503756a587e',
     'uri' => '/res/03c40be4/rsrc/image/nyan.gif',
     'disk' => '/rsrc/image/nyan.gif',
     'type' => 'gif',
   ),
   '/rsrc/image/search.png' =>
   array(
     'hash' => 'ff7da044e6f923b8f569dec11f97e5e5',
     'uri' => '/res/ff7da044/rsrc/image/search.png',
     'disk' => '/rsrc/image/search.png',
     'type' => 'png',
   ),
+  '/rsrc/image/sprite-icon-X2.png' =>
+  array(
+    'hash' => '2ed96382cab2930fb799a39e3f66f4f1',
+    'uri' => '/res/2ed96382/rsrc/image/sprite-icon-X2.png',
+    'disk' => '/rsrc/image/sprite-icon-X2.png',
+    'type' => 'png',
+  ),
+  '/rsrc/image/sprite-icon.png' =>
+  array(
+    'hash' => '3ad6f08b9770c3150a420d0ab67f6282',
+    'uri' => '/res/3ad6f08b/rsrc/image/sprite-icon.png',
+    'disk' => '/rsrc/image/sprite-icon.png',
+    'type' => 'png',
+  ),
   '/rsrc/image/sprite.png' =>
   array(
     'hash' => '8c6200d3191c0deea30f22e7b8166b15',
     'uri' => '/res/8c6200d3/rsrc/image/sprite.png',
     'disk' => '/rsrc/image/sprite.png',
     'type' => 'png',
   ),
   '/rsrc/swf/aphlict.swf' =>
   array(
     'hash' => '4b9a9d83bebaf254f3790e87b45c1f92',
     'uri' => '/res/4b9a9d83/rsrc/swf/aphlict.swf',
     'disk' => '/rsrc/swf/aphlict.swf',
     'type' => 'swf',
   ),
   'aphront-attached-file-view-css' =>
   array(
     'uri' => '/res/a6ca5487/rsrc/css/aphront/attached-file-view.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/aphront/attached-file-view.css',
   ),
   'aphront-calendar-view-css' =>
   array(
     'uri' => '/res/31e92d4d/rsrc/css/aphront/calendar-view.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/aphront/calendar-view.css',
   ),
   'aphront-contextbar-view-css' =>
   array(
     'uri' => '/res/9e0c2ed7/rsrc/css/aphront/context-bar.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/aphront/context-bar.css',
   ),
   'aphront-crumbs-view-css' =>
   array(
     'uri' => '/res/699be12a/rsrc/css/aphront/crumbs-view.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/aphront/crumbs-view.css',
   ),
   'aphront-dark-console-css' =>
   array(
     'uri' => '/res/1adffcf3/rsrc/css/aphront/dark-console.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/aphront/dark-console.css',
   ),
   'aphront-dialog-view-css' =>
   array(
     'uri' => '/res/ae4f5352/rsrc/css/aphront/dialog-view.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/aphront/dialog-view.css',
   ),
   'aphront-error-view-css' =>
   array(
     'uri' => '/res/410dbe72/rsrc/css/aphront/error-view.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/aphront/error-view.css',
   ),
   'aphront-form-view-css' =>
   array(
     'uri' => '/res/c5c3105a/rsrc/css/aphront/form-view.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/aphront/form-view.css',
   ),
   'aphront-headsup-action-list-view-css' =>
   array(
     'uri' => '/res/1dce0ad7/rsrc/css/aphront/headsup-action-list-view.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/aphront/headsup-action-list-view.css',
   ),
   'aphront-headsup-view-css' =>
   array(
     'uri' => '/res/cf759e39/rsrc/css/aphront/headsup.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/aphront/headsup.css',
   ),
   'aphront-list-filter-view-css' =>
   array(
     'uri' => '/res/0f5ddaba/rsrc/css/aphront/list-filter-view.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/aphront/list-filter-view.css',
   ),
   'aphront-pager-view-css' =>
   array(
     'uri' => '/res/43fb79f0/rsrc/css/aphront/pager-view.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/aphront/pager-view.css',
   ),
   'aphront-panel-view-css' =>
   array(
     'uri' => '/res/77bb2527/rsrc/css/aphront/panel-view.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/aphront/panel-view.css',
   ),
   'aphront-request-failure-view-css' =>
   array(
     'uri' => '/res/c9a43002/rsrc/css/aphront/request-failure-view.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/aphront/request-failure-view.css',
   ),
   'aphront-side-nav-view-css' =>
   array(
     'uri' => '/res/3e641619/rsrc/css/aphront/side-nav-view.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/aphront/side-nav-view.css',
   ),
   'aphront-table-view-css' =>
   array(
     'uri' => '/res/732d5e1f/rsrc/css/aphront/table-view.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/aphront/table-view.css',
   ),
   'aphront-tokenizer-control-css' =>
   array(
     'uri' => '/res/f4570596/rsrc/css/aphront/tokenizer.css',
     'type' => 'css',
     'requires' =>
     array(
       0 => 'aphront-typeahead-control-css',
     ),
     'disk' => '/rsrc/css/aphront/tokenizer.css',
   ),
   'aphront-tooltip-css' =>
   array(
     'uri' => '/res/e0fa3a98/rsrc/css/aphront/tooltip.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/aphront/tooltip.css',
   ),
   'aphront-typeahead-control-css' =>
   array(
     'uri' => '/res/311e8830/rsrc/css/aphront/typeahead.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/aphront/typeahead.css',
   ),
   'autosprite-css' =>
   array(
-    'uri' => '/res/6be3e4b3/rsrc/css/autosprite.css',
+    'uri' => '/res/e1084d7c/rsrc/css/autosprite.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/autosprite.css',
   ),
   'differential-changeset-view-css' =>
   array(
     'uri' => '/res/e26e4f76/rsrc/css/application/differential/changeset-view.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/differential/changeset-view.css',
   ),
   'differential-core-view-css' =>
   array(
     'uri' => '/res/7901260e/rsrc/css/application/differential/core.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/differential/core.css',
   ),
   'differential-inline-comment-editor' =>
   array(
     'uri' => '/res/1bc649b7/rsrc/js/application/differential/DifferentialInlineCommentEditor.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-dom',
       1 => 'javelin-util',
       2 => 'javelin-stratcom',
       3 => 'javelin-install',
       4 => 'javelin-request',
       5 => 'javelin-workflow',
     ),
     'disk' => '/rsrc/js/application/differential/DifferentialInlineCommentEditor.js',
   ),
   'differential-local-commits-view-css' =>
   array(
     'uri' => '/res/8cdacd82/rsrc/css/application/differential/local-commits-view.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/differential/local-commits-view.css',
   ),
   'differential-results-table-css' =>
   array(
     'uri' => '/res/470b474d/rsrc/css/application/differential/results-table.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/differential/results-table.css',
   ),
   'differential-revision-add-comment-css' =>
   array(
     'uri' => '/res/849748d3/rsrc/css/application/differential/add-comment.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/differential/add-comment.css',
   ),
   'differential-revision-comment-css' =>
   array(
     'uri' => '/res/5e613a7f/rsrc/css/application/differential/revision-comment.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/differential/revision-comment.css',
   ),
   'differential-revision-comment-list-css' =>
   array(
     'uri' => '/res/3b31faa3/rsrc/css/application/differential/revision-comment-list.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/differential/revision-comment-list.css',
   ),
   'differential-revision-history-css' =>
   array(
     'uri' => '/res/0d7d515d/rsrc/css/application/differential/revision-history.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/differential/revision-history.css',
   ),
   'differential-revision-list-css' =>
   array(
     'uri' => '/res/7659ad8d/rsrc/css/application/differential/revision-list.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/differential/revision-list.css',
   ),
   'differential-table-of-contents-css' =>
   array(
     'uri' => '/res/0ac99a19/rsrc/css/application/differential/table-of-contents.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/differential/table-of-contents.css',
   ),
   'diffusion-commit-view-css' =>
   array(
     'uri' => '/res/b445944e/rsrc/css/application/diffusion/commit-view.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/diffusion/commit-view.css',
   ),
   'diffusion-icons-css' =>
   array(
     'uri' => '/res/b93e32c9/rsrc/css/application/diffusion/diffusion-icons.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/diffusion/diffusion-icons.css',
   ),
   'diffusion-source-css' =>
   array(
     'uri' => '/res/6a28b429/rsrc/css/application/diffusion/diffusion-source.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/diffusion/diffusion-source.css',
   ),
   'files-css' =>
   array(
     'uri' => '/res/a265a77d/rsrc/css/application/files/files.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/files/files.css',
   ),
   'herald-css' =>
   array(
     'uri' => '/res/5051f3ab/rsrc/css/application/herald/herald.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/herald/herald.css',
   ),
   'herald-rule-editor' =>
   array(
     'uri' => '/res/3a2979de/rsrc/js/application/herald/HeraldRuleEditor.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'multirow-row-manager',
       1 => 'javelin-install',
       2 => 'javelin-typeahead',
       3 => 'javelin-util',
       4 => 'javelin-dom',
       5 => 'javelin-tokenizer',
       6 => 'javelin-typeahead-preloaded-source',
       7 => 'javelin-stratcom',
       8 => 'javelin-json',
       9 => 'phabricator-prefab',
     ),
     'disk' => '/rsrc/js/application/herald/HeraldRuleEditor.js',
   ),
   'herald-test-css' =>
   array(
     'uri' => '/res/c0cd6bdb/rsrc/css/application/herald/herald-test.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/herald/herald-test.css',
   ),
   'inline-comment-summary-css' =>
   array(
     'uri' => '/res/338704f7/rsrc/css/application/diff/inline-comment-summary.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/diff/inline-comment-summary.css',
   ),
   'javelin-aphlict' =>
   array(
     'uri' => '/res/c0b9e53f/rsrc/js/application/aphlict/Aphlict.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-util',
     ),
     'disk' => '/rsrc/js/application/aphlict/Aphlict.js',
   ),
   'javelin-behavior' =>
   array(
     'uri' => '/res/ef4eda09/rsrc/js/javelin/lib/behavior.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-magical-init',
     ),
     'disk' => '/rsrc/js/javelin/lib/behavior.js',
   ),
   'javelin-behavior-aphlict-dropdown' =>
   array(
     'uri' => '/res/dc8f194b/rsrc/js/application/aphlict/behavior-aphlict-dropdown.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-request',
       2 => 'javelin-stratcom',
       3 => 'javelin-vector',
       4 => 'javelin-dom',
     ),
     'disk' => '/rsrc/js/application/aphlict/behavior-aphlict-dropdown.js',
   ),
   'javelin-behavior-aphlict-listen' =>
   array(
     'uri' => '/res/6dde3f43/rsrc/js/application/aphlict/behavior-aphlict-listen.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-aphlict',
       2 => 'javelin-stratcom',
       3 => 'javelin-request',
       4 => 'javelin-uri',
       5 => 'javelin-dom',
       6 => 'javelin-json',
       7 => 'phabricator-notification',
     ),
     'disk' => '/rsrc/js/application/aphlict/behavior-aphlict-listen.js',
   ),
   'javelin-behavior-aphront-basic-tokenizer' =>
   array(
     'uri' => '/res/cf049052/rsrc/js/application/core/behavior-tokenizer.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'phabricator-prefab',
     ),
     'disk' => '/rsrc/js/application/core/behavior-tokenizer.js',
   ),
   'javelin-behavior-aphront-drag-and-drop' =>
   array(
     'uri' => '/res/0910fc0a/rsrc/js/application/core/behavior-drag-and-drop.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-util',
       3 => 'phabricator-drag-and-drop-file-upload',
     ),
     'disk' => '/rsrc/js/application/core/behavior-drag-and-drop.js',
   ),
   'javelin-behavior-aphront-drag-and-drop-textarea' =>
   array(
     'uri' => '/res/ad737ce4/rsrc/js/application/core/behavior-drag-and-drop-textarea.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'phabricator-drag-and-drop-file-upload',
       3 => 'phabricator-paste-file-upload',
       4 => 'phabricator-textareautils',
     ),
     'disk' => '/rsrc/js/application/core/behavior-drag-and-drop-textarea.js',
   ),
   'javelin-behavior-aphront-form-disable-on-submit' =>
   array(
     'uri' => '/res/ca54e8b9/rsrc/js/application/core/behavior-form.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-dom',
     ),
     'disk' => '/rsrc/js/application/core/behavior-form.js',
   ),
   'javelin-behavior-aphront-more' =>
   array(
     'uri' => '/res/9ad83c3c/rsrc/js/application/core/behavior-more.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-dom',
     ),
     'disk' => '/rsrc/js/application/core/behavior-more.js',
   ),
   'javelin-behavior-audit-preview' =>
   array(
     'uri' => '/res/3048b073/rsrc/js/application/diffusion/behavior-audit-preview.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-util',
       3 => 'phabricator-shaped-request',
     ),
     'disk' => '/rsrc/js/application/diffusion/behavior-audit-preview.js',
   ),
   'javelin-behavior-countdown-timer' =>
   array(
     'uri' => '/res/7468acb7/rsrc/js/application/countdown/timer.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-util',
     ),
     'disk' => '/rsrc/js/application/countdown/timer.js',
   ),
   'javelin-behavior-dark-console' =>
   array(
     'uri' => '/res/3269c0bb/rsrc/js/application/core/behavior-dark-console.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-util',
       3 => 'javelin-dom',
       4 => 'javelin-request',
       5 => 'phabricator-keyboard-shortcut',
       6 => 'javelin-behavior-dark-console-ajax',
     ),
     'disk' => '/rsrc/js/application/core/behavior-dark-console.js',
   ),
   'javelin-behavior-dark-console-ajax' =>
   array(
     'uri' => '/res/ac3ab63a/rsrc/js/application/core/behavior-dark-console-ajax.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
     ),
     'disk' => '/rsrc/js/application/core/behavior-dark-console-ajax.js',
   ),
   'javelin-behavior-device' =>
   array(
     'uri' => '/res/b6bd0c33/rsrc/js/application/core/behavior-device.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-dom',
       3 => 'javelin-vector',
       4 => 'javelin-install',
     ),
     'disk' => '/rsrc/js/application/core/behavior-device.js',
   ),
   'javelin-behavior-differential-accept-with-errors' =>
   array(
     'uri' => '/res/ba5144c5/rsrc/js/application/differential/behavior-accept-with-errors.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
     ),
     'disk' => '/rsrc/js/application/differential/behavior-accept-with-errors.js',
   ),
   'javelin-behavior-differential-add-reviewers-and-ccs' =>
   array(
     'uri' => '/res/27be3f81/rsrc/js/application/differential/behavior-add-reviewers-and-ccs.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'phabricator-prefab',
     ),
     'disk' => '/rsrc/js/application/differential/behavior-add-reviewers-and-ccs.js',
   ),
   'javelin-behavior-differential-comment-jump' =>
   array(
     'uri' => '/res/b580229b/rsrc/js/application/differential/behavior-comment-jump.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-util',
       2 => 'javelin-dom',
     ),
     'disk' => '/rsrc/js/application/differential/behavior-comment-jump.js',
   ),
   'javelin-behavior-differential-diff-radios' =>
   array(
     'uri' => '/res/004cb66f/rsrc/js/application/differential/behavior-diff-radios.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-dom',
     ),
     'disk' => '/rsrc/js/application/differential/behavior-diff-radios.js',
   ),
   'javelin-behavior-differential-dropdown-menus' =>
   array(
     'uri' => '/res/752f5dfc/rsrc/js/application/differential/behavior-dropdown-menus.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-util',
       3 => 'javelin-stratcom',
       4 => 'phabricator-dropdown-menu',
       5 => 'phabricator-menu-item',
     ),
     'disk' => '/rsrc/js/application/differential/behavior-dropdown-menus.js',
   ),
   'javelin-behavior-differential-edit-inline-comments' =>
   array(
     'uri' => '/res/70c1f3a3/rsrc/js/application/differential/behavior-edit-inline-comments.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-dom',
       3 => 'javelin-util',
       4 => 'javelin-vector',
       5 => 'differential-inline-comment-editor',
     ),
     'disk' => '/rsrc/js/application/differential/behavior-edit-inline-comments.js',
   ),
   'javelin-behavior-differential-feedback-preview' =>
   array(
     'uri' => '/res/5fbce8db/rsrc/js/application/differential/behavior-comment-preview.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-dom',
       3 => 'javelin-request',
       4 => 'javelin-util',
       5 => 'phabricator-shaped-request',
     ),
     'disk' => '/rsrc/js/application/differential/behavior-comment-preview.js',
   ),
   'javelin-behavior-differential-keyboard-navigation' =>
   array(
     'uri' => '/res/a7798465/rsrc/js/application/differential/behavior-keyboard-nav.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-stratcom',
       3 => 'phabricator-keyboard-shortcut',
     ),
     'disk' => '/rsrc/js/application/differential/behavior-keyboard-nav.js',
   ),
   'javelin-behavior-differential-populate' =>
   array(
     'uri' => '/res/781dd9a5/rsrc/js/application/differential/behavior-populate.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-workflow',
       2 => 'javelin-util',
       3 => 'javelin-dom',
       4 => 'javelin-stratcom',
       5 => 'phabricator-tooltip',
     ),
     'disk' => '/rsrc/js/application/differential/behavior-populate.js',
   ),
   'javelin-behavior-differential-show-all-comments' =>
   array(
     'uri' => '/res/eaa12efc/rsrc/js/application/differential/behavior-show-all-comments.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-dom',
     ),
     'disk' => '/rsrc/js/application/differential/behavior-show-all-comments.js',
   ),
   'javelin-behavior-differential-show-field-details' =>
   array(
     'uri' => '/res/8d57f459/rsrc/js/application/differential/behavior-show-field-details.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-dom',
     ),
     'disk' => '/rsrc/js/application/differential/behavior-show-field-details.js',
   ),
   'javelin-behavior-differential-show-more' =>
   array(
     'uri' => '/res/88115daf/rsrc/js/application/differential/behavior-show-more.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-workflow',
       3 => 'javelin-util',
       4 => 'javelin-stratcom',
     ),
     'disk' => '/rsrc/js/application/differential/behavior-show-more.js',
   ),
   'javelin-behavior-differential-toggle-files' =>
   array(
     'uri' => '/res/ae937207/rsrc/js/application/differential/behavior-toggle-files.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-stratcom',
     ),
     'disk' => '/rsrc/js/application/differential/behavior-toggle-files.js',
   ),
   'javelin-behavior-differential-user-select' =>
   array(
     'uri' => '/res/23c51a5d/rsrc/js/application/differential/behavior-user-select.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-stratcom',
     ),
     'disk' => '/rsrc/js/application/differential/behavior-user-select.js',
   ),
   'javelin-behavior-diffusion-commit-branches' =>
   array(
     'uri' => '/res/1ede335a/rsrc/js/application/diffusion/behavior-commit-branches.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-util',
       3 => 'javelin-request',
     ),
     'disk' => '/rsrc/js/application/diffusion/behavior-commit-branches.js',
   ),
   'javelin-behavior-diffusion-commit-graph' =>
   array(
     'uri' => '/res/cfe336e8/rsrc/js/application/diffusion/behavior-commit-graph.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-stratcom',
     ),
     'disk' => '/rsrc/js/application/diffusion/behavior-commit-graph.js',
   ),
   'javelin-behavior-diffusion-jump-to' =>
   array(
     'uri' => '/res/7c42e1ba/rsrc/js/application/diffusion/behavior-jump-to.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-util',
       2 => 'javelin-vector',
       3 => 'javelin-dom',
     ),
     'disk' => '/rsrc/js/application/diffusion/behavior-jump-to.js',
   ),
   'javelin-behavior-diffusion-line-linker' =>
   array(
     'uri' => '/res/d3cf5499/rsrc/js/application/diffusion/behavior-line-linker.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-dom',
       3 => 'javelin-uri',
     ),
     'disk' => '/rsrc/js/application/diffusion/behavior-line-linker.js',
   ),
   'javelin-behavior-diffusion-pull-lastmodified' =>
   array(
     'uri' => '/res/29fe2790/rsrc/js/application/diffusion/behavior-pull-lastmodified.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-util',
       3 => 'javelin-request',
     ),
     'disk' => '/rsrc/js/application/diffusion/behavior-pull-lastmodified.js',
   ),
   'javelin-behavior-error-log' =>
   array(
     'uri' => '/res/f46289e9/rsrc/js/application/core/behavior-error-log.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-dom',
     ),
     'disk' => '/rsrc/js/application/core/behavior-error-log.js',
   ),
   'javelin-behavior-fancy-datepicker' =>
   array(
     'uri' => '/res/ae843244/rsrc/js/application/core/behavior-fancy-datepicker.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-util',
       2 => 'javelin-dom',
       3 => 'javelin-stratcom',
       4 => 'javelin-vector',
     ),
     'disk' => '/rsrc/js/application/core/behavior-fancy-datepicker.js',
   ),
   'javelin-behavior-files-drag-and-drop' =>
   array(
     'uri' => '/res/4893f577/rsrc/js/application/core/behavior-files-drag-and-drop.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-uri',
       3 => 'phabricator-drag-and-drop-file-upload',
     ),
     'disk' => '/rsrc/js/application/core/behavior-files-drag-and-drop.js',
   ),
   'javelin-behavior-herald-rule-editor' =>
   array(
     'uri' => '/res/77a0c945/rsrc/js/application/herald/herald-rule-editor.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'herald-rule-editor',
       1 => 'javelin-behavior',
     ),
     'disk' => '/rsrc/js/application/herald/herald-rule-editor.js',
   ),
   'javelin-behavior-konami' =>
   array(
     'uri' => '/res/5f4b32fe/rsrc/js/application/core/behavior-konami.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
     ),
     'disk' => '/rsrc/js/application/core/behavior-konami.js',
   ),
   'javelin-behavior-lightbox-attachments' =>
   array(
     'uri' => '/res/5efba371/rsrc/js/application/core/behavior-lightbox-attachments.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-dom',
       3 => 'javelin-mask',
       4 => 'javelin-util',
       5 => 'phabricator-busy',
     ),
     'disk' => '/rsrc/js/application/core/behavior-lightbox-attachments.js',
   ),
   'javelin-behavior-line-chart' =>
   array(
     'uri' => '/res/1aa5ac88/rsrc/js/application/maniphest/behavior-line-chart.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-vector',
     ),
     'disk' => '/rsrc/js/application/maniphest/behavior-line-chart.js',
   ),
   'javelin-behavior-maniphest-batch-editor' =>
   array(
     'uri' => '/res/d22661be/rsrc/js/application/maniphest/behavior-batch-editor.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-util',
       3 => 'phabricator-prefab',
       4 => 'multirow-row-manager',
       5 => 'javelin-json',
     ),
     'disk' => '/rsrc/js/application/maniphest/behavior-batch-editor.js',
   ),
   'javelin-behavior-maniphest-batch-selector' =>
   array(
     'uri' => '/res/398cf8d7/rsrc/js/application/maniphest/behavior-batch-selector.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-stratcom',
     ),
     'disk' => '/rsrc/js/application/maniphest/behavior-batch-selector.js',
   ),
   'javelin-behavior-maniphest-description-preview' =>
   array(
     'uri' => '/res/8acd6f07/rsrc/js/application/maniphest/behavior-task-preview.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-util',
       3 => 'phabricator-shaped-request',
     ),
     'disk' => '/rsrc/js/application/maniphest/behavior-task-preview.js',
   ),
   'javelin-behavior-maniphest-subpriority-editor' =>
   array(
     'uri' => '/res/5e02f19a/rsrc/js/application/maniphest/behavior-subpriorityeditor.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-magical-init',
       2 => 'javelin-dom',
       3 => 'javelin-vector',
       4 => 'javelin-stratcom',
       5 => 'javelin-workflow',
     ),
     'disk' => '/rsrc/js/application/maniphest/behavior-subpriorityeditor.js',
   ),
   'javelin-behavior-maniphest-transaction-controls' =>
   array(
     'uri' => '/res/62465554/rsrc/js/application/maniphest/behavior-transaction-controls.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'phabricator-prefab',
     ),
     'disk' => '/rsrc/js/application/maniphest/behavior-transaction-controls.js',
   ),
   'javelin-behavior-maniphest-transaction-expand' =>
   array(
     'uri' => '/res/966410de/rsrc/js/application/maniphest/behavior-transaction-expand.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-workflow',
       3 => 'javelin-stratcom',
     ),
     'disk' => '/rsrc/js/application/maniphest/behavior-transaction-expand.js',
   ),
   'javelin-behavior-maniphest-transaction-preview' =>
   array(
     'uri' => '/res/855c9f0c/rsrc/js/application/maniphest/behavior-transaction-preview.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-util',
       3 => 'javelin-json',
       4 => 'javelin-stratcom',
       5 => 'phabricator-shaped-request',
     ),
     'disk' => '/rsrc/js/application/maniphest/behavior-transaction-preview.js',
   ),
   'javelin-behavior-owners-path-editor' =>
   array(
     'uri' => '/res/9cf78ffc/rsrc/js/application/owners/owners-path-editor.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'owners-path-editor',
       1 => 'javelin-behavior',
     ),
     'disk' => '/rsrc/js/application/owners/owners-path-editor.js',
   ),
   'javelin-behavior-phabricator-active-nav' =>
   array(
     'uri' => '/res/f879d4dd/rsrc/js/application/core/behavior-active-nav.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-vector',
       3 => 'javelin-dom',
       4 => 'javelin-uri',
     ),
     'disk' => '/rsrc/js/application/core/behavior-active-nav.js',
   ),
   'javelin-behavior-phabricator-autofocus' =>
   array(
     'uri' => '/res/2946bb89/rsrc/js/application/core/behavior-autofocus.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
     ),
     'disk' => '/rsrc/js/application/core/behavior-autofocus.js',
   ),
   'javelin-behavior-phabricator-keyboard-pager' =>
   array(
     'uri' => '/res/56d64eff/rsrc/js/application/core/behavior-keyboard-pager.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-uri',
       2 => 'phabricator-keyboard-shortcut',
     ),
     'disk' => '/rsrc/js/application/core/behavior-keyboard-pager.js',
   ),
   'javelin-behavior-phabricator-keyboard-shortcuts' =>
   array(
     'uri' => '/res/c5eb65cd/rsrc/js/application/core/behavior-keyboard-shortcuts.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-workflow',
       2 => 'javelin-json',
       3 => 'javelin-dom',
       4 => 'phabricator-keyboard-shortcut',
     ),
     'disk' => '/rsrc/js/application/core/behavior-keyboard-shortcuts.js',
   ),
   'javelin-behavior-phabricator-nav' =>
   array(
     'uri' => '/res/3d04f9ab/rsrc/js/application/core/behavior-phabricator-nav.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-behavior-device',
       2 => 'javelin-stratcom',
       3 => 'javelin-dom',
       4 => 'javelin-magical-init',
       5 => 'javelin-vector',
       6 => 'javelin-util',
       7 => 'javelin-fx',
     ),
     'disk' => '/rsrc/js/application/core/behavior-phabricator-nav.js',
   ),
   'javelin-behavior-phabricator-notification-example' =>
   array(
     'uri' => '/res/a6d51998/rsrc/js/application/uiexample/notification-example.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'phabricator-notification',
       1 => 'javelin-stratcom',
       2 => 'javelin-behavior',
       3 => 'javelin-uri',
     ),
     'disk' => '/rsrc/js/application/uiexample/notification-example.js',
   ),
   'javelin-behavior-phabricator-object-selector' =>
   array(
     'uri' => '/res/0c4b0d82/rsrc/js/application/core/behavior-object-selector.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-request',
       3 => 'javelin-util',
     ),
     'disk' => '/rsrc/js/application/core/behavior-object-selector.js',
   ),
   'javelin-behavior-phabricator-oncopy' =>
   array(
     'uri' => '/res/f490b8d1/rsrc/js/application/core/behavior-oncopy.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
     ),
     'disk' => '/rsrc/js/application/core/behavior-oncopy.js',
   ),
   'javelin-behavior-phabricator-remarkup-assist' =>
   array(
     'uri' => '/res/8a4f3a35/rsrc/js/application/core/behavior-phabricator-remarkup-assist.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-dom',
       3 => 'phabricator-textareautils',
     ),
     'disk' => '/rsrc/js/application/core/behavior-phabricator-remarkup-assist.js',
   ),
   'javelin-behavior-phabricator-search-typeahead' =>
   array(
     'uri' => '/res/046ab274/rsrc/js/application/core/behavior-search-typeahead.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-typeahead-ondemand-source',
       2 => 'javelin-typeahead',
       3 => 'javelin-dom',
       4 => 'javelin-uri',
       5 => 'javelin-util',
       6 => 'javelin-stratcom',
     ),
     'disk' => '/rsrc/js/application/core/behavior-search-typeahead.js',
   ),
   'javelin-behavior-phabricator-tooltips' =>
   array(
     'uri' => '/res/e0b344c6/rsrc/js/application/core/behavior-tooltip.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-behavior-device',
       2 => 'javelin-stratcom',
       3 => 'phabricator-tooltip',
     ),
     'disk' => '/rsrc/js/application/core/behavior-tooltip.js',
   ),
   'javelin-behavior-phabricator-watch-anchor' =>
   array(
     'uri' => '/res/b20b1cc2/rsrc/js/application/core/behavior-watch-anchor.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-dom',
       3 => 'javelin-vector',
     ),
     'disk' => '/rsrc/js/application/core/behavior-watch-anchor.js',
   ),
   'javelin-behavior-phame-post-preview' =>
   array(
     'uri' => '/res/ac4c503a/rsrc/js/application/phame/phame-post-preview.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-util',
       3 => 'phabricator-shaped-request',
     ),
     'disk' => '/rsrc/js/application/phame/phame-post-preview.js',
   ),
   'javelin-behavior-phriction-document-preview' =>
   array(
     'uri' => '/res/f1665ecd/rsrc/js/application/phriction/phriction-document-preview.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-util',
       3 => 'phabricator-shaped-request',
     ),
     'disk' => '/rsrc/js/application/phriction/phriction-document-preview.js',
   ),
   'javelin-behavior-ponder-feedback-preview' =>
   array(
     'uri' => '/res/2e802dd9/rsrc/js/application/ponder/behavior-comment-preview.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-util',
       3 => 'phabricator-shaped-request',
     ),
     'disk' => '/rsrc/js/application/ponder/behavior-comment-preview.js',
   ),
   'javelin-behavior-ponder-votebox' =>
   array(
     'uri' => '/res/9d091af3/rsrc/js/application/ponder/behavior-votebox.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-util',
       3 => 'javelin-stratcom',
       4 => 'javelin-request',
     ),
     'disk' => '/rsrc/js/application/ponder/behavior-votebox.js',
   ),
   'javelin-behavior-project-create' =>
   array(
     'uri' => '/res/e91f3f8f/rsrc/js/application/projects/behavior-project-create.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-stratcom',
       3 => 'javelin-workflow',
     ),
     'disk' => '/rsrc/js/application/projects/behavior-project-create.js',
   ),
   'javelin-behavior-refresh-csrf' =>
   array(
     'uri' => '/res/6fd76d0f/rsrc/js/application/core/behavior-refresh-csrf.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-request',
       1 => 'javelin-behavior',
       2 => 'javelin-dom',
       3 => 'phabricator-busy',
     ),
     'disk' => '/rsrc/js/application/core/behavior-refresh-csrf.js',
   ),
   'javelin-behavior-repository-crossreference' =>
   array(
     'uri' => '/res/244c5251/rsrc/js/application/repository/repository-crossreference.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-stratcom',
       3 => 'javelin-uri',
     ),
     'disk' => '/rsrc/js/application/repository/repository-crossreference.js',
   ),
   'javelin-behavior-stripe-payment-form' =>
   array(
     'uri' => '/res/87c7b043/rsrc/js/application/phortune/behavior-stripe-payment-form.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-json',
       3 => 'stripe-core',
     ),
     'disk' => '/rsrc/js/application/phortune/behavior-stripe-payment-form.js',
   ),
   'javelin-behavior-toggle-class' =>
   array(
     'uri' => '/res/fa818e0f/rsrc/js/application/core/behavior-toggle-class.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-dom',
     ),
     'disk' => '/rsrc/js/application/core/behavior-toggle-class.js',
   ),
   'javelin-behavior-view-placeholder' =>
   array(
     'uri' => '/res/5b89bdf5/rsrc/js/javelin/ext/view/ViewPlaceholder.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-view-renderer',
     ),
     'disk' => '/rsrc/js/javelin/ext/view/ViewPlaceholder.js',
   ),
   'javelin-behavior-workflow' =>
   array(
     'uri' => '/res/2b0e2754/rsrc/js/application/core/behavior-workflow.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-workflow',
       3 => 'javelin-dom',
     ),
     'disk' => '/rsrc/js/application/core/behavior-workflow.js',
   ),
   'javelin-color' =>
   array(
     'uri' => '/res/b0439fc9/rsrc/js/javelin/ext/fx/Color.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
     ),
     'disk' => '/rsrc/js/javelin/ext/fx/Color.js',
   ),
   'javelin-cookie' =>
   array(
     'uri' => '/res/a9cddab0/rsrc/js/javelin/lib/Cookie.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-util',
     ),
     'disk' => '/rsrc/js/javelin/lib/Cookie.js',
   ),
   'javelin-dom' =>
   array(
     'uri' => '/res/4c79cf8a/rsrc/js/javelin/lib/DOM.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-magical-init',
       1 => 'javelin-install',
       2 => 'javelin-util',
       3 => 'javelin-vector',
       4 => 'javelin-stratcom',
     ),
     'disk' => '/rsrc/js/javelin/lib/DOM.js',
   ),
   'javelin-dynval' =>
   array(
     'uri' => '/res/d89c6f88/rsrc/js/javelin/ext/reactor/core/DynVal.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-reactornode',
       2 => 'javelin-util',
       3 => 'javelin-reactor',
     ),
     'disk' => '/rsrc/js/javelin/ext/reactor/core/DynVal.js',
   ),
   'javelin-event' =>
   array(
     'uri' => '/res/3815b473/rsrc/js/javelin/core/Event.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
     ),
     'disk' => '/rsrc/js/javelin/core/Event.js',
   ),
   'javelin-fx' =>
   array(
     'uri' => '/res/30ef0914/rsrc/js/javelin/ext/fx/FX.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-color',
       1 => 'javelin-install',
       2 => 'javelin-util',
     ),
     'disk' => '/rsrc/js/javelin/ext/fx/FX.js',
   ),
   'javelin-history' =>
   array(
     'uri' => '/res/9bb36651/rsrc/js/javelin/lib/History.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-stratcom',
       1 => 'javelin-install',
       2 => 'javelin-uri',
       3 => 'javelin-util',
     ),
     'disk' => '/rsrc/js/javelin/lib/History.js',
   ),
   'javelin-install' =>
   array(
     'uri' => '/res/cab679ff/rsrc/js/javelin/core/install.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-util',
       1 => 'javelin-magical-init',
     ),
     'disk' => '/rsrc/js/javelin/core/install.js',
   ),
   'javelin-json' =>
   array(
     'uri' => '/res/561b8056/rsrc/js/javelin/lib/JSON.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
     ),
     'disk' => '/rsrc/js/javelin/lib/JSON.js',
   ),
   'javelin-magical-init' =>
   array(
     'uri' => '/res/4f3c705c/rsrc/js/javelin/core/init.js',
     'type' => 'js',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/js/javelin/core/init.js',
   ),
   'javelin-mask' =>
   array(
     'uri' => '/res/d2a35fff/rsrc/js/javelin/lib/Mask.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-dom',
     ),
     'disk' => '/rsrc/js/javelin/lib/Mask.js',
   ),
   'javelin-reactor' =>
   array(
     'uri' => '/res/dfd87f3c/rsrc/js/javelin/ext/reactor/core/Reactor.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-util',
     ),
     'disk' => '/rsrc/js/javelin/ext/reactor/core/Reactor.js',
   ),
   'javelin-reactor-dom' =>
   array(
     'uri' => '/res/701b6f39/rsrc/js/javelin/ext/reactor/dom/RDOM.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-dom',
       1 => 'javelin-dynval',
       2 => 'javelin-reactornode',
       3 => 'javelin-install',
       4 => 'javelin-util',
     ),
     'disk' => '/rsrc/js/javelin/ext/reactor/dom/RDOM.js',
   ),
   'javelin-reactor-node-calmer' =>
   array(
     'uri' => '/res/5a35920a/rsrc/js/javelin/ext/reactor/core/ReactorNodeCalmer.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-reactor',
       2 => 'javelin-util',
     ),
     'disk' => '/rsrc/js/javelin/ext/reactor/core/ReactorNodeCalmer.js',
   ),
   'javelin-reactornode' =>
   array(
     'uri' => '/res/f278cc27/rsrc/js/javelin/ext/reactor/core/ReactorNode.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-reactor',
       2 => 'javelin-util',
       3 => 'javelin-reactor-node-calmer',
     ),
     'disk' => '/rsrc/js/javelin/ext/reactor/core/ReactorNode.js',
   ),
   'javelin-request' =>
   array(
     'uri' => '/res/e25d75b3/rsrc/js/javelin/lib/Request.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-stratcom',
       2 => 'javelin-util',
       3 => 'javelin-behavior',
       4 => 'javelin-json',
       5 => 'javelin-dom',
       6 => 'javelin-resource',
     ),
     'disk' => '/rsrc/js/javelin/lib/Request.js',
   ),
   'javelin-resource' =>
   array(
     'uri' => '/res/d5a3f835/rsrc/js/javelin/lib/Resource.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-magical-init',
       1 => 'javelin-stratcom',
       2 => 'javelin-util',
       3 => 'javelin-uri',
     ),
     'disk' => '/rsrc/js/javelin/lib/Resource.js',
   ),
   'javelin-stratcom' =>
   array(
     'uri' => '/res/3ec22c29/rsrc/js/javelin/core/Stratcom.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-event',
       2 => 'javelin-util',
       3 => 'javelin-magical-init',
     ),
     'disk' => '/rsrc/js/javelin/core/Stratcom.js',
   ),
   'javelin-tokenizer' =>
   array(
     'uri' => '/res/c75c9e12/rsrc/js/javelin/lib/control/tokenizer/Tokenizer.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-dom',
       1 => 'javelin-util',
       2 => 'javelin-stratcom',
       3 => 'javelin-install',
     ),
     'disk' => '/rsrc/js/javelin/lib/control/tokenizer/Tokenizer.js',
   ),
   'javelin-typeahead' =>
   array(
     'uri' => '/res/dccb789e/rsrc/js/javelin/lib/control/typeahead/Typeahead.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-dom',
       2 => 'javelin-vector',
       3 => 'javelin-util',
     ),
     'disk' => '/rsrc/js/javelin/lib/control/typeahead/Typeahead.js',
   ),
   'javelin-typeahead-composite-source' =>
   array(
     'uri' => '/res/99705f64/rsrc/js/javelin/lib/control/typeahead/source/TypeaheadCompositeSource.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-typeahead-source',
       2 => 'javelin-util',
     ),
     'disk' => '/rsrc/js/javelin/lib/control/typeahead/source/TypeaheadCompositeSource.js',
   ),
   'javelin-typeahead-normalizer' =>
   array(
     'uri' => '/res/a9e97c0d/rsrc/js/javelin/lib/control/typeahead/normalizer/TypeaheadNormalizer.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
     ),
     'disk' => '/rsrc/js/javelin/lib/control/typeahead/normalizer/TypeaheadNormalizer.js',
   ),
   'javelin-typeahead-ondemand-source' =>
   array(
     'uri' => '/res/81e531aa/rsrc/js/javelin/lib/control/typeahead/source/TypeaheadOnDemandSource.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-util',
       2 => 'javelin-stratcom',
       3 => 'javelin-request',
       4 => 'javelin-typeahead-source',
     ),
     'disk' => '/rsrc/js/javelin/lib/control/typeahead/source/TypeaheadOnDemandSource.js',
   ),
   'javelin-typeahead-preloaded-source' =>
   array(
     'uri' => '/res/d464efd2/rsrc/js/javelin/lib/control/typeahead/source/TypeaheadPreloadedSource.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-util',
       2 => 'javelin-stratcom',
       3 => 'javelin-request',
       4 => 'javelin-typeahead-source',
     ),
     'disk' => '/rsrc/js/javelin/lib/control/typeahead/source/TypeaheadPreloadedSource.js',
   ),
   'javelin-typeahead-source' =>
   array(
     'uri' => '/res/74b1f091/rsrc/js/javelin/lib/control/typeahead/source/TypeaheadSource.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-util',
       2 => 'javelin-dom',
       3 => 'javelin-typeahead-normalizer',
     ),
     'disk' => '/rsrc/js/javelin/lib/control/typeahead/source/TypeaheadSource.js',
   ),
   'javelin-typeahead-static-source' =>
   array(
     'uri' => '/res/c8e247fc/rsrc/js/javelin/lib/control/typeahead/source/TypeaheadStaticSource.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-typeahead-source',
     ),
     'disk' => '/rsrc/js/javelin/lib/control/typeahead/source/TypeaheadStaticSource.js',
   ),
   'javelin-uri' =>
   array(
     'uri' => '/res/c107d858/rsrc/js/javelin/lib/URI.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-util',
       2 => 'javelin-stratcom',
     ),
     'disk' => '/rsrc/js/javelin/lib/URI.js',
   ),
   'javelin-util' =>
   array(
     'uri' => '/res/25786b6c/rsrc/js/javelin/core/util.js',
     'type' => 'js',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/js/javelin/core/util.js',
   ),
   'javelin-vector' =>
   array(
     'uri' => '/res/f240bdb3/rsrc/js/javelin/lib/Vector.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-event',
     ),
     'disk' => '/rsrc/js/javelin/lib/Vector.js',
   ),
   'javelin-view' =>
   array(
     'uri' => '/res/b98657a7/rsrc/js/javelin/ext/view/View.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-util',
     ),
     'disk' => '/rsrc/js/javelin/ext/view/View.js',
   ),
   'javelin-view-html' =>
   array(
     'uri' => '/res/7e5a2122/rsrc/js/javelin/ext/view/HTMLView.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-view',
     ),
     'disk' => '/rsrc/js/javelin/ext/view/HTMLView.js',
   ),
   'javelin-view-interpreter' =>
   array(
     'uri' => '/res/17e911ca/rsrc/js/javelin/ext/view/ViewInterpreter.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-view',
       1 => 'javelin-install',
     ),
     'disk' => '/rsrc/js/javelin/ext/view/ViewInterpreter.js',
   ),
   'javelin-view-renderer' =>
   array(
     'uri' => '/res/db4ed5a2/rsrc/js/javelin/ext/view/ViewRenderer.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
     ),
     'disk' => '/rsrc/js/javelin/ext/view/ViewRenderer.js',
   ),
   'javelin-view-visitor' =>
   array(
     'uri' => '/res/0ef9dc43/rsrc/js/javelin/ext/view/ViewVisitor.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-util',
     ),
     'disk' => '/rsrc/js/javelin/ext/view/ViewVisitor.js',
   ),
   'javelin-workflow' =>
   array(
     'uri' => '/res/519c4e1a/rsrc/js/javelin/lib/Workflow.js',
     'type' => 'js',
     'requires' =>
     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',
     ),
     'disk' => '/rsrc/js/javelin/lib/Workflow.js',
   ),
   'lightbox-attachment-css' =>
   array(
     'uri' => '/res/c1c3415d/rsrc/css/aphront/lightbox-attachment.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/aphront/lightbox-attachment.css',
   ),
   'maniphest-batch-editor' =>
   array(
     'uri' => '/res/fb15d744/rsrc/css/application/maniphest/batch-editor.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/maniphest/batch-editor.css',
   ),
   'maniphest-report-css' =>
   array(
     'uri' => '/res/2e633fcf/rsrc/css/application/maniphest/report.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/maniphest/report.css',
   ),
   'maniphest-task-edit-css' =>
   array(
     'uri' => '/res/68c7863e/rsrc/css/application/maniphest/task-edit.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/maniphest/task-edit.css',
   ),
   'maniphest-task-summary-css' =>
   array(
     'uri' => '/res/6e67cb30/rsrc/css/application/maniphest/task-summary.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/maniphest/task-summary.css',
   ),
   'maniphest-transaction-detail-css' =>
   array(
     'uri' => '/res/24e5862f/rsrc/css/application/maniphest/transaction-detail.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/maniphest/transaction-detail.css',
   ),
   'multirow-row-manager' =>
   array(
     'uri' => '/res/0a9b3dee/rsrc/js/application/core/MultirowRowManager.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-stratcom',
       2 => 'javelin-dom',
       3 => 'javelin-util',
     ),
     'disk' => '/rsrc/js/application/core/MultirowRowManager.js',
   ),
   'owners-path-editor' =>
   array(
     'uri' => '/res/e6c51eb6/rsrc/js/application/owners/OwnersPathEditor.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'multirow-row-manager',
       1 => 'javelin-install',
       2 => 'path-typeahead',
       3 => 'javelin-dom',
       4 => 'javelin-util',
     ),
     'disk' => '/rsrc/js/application/owners/OwnersPathEditor.js',
   ),
   'owners-path-editor-css' =>
   array(
     'uri' => '/res/9bc5332c/rsrc/css/application/owners/owners-path-editor.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/owners/owners-path-editor.css',
   ),
   'path-typeahead' =>
   array(
     'uri' => '/res/50246fb6/rsrc/js/application/herald/PathTypeahead.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-typeahead',
       2 => 'javelin-dom',
       3 => 'javelin-request',
       4 => 'javelin-typeahead-ondemand-source',
       5 => 'javelin-util',
     ),
     'disk' => '/rsrc/js/application/herald/PathTypeahead.js',
   ),
   'phabricator-action-list-view-css' =>
   array(
-    'uri' => '/res/05a6dbac/rsrc/css/layout/phabricator-action-list-view.css',
+    'uri' => '/res/a5a123d0/rsrc/css/layout/phabricator-action-list-view.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/layout/phabricator-action-list-view.css',
   ),
   'phabricator-app-buttons-css' =>
   array(
     'uri' => '/res/1e153463/rsrc/css/application/directory/phabricator-app-buttons.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/directory/phabricator-app-buttons.css',
   ),
   'phabricator-application-launch-view-css' =>
   array(
     'uri' => '/res/cd9e0fcb/rsrc/css/application/base/phabricator-application-launch-view.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/base/phabricator-application-launch-view.css',
   ),
   'phabricator-busy' =>
   array(
     'uri' => '/res/6ec372e1/rsrc/js/application/core/Busy.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-dom',
     ),
     'disk' => '/rsrc/js/application/core/Busy.js',
   ),
   'phabricator-chatlog-css' =>
   array(
     'uri' => '/res/f6631adc/rsrc/css/application/chatlog/chatlog.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/chatlog/chatlog.css',
   ),
   'phabricator-content-source-view-css' =>
   array(
     'uri' => '/res/8c738a93/rsrc/css/application/contentsource/content-source-view.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/contentsource/content-source-view.css',
   ),
   'phabricator-core-buttons-css' =>
   array(
     'uri' => '/res/f03fd11e/rsrc/css/core/buttons.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/core/buttons.css',
   ),
   'phabricator-core-css' =>
   array(
     'uri' => '/res/a6bafd6e/rsrc/css/core/core.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/core/core.css',
   ),
   'phabricator-countdown-css' =>
   array(
     'uri' => '/res/0f646281/rsrc/css/application/countdown/timer.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/countdown/timer.css',
   ),
   'phabricator-directory-css' =>
   array(
     'uri' => '/res/61afca2b/rsrc/css/application/directory/phabricator-directory.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/directory/phabricator-directory.css',
   ),
   'phabricator-drag-and-drop-file-upload' =>
   array(
     'uri' => '/res/496110e1/rsrc/js/application/core/DragAndDropFileUpload.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-util',
       2 => 'javelin-request',
       3 => 'javelin-dom',
       4 => 'javelin-uri',
       5 => 'phabricator-file-upload',
     ),
     'disk' => '/rsrc/js/application/core/DragAndDropFileUpload.js',
   ),
   'phabricator-dropdown-menu' =>
   array(
     'uri' => '/res/2b4aa4d8/rsrc/js/application/core/DropdownMenu.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-util',
       2 => 'javelin-dom',
       3 => 'javelin-vector',
       4 => 'javelin-stratcom',
       5 => 'phabricator-menu-item',
     ),
     'disk' => '/rsrc/js/application/core/DropdownMenu.js',
   ),
   'phabricator-feed-css' =>
   array(
     'uri' => '/res/8ddc1d44/rsrc/css/application/feed/feed.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/feed/feed.css',
   ),
   'phabricator-file-upload' =>
   array(
     'uri' => '/res/2de10295/rsrc/js/application/core/FileUpload.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-dom',
       2 => 'phabricator-notification',
     ),
     'disk' => '/rsrc/js/application/core/FileUpload.js',
   ),
   'phabricator-filetree-view-css' =>
   array(
     'uri' => '/res/214cbf2b/rsrc/css/layout/phabricator-filetree-view.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/layout/phabricator-filetree-view.css',
   ),
   'phabricator-flag-css' =>
   array(
     'uri' => '/res/2eee890a/rsrc/css/application/flag/flag.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/flag/flag.css',
   ),
   'phabricator-form-view-css' =>
   array(
     'uri' => '/res/7609ca21/rsrc/css/layout/phabricator-form-view.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/layout/phabricator-form-view.css',
   ),
   'phabricator-header-view-css' =>
   array(
     'uri' => '/res/c89cc14d/rsrc/css/layout/phabricator-header-view.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/layout/phabricator-header-view.css',
   ),
   'phabricator-jump-nav' =>
   array(
     'uri' => '/res/8bdc0fc3/rsrc/css/application/directory/phabricator-jump-nav.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/directory/phabricator-jump-nav.css',
   ),
   'phabricator-keyboard-shortcut' =>
   array(
     'uri' => '/res/beed38cd/rsrc/js/application/core/KeyboardShortcut.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-util',
       2 => 'phabricator-keyboard-shortcut-manager',
     ),
     'disk' => '/rsrc/js/application/core/KeyboardShortcut.js',
   ),
   'phabricator-keyboard-shortcut-manager' =>
   array(
     'uri' => '/res/0be80136/rsrc/js/application/core/KeyboardShortcutManager.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-util',
       2 => 'javelin-stratcom',
       3 => 'javelin-dom',
       4 => 'javelin-vector',
     ),
     'disk' => '/rsrc/js/application/core/KeyboardShortcutManager.js',
   ),
   'phabricator-main-menu-view' =>
   array(
     'uri' => '/res/8c3aaa49/rsrc/css/application/base/main-menu-view.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/base/main-menu-view.css',
   ),
   'phabricator-menu-item' =>
   array(
     'uri' => '/res/32fc2325/rsrc/js/application/core/DropdownMenuItem.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-dom',
     ),
     'disk' => '/rsrc/js/application/core/DropdownMenuItem.js',
   ),
   'phabricator-nav-view-css' =>
   array(
     'uri' => '/res/84381dcf/rsrc/css/aphront/phabricator-nav-view.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/aphront/phabricator-nav-view.css',
   ),
   'phabricator-notification' =>
   array(
     'uri' => '/res/ad727561/rsrc/js/application/core/Notification.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-dom',
       2 => 'javelin-stratcom',
       3 => 'javelin-util',
       4 => 'phabricator-notification-css',
     ),
     'disk' => '/rsrc/js/application/core/Notification.js',
   ),
   'phabricator-notification-css' =>
   array(
     'uri' => '/res/91197237/rsrc/css/aphront/notification.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/aphront/notification.css',
   ),
   'phabricator-notification-menu-css' =>
   array(
     'uri' => '/res/fc8a7fb9/rsrc/css/application/base/notification-menu.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/base/notification-menu.css',
   ),
   'phabricator-object-item-list-view-css' =>
   array(
     'uri' => '/res/945fabe9/rsrc/css/layout/phabricator-object-item-list-view.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/layout/phabricator-object-item-list-view.css',
   ),
   'phabricator-object-list-view-css' =>
   array(
     'uri' => '/res/4f183668/rsrc/css/application/projects/phabricator-object-list-view.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/projects/phabricator-object-list-view.css',
   ),
   'phabricator-object-selector-css' =>
   array(
     'uri' => '/res/7eb4c705/rsrc/css/application/objectselector/object-selector.css',
     'type' => 'css',
     'requires' =>
     array(
       0 => 'aphront-dialog-view-css',
     ),
     'disk' => '/rsrc/css/application/objectselector/object-selector.css',
   ),
   'phabricator-paste-file-upload' =>
   array(
     'uri' => '/res/b0b8afd8/rsrc/js/application/core/PasteFileUpload.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-util',
       2 => 'javelin-request',
       3 => 'javelin-dom',
       4 => 'javelin-uri',
     ),
     'disk' => '/rsrc/js/application/core/PasteFileUpload.js',
   ),
   'phabricator-pinboard-view-css' =>
   array(
     'uri' => '/res/3a24d210/rsrc/css/layout/phabricator-pinboard-view.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/layout/phabricator-pinboard-view.css',
   ),
   'phabricator-prefab' =>
   array(
     'uri' => '/res/2734e45f/rsrc/js/application/core/Prefab.js',
     'type' => 'js',
     'requires' =>
     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',
     ),
     'disk' => '/rsrc/js/application/core/Prefab.js',
   ),
   'phabricator-profile-css' =>
   array(
     'uri' => '/res/9869d10b/rsrc/css/application/profile/profile-view.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/profile/profile-view.css',
   ),
   'phabricator-profile-header-css' =>
   array(
     'uri' => '/res/4b1cb23b/rsrc/css/application/profile/profile-header-view.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/profile/profile-header-view.css',
   ),
   'phabricator-project-tag-css' =>
   array(
     'uri' => '/res/6b0a5223/rsrc/css/application/projects/project-tag.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/projects/project-tag.css',
   ),
   'phabricator-property-list-view-css' =>
   array(
     'uri' => '/res/da1e1227/rsrc/css/layout/phabricator-property-list-view.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/layout/phabricator-property-list-view.css',
   ),
   'phabricator-remarkup-css' =>
   array(
     'uri' => '/res/2e0d0042/rsrc/css/core/remarkup.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/core/remarkup.css',
   ),
   'phabricator-search-results-css' =>
   array(
     'uri' => '/res/f8a86e27/rsrc/css/application/search/search-results.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/search/search-results.css',
   ),
   'phabricator-shaped-request' =>
   array(
     'uri' => '/res/fbdb92db/rsrc/js/application/core/ShapedRequest.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-util',
       2 => 'javelin-request',
     ),
     'disk' => '/rsrc/js/application/core/ShapedRequest.js',
   ),
   'phabricator-slowvote-css' =>
   array(
     'uri' => '/res/94d20443/rsrc/css/application/slowvote/slowvote.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/slowvote/slowvote.css',
   ),
   'phabricator-source-code-view-css' =>
   array(
     'uri' => '/res/cf0c566c/rsrc/css/layout/phabricator-source-code-view.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/layout/phabricator-source-code-view.css',
   ),
   'phabricator-standard-page-view' =>
   array(
     'uri' => '/res/92068207/rsrc/css/application/base/standard-page-view.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/base/standard-page-view.css',
   ),
   'phabricator-textareautils' =>
   array(
     'uri' => '/res/703614ea/rsrc/js/application/core/TextAreaUtils.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
     ),
     'disk' => '/rsrc/js/application/core/TextAreaUtils.js',
   ),
   'phabricator-timeline-view-css' =>
   array(
     'uri' => '/res/aa995c54/rsrc/css/layout/phabricator-timeline-view.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/layout/phabricator-timeline-view.css',
   ),
   'phabricator-tooltip' =>
   array(
     'uri' => '/res/bcddf5de/rsrc/js/application/core/ToolTip.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-util',
       2 => 'javelin-dom',
       3 => 'javelin-vector',
     ),
     'disk' => '/rsrc/js/application/core/ToolTip.js',
   ),
   'phabricator-transaction-view-css' =>
   array(
     'uri' => '/res/731959fb/rsrc/css/aphront/transaction.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/aphront/transaction.css',
   ),
   'phabricator-ui-example-css' =>
   array(
     'uri' => '/res/376ab671/rsrc/css/application/uiexample/example.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/uiexample/example.css',
   ),
   'phabricator-uiexample-javelin-view' =>
   array(
     'uri' => '/res/a2ce2cfc/rsrc/js/application/uiexample/JavelinViewExample.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-view',
       2 => 'javelin-util',
       3 => 'javelin-dom',
     ),
     'disk' => '/rsrc/js/application/uiexample/JavelinViewExample.js',
   ),
   'phabricator-uiexample-reactor-button' =>
   array(
     'uri' => '/res/142127f6/rsrc/js/application/uiexample/ReactorButtonExample.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-view',
       2 => 'javelin-util',
       3 => 'javelin-dom',
       4 => 'javelin-reactor-dom',
     ),
     'disk' => '/rsrc/js/application/uiexample/ReactorButtonExample.js',
   ),
   'phabricator-uiexample-reactor-checkbox' =>
   array(
     'uri' => '/res/c75cb9e9/rsrc/js/application/uiexample/ReactorCheckboxExample.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-view',
       2 => 'javelin-util',
       3 => 'javelin-dom',
       4 => 'javelin-reactor-dom',
     ),
     'disk' => '/rsrc/js/application/uiexample/ReactorCheckboxExample.js',
   ),
   'phabricator-uiexample-reactor-focus' =>
   array(
     'uri' => '/res/3cc992eb/rsrc/js/application/uiexample/ReactorFocusExample.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-view',
       2 => 'javelin-util',
       3 => 'javelin-dom',
       4 => 'javelin-reactor-dom',
     ),
     'disk' => '/rsrc/js/application/uiexample/ReactorFocusExample.js',
   ),
   'phabricator-uiexample-reactor-input' =>
   array(
     'uri' => '/res/4953da16/rsrc/js/application/uiexample/ReactorInputExample.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-view',
       2 => 'javelin-util',
       3 => 'javelin-dom',
       4 => 'javelin-reactor-dom',
       5 => 'javelin-view-html',
       6 => 'javelin-view-interpreter',
       7 => 'javelin-view-renderer',
     ),
     'disk' => '/rsrc/js/application/uiexample/ReactorInputExample.js',
   ),
   'phabricator-uiexample-reactor-mouseover' =>
   array(
     'uri' => '/res/52a355b6/rsrc/js/application/uiexample/ReactorMouseoverExample.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-view',
       2 => 'javelin-util',
       3 => 'javelin-dom',
       4 => 'javelin-reactor-dom',
     ),
     'disk' => '/rsrc/js/application/uiexample/ReactorMouseoverExample.js',
   ),
   'phabricator-uiexample-reactor-radio' =>
   array(
     'uri' => '/res/ae87f3af/rsrc/js/application/uiexample/ReactorRadioExample.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-view',
       2 => 'javelin-util',
       3 => 'javelin-dom',
       4 => 'javelin-reactor-dom',
     ),
     'disk' => '/rsrc/js/application/uiexample/ReactorRadioExample.js',
   ),
   'phabricator-uiexample-reactor-select' =>
   array(
     'uri' => '/res/23cb448a/rsrc/js/application/uiexample/ReactorSelectExample.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-view',
       2 => 'javelin-util',
       3 => 'javelin-dom',
       4 => 'javelin-reactor-dom',
     ),
     'disk' => '/rsrc/js/application/uiexample/ReactorSelectExample.js',
   ),
   'phabricator-uiexample-reactor-sendclass' =>
   array(
     'uri' => '/res/8cd34264/rsrc/js/application/uiexample/ReactorSendClassExample.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-view',
       2 => 'javelin-util',
       3 => 'javelin-dom',
       4 => 'javelin-reactor-dom',
     ),
     'disk' => '/rsrc/js/application/uiexample/ReactorSendClassExample.js',
   ),
   'phabricator-uiexample-reactor-sendproperties' =>
   array(
     'uri' => '/res/18af54aa/rsrc/js/application/uiexample/ReactorSendPropertiesExample.js',
     'type' => 'js',
     'requires' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-view',
       2 => 'javelin-util',
       3 => 'javelin-dom',
       4 => 'javelin-reactor-dom',
     ),
     'disk' => '/rsrc/js/application/uiexample/ReactorSendPropertiesExample.js',
   ),
   'phame-css' =>
   array(
     'uri' => '/res/2e4c86eb/rsrc/css/application/phame/phame.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/phame/phame.css',
   ),
   'phriction-document-css' =>
   array(
     'uri' => '/res/8d09bd7f/rsrc/css/application/phriction/phriction-document-css.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/phriction/phriction-document-css.css',
   ),
   'ponder-comment-table-css' =>
   array(
     'uri' => '/res/a1bb9056/rsrc/css/application/ponder/comments.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/ponder/comments.css',
   ),
   'ponder-core-view-css' =>
   array(
     'uri' => '/res/3a2d5e18/rsrc/css/application/ponder/core.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/ponder/core.css',
   ),
   'ponder-feed-view-css' =>
   array(
     'uri' => '/res/df22bd20/rsrc/css/application/ponder/feed.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/ponder/feed.css',
   ),
   'ponder-post-css' =>
   array(
     'uri' => '/res/013b9e2c/rsrc/css/application/ponder/post.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/ponder/post.css',
   ),
   'ponder-vote-css' =>
   array(
     'uri' => '/res/ea8316c2/rsrc/css/application/ponder/vote.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/ponder/vote.css',
   ),
   'raphael-core' =>
   array(
     'uri' => '/res/3f48575a/rsrc/js/raphael/raphael.js',
     'type' => 'js',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/js/raphael/raphael.js',
   ),
   'raphael-g' =>
   array(
     'uri' => '/res/b07e5245/rsrc/js/raphael/g.raphael.js',
     'type' => 'js',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/js/raphael/g.raphael.js',
   ),
   'raphael-g-line' =>
   array(
     'uri' => '/res/a59c8556/rsrc/js/raphael/g.raphael.line.js',
     'type' => 'js',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/js/raphael/g.raphael.line.js',
   ),
+  'sprite-icon-css' =>
+  array(
+    'uri' => '/res/ca19186e/rsrc/css/sprite-icon.css',
+    'type' => 'css',
+    'requires' =>
+    array(
+    ),
+    'disk' => '/rsrc/css/sprite-icon.css',
+  ),
   'stripe-core' =>
   array(
     'uri' => '/res/3b0f0ad4/rsrc/js/stripe/stripe_core.js',
     'type' => 'js',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/js/stripe/stripe_core.js',
   ),
   'stripe-payment-form-css' =>
   array(
     'uri' => '/res/634a6371/rsrc/css/application/phortune/stripe-payment-form.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/application/phortune/stripe-payment-form.css',
   ),
   'syntax-highlighting-css' =>
   array(
     'uri' => '/res/cb3b9dc0/rsrc/css/core/syntax.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
     'disk' => '/rsrc/css/core/syntax.css',
   ),
 ), array(
   'packages' =>
   array(
-    '8f8908d2' =>
+    '5c5dd816' =>
     array(
       'name' => 'core.pkg.css',
       'symbols' =>
       array(
         0 => 'phabricator-core-css',
         1 => 'phabricator-core-buttons-css',
         2 => 'phabricator-standard-page-view',
         3 => 'aphront-dialog-view-css',
         4 => 'aphront-form-view-css',
         5 => 'aphront-panel-view-css',
         6 => 'aphront-side-nav-view-css',
         7 => 'aphront-table-view-css',
         8 => 'aphront-crumbs-view-css',
         9 => 'aphront-tokenizer-control-css',
         10 => 'aphront-typeahead-control-css',
         11 => 'aphront-list-filter-view-css',
         12 => 'phabricator-directory-css',
         13 => 'phabricator-jump-nav',
         14 => 'phabricator-app-buttons-css',
         15 => 'phabricator-remarkup-css',
         16 => 'syntax-highlighting-css',
         17 => 'aphront-pager-view-css',
         18 => 'phabricator-transaction-view-css',
         19 => 'aphront-tooltip-css',
         20 => 'aphront-headsup-view-css',
         21 => 'phabricator-flag-css',
         22 => 'aphront-error-view-css',
         23 => 'autosprite-css',
-        24 => 'phabricator-main-menu-view',
-        25 => 'phabricator-notification-css',
-        26 => 'phabricator-notification-menu-css',
-        27 => 'lightbox-attachment-css',
-        28 => 'phabricator-header-view-css',
-        29 => 'phabricator-form-view-css',
-        30 => 'phabricator-filetree-view-css',
-        31 => 'phabricator-nav-view-css',
+        24 => 'sprite-icon-css',
+        25 => 'phabricator-main-menu-view',
+        26 => 'phabricator-notification-css',
+        27 => 'phabricator-notification-menu-css',
+        28 => 'lightbox-attachment-css',
+        29 => 'phabricator-header-view-css',
+        30 => 'phabricator-form-view-css',
+        31 => 'phabricator-filetree-view-css',
+        32 => 'phabricator-nav-view-css',
       ),
-      'uri' => '/res/pkg/8f8908d2/core.pkg.css',
+      'uri' => '/res/pkg/5c5dd816/core.pkg.css',
       'type' => 'css',
     ),
     'd223b82c' =>
     array(
       'name' => 'core.pkg.js',
       'symbols' =>
       array(
         0 => 'javelin-behavior-aphront-basic-tokenizer',
         1 => 'javelin-behavior-workflow',
         2 => 'javelin-behavior-aphront-form-disable-on-submit',
         3 => 'phabricator-keyboard-shortcut-manager',
         4 => 'phabricator-keyboard-shortcut',
         5 => 'javelin-behavior-phabricator-keyboard-shortcuts',
         6 => 'javelin-behavior-refresh-csrf',
         7 => 'javelin-behavior-phabricator-watch-anchor',
         8 => 'javelin-behavior-phabricator-autofocus',
         9 => 'phabricator-paste-file-upload',
         10 => 'phabricator-menu-item',
         11 => 'phabricator-dropdown-menu',
         12 => 'javelin-behavior-phabricator-oncopy',
         13 => 'phabricator-tooltip',
         14 => 'javelin-behavior-phabricator-tooltips',
         15 => 'phabricator-prefab',
         16 => 'javelin-behavior-device',
         17 => 'javelin-behavior-toggle-class',
         18 => 'javelin-behavior-lightbox-attachments',
         19 => 'phabricator-busy',
         20 => 'javelin-aphlict',
         21 => 'phabricator-notification',
         22 => 'javelin-behavior-aphlict-listen',
         23 => 'javelin-behavior-phabricator-search-typeahead',
         24 => 'javelin-behavior-konami',
         25 => 'javelin-behavior-aphlict-dropdown',
         26 => 'javelin-behavior-phabricator-active-nav',
         27 => 'javelin-behavior-phabricator-nav',
         28 => 'javelin-behavior-phabricator-remarkup-assist',
         29 => 'phabricator-textareautils',
         30 => 'phabricator-file-upload',
       ),
       'uri' => '/res/pkg/d223b82c/core.pkg.js',
       'type' => 'js',
     ),
     '3c5efda9' =>
     array(
       'name' => 'darkconsole.pkg.js',
       'symbols' =>
       array(
         0 => 'javelin-behavior-dark-console-ajax',
         1 => 'javelin-behavior-dark-console',
         2 => 'javelin-behavior-error-log',
       ),
       'uri' => '/res/pkg/3c5efda9/darkconsole.pkg.js',
       'type' => 'js',
     ),
     47549184 =>
     array(
       'name' => 'differential.pkg.css',
       'symbols' =>
       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 => 'differential-revision-comment-list-css',
         9 => 'phabricator-object-selector-css',
         10 => 'aphront-headsup-action-list-view-css',
         11 => 'phabricator-content-source-view-css',
         12 => 'differential-local-commits-view-css',
         13 => 'inline-comment-summary-css',
       ),
       'uri' => '/res/pkg/47549184/differential.pkg.css',
       'type' => 'css',
     ),
     '7ecd31fa' =>
     array(
       'name' => 'differential.pkg.js',
       'symbols' =>
       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-accept-with-errors',
         8 => 'javelin-behavior-differential-comment-jump',
         9 => 'javelin-behavior-differential-add-reviewers-and-ccs',
         10 => 'javelin-behavior-differential-keyboard-navigation',
         11 => 'javelin-behavior-aphront-drag-and-drop',
         12 => 'javelin-behavior-aphront-drag-and-drop-textarea',
         13 => 'javelin-behavior-phabricator-object-selector',
         14 => 'javelin-behavior-repository-crossreference',
         15 => 'differential-inline-comment-editor',
         16 => 'javelin-behavior-differential-dropdown-menus',
         17 => 'javelin-behavior-differential-toggle-files',
         18 => 'javelin-behavior-differential-user-select',
       ),
       'uri' => '/res/pkg/7ecd31fa/differential.pkg.js',
       'type' => 'js',
     ),
     'c8ce2d88' =>
     array(
       'name' => 'diffusion.pkg.css',
       'symbols' =>
       array(
         0 => 'diffusion-commit-view-css',
         1 => 'diffusion-icons-css',
       ),
       'uri' => '/res/pkg/c8ce2d88/diffusion.pkg.css',
       'type' => 'css',
     ),
     '5e68be89' =>
     array(
       'name' => 'diffusion.pkg.js',
       'symbols' =>
       array(
         0 => 'javelin-behavior-diffusion-pull-lastmodified',
         1 => 'javelin-behavior-diffusion-commit-graph',
         2 => 'javelin-behavior-audit-preview',
       ),
       'uri' => '/res/pkg/5e68be89/diffusion.pkg.js',
       'type' => 'js',
     ),
     20727878 =>
     array(
       'name' => 'javelin.pkg.js',
       'symbols' =>
       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-fx',
         20 => 'javelin-color',
       ),
       'uri' => '/res/pkg/20727878/javelin.pkg.js',
       'type' => 'js',
     ),
     '7839ae2d' =>
     array(
       'name' => 'maniphest.pkg.css',
       'symbols' =>
       array(
         0 => 'maniphest-task-summary-css',
         1 => 'maniphest-transaction-detail-css',
         2 => 'aphront-attached-file-view-css',
         3 => 'phabricator-project-tag-css',
       ),
       'uri' => '/res/pkg/7839ae2d/maniphest.pkg.css',
       'type' => 'css',
     ),
     '7707de41' =>
     array(
       'name' => 'maniphest.pkg.js',
       'symbols' =>
       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',
       ),
       'uri' => '/res/pkg/7707de41/maniphest.pkg.js',
       'type' => 'js',
     ),
   ),
   'reverse' =>
   array(
     'aphront-attached-file-view-css' => '7839ae2d',
-    'aphront-crumbs-view-css' => '8f8908d2',
-    'aphront-dialog-view-css' => '8f8908d2',
-    'aphront-error-view-css' => '8f8908d2',
-    'aphront-form-view-css' => '8f8908d2',
+    'aphront-crumbs-view-css' => '5c5dd816',
+    'aphront-dialog-view-css' => '5c5dd816',
+    'aphront-error-view-css' => '5c5dd816',
+    'aphront-form-view-css' => '5c5dd816',
     'aphront-headsup-action-list-view-css' => '47549184',
-    'aphront-headsup-view-css' => '8f8908d2',
-    'aphront-list-filter-view-css' => '8f8908d2',
-    'aphront-pager-view-css' => '8f8908d2',
-    'aphront-panel-view-css' => '8f8908d2',
-    'aphront-side-nav-view-css' => '8f8908d2',
-    'aphront-table-view-css' => '8f8908d2',
-    'aphront-tokenizer-control-css' => '8f8908d2',
-    'aphront-tooltip-css' => '8f8908d2',
-    'aphront-typeahead-control-css' => '8f8908d2',
-    'autosprite-css' => '8f8908d2',
+    'aphront-headsup-view-css' => '5c5dd816',
+    'aphront-list-filter-view-css' => '5c5dd816',
+    'aphront-pager-view-css' => '5c5dd816',
+    'aphront-panel-view-css' => '5c5dd816',
+    'aphront-side-nav-view-css' => '5c5dd816',
+    'aphront-table-view-css' => '5c5dd816',
+    'aphront-tokenizer-control-css' => '5c5dd816',
+    'aphront-tooltip-css' => '5c5dd816',
+    'aphront-typeahead-control-css' => '5c5dd816',
+    'autosprite-css' => '5c5dd816',
     'differential-changeset-view-css' => '47549184',
     'differential-core-view-css' => '47549184',
     'differential-inline-comment-editor' => '7ecd31fa',
     'differential-local-commits-view-css' => '47549184',
     'differential-results-table-css' => '47549184',
     'differential-revision-add-comment-css' => '47549184',
     'differential-revision-comment-css' => '47549184',
     'differential-revision-comment-list-css' => '47549184',
     'differential-revision-history-css' => '47549184',
     'differential-revision-list-css' => '47549184',
     'differential-table-of-contents-css' => '47549184',
     'diffusion-commit-view-css' => 'c8ce2d88',
     'diffusion-icons-css' => 'c8ce2d88',
     'inline-comment-summary-css' => '47549184',
     'javelin-aphlict' => 'd223b82c',
     'javelin-behavior' => '20727878',
     'javelin-behavior-aphlict-dropdown' => 'd223b82c',
     'javelin-behavior-aphlict-listen' => 'd223b82c',
     'javelin-behavior-aphront-basic-tokenizer' => 'd223b82c',
     'javelin-behavior-aphront-drag-and-drop' => '7ecd31fa',
     'javelin-behavior-aphront-drag-and-drop-textarea' => '7ecd31fa',
     'javelin-behavior-aphront-form-disable-on-submit' => 'd223b82c',
     'javelin-behavior-audit-preview' => '5e68be89',
     'javelin-behavior-dark-console' => '3c5efda9',
     'javelin-behavior-dark-console-ajax' => '3c5efda9',
     'javelin-behavior-device' => 'd223b82c',
     'javelin-behavior-differential-accept-with-errors' => '7ecd31fa',
     'javelin-behavior-differential-add-reviewers-and-ccs' => '7ecd31fa',
     'javelin-behavior-differential-comment-jump' => '7ecd31fa',
     'javelin-behavior-differential-diff-radios' => '7ecd31fa',
     'javelin-behavior-differential-dropdown-menus' => '7ecd31fa',
     'javelin-behavior-differential-edit-inline-comments' => '7ecd31fa',
     'javelin-behavior-differential-feedback-preview' => '7ecd31fa',
     'javelin-behavior-differential-keyboard-navigation' => '7ecd31fa',
     'javelin-behavior-differential-populate' => '7ecd31fa',
     'javelin-behavior-differential-show-more' => '7ecd31fa',
     'javelin-behavior-differential-toggle-files' => '7ecd31fa',
     'javelin-behavior-differential-user-select' => '7ecd31fa',
     'javelin-behavior-diffusion-commit-graph' => '5e68be89',
     'javelin-behavior-diffusion-pull-lastmodified' => '5e68be89',
     'javelin-behavior-error-log' => '3c5efda9',
     'javelin-behavior-konami' => 'd223b82c',
     'javelin-behavior-lightbox-attachments' => 'd223b82c',
     'javelin-behavior-maniphest-batch-selector' => '7707de41',
     'javelin-behavior-maniphest-subpriority-editor' => '7707de41',
     'javelin-behavior-maniphest-transaction-controls' => '7707de41',
     'javelin-behavior-maniphest-transaction-expand' => '7707de41',
     'javelin-behavior-maniphest-transaction-preview' => '7707de41',
     'javelin-behavior-phabricator-active-nav' => 'd223b82c',
     'javelin-behavior-phabricator-autofocus' => 'd223b82c',
     'javelin-behavior-phabricator-keyboard-shortcuts' => 'd223b82c',
     'javelin-behavior-phabricator-nav' => 'd223b82c',
     'javelin-behavior-phabricator-object-selector' => '7ecd31fa',
     'javelin-behavior-phabricator-oncopy' => 'd223b82c',
     'javelin-behavior-phabricator-remarkup-assist' => 'd223b82c',
     'javelin-behavior-phabricator-search-typeahead' => 'd223b82c',
     'javelin-behavior-phabricator-tooltips' => 'd223b82c',
     'javelin-behavior-phabricator-watch-anchor' => 'd223b82c',
     'javelin-behavior-refresh-csrf' => 'd223b82c',
     'javelin-behavior-repository-crossreference' => '7ecd31fa',
     'javelin-behavior-toggle-class' => 'd223b82c',
     'javelin-behavior-workflow' => 'd223b82c',
     'javelin-color' => '20727878',
     'javelin-dom' => '20727878',
     'javelin-event' => '20727878',
     'javelin-fx' => '20727878',
     'javelin-install' => '20727878',
     'javelin-json' => '20727878',
     'javelin-mask' => '20727878',
     'javelin-request' => '20727878',
     'javelin-resource' => '20727878',
     'javelin-stratcom' => '20727878',
     'javelin-tokenizer' => '20727878',
     'javelin-typeahead' => '20727878',
     'javelin-typeahead-normalizer' => '20727878',
     'javelin-typeahead-ondemand-source' => '20727878',
     'javelin-typeahead-preloaded-source' => '20727878',
     'javelin-typeahead-source' => '20727878',
     'javelin-uri' => '20727878',
     'javelin-util' => '20727878',
     'javelin-vector' => '20727878',
     'javelin-workflow' => '20727878',
-    'lightbox-attachment-css' => '8f8908d2',
+    'lightbox-attachment-css' => '5c5dd816',
     'maniphest-task-summary-css' => '7839ae2d',
     'maniphest-transaction-detail-css' => '7839ae2d',
-    'phabricator-app-buttons-css' => '8f8908d2',
+    'phabricator-app-buttons-css' => '5c5dd816',
     'phabricator-busy' => 'd223b82c',
     'phabricator-content-source-view-css' => '47549184',
-    'phabricator-core-buttons-css' => '8f8908d2',
-    'phabricator-core-css' => '8f8908d2',
-    'phabricator-directory-css' => '8f8908d2',
+    'phabricator-core-buttons-css' => '5c5dd816',
+    'phabricator-core-css' => '5c5dd816',
+    'phabricator-directory-css' => '5c5dd816',
     'phabricator-drag-and-drop-file-upload' => '7ecd31fa',
     'phabricator-dropdown-menu' => 'd223b82c',
     'phabricator-file-upload' => 'd223b82c',
-    'phabricator-filetree-view-css' => '8f8908d2',
-    'phabricator-flag-css' => '8f8908d2',
-    'phabricator-form-view-css' => '8f8908d2',
-    'phabricator-header-view-css' => '8f8908d2',
-    'phabricator-jump-nav' => '8f8908d2',
+    'phabricator-filetree-view-css' => '5c5dd816',
+    'phabricator-flag-css' => '5c5dd816',
+    'phabricator-form-view-css' => '5c5dd816',
+    'phabricator-header-view-css' => '5c5dd816',
+    'phabricator-jump-nav' => '5c5dd816',
     'phabricator-keyboard-shortcut' => 'd223b82c',
     'phabricator-keyboard-shortcut-manager' => 'd223b82c',
-    'phabricator-main-menu-view' => '8f8908d2',
+    'phabricator-main-menu-view' => '5c5dd816',
     'phabricator-menu-item' => 'd223b82c',
-    'phabricator-nav-view-css' => '8f8908d2',
+    'phabricator-nav-view-css' => '5c5dd816',
     'phabricator-notification' => 'd223b82c',
-    'phabricator-notification-css' => '8f8908d2',
-    'phabricator-notification-menu-css' => '8f8908d2',
+    'phabricator-notification-css' => '5c5dd816',
+    'phabricator-notification-menu-css' => '5c5dd816',
     'phabricator-object-selector-css' => '47549184',
     'phabricator-paste-file-upload' => 'd223b82c',
     'phabricator-prefab' => 'd223b82c',
     'phabricator-project-tag-css' => '7839ae2d',
-    'phabricator-remarkup-css' => '8f8908d2',
+    'phabricator-remarkup-css' => '5c5dd816',
     'phabricator-shaped-request' => '7ecd31fa',
-    'phabricator-standard-page-view' => '8f8908d2',
+    'phabricator-standard-page-view' => '5c5dd816',
     'phabricator-textareautils' => 'd223b82c',
     'phabricator-tooltip' => 'd223b82c',
-    'phabricator-transaction-view-css' => '8f8908d2',
-    'syntax-highlighting-css' => '8f8908d2',
+    'phabricator-transaction-view-css' => '5c5dd816',
+    'sprite-icon-css' => '5c5dd816',
+    'syntax-highlighting-css' => '5c5dd816',
   ),
 ));
diff --git a/src/applications/uiexample/examples/PhabricatorActionListExample.php b/src/applications/uiexample/examples/PhabricatorActionListExample.php
index 2922d95ce..44f6e0179 100644
--- a/src/applications/uiexample/examples/PhabricatorActionListExample.php
+++ b/src/applications/uiexample/examples/PhabricatorActionListExample.php
@@ -1,111 +1,110 @@
 <?php
 
 final class PhabricatorActionListExample extends PhabricatorUIExample {
 
   public function getName() {
     return 'Action List';
   }
 
   public function getDescription() {
     return 'Use <tt>PhabricatorActionListView</tt> to render object actions.';
   }
 
   public function renderExample() {
     $request = $this->getRequest();
     $user = $request->getUser();
 
     $notices = array();
     if ($request->isFormPost()) {
       $notices[] = 'You just submitted a valid form POST.';
     }
 
     if ($request->isJavelinWorkflow()) {
       $notices[] = 'You just submitted a Workflow request.';
     }
 
     if ($notices) {
       $notices = id(new AphrontErrorView())
         ->setSeverity(AphrontErrorView::SEVERITY_NOTICE)
         ->setErrors($notices);
     } else {
       $notices = null;
     }
 
     if ($request->isJavelinWorkflow()) {
       $dialog = new AphrontDialogView();
       $dialog->setUser($user);
       $dialog->setTitle('Request Information');
       $dialog->appendChild($notices);
       $dialog->addCancelButton($request->getRequestURI(), 'Close');
       return id(new AphrontDialogResponse())->setDialog($dialog);
     }
 
     $view = new PhabricatorActionListView();
     $view->setUser($user);
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setUser($user)
         ->setHref($request->getRequestURI())
         ->setName('Normal Action')
         ->setIcon('file'));
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setUser($user)
         ->setHref($request->getRequestURI())
         ->setDisabled(true)
         ->setName('Disabled Action')
         ->setIcon('file'));
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setUser($user)
         ->setHref($request->getRequestURI())
         ->setRenderAsForm(true)
         ->setName('Form Action')
         ->setIcon('file'));
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setUser($user)
         ->setHref($request->getRequestURI())
         ->setRenderAsForm(true)
         ->setDisabled(true)
         ->setName('Disabled Form Action')
         ->setIcon('file'));
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setUser($user)
         ->setHref($request->getRequestURI())
         ->setWorkflow(true)
         ->setName('Workflow Action')
         ->setIcon('file'));
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setUser($user)
         ->setHref($request->getRequestURI())
         ->setRenderAsForm(true)
         ->setWorkflow(true)
         ->setName('Form + Workflow Action')
         ->setIcon('file'));
 
     foreach (PhabricatorActionView::getAvailableIcons() as $icon) {
       $view->addAction(
         id(new PhabricatorActionView())
           ->setUser($user)
           ->setHref('#')
-          ->setDisabled(true)
           ->setName('Icon "'.$icon.'"')
           ->setIcon($icon));
     }
 
     return array(
       $view,
       '<div style="clear: both;"></div>',
       $notices,
     );
   }
 }
diff --git a/src/infrastructure/celerity/CeleritySpriteGenerator.php b/src/infrastructure/celerity/CeleritySpriteGenerator.php
new file mode 100644
index 000000000..febd36f65
--- /dev/null
+++ b/src/infrastructure/celerity/CeleritySpriteGenerator.php
@@ -0,0 +1,132 @@
+<?php
+
+final class CeleritySpriteGenerator {
+
+  public function buildIconSheet() {
+    $icons = $this->getDirectoryList('icons_1x');
+
+    $colors = array(
+      '',
+      'grey',
+      'white',
+    );
+
+    $scales = array(
+      '1x'  => 1,
+      '2x'  => 2,
+    );
+
+    $template = id(new PhutilSprite())
+      ->setSourceSize(14, 14);
+
+    $sprites = array();
+    foreach ($colors as $color) {
+      foreach ($icons as $icon) {
+        $prefix = 'icons_';
+        if (strlen($color)) {
+          $prefix .= $color.'_';
+        }
+
+        $suffix = '';
+        if (strlen($color)) {
+          $suffix = '-'.$color;
+        }
+
+        $sprite = id(clone $template)
+          ->setName('action-'.$icon.$suffix);
+
+        if ($color == 'white') {
+          $sprite->setTargetCSS(
+            '.device-desktop .phabricator-action-view:hover .action-'.$icon);
+        } else {
+          $sprite->setTargetCSS('.action-'.$icon.$suffix);
+        }
+
+        foreach ($scales as $scale_key => $scale) {
+          $path = $this->getPath($prefix.$scale_key.'/'.$icon.'.png');
+          $sprite->setSourceFile($path, $scale);
+        }
+        $sprites[] = $sprite;
+      }
+    }
+
+    $remarkup_icons = $this->getDirectoryList('remarkup_1x');
+    foreach ($remarkup_icons as $icon) {
+      $prefix = 'remarkup_';
+
+      // Strip 'text_' from these file names.
+      $class_name = substr($icon, 5);
+
+      $sprite = id(clone $template)
+        ->setName('remarkup-assist-'.$icon)
+        ->setTargetCSS('.remarkup-assist-'.$class_name);
+      foreach ($scales as $scale_key => $scale) {
+        $path = $this->getPath($prefix.$scale_key.'/'.$icon.'.png');
+        $sprite->setSourceFile($path, $scale);
+      }
+      $sprites[] = $sprite;
+    }
+
+    $sheet = $this->buildSheet('icon');
+    $sheet->setScales($scales);
+    foreach ($sprites as $sprite) {
+      $sheet->addSprite($sprite);
+    }
+
+    return $sheet;
+  }
+
+  private function getPath($to_path = null) {
+    $root = dirname(phutil_get_library_root('phabricator'));
+    return $root.'/resources/sprite/'.$to_path;
+  }
+
+  private function getDirectoryList($dir) {
+    $path = $this->getPath($dir);
+
+    $result = array();
+
+    $images = Filesystem::listDirectory($path, $include_hidden = false);
+    foreach ($images as $image) {
+      if (!preg_match('/\.png$/', $image)) {
+        throw new Exception(
+          "Expected file '{$image}' in '{$path}' to be a sprite source ".
+          "ending in '.png'.");
+      }
+      $result[] = substr($image, 0, -4);
+    }
+
+    return $result;
+  }
+
+  private function buildSheet($name) {
+    $sheet = new PhutilSpriteSheet();
+
+    $at = '@';
+    $sheet->setCSSHeader(<<<EOCSS
+/**
+ * @provides sprite-{$name}-css
+ * {$at}generated
+ */
+
+.sprite-{$name} {
+  background-image: url(/rsrc/image/sprite-{$name}.png);
+  background-repeat: no-repeat;
+}
+
+@media
+only screen and (min-device-pixel-ratio: 1.5),
+only screen and (-webkit-min-device-pixel-ratio: 1.5) {
+  .sprite-{$name} {
+    background-image: url(/rsrc/image/sprite-{$name}-X2.png);
+    background-size: {X}px {Y}px;
+  }
+}
+EOCSS
+);
+
+    return $sheet;
+  }
+}
+
+
diff --git a/src/view/form/control/PhabricatorRemarkupControl.php b/src/view/form/control/PhabricatorRemarkupControl.php
index e6e08b5de..55473450a 100644
--- a/src/view/form/control/PhabricatorRemarkupControl.php
+++ b/src/view/form/control/PhabricatorRemarkupControl.php
@@ -1,131 +1,133 @@
 <?php
 
 final class PhabricatorRemarkupControl extends AphrontFormTextAreaControl {
 
   protected function renderInput() {
     $id = $this->getID();
     if (!$id) {
       $id = celerity_generate_unique_node_id();
       $this->setID($id);
     }
 
     // We need to have this if previews render images, since Ajax can not
     // currently ship JS or CSS.
     require_celerity_resource('lightbox-attachment-css');
 
     Javelin::initBehavior(
       'aphront-drag-and-drop-textarea',
       array(
         'target'          => $id,
         'activatedClass'  => 'aphront-textarea-drag-and-drop',
         'uri'             => '/file/dropupload/',
       ));
 
     Javelin::initBehavior('phabricator-remarkup-assist', array());
     Javelin::initBehavior('phabricator-tooltips', array());
 
     $actions = array(
       'b'     => array(
         'tip' => pht('Bold'),
       ),
       'i'     => array(
         'tip' => pht('Italics'),
       ),
       'tt'    => array(
         'tip' => pht('Monospaced'),
       ),
       array(
         'spacer' => true,
       ),
       'ul' => array(
         'tip' => pht('Bulleted List'),
       ),
       'ol' => array(
         'tip' => pht('Numbered List'),
       ),
       'code' => array(
         'tip' => pht('Code Block'),
       ),
       'table' => array(
         'tip' => pht('Table'),
       ),
       'help'  => array(
         'tip' => pht('Help'),
         'align' => 'right',
         'href'  => PhabricatorEnv::getDoclink(
           'article/Remarkup_Reference.html'),
       ),
     );
 
     $buttons = array();
     foreach ($actions as $action => $spec) {
       if (idx($spec, 'spacer')) {
         $buttons[] = phutil_render_tag(
           'span',
           array(
             'class' => 'remarkup-assist-separator',
           ),
           '');
         continue;
       }
 
       $classes = array();
       $classes[] = 'remarkup-assist-button';
       if (idx($spec, 'align') == 'right') {
         $classes[] = 'remarkup-assist-right';
       }
 
       $href = idx($spec, 'href', '#');
       if ($href == '#') {
         $meta = array('action' => $action);
         $mustcapture = true;
         $target = null;
       } else {
         $meta = array();
         $mustcapture = null;
         $target = '_blank';
       }
 
       $tip = idx($spec, 'tip');
       if ($tip) {
         $meta['tip'] = $tip;
       }
 
+      require_celerity_resource('sprite-icon-css');
+
       $buttons[] = javelin_render_tag(
         'a',
         array(
           'class'       => implode(' ', $classes),
           'href'        => $href,
           'sigil'       => 'remarkup-assist has-tooltip',
           'meta'        => $meta,
           'mustcapture' => $mustcapture,
           'target'      => $target,
           'tabindex'    => -1,
         ),
         phutil_render_tag(
           'div',
           array(
-            'class' => 'remarkup-assist autosprite remarkup-assist-'.$action,
+            'class' => 'remarkup-assist sprite-icon remarkup-assist-'.$action,
           ),
           ''));
     }
 
     $buttons = phutil_render_tag(
       'div',
       array(
         'class' => 'remarkup-assist-bar',
       ),
       implode('', $buttons));
 
     $this->setCustomClass('remarkup-assist-textarea');
 
     return javelin_render_tag(
       'div',
       array(
         'sigil' => 'remarkup-assist-control',
       ),
       $buttons.
       parent::renderInput());
   }
 
 }
diff --git a/src/view/layout/PhabricatorActionView.php b/src/view/layout/PhabricatorActionView.php
index 0bdae1815..10f3a4911 100644
--- a/src/view/layout/PhabricatorActionView.php
+++ b/src/view/layout/PhabricatorActionView.php
@@ -1,145 +1,143 @@
 <?php
 
 final class PhabricatorActionView extends AphrontView {
 
   private $name;
   private $user;
   private $icon;
   private $href;
   private $disabled;
   private $workflow;
   private $renderAsForm;
 
   public function setHref($href) {
     $this->href = $href;
     return $this;
   }
 
   public function setIcon($icon) {
     $this->icon = $icon;
     return $this;
   }
 
   public function setName($name) {
     $this->name = $name;
     return $this;
   }
 
   public function setDisabled($disabled) {
     $this->disabled = $disabled;
     return $this;
   }
 
   public function setWorkflow($workflow) {
     $this->workflow = $workflow;
     return $this;
   }
 
   public function setRenderAsForm($form) {
     $this->renderAsForm = $form;
     return $this;
   }
 
   public function setUser(PhabricatorUser $user) {
     $this->user = $user;
     return $this;
   }
 
   public function render() {
 
     $icon = null;
     if ($this->icon) {
+
+      $suffix = '';
+      if ($this->disabled) {
+        $suffix = '-grey';
+      }
+
+      require_celerity_resource('sprite-icon-css');
       $icon = phutil_render_tag(
         'span',
         array(
-          'class' => 'phabricator-action-view-icon autosprite '.
-                       'action-'.$this->icon,
+          'class' => 'phabricator-action-view-icon sprite-icon '.
+                       'action-'.$this->icon.$suffix,
         ),
         '');
     }
 
     if ($this->href) {
       if ($this->renderAsForm) {
         if (!$this->user) {
           throw new Exception(
             'Call setUser() when rendering an action as a form.');
         }
 
         $item = javelin_render_tag(
           'button',
           array(
             'class' => 'phabricator-action-view-item',
           ),
           phutil_escape_html($this->name));
 
         $item = phabricator_render_form(
           $this->user,
           array(
             'action'    => $this->href,
             'method'    => 'POST',
             'sigil'     => $this->workflow ? 'workflow' : null,
           ),
           $item);
       } else {
         $item = javelin_render_tag(
           'a',
           array(
             'href'  => $this->href,
             'class' => 'phabricator-action-view-item',
             'sigil' => $this->workflow ? 'workflow' : null,
           ),
           phutil_escape_html($this->name));
       }
     } else {
       $item = phutil_render_tag(
         'span',
         array(
           'class' => 'phabricator-action-view-item',
         ),
         phutil_escape_html($this->name));
     }
 
     $classes = array();
     $classes[] = 'phabricator-action-view';
     if ($this->disabled) {
       $classes[] = 'phabricator-action-view-disabled';
     }
 
     return phutil_render_tag(
       'li',
       array(
         'class' => implode(' ', $classes),
       ),
       $icon.$item);
   }
 
   public static function getAvailableIcons() {
-    return array(
-      'delete',
-      'download',
-      'edit',
-      'file',
-      'flag-0',
-      'flag-1',
-      'flag-2',
-      'flag-3',
-      'flag-4',
-      'flag-5',
-      'flag-6',
-      'flag-7',
-      'flag-ghost',
-      'fork',
-      'move',
-      'new',
-      'preview',
-      'subscribe-add',
-      'subscribe-auto',
-      'subscribe-delete',
-      'undo',
-      'unlock',
-      'unpublish',
-      'world',
-    );
+    $root = dirname(phutil_get_library_root('phabricator'));
+    $path = $root.'/resources/sprite/manifest/icon.json';
+    $data = Filesystem::readFile($path);
+    $manifest = json_decode($data, true);
+
+    $results = array();
+    $prefix = 'action-';
+    foreach ($manifest['sprites'] as $sprite) {
+      if (preg_match('/-(white|grey)$/', $sprite)) {
+        continue;
+      }
+      if (!strncmp($sprite, $prefix, strlen($prefix))) {
+        $results[] = substr($sprite, strlen($prefix));
+      }
+    }
+
+    return $results;
   }
 
 }
diff --git a/webroot/rsrc/css/layout/phabricator-action-list-view.css b/webroot/rsrc/css/layout/phabricator-action-list-view.css
index a89e71945..8a2d0e55f 100644
--- a/webroot/rsrc/css/layout/phabricator-action-list-view.css
+++ b/webroot/rsrc/css/layout/phabricator-action-list-view.css
@@ -1,81 +1,89 @@
 /**
  * @provides phabricator-action-list-view-css
  */
 
 .phabricator-action-list-view {
   background: #ffffff;
 }
 
 .device-desktop .phabricator-action-list-view {
   border: 1px solid #dcdcdc;
   padding: .5em 0;
 
   float: right;
   margin-top: 0px;
   margin-right: 1%;
   width: 20%;
   border-radius: 2px;
   font-size: 12px;
 
   box-shadow: 0px 1px 4px rgba(0, 0, 0, 0.10);
 }
 
 .device-tablet .phabricator-action-list-view,
 .device-phone .phabricator-action-list-view {
   background: #f3f3f3;
   border-top: 1px solid #dcdcdc;
   padding: .5em 0;
 }
 
 .phabricator-action-view {
-  padding: 2px 0;
+  padding: 1px 0;
   position: relative;
 }
 
 .phabricator-action-view button.phabricator-action-view-item {
   border: none;
   background: transparent;
   box-shadow: none;
   outline: 0;
-  box-shadow: 0;
   padding: 0;
   margin: 0;
   font-weight: normal;
   color: #3b5998;
   width: 100%;
   text-align: left;
   text-shadow: none;
+
+  border-radius: 0;
+  color: #18559D;
+  font: inherit;
+  display: inline;
+  min-width: 0;
 }
 
 .phabricator-action-view button.phabricator-action-view-item,
 .phabricator-action-view-item {
+  padding: 1px 0 1px 34px;
   line-height: 20px;
-  padding-left: 34px;
   display: block;
   font-size: 12px;
+  text-decoration: none;
 }
 
 .phabricator-action-view-icon {
-  width: 16px;
-  height: 16px;
+  width: 14px;
+  height: 14px;
   position: absolute;
-  top: 4px;
-  left: 12px;
+  top: 5px;
+  left: 13px;
 }
 
-.device-desktop .phabricator-action-view-item:hover {
+.device-desktop .phabricator-action-view:hover .phabricator-action-view-item {
+  text-decoration: none;
   background-color: #3875d7;
   color: #ffffff;
-  text-decoration: none;
 }
 
 .phabricator-action-view-disabled .phabricator-action-view-item,
 .phabricator-action-view-disabled button.phabricator-action-view-item {
   color: #888888;
 }
 
-.phabricator-action-view-disabled .phabricator-action-view-item:hover,
-.phabricator-action-view-disabled button.phabricator-action-view-item:hover {
+.device-desktop .phabricator-action-view-disabled:hover
+  .phabricator-action-view-item,
+.device-desktop .phabricator-action-view-disabled:hover
+  button.phabricator-action-view-item {
   background-color: #dfdfdf;
   color: #888888;
 }
diff --git a/webroot/rsrc/css/sprite-icon.css b/webroot/rsrc/css/sprite-icon.css
new file mode 100644
index 000000000..e60a243b0
--- /dev/null
+++ b/webroot/rsrc/css/sprite-icon.css
@@ -0,0 +1,786 @@
+/**
+ * @provides sprite-icon-css
+ * @generated
+ */
+
+.sprite-icon {
+  background-image: url(/rsrc/image/sprite-icon.png);
+  background-repeat: no-repeat;
+}
+
+@media
+only screen and (min-device-pixel-ratio: 1.5),
+only screen and (-webkit-min-device-pixel-ratio: 1.5) {
+  .sprite-icon {
+    background-image: url(/rsrc/image/sprite-icon-X2.png);
+    background-size: 210px 210px;
+  }
+}
+
+.action-arrow_left {
+  background-position: 0px 0px;
+}
+
+.action-arrow_right {
+  background-position: -15px 0px;
+}
+
+.action-attach {
+  background-position: -30px 0px;
+}
+
+.action-blame {
+  background-position: -45px 0px;
+}
+
+.action-check {
+  background-position: -60px 0px;
+}
+
+.action-comment {
+  background-position: -75px 0px;
+}
+
+.action-computer {
+  background-position: -90px 0px;
+}
+
+.action-create {
+  background-position: -105px 0px;
+}
+
+.action-delete {
+  background-position: -120px 0px;
+}
+
+.action-disable {
+  background-position: -135px 0px;
+}
+
+.action-dislike {
+  background-position: -150px 0px;
+}
+
+.action-download {
+  background-position: -165px 0px;
+}
+
+.action-edit {
+  background-position: -180px 0px;
+}
+
+.action-enable {
+  background-position: -195px 0px;
+}
+
+.action-file {
+  background-position: 0px -15px;
+}
+
+.action-flag-0 {
+  background-position: -15px -15px;
+}
+
+.action-flag-1 {
+  background-position: -30px -15px;
+}
+
+.action-flag-2 {
+  background-position: -45px -15px;
+}
+
+.action-flag-3 {
+  background-position: -60px -15px;
+}
+
+.action-flag-4 {
+  background-position: -75px -15px;
+}
+
+.action-flag-5 {
+  background-position: -90px -15px;
+}
+
+.action-flag-6 {
+  background-position: -105px -15px;
+}
+
+.action-flag-7 {
+  background-position: -120px -15px;
+}
+
+.action-flag-ghost {
+  background-position: -135px -15px;
+}
+
+.action-flag {
+  background-position: -150px -15px;
+}
+
+.action-folder-open {
+  background-position: -165px -15px;
+}
+
+.action-fork {
+  background-position: -180px -15px;
+}
+
+.action-herald {
+  background-position: -195px -15px;
+}
+
+.action-highlight {
+  background-position: 0px -30px;
+}
+
+.action-history {
+  background-position: -15px -30px;
+}
+
+.action-image {
+  background-position: -30px -30px;
+}
+
+.action-like {
+  background-position: -45px -30px;
+}
+
+.action-link {
+  background-position: -60px -30px;
+}
+
+.action-lint-info {
+  background-position: -75px -30px;
+}
+
+.action-lint-ok {
+  background-position: -90px -30px;
+}
+
+.action-lint-warning {
+  background-position: -105px -30px;
+}
+
+.action-lock {
+  background-position: -120px -30px;
+}
+
+.action-love {
+  background-position: -135px -30px;
+}
+
+.action-merge {
+  background-position: -150px -30px;
+}
+
+.action-message {
+  background-position: -165px -30px;
+}
+
+.action-meta-mta {
+  background-position: -180px -30px;
+}
+
+.action-move {
+  background-position: -195px -30px;
+}
+
+.action-new {
+  background-position: 0px -45px;
+}
+
+.action-perflab {
+  background-position: -15px -45px;
+}
+
+.action-preview {
+  background-position: -30px -45px;
+}
+
+.action-refresh {
+  background-position: -45px -45px;
+}
+
+.action-remove {
+  background-position: -60px -45px;
+}
+
+.action-search {
+  background-position: -75px -45px;
+}
+
+.action-start-sandcastle {
+  background-position: -90px -45px;
+}
+
+.action-subscribe-add {
+  background-position: -105px -45px;
+}
+
+.action-subscribe-auto {
+  background-position: -120px -45px;
+}
+
+.action-subscribe-delete {
+  background-position: -135px -45px;
+}
+
+.action-tag {
+  background-position: -150px -45px;
+}
+
+.action-transcript {
+  background-position: -165px -45px;
+}
+
+.action-undo {
+  background-position: -180px -45px;
+}
+
+.action-unlock {
+  background-position: -195px -45px;
+}
+
+.action-unmerge {
+  background-position: 0px -60px;
+}
+
+.action-unpublish {
+  background-position: -15px -60px;
+}
+
+.action-warning {
+  background-position: -30px -60px;
+}
+
+.action-world {
+  background-position: -45px -60px;
+}
+
+.action-arrow_left-grey {
+  background-position: -60px -60px;
+}
+
+.action-arrow_right-grey {
+  background-position: -75px -60px;
+}
+
+.action-attach-grey {
+  background-position: -90px -60px;
+}
+
+.action-blame-grey {
+  background-position: -105px -60px;
+}
+
+.action-check-grey {
+  background-position: -120px -60px;
+}
+
+.action-comment-grey {
+  background-position: -135px -60px;
+}
+
+.action-computer-grey {
+  background-position: -150px -60px;
+}
+
+.action-create-grey {
+  background-position: -165px -60px;
+}
+
+.action-delete-grey {
+  background-position: -180px -60px;
+}
+
+.action-disable-grey {
+  background-position: -195px -60px;
+}
+
+.action-dislike-grey {
+  background-position: 0px -75px;
+}
+
+.action-download-grey {
+  background-position: -15px -75px;
+}
+
+.action-edit-grey {
+  background-position: -30px -75px;
+}
+
+.action-enable-grey {
+  background-position: -45px -75px;
+}
+
+.action-file-grey {
+  background-position: -60px -75px;
+}
+
+.action-flag-0-grey {
+  background-position: -75px -75px;
+}
+
+.action-flag-1-grey {
+  background-position: -90px -75px;
+}
+
+.action-flag-2-grey {
+  background-position: -105px -75px;
+}
+
+.action-flag-3-grey {
+  background-position: -120px -75px;
+}
+
+.action-flag-4-grey {
+  background-position: -135px -75px;
+}
+
+.action-flag-5-grey {
+  background-position: -150px -75px;
+}
+
+.action-flag-6-grey {
+  background-position: -165px -75px;
+}
+
+.action-flag-7-grey {
+  background-position: -180px -75px;
+}
+
+.action-flag-ghost-grey {
+  background-position: -195px -75px;
+}
+
+.action-flag-grey {
+  background-position: 0px -90px;
+}
+
+.action-folder-open-grey {
+  background-position: -15px -90px;
+}
+
+.action-fork-grey {
+  background-position: -30px -90px;
+}
+
+.action-herald-grey {
+  background-position: -45px -90px;
+}
+
+.action-highlight-grey {
+  background-position: -60px -90px;
+}
+
+.action-history-grey {
+  background-position: -75px -90px;
+}
+
+.action-image-grey {
+  background-position: -90px -90px;
+}
+
+.action-like-grey {
+  background-position: -105px -90px;
+}
+
+.action-link-grey {
+  background-position: -120px -90px;
+}
+
+.action-lint-info-grey {
+  background-position: -135px -90px;
+}
+
+.action-lint-ok-grey {
+  background-position: -150px -90px;
+}
+
+.action-lint-warning-grey {
+  background-position: -165px -90px;
+}
+
+.action-lock-grey {
+  background-position: -180px -90px;
+}
+
+.action-love-grey {
+  background-position: -195px -90px;
+}
+
+.action-merge-grey {
+  background-position: 0px -105px;
+}
+
+.action-message-grey {
+  background-position: -15px -105px;
+}
+
+.action-meta-mta-grey {
+  background-position: -30px -105px;
+}
+
+.action-move-grey {
+  background-position: -45px -105px;
+}
+
+.action-new-grey {
+  background-position: -60px -105px;
+}
+
+.action-perflab-grey {
+  background-position: -75px -105px;
+}
+
+.action-preview-grey {
+  background-position: -90px -105px;
+}
+
+.action-refresh-grey {
+  background-position: -105px -105px;
+}
+
+.action-remove-grey {
+  background-position: -120px -105px;
+}
+
+.action-search-grey {
+  background-position: -135px -105px;
+}
+
+.action-start-sandcastle-grey {
+  background-position: -150px -105px;
+}
+
+.action-subscribe-add-grey {
+  background-position: -165px -105px;
+}
+
+.action-subscribe-auto-grey {
+  background-position: -180px -105px;
+}
+
+.action-subscribe-delete-grey {
+  background-position: -195px -105px;
+}
+
+.action-tag-grey {
+  background-position: 0px -120px;
+}
+
+.action-transcript-grey {
+  background-position: -15px -120px;
+}
+
+.action-undo-grey {
+  background-position: -30px -120px;
+}
+
+.action-unlock-grey {
+  background-position: -45px -120px;
+}
+
+.action-unmerge-grey {
+  background-position: -60px -120px;
+}
+
+.action-unpublish-grey {
+  background-position: -75px -120px;
+}
+
+.action-warning-grey {
+  background-position: -90px -120px;
+}
+
+.action-world-grey {
+  background-position: -105px -120px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-arrow_left {
+  background-position: -120px -120px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-arrow_right {
+  background-position: -135px -120px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-attach {
+  background-position: -150px -120px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-blame {
+  background-position: -165px -120px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-check {
+  background-position: -180px -120px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-comment {
+  background-position: -195px -120px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-computer {
+  background-position: 0px -135px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-create {
+  background-position: -15px -135px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-delete {
+  background-position: -30px -135px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-disable {
+  background-position: -45px -135px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-dislike {
+  background-position: -60px -135px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-download {
+  background-position: -75px -135px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-edit {
+  background-position: -90px -135px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-enable {
+  background-position: -105px -135px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-file {
+  background-position: -120px -135px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-flag-0 {
+  background-position: -135px -135px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-flag-1 {
+  background-position: -150px -135px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-flag-2 {
+  background-position: -165px -135px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-flag-3 {
+  background-position: -180px -135px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-flag-4 {
+  background-position: -195px -135px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-flag-5 {
+  background-position: 0px -150px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-flag-6 {
+  background-position: -15px -150px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-flag-7 {
+  background-position: -30px -150px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-flag-ghost {
+  background-position: -45px -150px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-flag {
+  background-position: -60px -150px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-folder-open {
+  background-position: -75px -150px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-fork {
+  background-position: -90px -150px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-herald {
+  background-position: -105px -150px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-highlight {
+  background-position: -120px -150px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-history {
+  background-position: -135px -150px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-image {
+  background-position: -150px -150px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-like {
+  background-position: -165px -150px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-link {
+  background-position: -180px -150px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-lint-info {
+  background-position: 0px -165px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-lint-ok {
+  background-position: -15px -165px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-lint-warning {
+  background-position: -30px -165px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-lock {
+  background-position: -45px -165px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-love {
+  background-position: -60px -165px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-merge {
+  background-position: -75px -165px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-message {
+  background-position: -90px -165px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-meta-mta {
+  background-position: -105px -165px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-move {
+  background-position: -120px -165px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-new {
+  background-position: -135px -165px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-perflab {
+  background-position: -150px -165px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-preview {
+  background-position: -165px -165px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-refresh {
+  background-position: -180px -165px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-remove {
+  background-position: 0px -180px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-search {
+  background-position: -15px -180px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-start-sandcastle {
+  background-position: -30px -180px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-subscribe-add {
+  background-position: -45px -180px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-subscribe-auto {
+  background-position: -60px -180px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-subscribe-delete {
+  background-position: -75px -180px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-tag {
+  background-position: -90px -180px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-transcript {
+  background-position: -105px -180px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-undo {
+  background-position: -120px -180px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-unlock {
+  background-position: -135px -180px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-unmerge {
+  background-position: -150px -180px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-unpublish {
+  background-position: -165px -180px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-warning {
+  background-position: -180px -180px;
+}
+
+.device-desktop .phabricator-action-view:hover .action-world {
+  background-position: 0px -195px;
+}
+
+.remarkup-assist-b {
+  background-position: -15px -195px;
+}
+
+.remarkup-assist-code {
+  background-position: -30px -195px;
+}
+
+.remarkup-assist-help {
+  background-position: -45px -195px;
+}
+
+.remarkup-assist-i {
+  background-position: -60px -195px;
+}
+
+.remarkup-assist-image {
+  background-position: -75px -195px;
+}
+
+.remarkup-assist-larger {
+  background-position: -90px -195px;
+}
+
+.remarkup-assist-meme {
+  background-position: -105px -195px;
+}
+
+.remarkup-assist-ol {
+  background-position: -120px -195px;
+}
+
+.remarkup-assist-table {
+  background-position: -135px -195px;
+}
+
+.remarkup-assist-tag {
+  background-position: -150px -195px;
+}
+
+.remarkup-assist-tt {
+  background-position: -165px -195px;
+}
+
+.remarkup-assist-ul {
+  background-position: -180px -195px;
+}
diff --git a/webroot/rsrc/image/autosprite.png b/webroot/rsrc/image/autosprite.png
index 1bab2a4e1..98e0dc238 100644
Binary files a/webroot/rsrc/image/autosprite.png and b/webroot/rsrc/image/autosprite.png differ
diff --git a/webroot/rsrc/image/sprite-icon-X2.png b/webroot/rsrc/image/sprite-icon-X2.png
new file mode 100644
index 000000000..5947f5033
Binary files /dev/null and b/webroot/rsrc/image/sprite-icon-X2.png differ
diff --git a/webroot/rsrc/image/sprite-icon.png b/webroot/rsrc/image/sprite-icon.png
new file mode 100644
index 000000000..21296bbea
Binary files /dev/null and b/webroot/rsrc/image/sprite-icon.png differ