diff --git a/conf/default.conf.php b/conf/default.conf.php index 1217dc6238..6cc166c323 100644 --- a/conf/default.conf.php +++ b/conf/default.conf.php @@ -1,1344 +1,1347 @@ null, // If you have multiple environments, provide the production environment URI // here so that emails, etc., generated in development/sandbox environments // contain the right links. 'phabricator.production-uri' => null, // -- IMPORTANT! Security! -------------------------------------------------- // // IMPORTANT: By default, Phabricator serves files from the same domain the // application lives on. This is convenient but not secure: it creates a large // class of vulnerabilities which can not be generally mitigated. // // To avoid this, you should configure a second domain in the same way you // have the primary domain configured (e.g., point it at the same machine and // set up the same vhost rules) and provide it here. For instance, if your // primary install is on "http://www.phabricator-example.com/", you could // configure "http://www.phabricator-files.com/" and specify the entire // domain (with protocol) here. This will enforce that files are // served only from the alternate domain. Ideally, you should use a // completely separate domain name rather than just a different subdomain. // // It is STRONGLY RECOMMENDED that you configure this. Your install is NOT // SECURE unless you do so. 'security.alternate-file-domain' => null, // Default key for HMAC digests where the key is not important (i.e., the // hash itself is secret). You can change this if you want (to any other // string), but doing so will break existing sessions and CSRF tokens. 'security.hmac-key' => '[D\t~Y7eNmnQGJ;rnH6aF;m2!vJ8@v8C=Cs:aQS\.Qw', // If the web server responds to both HTTP and HTTPS requests but you want // users to connect with only HTTPS, you can set this to true to make // Phabricator redirect HTTP requests to HTTPS. // // Normally, you should just configure your server not to accept HTTP traffic, // but this setting may be useful if you originally used HTTP and have now // switched to HTTPS but don't want to break old links, or if your webserver // sits behind a load balancer which terminates HTTPS connections and you // can not reasonably configure more granular behavior there. // // NOTE: Phabricator determines if a request is HTTPS or not by examining the // PHP $_SERVER['HTTPS'] variable. If you run Apache/mod_php this will // probably be set correctly for you automatically, but if you run Phabricator // as CGI/FCGI (e.g., through nginx or lighttpd), you need to configure your // web server so that it passes the value correctly based on the connection // type. Alternatively, you can add a PHP snippet to the top of this // configuration file to directly set $_SERVER['HTTPS'] to the correct value. 'security.require-https' => false, // -- Internationalization -------------------------------------------------- // // This allows customizing texts used in Phabricator. The class must extend // PhabricatorTranslation. 'translation.provider' => 'PhabricatorEnglishTranslation', // You can use 'translation.override' if you don't want to create a full // translation to give users an option for switching to it and you just want // to override some strings in the default translation. 'translation.override' => array(), // -- Access Policies ------------------------------------------------------- // // Phabricator allows you to set the visibility of objects (like repositories // and source code) to "Public", which means anyone on the internet can see // them, even without being logged in. This is great for open source, but // some installs may never want to make anything public, so this policy is // disabled by default. You can enable it here, which will let you set the // policy for objects to "Public". With this option disabled, the most open // policy is "All Users", which means users must be logged in to view things. 'policy.allow-public' => false, // -- Logging --------------------------------------------------------------- // // To enable the Phabricator access log, specify a path here. The Phabricator // access log can provide more detailed information about Phabricator access // than normal HTTP access logs (for instance, it can show logged-in users, // controllers, and other application data). If not set, no log will be // written. // // Make sure the PHP process can write to the log! 'log.access.path' => null, // Format for the access log. If not set, the default format will be used: // // "[%D]\t%h\t%u\t%M\t%C\t%m\t%U\t%c\t%T" // // Available variables are: // // - %c The HTTP response code. // - %C The controller which handled the request. // - %D The request date. // - %e Epoch timestamp. // - %h The webserver's host name. // - %p The PID of the server process. // - %R The HTTP referrer. // - %r The remote IP. // - %T The request duration, in microseconds. // - %U The request path. // - %u The logged-in user, if one is logged in. // - %M The HTTP method. // - %m For conduit, the Conduit method which was invoked. // // If a variable isn't available (for example, %m appears in the file format // but the request is not a Conduit request), it will be rendered as "-". // // Note that the default format is subject to change in the future, so if you // rely on the log's format, specify it explicitly. 'log.access.format' => null, // -- DarkConsole ----------------------------------------------------------- // // DarkConsole is a administrative debugging/profiling tool built into // Phabricator. You can leave it disabled unless you're developing against // Phabricator. // Determines whether or not DarkConsole is available. DarkConsole exposes // some data like queries and stack traces, so you should be careful about // turning it on in production (although users can not normally see it, even // if the deployment configuration enables it). 'darkconsole.enabled' => false, // Always enable DarkConsole, even for logged out users. This potentially // exposes sensitive information to users, so make sure untrusted users can // not access an install running in this mode. You should definitely leave // this off in production. It is only really useful for using DarkConsole // utilities to debug or profile logged-out pages. You must set // 'darkconsole.enabled' to use this option. 'darkconsole.always-on' => false, // Map of additional configuration values to lock. 'config.lock' => array(), // Map of additional configuration values to hide. 'config.hide' => array(), // Map of additional configuration values to mask. 'config.mask' => array(), // -- MySQL --------------------------------------------------------------- // // Class providing database configuration. It must implement // DatabaseConfigurationProvider. 'mysql.configuration-provider' => 'DefaultDatabaseConfigurationProvider', // The username to use when connecting to MySQL. 'mysql.user' => 'root', // The password to use when connecting to MySQL. 'mysql.pass' => '', // The MySQL server to connect to. If you want to connect to a different // port than the default (which is 3306), specify it in the hostname // (e.g., db.example.com:1234). 'mysql.host' => 'localhost', // Phabricator supports PHP extensions MySQL and MySQLi. It is possible to // implement also other access mechanism (e.g. PDO_MySQL). The class must // extend AphrontMySQLDatabaseConnectionBase. 'mysql.implementation' => 'AphrontMySQLDatabaseConnection', // -- Notifications --------------------------------------------------------- // // Set this to true to enable real-time notifications. You must also run a // notification server for this to work. Consult the documentation in // "Notifications User Guide: Setup and Configuration" for instructions. 'notification.enabled' => false, // Client port for the realtime server to listen on, and for realtime clients // to connect to. Use "localhost" if you are running the notification server // on the same host as the web server. 'notification.client-uri' => 'http://localhost:22280/', // URI and port for the notification root server. 'notification.server-uri' => 'http://localhost:22281/', // The server must be started as root so it can bind to privileged ports, but // if you specify a user here it will drop permissions after binding. 'notification.user' => null, // Location where the server should log to. 'notification.log' => '/var/log/aphlict.log', // PID file to use. 'notification.pidfile' => '/var/run/aphlict.pid', // Enable this option to get additional debug output in the browser. 'notification.debug' => false, // -- Email ----------------------------------------------------------------- // // Some Phabricator tools send email notifications, e.g. when Differential // revisions are updated or Maniphest tasks are changed. These options allow // you to configure how email is delivered. // You can test your mail setup by going to "MetaMTA" in the web interface, // clicking "Send New Message", and then composing a message. // Default address to send mail "From". 'metamta.default-address' => 'noreply@example.com', // Domain used to generate Message-IDs. 'metamta.domain' => 'example.com', // When a message is sent to multiple recipients (for example, several // reviewers on a code review), Phabricator can either deliver one email to // everyone (e.g., "To: alincoln, usgrant, htaft") or separate emails to each // user (e.g., "To: alincoln", "To: usgrant", "To: htaft"). The major // advantages and disadvantages of each approach are: // // - One mail to everyone: // - Recipients can see To/Cc at a glance. // - If you use mailing lists, you won't get duplicate mail if you're // a normal recipient and also Cc'd on a mailing list. // - Getting threading to work properly is harder, and probably requires // making mail less useful by turning off options. // - Sometimes people will "Reply All" and everyone will get two mails, // one from the user and one from Phabricator turning their mail into // a comment. // - Not supported with a private reply-to address. // - Mails are sent in the server default translation. // - One mail to each user: // - Recipients need to look in the mail body to see To/Cc. // - If you use mailing lists, recipients may sometimes get duplicate // mail. // - Getting threading to work properly is easier, and threading settings // can be customzied by each user. // - "Reply All" no longer spams all other users. // - Required if private reply-to addresses are configured. // - Mails are sent in the language of user preference. // // In the code, splitting one outbound email into one-per-recipient is // sometimes referred to as "multiplexing". 'metamta.one-mail-per-recipient' => true, // When sending a message that has no To recipient (i.e. all recipients // are CC'd, for example when multiplexing mail), set the To field to the // following value. If no value is set, messages with no To will have // their CCs upgraded to To. 'metamta.placeholder-to-recipient' => null, // When a user takes an action which generates an email notification (like // commenting on a Differential revision), Phabricator can either send that // mail "From" the user's email address (like "alincoln@logcabin.com") or // "From" the 'metamta.default-address' address. The user experience is // generally better if Phabricator uses the user's real address as the "From" // since the messages are easier to organize when they appear in mail clients, // but this will only work if the server is authorized to send email on behalf // of the "From" domain. Practically, this means: // - If you are doing an install for Example Corp and all the users will // have corporate @corp.example.com addresses and any hosts Phabricator // is running on are authorized to send email from corp.example.com, // you can enable this to make the user experience a little better. // - If you are doing an install for an open source project and your // users will be registering via Facebook and using personal email // addresses, you MUST NOT enable this or virtually all of your outgoing // email will vanish into SFP blackholes. // - If your install is anything else, you're much safer leaving this // off since the risk in turning it on is that your outgoing mail will // mostly never arrive. 'metamta.can-send-as-user' => false, // Adapter class to use to transmit mail to the MTA. The default uses // PHPMailerLite, which will invoke "sendmail". This is appropriate // if sendmail actually works on your host, but if you haven't configured mail // it may not be so great. A number of other mailers are available (e.g., SES, // SendGrid, SMTP, custom mailers), consult "Configuring Outbound Email" in // the documentation for details. 'metamta.mail-adapter' => 'PhabricatorMailImplementationPHPMailerLiteAdapter', // When email is sent, try to hand it off to the MTA immediately instead of // queueing it for delivery by the daemons. If you are running the Phabricator // daemons with "phd start", you should disable this to provide a (sometimes // substantial) performance boost. It's on by default to make setup and // configuration a little easier. 'metamta.send-immediately' => true, // When email is sent, what format should Phabricator use for user's // email addresses? Valid values are: // - 'short' - 'gwashington ' // - 'real' - 'George Washington ' // - 'full' - 'gwashington (George Washington) ' // The default is 'full'. 'metamta.user-address-format' => 'full', // If you're using PHPMailer to send email, provide the mailer and options // here. PHPMailer is much more enormous than PHPMailerLite, and provides more // mailers and greater enormity. You need it when you want to use SMTP // instead of sendmail as the mailer. 'phpmailer.mailer' => 'smtp', 'phpmailer.smtp-host' => '', 'phpmailer.smtp-port' => 25, // When using PHPMailer with SMTP, you can set this to one of "tls" or "ssl" // to use TLS or SSL. Leave it blank for vanilla SMTP. If you're sending // via Gmail, set it to "ssl". 'phpmailer.smtp-protocol' => '', // Set following if your smtp server requires authentication. 'phpmailer.smtp-user' => null, 'phpmailer.smtp-password' => null, // If you're using Amazon SES to send email, provide your AWS access key // and AWS secret key here. To set up Amazon SES with Phabricator, you need // to: // - Make sure 'metamta.mail-adapter' is set to: // "PhabricatorMailImplementationAmazonSESAdapter" // - Make sure 'metamta.can-send-as-user' is false. // - Make sure 'metamta.default-address' is configured to something sensible. // - Make sure 'metamta.default-address' is a validated SES "From" address. 'amazon-ses.access-key' => null, 'amazon-ses.secret-key' => null, // If you're using Sendgrid to send email, provide your access credentials // here. This will use the REST API. You can also use Sendgrid as a normal // SMTP service. 'sendgrid.api-user' => null, 'sendgrid.api-key' => null, // You can configure a reply handler domain so that email sent from Maniphest // will have a special "Reply To" address like "T123+82+af19f@example.com" // that allows recipients to reply by email and interact with tasks. For // instructions on configurating reply handlers, see the article // "Configuring Inbound Email" in the Phabricator documentation. By default, // this is set to 'null' and Phabricator will use a generic 'noreply@' address // or the address of the acting user instead of a special reply handler // address (see 'metamta.default-address'). If you set a domain here, // Phabricator will begin generating private reply handler addresses. See // also 'metamta.maniphest.reply-handler' to further configure behavior. // This key should be set to the domain part after the @, like "example.com". 'metamta.maniphest.reply-handler-domain' => null, // You can follow the instructions in "Configuring Inbound Email" in the // Phabricator documentation and set 'metamta.maniphest.reply-handler-domain' // to support updating Maniphest tasks by email. If you want more advanced // customization than this provides, you can override the reply handler // class with an implementation of your own. This will allow you to do things // like have a single public reply handler or change how private reply // handlers are generated and validated. // // This key should be set to a loadable subclass of // PhabricatorMailReplyHandler. 'metamta.maniphest.reply-handler' => 'ManiphestReplyHandler', // If you don't want phabricator to take up an entire domain // (or subdomain for that matter), you can use this and set a common // prefix for mail sent by phabricator. It will make use of the fact that // a mail-address such as phabricator+D123+1hjk213h@example.com will be // delivered to the phabricator users mailbox. // Set this to the left part of the email address and it well get // prepended to all outgoing mail. If you want to use e.g. // 'phabricator@example.com' this should be set to 'phabricator'. 'metamta.single-reply-handler-prefix' => null, // Prefix prepended to mail sent by Maniphest. You can change this to // distinguish between testing and development installs, for example. 'metamta.maniphest.subject-prefix' => '[Maniphest]', // See 'metamta.maniphest.reply-handler-domain'. This does the same thing, but // affects Pholio. 'metamta.pholio.reply-handler-domain' => null, // Prefix prepended to mail sent by Pholio. 'metamta.pholio.subject-prefix' => '[Pholio]', // See 'metamta.maniphest.reply-handler-domain'. This does the same thing, but // affects Macro. 'metamta.macro.reply-handler-domain' => null, // Prefix prepended to mail sent by Macro. 'metamta.macro.subject-prefix' => '[Macro]', // See 'metamta.maniphest.reply-handler-domain'. This does the same thing, // but allows email replies via Differential. 'metamta.differential.reply-handler-domain' => null, // See 'metamta.maniphest.reply-handler'. This does the same thing, but // affects Differential. 'metamta.differential.reply-handler' => 'DifferentialReplyHandler', // Prefix prepended to mail sent by Differential. 'metamta.differential.subject-prefix' => '[Differential]', // Set this to true if you want patches to be attached to mail from // Differential. This won't work if you are using SendGrid as your mail // adapter. 'metamta.differential.attach-patches' => false, // To include patches in email bodies, set this to a positive integer. Patches // will be inlined if they are at most that many lines. For instance, a value // of 100 means "inline patches if they are no longer than 100 lines". By // default, patches are not inlined. 'metamta.differential.inline-patches' => 0, // If you enable either of the options above, you can choose what format // patches are sent in. Valid options are 'unified' (like diff -u) or 'git'. 'metamta.differential.patch-format' => 'unified', // Enables a different format for comments in differential emails. // Differential will create unified diffs around the comment, which // will give enough context for people who are only viewing the // reviews in email to understand what is going on. The context will // be created based on the range of the comment. 'metamta.differential.unified-comment-context' => false, // Prefix prepended to mail sent by Diffusion. 'metamta.diffusion.subject-prefix' => '[Diffusion]', // See 'metamta.maniphest.reply-handler-domain'. This does the same thing, // but allows email replies via Diffusion. 'metamta.diffusion.reply-handler-domain' => null, // See 'metamta.maniphest.reply-handler'. This does the same thing, but // affects Diffusion. 'metamta.diffusion.reply-handler' => 'PhabricatorAuditReplyHandler', // Set this to true if you want patches to be attached to commit notifications // from Diffusion. This won't work with SendGrid. 'metamta.diffusion.attach-patches' => false, // To include patches in Diffusion email bodies, set this to a positive // integer. Patches will be inlined if they are at most that many lines. // By default, patches are not inlined. 'metamta.diffusion.inline-patches' => 0, // If you've enabled attached patches or inline patches for commit emails, you // can establish a hard byte limit on their size. You should generally set // reasonable byte and time limits (defaults are 1MB and 60 seconds) to avoid // sending ridiculously enormous email for changes like "importing an external // library" or "accidentally committed this full-length movie as text". 'metamta.diffusion.byte-limit' => 1024 * 1024, // If you've enabled attached patches or inline patches for commit emails, you // can establish a hard time limit on generating them. 'metamta.diffusion.time-limit' => 60, // Prefix prepended to mail sent by Package. 'metamta.package.subject-prefix' => '[Package]', // See 'metamta.maniphest.reply-handler'. This does similar thing for package // except that it only supports sending out mail and doesn't handle incoming // email. 'metamta.package.reply-handler' => 'OwnersPackageReplyHandler', // By default, Phabricator generates unique reply-to addresses and sends a // separate email to each recipient when you enable reply handling. This is // more secure than using "From" to establish user identity, but can mean // users may receive multiple emails when they are on mailing lists. Instead, // you can use a single, non-unique reply to address and authenticate users // based on the "From" address by setting this to 'true'. This trades away // a little bit of security for convenience, but it's reasonable in many // installs. Object interactions are still protected using hashes in the // single public email address, so objects can not be replied to blindly. 'metamta.public-replies' => false, // You can configure an email address like "bugs@phabricator.example.com" // which will automatically create Maniphest tasks when users send email // to it. This relies on the "From" address to authenticate users, so it is // is not completely secure. To set this up, enter a complete email // address like "bugs@phabricator.example.com" and then configure mail to // that address so it routed to Phabricator (if you've already configured // reply handlers, you're probably already done). See "Configuring Inbound // Email" in the documentation for more information. 'metamta.maniphest.public-create-email' => null, // If you enable 'metamta.public-replies', Phabricator uses "From" to // authenticate users. You can additionally enable this setting to try to // authenticate with 'Reply-To'. Note that this is completely spoofable and // insecure (any user can set any 'Reply-To' address) but depending on the // nature of your install or other deliverability conditions this might be // okay. Generally, you can't do much more by spoofing Reply-To than be // annoying (you can write but not read content). But, you know, this is // still **COMPLETELY INSECURE**. 'metamta.insecure-auth-with-reply-to' => false, // If you enable 'metamta.maniphest.public-create-email' and create an // email address like "bugs@phabricator.example.com", it will default to // rejecting mail which doesn't come from a known user. However, you might // want to let anyone send email to this address; to do so, set a default // author here (a Phabricator username). A typical use of this might be to // create a "System Agent" user called "bugs" and use that name here. If you // specify a valid username, mail will always be accepted and used to create // a task, even if the sender is not a system user. The original email // address will be stored in an 'From Email' field on the task. 'metamta.maniphest.default-public-author' => null, // You can disable the Herald hints in email if users prefer smaller messages. // These are the links under the headers "MANAGE HERALD RULES" and // "WHY DID I GET THIS EMAIL?". If you set this to true, they will not appear // in any mail. Users can still navigate to the links via the web interface. 'metamta.herald.show-hints' => true, // You can disable the hints under "REPLY HANDLER ACTIONS" if users prefer // smaller messages. The actions themselves will still work properly. 'metamta.reply.show-hints' => true, // You can disable the "To:" and "Cc:" footers in mail if users prefer // smaller messages. 'metamta.recipients.show-hints' => true, // If this option is enabled, Phabricator will add a "Precedence: bulk" // header to transactional mail (e.g., Differential, Maniphest and Herald // notifications). This may improve the behavior of some auto-responder // software and prevent it from replying. However, it may also cause // deliverability issues -- notably, you currently can not send this header // via Amazon SES, and enabling this option with SES will prevent delivery // of any affected mail. 'metamta.precedence-bulk' => false, // Mail.app on OS X Lion won't respect threading headers unless the subject // is prefixed with "Re:". If you enable this option, Phabricator will add // "Re:" to the subject line of all mail which is expected to thread. If // you've set 'metamta.one-mail-per-recipient', users can override this // setting in their preferences. 'metamta.re-prefix' => false, // If true, allow MetaMTA to change mail subjects to put text like // '[Accepted]' and '[Commented]' in them. This makes subjects more useful, // but might break threading on some clients. If you've set // 'metamta.one-mail-per-recipient', users can override this setting in their // preferences. 'metamta.vary-subjects' => true, // -- Auth ------------------------------------------------------------------ // // Can users login with a username/password, or by following the link from // a password reset email? You can disable this and configure one or more // OAuth providers instead. 'auth.password-auth-enabled' => true, // Maximum number of simultaneous web sessions each user is permitted to have. // Setting this to "1" will prevent a user from logging in on more than one // browser at the same time. 'auth.sessions.web' => 5, // Maximum number of simultaneous Conduit sessions each user is permitted // to have. 'auth.sessions.conduit' => 5, // Set this true to enable the Settings -> SSH Public Keys panel, which will // allow users to associated SSH public keys with their accounts. This is only // really useful if you're setting up services over SSH and want to use // Phabricator for authentication; in most situations you can leave this // disabled. 'auth.sshkeys.enabled' => false, // If true, email addresses must be verified (by clicking a link in an // email) before a user can login. By default, verification is optional // unless 'auth.email-domains' is nonempty (see below). 'auth.require-email-verification' => false, // You can restrict allowed email addresses to certain domains (like // "yourcompany.com") by setting a list of allowed domains here. Users will // only be allowed to register using email addresses at one of the domains, // and will only be able to add new email addresses for these domains. If // you configure this, it implies 'auth.require-email-verification'. // // To configure email domains, set a list of domains like this: // // array( // 'yourcompany.com', // 'yourcompany.co.uk', // ) // // You should omit the "@" from domains. Note that the domain must match // exactly. If you allow "yourcompany.com", that permits "joe@yourcompany.com" // but rejects "joe@mail.yourcompany.com". 'auth.email-domains' => array(), // You can provide an arbitrary block of HTML here, which will appear on the // login screen. Normally, you'd use this to provide login or registration // instructions to users. 'auth.login-message' => null, // -- Accounts -------------------------------------------------------------- // // Is basic account information (email, real name, profile picture) editable? // If you set up Phabricator to automatically synchronize account information // from some other authoritative system, you can disable this to ensure // information remains consistent across both systems. 'account.editable' => true, // When users set or reset a password, it must have at least this many // characters. 'account.minimum-password-length' => 8, // -- Facebook OAuth -------------------------------------------------------- // // Can users use Facebook credentials to login to Phabricator? 'facebook.auth-enabled' => false, // Can users use Facebook credentials to create new Phabricator accounts? 'facebook.registration-enabled' => true, // Are Facebook accounts permanently linked to Phabricator accounts, or can // the user unlink them? 'facebook.auth-permanent' => false, // The Facebook "Application ID" to use for Facebook API access. 'facebook.application-id' => null, // The Facebook "Application Secret" to use for Facebook API access. 'facebook.application-secret' => null, // Should Phabricator reject requests made by users with // Secure Browsing disabled? 'facebook.require-https-auth' => false, // -- GitHub OAuth ---------------------------------------------------------- // // Can users use GitHub credentials to login to Phabricator? 'github.auth-enabled' => false, // Can users use GitHub credentials to create new Phabricator accounts? 'github.registration-enabled' => true, // Are GitHub accounts permanently linked to Phabricator accounts, or can // the user unlink them? 'github.auth-permanent' => false, // The GitHub "Client ID" to use for GitHub API access. 'github.application-id' => null, // The GitHub "Secret" to use for GitHub API access. 'github.application-secret' => null, // -- Google OAuth ---------------------------------------------------------- // // Can users use Google credentials to login to Phabricator? 'google.auth-enabled' => false, // Can users use Google credentials to create new Phabricator accounts? 'google.registration-enabled' => true, // Are Google accounts permanently linked to Phabricator accounts, or can // the user unlink them? 'google.auth-permanent' => false, // The Google "Client ID" to use for Google API access. 'google.application-id' => null, // The Google "Client Secret" to use for Google API access. 'google.application-secret' => null, // -- LDAP Auth ----------------------------------------------------- // // Enable ldap auth 'ldap.auth-enabled' => false, // The LDAP server hostname 'ldap.hostname' => null, // The LDAP server port 'ldap.port' => 389, // The LDAP base domain name 'ldap.base_dn' => null, // The attribute to be regarded as 'username'. Has to be unique 'ldap.search_attribute' => null, // Perform a search to find a user // Many LDAP installations do not have the username in the dn, if this is // true for you set this to true and configure the username_attribute below 'ldap.search-first' => false, // The attribute to search for if you have to search for a user 'ldap.username-attribute' => null, // The attribute(s) to be regarded as 'real name'. // If more then one attribute is supplied the values of the attributes in // the array will be joined 'ldap.real_name_attributes' => array(), // A domain name to use when authenticating against Active Directory // (e.g. 'example.com') 'ldap.activedirectory_domain' => null, // The LDAP version 'ldap.version' => 3, // LDAP Referrals Option // Whether referrals should be followed by the client // Should be set to 0 if you use Windows 2003 AD 'ldap.referrals' => true, // The anonymous user name to use before searching a user. // Many LDAP installations require login even before searching a user, set // this option to enable it. 'ldap.anonymous-user-name' => null, // The password of the LDAP anonymous user. 'ldap.anonymous-user-password' => null, // Whether to use STARTTLS 'ldap.start-tls' => false, // -- Disqus OAuth ---------------------------------------------------------- // // Can users use Disqus credentials to login to Phabricator? 'disqus.auth-enabled' => false, // Can users use Disqus credentials to create new Phabricator accounts? 'disqus.registration-enabled' => true, // Are Disqus accounts permanently linked to Phabricator accounts, or can // the user unlink them? 'disqus.auth-permanent' => false, // The Disqus "Client ID" to use for Disqus API access. 'disqus.application-id' => null, // The Disqus "Client Secret" to use for Disqus API access. 'disqus.application-secret' => null, // -- Phabricator OAuth ----------------------------------------------------- // // Meta-town -- Phabricator is itself an OAuth Provider // TODO -- T887 -- make this support multiple Phabricator instances! // The URI of the Phabricator instance to use as an OAuth server. 'phabricator.oauth-uri' => null, // Can users use Phabricator credentials to login to Phabricator? 'phabricator.auth-enabled' => false, // Can users use Phabricator credentials to create new Phabricator accounts? 'phabricator.registration-enabled' => true, // Are Phabricator accounts permanently linked to Phabricator accounts, or can // the user unlink them? 'phabricator.auth-permanent' => false, // The Phabricator "Client ID" to use for Phabricator API access. 'phabricator.application-id' => null, // The Phabricator "Client Secret" to use for Phabricator API access. 'phabricator.application-secret' => null, // -- Recaptcha ------------------------------------------------------------- // // Is Recaptcha enabled? If disabled, captchas will not appear. You should // enable Recaptcha if your install is public-facing, as it hinders // brute-force attacks. 'recaptcha.enabled' => false, // Your Recaptcha public key, obtained from Recaptcha. 'recaptcha.public-key' => null, // Your Recaptcha private key, obtained from Recaptcha. 'recaptcha.private-key' => null, // -- Misc ------------------------------------------------------------------ // // This is hashed with other inputs to generate CSRF tokens. If you want, you // can change it to some other string which is unique to your install. This // will make your install more secure in a vague, mostly theoretical way. But // it will take you like 3 seconds of mashing on your keyboard to set it up so // you might as well. 'phabricator.csrf-key' => '0b7ec0592e0a2829d8b71df2fa269b2c6172eca3', // This is hashed with other inputs to generate mail tokens. If you want, you // can change it to some other string which is unique to your install. In // particular, you will want to do this if you accidentally send a bunch of // mail somewhere you shouldn't have, to invalidate all old reply-to // addresses. 'phabricator.mail-key' => '5ce3e7e8787f6e40dfae861da315a5cdf1018f12', // PHP requires that you set a timezone in your php.ini before using date // functions, or it will emit a warning. If this isn't possible (for instance, // because you are using HPHP) you can set some valid constant for // date_default_timezone_set() here and Phabricator will set it on your // behalf, silencing the warning. 'phabricator.timezone' => null, // When unhandled exceptions occur, stack traces are hidden by default. // You can enable traces for development to make it easier to debug problems. 'phabricator.show-stack-traces' => false, // Shows an error callout if a page generated PHP errors, warnings or notices. // This makes it harder to miss problems while developing Phabricator. 'phabricator.show-error-callout' => false, // When users write comments which have URIs, they'll be automatically linked // if the protocol appears in this set. This whitelist is primarily to prevent // security issues like javascript:// URIs. 'uri.allowed-protocols' => array( 'http' => true, 'https' => true, ), // Tokenizers are UI controls which let the user select other users, email // addresses, project names, etc., by typing the first few letters and having // the control autocomplete from a list. They can load their data in two ways: // either in a big chunk up front, or as the user types. By default, the data // is loaded in a big chunk. This is simpler and performs better for small // datasets. However, if you have a very large number of users or projects, // (in the ballpark of more than a thousand), loading all that data may become // slow enough that it's worthwhile to query on demand instead. This makes // the typeahead slightly less responsive but overall performance will be much // better if you have a ton of stuff. You can figure out which setting is // best for your install by changing this setting and then playing with a // user tokenizer (like the user selectors in Maniphest or Differential) and // seeing which setting loads faster and feels better. 'tokenizer.ondemand' => false, // By default, Phabricator includes some silly nonsense in the UI, such as // a submit button called "Clowncopterize" in Differential and a call to // "Leap Into Action". If you'd prefer more traditional UI strings like // "Submit", you can set this flag to disable most of the jokes and easter // eggs. 'phabricator.serious-business' => false, // Should Phabricator show beta applications on the homepage 'phabricator.show-beta-applications' => false, + // Contains a list of uninstalled applications + 'phabricator.uninstalled-applications' => array(), + // -- Files ----------------------------------------------------------------- // // Lists which uploaded file types may be viewed in the browser. If a file // has a mime type which does not appear in this list, it will always be // downloaded instead of displayed. This is mainly a usability // consideration, since browsers tend to freak out when viewing enormous // binary files. // // The keys in this array are viewable mime types; the values are the mime // types they will be delivered as when they are viewed in the browser. // // IMPORTANT: Configure 'security.alternate-file-domain' above! Your install // is NOT safe if it is left unconfigured. 'files.viewable-mime-types' => array( 'image/jpeg' => 'image/jpeg', 'image/jpg' => 'image/jpg', 'image/png' => 'image/png', 'image/gif' => 'image/gif', 'text/plain' => 'text/plain; charset=utf-8', 'text/x-diff' => 'text/plain; charset=utf-8', // ".ico" favicon files, which have mime type diversity. See: // http://en.wikipedia.org/wiki/ICO_(file_format)#MIME_type 'image/x-ico' => 'image/x-icon', 'image/x-icon' => 'image/x-icon', 'image/vnd.microsoft.icon' => 'image/x-icon', ), // List of mime types which can be used as the source for an tag. // This should be a subset of 'files.viewable-mime-types' and exclude files // like text. 'files.image-mime-types' => array( 'image/jpeg' => true, 'image/jpg' => true, 'image/png' => true, 'image/gif' => true, 'image/x-ico' => true, 'image/x-icon' => true, 'image/vnd.microsoft.icon' => true, ), // -- Storage --------------------------------------------------------------- // // Phabricator allows users to upload files, and can keep them in various // storage engines. This section allows you to configure which engines // Phabricator will use, and how it will use them. // The largest filesize Phabricator will store in the MySQL BLOB storage // engine, which just uses a database table to store files. While this isn't a // best practice, it's really easy to set up. Set this to 0 to disable use of // the MySQL blob engine. 'storage.mysql-engine.max-size' => 1000000, // Phabricator provides a local disk storage engine, which just writes files // to some directory on local disk. The webserver must have read/write // permissions on this directory. This is straightforward and suitable for // most installs, but will not scale past one web frontend unless the path // is actually an NFS mount, since you'll end up with some of the files // written to each web frontend and no way for them to share. To use the // local disk storage engine, specify the path to a directory here. To // disable it, specify null. 'storage.local-disk.path' => null, // If you want to store files in Amazon S3, specify an AWS access and secret // key here and a bucket name below. 'amazon-s3.access-key' => null, 'amazon-s3.secret-key' => null, // To use a custom endpoint, specify it here. Normally, you do not need to // configure this. 'amazon-s3.endpoint' => null, // Set this to a valid Amazon S3 bucket to store files there. You must also // configure S3 access keys above. 'storage.s3.bucket' => null, // Phabricator uses a storage engine selector to choose which storage engine // to use when writing file data. If you add new storage engines or want to // provide very custom rules (e.g., write images to one storage engine and // other files to a different one), you can provide an alternate // implementation here. The default engine will use choose MySQL, Local Disk, // and S3, in that order, if they have valid configurations above and a file // fits within configured limits. 'storage.engine-selector' => 'PhabricatorDefaultFileStorageEngineSelector', // Set the size of the largest file a user may upload. This is used to render // text like "Maximum file size: 10MB" on interfaces where users can upload // files, and files larger than this size will be rejected. // // Specify this limit in bytes, or using a "K", "M", or "G" suffix. // // NOTE: Setting this to a large size is NOT sufficient to allow users to // upload large files. You must also configure a number of other settings. To // configure file upload limits, consult the article "Configuring File Upload // Limits" in the documentation. Once you've configured some limit across all // levels of the server, you can set this limit to an appropriate value and // the UI will then reflect the actual configured limit. 'storage.upload-size-limit' => null, // Phabricator puts databases in a namespace, which defualts to "phabricator" // -- for instance, the Differential database is named // "phabricator_differential" by default. You can change this namespace if you // want. Normally, you should not do this unless you are developing // Phabricator and using namespaces to separate multiple sandbox datasets. 'storage.default-namespace' => 'phabricator', // -- Search ---------------------------------------------------------------- // // Phabricator supports Elastic Search; to use it, specify a host like // 'http://elastic.example.com:9200/' here. 'search.elastic.host' => null, // Phabricator uses a search engine selector to choose which search engine // to use when indexing and reconstructing documents, and when executing // queries. You can override the engine selector to provide a new selector // class which can select some custom engine you implement, if you want to // store your documents in some search engine which does not have default // support. 'search.engine-selector' => 'PhabricatorDefaultSearchEngineSelector', // -- Differential ---------------------------------------------------------- // 'differential.revision-custom-detail-renderer' => null, // Array for custom remarkup rules. The array should have a list of // class names of classes that extend PhutilRemarkupRule 'differential.custom-remarkup-rules' => null, // Array for custom remarkup block rules. The array should have a list of // class names of classes that extend PhutilRemarkupEngineBlockRule 'differential.custom-remarkup-block-rules' => null, // List of file regexps where whitespace is meaningful and should not // use 'ignore-all' by default 'differential.whitespace-matters' => array( '/\.py$/', '/\.l?hs$/', ), 'differential.field-selector' => 'DifferentialDefaultFieldSelector', // Differential can show "Host" and "Path" fields on revisions, with // information about the machine and working directory where the // change came from. These fields are disabled by default because they may // occasionally have sensitive information; you can set this to true to // enable them. 'differential.show-host-field' => false, // Differential has a required "Test Plan" field by default, which requires // authors to fill out information about how they verified the correctness of // their changes when sending code for review. If you'd prefer not to use // this field, you can disable it here. You can also make it optional // (instead of required) below. 'differential.show-test-plan-field' => true, // Differential has a required "Test Plan" field by default. You can make it // optional by setting this to false. You can also completely remove it above, // if you prefer. 'differential.require-test-plan-field' => true, // If you set this to true, users can "!accept" revisions via email (normally, // they can take other actions but can not "!accept"). This action is disabled // by default because email authentication can be configured to be very weak, // and, socially, email "!accept" is kind of sketchy and implies revisions may // not actually be receiving thorough review. 'differential.enable-email-accept' => false, // If you set this to true, users won't need to login to view differential // revisions. Anonymous users will have read-only access and won't be able to // interact with the revisions. 'differential.anonymous-access' => false, // If you set this to true, revision author email address information will // be exposed in Conduit. This is useful for Arcanist. // // For example, consider the "arc patch DX" workflow which needs to ask // Differential for the revision DX. This data often should contain // the author's email address, eg "George Washington // " when DX is a git or mercurial revision. If this // option is false, Differential defaults to the best it can, something like // "George Washington" or "gwashington". 'differential.expose-emails-prudently' => false, // List of file regexps that should be treated as if they are generated by // an automatic process, and thus get hidden by default in differential. 'differential.generated-paths' => array( // '/config\.h$/', // '#/autobuilt/#', ), // If you set this to true, users can accept their own revisions. This action // is disabled by default because it's most likely not a behavior you want, // but it proves useful if you are working alone on a project and want to make // use of all of differential's features. 'differential.allow-self-accept' => false, // If you set this to true, any user can close any revision so long as it has // been accepted. This can be useful depending on your development model. For // example, github-style pull requests where the reviewer is often the // actual committer can benefit from turning this option to true. If false, // only the submitter can close a revision. 'differential.always-allow-close' => false, // If you set this to true, any user can reopen a revision so long as it has // been closed. This can be useful if a revision is accidentally closed or // if a developer changes his or her mind after closing a revision. If it is // false, reopening is not allowed. 'differential.allow-reopen' => false, // Revisions newer than this number of days are marked as fresh in Action // Required and Revisions Waiting on You views. Only work days (not weekends // and holidays) are included. Set to 0 to disable this feature. 'differential.days-fresh' => 1, // Similar to 'differential.days-fresh' but marks stale revisions. If the // revision is even older than it is marked as old. 'differential.days-stale' => 3, // -- Repositories ---------------------------------------------------------- // // The default location in which to store local copies of repositories. // Anything stored in this directory will be assumed to be under the // control of phabricator, which means that Phabricator will try to do some // maintenance on working copies if there are problems (such as a change // to the remote origin url). This maintenance may include completely // removing (and recloning) anything in this directory. // // When set to null, this option is ignored (i.e. Phabricator will not fully // control any working copies). 'repository.default-local-path' => null, // -- Maniphest ------------------------------------------------------------- // 'maniphest.enabled' => true, // Array of custom fields for Maniphest tasks. For details on adding custom // fields to Maniphest, see "Maniphest User Guide: Adding Custom Fields". 'maniphest.custom-fields' => array(), // Class which drives custom field construction. See "Maniphest User Guide: // Adding Custom Fields" in the documentation for more information. 'maniphest.custom-task-extensions-class' => 'ManiphestDefaultTaskExtensions', // What should the default task priority be in create flows? // See the constants in @{class:ManiphestTaskPriority} for valid values. // Defaults to "needs triage". 'maniphest.default-priority' => 90, // -- Phriction ------------------------------------------------------------- // 'phriction.enabled' => true, // -- Phame ----------------------------------------------------------------- // // Should Phame users have Disqus comment widget, and if so what's the // website shortname to use? For example, secure.phabricator.org uses // "phabricator", which we registered with Disqus. If you aren't familiar // with Disqus, see: // Disqus quick start guide - http://docs.disqus.com/help/4/ // Information on shortnames - http://docs.disqus.com/help/68/ 'disqus.shortname' => null, // Directories to look for Phame skins inside of. 'phame.skins' => array( 'externals/skins/', ), // -- Remarkup -------------------------------------------------------------- // // If you enable this, linked YouTube videos will be embeded inline. This has // mild security implications (you'll leak referrers to YouTube) and is pretty // silly (but sort of awesome). 'remarkup.enable-embedded-youtube' => false, // -- Cache ----------------------------------------------------------------- // // Set this to false to disable the use of gzdeflate()-based compression in // some caches. This may give you less performant (but more debuggable) // caching. 'cache.enable-deflate' => true, // -- Garbage Collection ---------------------------------------------------- // // Phabricator generates various logs and caches in the database which can // be garbage collected after a while to make the total data size more // manageable. To run garbage collection, launch a // PhabricatorGarbageCollector daemon. // These 'ttl' keys configure how much old data the GC daemon keeps around. // Objects older than the ttl will be collected. Set any value to 0 to store // data indefinitely. 'gcdaemon.ttl.herald-transcripts' => 30 * (24 * 60 * 60), 'gcdaemon.ttl.daemon-logs' => 7 * (24 * 60 * 60), 'gcdaemon.ttl.differential-parse-cache' => 14 * (24 * 60 * 60), 'gcdaemon.ttl.markup-cache' => 30 * (24 * 60 * 60), 'gcdaemon.ttl.task-archive' => 14 * (24 * 60 * 60), 'gcdaemon.ttl.general-cache' => 30 * (24 * 60 * 60), // -- Feed ------------------------------------------------------------------ // // If you set this to true, you can embed Phabricator activity feeds in other // pages using iframes. These feeds are completely public, and a login is not // required to view them! This is intended for things like open source // projects that want to expose an activity feed on the project homepage. // // NOTE: You must also set `policy.allow-public` to true for this setting // to work properly. 'feed.public' => false, // If you set this to a list of http URIs, when a feed story is published a // task will be created for each uri that posts the story data to the uri. // Daemons automagically retry failures 100 times, waiting $fail_count * 60s // between each subsequent failure. Be sure to keep the daemon console // (/daemon/) open while developing and testing your end points. // // NOTE: URIs are not validated, the URI must return http status 200 within // 30 seconds, and no permission checks are performed. 'feed.http-hooks' => array(), // -- Drydock --------------------------------------------------------------- // // If you want to use Drydock's builtin EC2 Blueprints, configure your AWS // EC2 credentials here. 'amazon-ec2.access-key' => null, 'amazon-ec2.secret-key' => null, // -- Customization --------------------------------------------------------- // // Paths to additional phutil libraries to load. 'load-libraries' => array(), 'aphront.default-application-configuration-class' => 'AphrontDefaultApplicationConfiguration', 'controller.oauth-registration' => 'PhabricatorOAuthDefaultRegistrationController', // Directory that phd (the Phabricator daemon control script) should use to // track running daemons. 'phd.pid-directory' => '/var/tmp/phd/pid', // Directory that the Phabricator daemons should use to store the log file 'phd.log-directory' => '/var/tmp/phd/log', // Number of "TaskMaster" daemons that "phd start" should start. You can // raise this if you have a task backlog, or explicitly launch more with // "phd launch taskmaster". 'phd.start-taskmasters' => 4, // Launch daemons in "verbose" mode by default. This creates a lot of output, // but can help debug issues. Daemons launched in debug mode with "phd debug" // are always launched in verbose mode. See also 'phd.trace'. 'phd.verbose' => false, // Launch daemons in "trace" mode by default. This creates an ENORMOUS amount // of output, but can help debug issues. Daemons launched in debug mode with // "phd debug" are always launched in trace mdoe. See also 'phd.verbose'. 'phd.trace' => false, // Path to custom celerity resource map relative to 'phabricator/src'. // See also `scripts/celerity_mapper.php`. 'celerity.resource-path' => '__celerity_resource_map__.php', // This value is an input to the hash function when building resource hashes. // It has no security value, but if you accidentally poison user caches (by // pushing a bad patch or having something go wrong with a CDN, e.g.) you can // change this to something else and rebuild the Celerity map to break user // caches. Unless you are doing Celerity development, it is exceptionally // unlikely that you need to modify this. 'celerity.resource-hash' => 'd9455ea150622ee044f7931dabfa52aa', // In a development environment, it is desirable to force static resources // (CSS and JS) to be read from disk on every request, so that edits to them // appear when you reload the page even if you haven't updated the resource // maps. This setting ensures requests will be verified against the state on // disk. Generally, you should leave this off in production (caching behavior // and performance improve with it off) but turn it on in development. (These // settings are the defaults.) 'celerity.force-disk-reads' => false, // Minify static resources by removing whitespace and comments. You should // enable this in production, but disable it in development. 'celerity.minify' => false, // You can respond to various application events by installing listeners, // which will receive callbacks when interesting things occur. Specify a list // of classes which extend PhabricatorEventListener here. 'events.listeners' => array(), // -- Syntax Highlighting --------------------------------------------------- // // Phabricator can highlight PHP by default and use Pygments for other // languages if enabled. You can provide a custom highlighter engine by // extending class PhutilSyntaxHighlighterEngine. 'syntax-highlighter.engine' => 'PhutilDefaultSyntaxHighlighterEngine', // If you want syntax highlighting for other languages than PHP then you can // install the python package 'Pygments', make sure the 'pygmentize' script is // available in the $PATH of the webserver, and then enable this. 'pygments.enabled' => false, // In places that we display a dropdown to syntax-highlight code, // this is where that list is defined. // Syntax is 'lexer-name' => 'Display Name', 'pygments.dropdown-choices' => array( 'apacheconf' => 'Apache Configuration', 'bash' => 'Bash Scripting', 'brainfuck' => 'Brainf*ck', 'c' => 'C', 'cpp' => 'C++', 'css' => 'CSS', 'd' => 'D', 'diff' => 'Diff', 'django' => 'Django Templating', 'erb' => 'Embedded Ruby/ERB', 'erlang' => 'Erlang', 'haskell' => 'Haskell', 'html' => 'HTML', 'java' => 'Java', 'js' => 'Javascript', 'mysql' => 'MySQL', 'objc' => 'Objective-C', 'perl' => 'Perl', 'php' => 'PHP', 'rest' => 'reStructuredText', 'text' => 'Plain Text', 'python' => 'Python', 'rainbow' => 'Rainbow', 'remarkup' => 'Remarkup', 'ruby' => 'Ruby', 'xml' => 'XML', ), // This is an override list of regular expressions which allows you to choose // what language files are highlighted as. If your projects have certain rules // about filenames or use unusual or ambiguous language extensions, you can // create a mapping here. This is an ordered dictionary of regular expressions // which will be tested against the filename. They should map to either an // explicit language as a string value, or a numeric index into the captured // groups as an integer. 'syntax.filemap' => array( // Example: Treat all '*.xyz' files as PHP. // '@\\.xyz$@' => 'php', // Example: Treat 'httpd.conf' as 'apacheconf'. // '@/httpd\\.conf$@' => 'apacheconf', // Example: Treat all '*.x.bak' file as '.x'. NOTE: we map to capturing // group 1 by specifying the mapping as "1". // '@\\.([^.]+)\\.bak$@' => 1, '@\.arcconfig$@' => 'js', '@\.divinerconfig$@' => 'js', ), // Set the default monospaced font style for users who haven't set a custom // style. 'style.monospace' => '10px "Menlo", "Consolas", "Monaco", monospace', // -- Debugging ------------------------------------------------------------- // // Enable this to change HTTP redirects into normal pages with a link to the // redirection target. For example, after you submit a form you'll get a page // saying "normally, you'd be redirected...". This is useful to examine // service or profiler information on write pathways, or debug redirects. It // also makes the UX horrible for normal use, so you should enable it only // when debugging. // // NOTE: This does not currently work for forms with Javascript "workflow", // since the redirect happens in Javascript. 'debug.stop-on-redirect' => false, // Set the rate for how often to do sampled profiling. On average, one // request for every number of requests specified here will be sampled. // Set this value to 0 to completely disable profiling. In a production // environment, this value should either be set to 0 (to disable) or to // a large number (to sample only a few requests). 'debug.profile-rate' => 0, // -- Environment ---------------------------------------------------------- // // Phabricator occasionally shells out to other binaries on the server. // An example of this is the "pygmentize" command, used to syntax-highlight // code written in languages other than PHP. By default, it is assumed that // these binaries are in the $PATH of the user running Phabricator (normally // 'apache', 'httpd', or 'nobody'). Here you can add extra directories to // the $PATH environment variable, for when these binaries are in non-standard // locations. 'environment.append-paths' => array(), // -- Audit ---------------------------------------------------------- // // Controls whether or not task creator can Close Audits 'audit.can-author-close-audit' => false, ); diff --git a/resources/sprite/conpher_1x/calendar_off.png b/resources/sprite/conpher_1x/calendar_off.png new file mode 100644 index 0000000000..d4bbae5dfe Binary files /dev/null and b/resources/sprite/conpher_1x/calendar_off.png differ diff --git a/resources/sprite/conpher_1x/calendar_on.png b/resources/sprite/conpher_1x/calendar_on.png new file mode 100644 index 0000000000..9759fc0546 Binary files /dev/null and b/resources/sprite/conpher_1x/calendar_on.png differ diff --git a/resources/sprite/conpher_1x/conversation_off.png b/resources/sprite/conpher_1x/conversation_off.png new file mode 100644 index 0000000000..2a0310bca2 Binary files /dev/null and b/resources/sprite/conpher_1x/conversation_off.png differ diff --git a/resources/sprite/conpher_1x/conversation_on.png b/resources/sprite/conpher_1x/conversation_on.png new file mode 100644 index 0000000000..11e8437a0a Binary files /dev/null and b/resources/sprite/conpher_1x/conversation_on.png differ diff --git a/resources/sprite/conpher_1x/files_off.png b/resources/sprite/conpher_1x/files_off.png new file mode 100644 index 0000000000..0eb7e3996d Binary files /dev/null and b/resources/sprite/conpher_1x/files_off.png differ diff --git a/resources/sprite/conpher_1x/files_on.png b/resources/sprite/conpher_1x/files_on.png new file mode 100644 index 0000000000..5699ec5f00 Binary files /dev/null and b/resources/sprite/conpher_1x/files_on.png differ diff --git a/resources/sprite/conpher_1x/list_off.png b/resources/sprite/conpher_1x/list_off.png new file mode 100644 index 0000000000..5f64e19b74 Binary files /dev/null and b/resources/sprite/conpher_1x/list_off.png differ diff --git a/resources/sprite/conpher_1x/list_on.png b/resources/sprite/conpher_1x/list_on.png new file mode 100644 index 0000000000..5f104f217d Binary files /dev/null and b/resources/sprite/conpher_1x/list_on.png differ diff --git a/resources/sprite/conpher_1x/more_off.png b/resources/sprite/conpher_1x/more_off.png new file mode 100644 index 0000000000..bd65726e00 Binary files /dev/null and b/resources/sprite/conpher_1x/more_off.png differ diff --git a/resources/sprite/conpher_1x/more_on.png b/resources/sprite/conpher_1x/more_on.png new file mode 100644 index 0000000000..d6c1c6b12a Binary files /dev/null and b/resources/sprite/conpher_1x/more_on.png differ diff --git a/resources/sprite/conpher_1x/people_off.png b/resources/sprite/conpher_1x/people_off.png new file mode 100644 index 0000000000..372f5ecd05 Binary files /dev/null and b/resources/sprite/conpher_1x/people_off.png differ diff --git a/resources/sprite/conpher_1x/people_on.png b/resources/sprite/conpher_1x/people_on.png new file mode 100644 index 0000000000..87fd885951 Binary files /dev/null and b/resources/sprite/conpher_1x/people_on.png differ diff --git a/resources/sprite/conpher_1x/settings_off.png b/resources/sprite/conpher_1x/settings_off.png new file mode 100644 index 0000000000..d75b0f1fb7 Binary files /dev/null and b/resources/sprite/conpher_1x/settings_off.png differ diff --git a/resources/sprite/conpher_1x/settings_on.png b/resources/sprite/conpher_1x/settings_on.png new file mode 100644 index 0000000000..f90ca7820d Binary files /dev/null and b/resources/sprite/conpher_1x/settings_on.png differ diff --git a/resources/sprite/conpher_2x/calendar_off.png b/resources/sprite/conpher_2x/calendar_off.png new file mode 100644 index 0000000000..b807c6457e Binary files /dev/null and b/resources/sprite/conpher_2x/calendar_off.png differ diff --git a/resources/sprite/conpher_2x/calendar_on.png b/resources/sprite/conpher_2x/calendar_on.png new file mode 100644 index 0000000000..b60e94dc02 Binary files /dev/null and b/resources/sprite/conpher_2x/calendar_on.png differ diff --git a/resources/sprite/conpher_2x/conversation_off.png b/resources/sprite/conpher_2x/conversation_off.png new file mode 100644 index 0000000000..5c50e5ccfd Binary files /dev/null and b/resources/sprite/conpher_2x/conversation_off.png differ diff --git a/resources/sprite/conpher_2x/conversation_on.png b/resources/sprite/conpher_2x/conversation_on.png new file mode 100644 index 0000000000..8d1bf1435d Binary files /dev/null and b/resources/sprite/conpher_2x/conversation_on.png differ diff --git a/resources/sprite/conpher_2x/files_off.png b/resources/sprite/conpher_2x/files_off.png new file mode 100644 index 0000000000..b593b1437f Binary files /dev/null and b/resources/sprite/conpher_2x/files_off.png differ diff --git a/resources/sprite/conpher_2x/files_on.png b/resources/sprite/conpher_2x/files_on.png new file mode 100644 index 0000000000..a31547d8d9 Binary files /dev/null and b/resources/sprite/conpher_2x/files_on.png differ diff --git a/resources/sprite/conpher_2x/list_off.png b/resources/sprite/conpher_2x/list_off.png new file mode 100644 index 0000000000..a9add168df Binary files /dev/null and b/resources/sprite/conpher_2x/list_off.png differ diff --git a/resources/sprite/conpher_2x/list_on.png b/resources/sprite/conpher_2x/list_on.png new file mode 100644 index 0000000000..0214b6b0ca Binary files /dev/null and b/resources/sprite/conpher_2x/list_on.png differ diff --git a/resources/sprite/conpher_2x/more_off.png b/resources/sprite/conpher_2x/more_off.png new file mode 100644 index 0000000000..ce90ebc722 Binary files /dev/null and b/resources/sprite/conpher_2x/more_off.png differ diff --git a/resources/sprite/conpher_2x/more_on.png b/resources/sprite/conpher_2x/more_on.png new file mode 100644 index 0000000000..9b2b0f4321 Binary files /dev/null and b/resources/sprite/conpher_2x/more_on.png differ diff --git a/resources/sprite/conpher_2x/people_off.png b/resources/sprite/conpher_2x/people_off.png new file mode 100644 index 0000000000..ad51a2427d Binary files /dev/null and b/resources/sprite/conpher_2x/people_off.png differ diff --git a/resources/sprite/conpher_2x/people_on.png b/resources/sprite/conpher_2x/people_on.png new file mode 100644 index 0000000000..ff42ad8f95 Binary files /dev/null and b/resources/sprite/conpher_2x/people_on.png differ diff --git a/resources/sprite/conpher_2x/settings_off.png b/resources/sprite/conpher_2x/settings_off.png new file mode 100644 index 0000000000..c25d7905ac Binary files /dev/null and b/resources/sprite/conpher_2x/settings_off.png differ diff --git a/resources/sprite/conpher_2x/settings_on.png b/resources/sprite/conpher_2x/settings_on.png new file mode 100644 index 0000000000..2aa6501876 Binary files /dev/null and b/resources/sprite/conpher_2x/settings_on.png differ diff --git a/resources/sprite/manifest/conph.json b/resources/sprite/manifest/conph.json new file mode 100644 index 0000000000..9554b39997 --- /dev/null +++ b/resources/sprite/manifest/conph.json @@ -0,0 +1,81 @@ +{ + "version" : 1, + "sprites" : { + "conpher_calendar_off" : { + "name" : "conpher_calendar_off", + "rule" : ".conpher_calendar_off", + "hash" : "a8228ab90fd90f4c2500d9285179bf26" + }, + "conpher_calendar_on" : { + "name" : "conpher_calendar_on", + "rule" : ".conpher_calendar_on, .device-desktop .conpher_calendar_off:hover ", + "hash" : "931243bc3c414782ddb2d1d9607908ba" + }, + "conpher_conversation_off" : { + "name" : "conpher_conversation_off", + "rule" : ".conpher_conversation_off", + "hash" : "931abb0377898297a9a603a6d280b977" + }, + "conpher_conversation_on" : { + "name" : "conpher_conversation_on", + "rule" : ".conpher_conversation_on, .device-desktop .conpher_conversation_off:hover ", + "hash" : "0b8a39dc5019dac1975b7be2ca0ccbfa" + }, + "conpher_files_off" : { + "name" : "conpher_files_off", + "rule" : ".conpher_files_off", + "hash" : "de1aee01b9b47b354e6ac280ae68bae1" + }, + "conpher_files_on" : { + "name" : "conpher_files_on", + "rule" : ".conpher_files_on, .device-desktop .conpher_files_off:hover ", + "hash" : "9ccbbd5e86fd4ec87a11aee0c9ec8c60" + }, + "conpher_list_off" : { + "name" : "conpher_list_off", + "rule" : ".conpher_list_off", + "hash" : "2611311d0c2aec04416433be74d3a30e" + }, + "conpher_list_on" : { + "name" : "conpher_list_on", + "rule" : ".conpher_list_on, .device-desktop .conpher_list_off:hover ", + "hash" : "cee6de0301c84b0d195282642642afa0" + }, + "conpher_more_off" : { + "name" : "conpher_more_off", + "rule" : ".conpher_more_off", + "hash" : "3b7099bdde20a13864b48552b11e92c3" + }, + "conpher_more_on" : { + "name" : "conpher_more_on", + "rule" : ".conpher_more_on, .device-desktop .conpher_more_off:hover ", + "hash" : "b146f0cff9c2e5f0b57f7ebcfe0704d3" + }, + "conpher_people_off" : { + "name" : "conpher_people_off", + "rule" : ".conpher_people_off", + "hash" : "641a6a21aa32a12416e85caf8a22e340" + }, + "conpher_people_on" : { + "name" : "conpher_people_on", + "rule" : ".conpher_people_on, .device-desktop .conpher_people_off:hover ", + "hash" : "f13745fd7036564eefb1c0ebc3502a92" + }, + "conpher_settings_off" : { + "name" : "conpher_settings_off", + "rule" : ".conpher_settings_off", + "hash" : "aa9ab000d9e33e3c50c2fe70367f30b4" + }, + "conpher_settings_on" : { + "name" : "conpher_settings_on", + "rule" : ".conpher_settings_on, .device-desktop .conpher_settings_off:hover ", + "hash" : "a5fe22965997f9559800ca7db5ea32c8" + } + }, + "scales" : [ + 1, + 2 + ], + "header" : "\/**\n * @provides sprite-conpher-css\n * @generated\n *\/\n\n.sprite-conpher {\n background-image: url(\/rsrc\/image\/sprite-conpher.png);\n background-repeat: no-repeat;\n}\n\n@media\nonly screen and (min-device-pixel-ratio: 1.5),\nonly screen and (-webkit-min-device-pixel-ratio: 1.5) {\n .sprite-conpher {\n background-image: url(\/rsrc\/image\/sprite-conpher-X2.png);\n background-size: {X}px {Y}px;\n }\n}\n", + "type" : "standard" +} diff --git a/scripts/celerity/generate_sprites.php b/scripts/celerity/generate_sprites.php index 1a337e2c63..1ac4d0fc2c 100755 --- a/scripts/celerity/generate_sprites.php +++ b/scripts/celerity/generate_sprites.php @@ -1,82 +1,83 @@ #!/usr/bin/env php setTagline('regenerate CSS sprite sheets'); $args->setSynopsis(<<parseStandardArguments(); $args->parse( array( array( 'name' => 'force', 'help' => 'Force regeneration even if sources have not changed.', ), )); $root = dirname(phutil_get_library_root('phabricator')); $webroot = $root.'/webroot/rsrc'; $webroot = Filesystem::readablePath($webroot); $generator = new CeleritySpriteGenerator(); $sheets = array( 'icon' => $generator->buildIconSheet(), 'menu' => $generator->buildMenuSheet(), 'apps' => $generator->buildAppsSheet(), + 'conph' => $generator->buildConpherenceSheet(), 'apps-large' => $generator->buildAppsLargeSheet(), // TODO: @chad: should we actually remove this? // 'apps-xlarge' => $generator->buildAppsXLargeSheet(), 'gradient' => $generator->buildGradientSheet(), ); list($err) = exec_manual('optipng'); if ($err) { $have_optipng = false; echo phutil_console_format( " WARNING `optipng` not found in PATH.\n". "Sprites will not be optimized! Install `optipng`!\n"); } else { $have_optipng = true; } foreach ($sheets as $name => $sheet) { $manifest_path = $root.'/resources/sprite/manifest/'.$name.'.json'; if (!$args->getArg('force')) { if (Filesystem::pathExists($manifest_path)) { $data = Filesystem::readFile($manifest_path); $data = json_decode($data, true); if (!$sheet->needsRegeneration($data)) { continue; } } } $sheet ->generateCSS($webroot."/css/sprite-{$name}.css") ->generateManifest($root."/resources/sprite/manifest/{$name}.json"); foreach ($sheet->getScales() as $scale) { if ($scale == 1) { $sheet_name = "sprite-{$name}.png"; } else { $sheet_name = "sprite-{$name}-X{$scale}.png"; } $full_path = "{$webroot}/image/{$sheet_name}"; $sheet->generateImage($full_path, $scale); if ($have_optipng) { echo "Optimizing...\n"; phutil_passthru('optipng -o7 -clobber %s', $full_path); } } } echo "Done.\n"; diff --git a/src/__celerity_resource_map__.php b/src/__celerity_resource_map__.php index da47577120..e6b8caacdf 100644 --- a/src/__celerity_resource_map__.php +++ b/src/__celerity_resource_map__.php @@ -1,3716 +1,3750 @@ array( 'hash' => 'ae90914d120ac3838ddc633b480343f3', 'uri' => '/res/ae90914d/rsrc/image/actions/edit.png', 'disk' => '/rsrc/image/actions/edit.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/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/darkload.gif' => array( 'hash' => '3a52cb7145d6e70f461fed21273117f2', 'uri' => '/res/3a52cb71/rsrc/image/darkload.gif', 'disk' => '/rsrc/image/darkload.gif', 'type' => 'gif', ), '/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/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/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' => 'ad020b1529b3a3b3480ca9de1d5f1e40', 'uri' => '/res/ad020b15/rsrc/image/menu_texture.png', 'disk' => '/rsrc/image/menu_texture.png', 'type' => 'png', ), '/rsrc/image/search.png' => array( 'hash' => 'ff7da044e6f923b8f569dec11f97e5e5', 'uri' => '/res/ff7da044/rsrc/image/search.png', 'disk' => '/rsrc/image/search.png', 'type' => 'png', ), '/rsrc/image/sprite-apps-X2.png' => array( 'hash' => '361e64ded74eee1094127c7878c2c385', 'uri' => '/res/361e64de/rsrc/image/sprite-apps-X2.png', 'disk' => '/rsrc/image/sprite-apps-X2.png', 'type' => 'png', ), '/rsrc/image/sprite-apps-large-X2.png' => array( 'hash' => '73507e04b4bd4d1e8e7544f7c424fc0f', 'uri' => '/res/73507e04/rsrc/image/sprite-apps-large-X2.png', 'disk' => '/rsrc/image/sprite-apps-large-X2.png', 'type' => 'png', ), '/rsrc/image/sprite-apps-large.png' => array( 'hash' => '6a5aade6134954171f2f1f8507270632', 'uri' => '/res/6a5aade6/rsrc/image/sprite-apps-large.png', 'disk' => '/rsrc/image/sprite-apps-large.png', 'type' => 'png', ), '/rsrc/image/sprite-apps-xlarge.png' => array( 'hash' => '992d2c278b6a22c0fa874d457a252fbd', 'uri' => '/res/992d2c27/rsrc/image/sprite-apps-xlarge.png', 'disk' => '/rsrc/image/sprite-apps-xlarge.png', 'type' => 'png', ), '/rsrc/image/sprite-apps.png' => array( 'hash' => '5e76c53e9f61755e5d3e7befa9d73ae5', 'uri' => '/res/5e76c53e/rsrc/image/sprite-apps.png', 'disk' => '/rsrc/image/sprite-apps.png', 'type' => 'png', ), + '/rsrc/image/sprite-conph-X2.png' => + array( + 'hash' => '8f79b9888577dab95d6019d1b7f2a204', + 'uri' => '/res/8f79b988/rsrc/image/sprite-conph-X2.png', + 'disk' => '/rsrc/image/sprite-conph-X2.png', + 'type' => 'png', + ), + '/rsrc/image/sprite-conph.png' => + array( + 'hash' => 'a6329b4baa648b57c00de65f6758cbd2', + 'uri' => '/res/a6329b4b/rsrc/image/sprite-conph.png', + 'disk' => '/rsrc/image/sprite-conph.png', + 'type' => 'png', + ), '/rsrc/image/sprite-gradient.png' => array( 'hash' => '92aebaab67dcc6baf2ea99294368d895', 'uri' => '/res/92aebaab/rsrc/image/sprite-gradient.png', 'disk' => '/rsrc/image/sprite-gradient.png', 'type' => 'png', ), '/rsrc/image/sprite-icon-X2.png' => array( 'hash' => 'c9fae25bc6221922ce26517e654a18e4', 'uri' => '/res/c9fae25b/rsrc/image/sprite-icon-X2.png', 'disk' => '/rsrc/image/sprite-icon-X2.png', 'type' => 'png', ), '/rsrc/image/sprite-icon.png' => array( 'hash' => 'b690ea69bf5f2abe84d0a6e9ef64b03d', 'uri' => '/res/b690ea69/rsrc/image/sprite-icon.png', 'disk' => '/rsrc/image/sprite-icon.png', 'type' => 'png', ), '/rsrc/image/sprite-menu-X2.png' => array( 'hash' => 'ad544a9287ca73b9e0d3f549834701ee', 'uri' => '/res/ad544a92/rsrc/image/sprite-menu-X2.png', 'disk' => '/rsrc/image/sprite-menu-X2.png', 'type' => 'png', ), '/rsrc/image/sprite-menu.png' => array( 'hash' => '8a6822c29bfa6f33db1c1b8b02b5c6d3', 'uri' => '/res/8a6822c2/rsrc/image/sprite-menu.png', 'disk' => '/rsrc/image/sprite-menu.png', 'type' => 'png', ), '/rsrc/image/texture/dark-menu-hover.png' => array( 'hash' => 'a214a732644be34872e895b338b5d639', 'uri' => '/res/a214a732/rsrc/image/texture/dark-menu-hover.png', 'disk' => '/rsrc/image/texture/dark-menu-hover.png', 'type' => 'png', ), '/rsrc/image/texture/dark-menu.png' => array( 'hash' => '41ee673a762cec48a154b456ad5ac204', 'uri' => '/res/41ee673a/rsrc/image/texture/dark-menu.png', 'disk' => '/rsrc/image/texture/dark-menu.png', 'type' => 'png', ), '/rsrc/image/texture/dust_background.jpg' => array( 'hash' => 'c32ab9819d4af583f5609bbd3750721a', 'uri' => '/res/c32ab981/rsrc/image/texture/dust_background.jpg', 'disk' => '/rsrc/image/texture/dust_background.jpg', 'type' => 'jpg', ), '/rsrc/image/texture/table_header.png' => array( 'hash' => '4ed3f56a30d3749e8f62052b9735a316', 'uri' => '/res/4ed3f56a/rsrc/image/texture/table_header.png', 'disk' => '/rsrc/image/texture/table_header.png', 'type' => 'png', ), '/rsrc/image/texture/table_header_hover.png' => array( 'hash' => 'ea1f71a604e9b4859de1e25751540437', 'uri' => '/res/ea1f71a6/rsrc/image/texture/table_header_hover.png', 'disk' => '/rsrc/image/texture/table_header_hover.png', 'type' => 'png', ), '/rsrc/image/texture/table_header_tall.png' => array( 'hash' => 'b05525601f78d759f1c5e47fd9c1a8aa', 'uri' => '/res/b0552560/rsrc/image/texture/table_header_tall.png', 'disk' => '/rsrc/image/texture/table_header_tall.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/87d6e40d/rsrc/css/aphront/calendar-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/calendar-view.css', ), 'aphront-contextbar-view-css' => array( 'uri' => '/res/ecfd5ba9/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/63841304/rsrc/css/aphront/dark-console.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/dark-console.css', ), 'aphront-dialog-view-css' => array( 'uri' => '/res/215b3ab1/rsrc/css/aphront/dialog-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/dialog-view.css', ), 'aphront-error-view-css' => array( 'uri' => '/res/5f43a7c5/rsrc/css/aphront/error-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/error-view.css', ), 'aphront-form-view-css' => array( 'uri' => '/res/1e191b83/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/73874cd2/rsrc/css/aphront/headsup.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/headsup.css', ), 'aphront-list-filter-view-css' => array( 'uri' => '/res/e783d6e1/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/789ff5e5/rsrc/css/aphront/panel-view.css', + 'uri' => '/res/3d1420b3/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-table-view-css' => array( 'uri' => '/res/fd33a0f0/rsrc/css/aphront/table-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/table-view.css', ), 'aphront-tokenizer-control-css' => array( 'uri' => '/res/207105f0/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/3a7d8e07/rsrc/css/aphront/tooltip.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/tooltip.css', ), 'aphront-typeahead-control-css' => array( 'uri' => '/res/ef59c20c/rsrc/css/aphront/typeahead.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/typeahead.css', ), 'config-options-css' => array( 'uri' => '/res/e6c21f2f/rsrc/css/application/config/config-options.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/config/config-options.css', ), 'conpherence-header-pane-css' => array( 'uri' => '/res/4b8aebd2/rsrc/css/application/conpherence/header-pane.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/conpherence/header-pane.css', ), 'conpherence-menu-css' => array( 'uri' => '/res/0dc6b412/rsrc/css/application/conpherence/menu.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/conpherence/menu.css', ), 'conpherence-message-pane-css' => array( 'uri' => '/res/88b1927c/rsrc/css/application/conpherence/message-pane.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/conpherence/message-pane.css', ), 'conpherence-update-css' => array( 'uri' => '/res/8e4757b5/rsrc/css/application/conpherence/update.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/conpherence/update.css', ), 'conpherence-widget-pane-css' => array( 'uri' => '/res/b3e6a558/rsrc/css/application/conpherence/widget-pane.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/conpherence/widget-pane.css', ), 'differential-changeset-view-css' => array( 'uri' => '/res/ea694162/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/85fe5117/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', + 'uri' => '/res/e0ad34ac/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/224f3703/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/aab3123c/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/42c222f4/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/d41bc64c/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/fe6c4721/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/4fde8bfc/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', ), 'global-drag-and-drop-css' => array( 'uri' => '/res/4e24cb65/rsrc/css/application/files/global-drag-and-drop.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/files/global-drag-and-drop.css', ), 'herald-css' => array( 'uri' => '/res/2150a55d/rsrc/css/application/herald/herald.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/herald/herald.css', ), 'herald-rule-editor' => array( 'uri' => '/res/f35d7e23/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/f09bc90d/rsrc/js/application/aphlict/behavior-aphlict-dropdown.js', + 'uri' => '/res/2418f448/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', 5 => 'javelin-uri', ), '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/3d809b40/rsrc/js/application/core/behavior-drag-and-drop.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'phabricator-file-upload', 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/853e33b9/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/70fd43fd/rsrc/js/application/core/behavior-form.js', + 'uri' => '/res/b5052cd0/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-conpherence-init' => array( 'uri' => '/res/bd911b43/rsrc/js/application/conpherence/behavior-init.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-stratcom', ), 'disk' => '/rsrc/js/application/conpherence/behavior-init.js', ), 'javelin-behavior-conpherence-menu' => array( 'uri' => '/res/9d21fb86/rsrc/js/application/conpherence/behavior-menu.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-workflow', 3 => 'javelin-util', 4 => 'javelin-stratcom', 5 => 'javelin-uri', ), 'disk' => '/rsrc/js/application/conpherence/behavior-menu.js', ), 'javelin-behavior-conpherence-widget-pane' => array( 'uri' => '/res/f3e0dbba/rsrc/js/application/conpherence/behavior-widget-pane.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-stratcom', ), 'disk' => '/rsrc/js/application/conpherence/behavior-widget-pane.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/c3e8a3d8/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', ), 'disk' => '/rsrc/js/application/core/behavior-dark-console.js', ), 'javelin-behavior-device' => array( 'uri' => '/res/a10b851b/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/8fea67b3/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/71effec4/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 => 'javelin-behavior-device', 6 => '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/b9f93090/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/62bd2035/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/0a1bc610/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-global-drag-and-drop' => array( 'uri' => '/res/73ae3fd1/rsrc/js/application/core/behavior-global-drag-and-drop.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-uri', 3 => 'javelin-mask', 4 => 'phabricator-drag-and-drop-file-upload', ), 'disk' => '/rsrc/js/application/core/behavior-global-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/2199602f/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/08f5e202/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-home-reveal-tiles' => array( 'uri' => '/res/7230ca0c/rsrc/js/application/core/behavior-home-reveal-tiles.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-dom', ), 'disk' => '/rsrc/js/application/core/behavior-home-reveal-tiles.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/cec31f3f/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', ), '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/07406487/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-transaction-comment-form' => array( 'uri' => '/res/acc3ada1/rsrc/js/application/transactions/behavior-transaction-comment-form.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-util', 3 => 'phabricator-shaped-request', ), 'disk' => '/rsrc/js/application/transactions/behavior-transaction-comment-form.js', ), 'javelin-behavior-phabricator-transaction-list' => array( - 'uri' => '/res/307a71af/rsrc/js/application/transactions/behavior-transaction-list.js', + 'uri' => '/res/f1fbb474/rsrc/js/application/transactions/behavior-transaction-list.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-workflow', 3 => 'javelin-dom', 4 => 'javelin-fx', ), 'disk' => '/rsrc/js/application/transactions/behavior-transaction-list.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-pholio-mock-view' => + array( + 'uri' => '/res/10fbdca1/rsrc/js/application/pholio/behavior-pholio-mock-view.js', + 'type' => 'js', + 'requires' => + array( + 0 => 'javelin-behavior', + 1 => 'javelin-stratcom', + ), + 'disk' => '/rsrc/js/application/pholio/behavior-pholio-mock-view.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', + 'uri' => '/res/2c99beaf/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/459f3c08/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/c81f64eb/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/4657e15d/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/14e825ce/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/fb430d3e/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/29b68354/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', 5 => 'phabricator-prefab', ), 'disk' => '/rsrc/js/application/owners/OwnersPathEditor.js', ), 'owners-path-editor-css' => array( 'uri' => '/res/4fcaabf6/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/7a67c3b9/rsrc/css/layout/phabricator-action-list-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/layout/phabricator-action-list-view.css', ), 'phabricator-application-launch-view-css' => array( 'uri' => '/res/8aee0702/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/7320ca6d/rsrc/css/core/buttons.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/core/buttons.css', ), 'phabricator-core-css' => array( 'uri' => '/res/03c97d00/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-crumbs-view-css' => array( 'uri' => '/res/69fdba64/rsrc/css/layout/phabricator-crumbs-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/layout/phabricator-crumbs-view.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/ce71f19a/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-fatal-config-template-css' => array( 'uri' => '/res/6e1a8d22/rsrc/css/application/config/config-template.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/config/config-template.css', ), 'phabricator-feed-css' => array( 'uri' => '/res/94a04b24/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/c912ed91/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/bdec7be5/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/88ef478c/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/2e0e2211/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/38ec42d4/rsrc/css/application/base/main-menu-view.css', + 'uri' => '/res/597e394b/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/df20ec17/rsrc/css/aphront/phabricator-nav-view.css', + 'uri' => '/res/f3c78a53/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/664b9bec/rsrc/css/aphront/notification.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/notification.css', ), 'phabricator-notification-menu-css' => array( - 'uri' => '/res/d0d0264c/rsrc/css/application/base/notification-menu.css', + 'uri' => '/res/b7cc25af/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/2fb97c5c/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/cd84ee5a/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/f444d7c9/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-side-menu-view-css' => array( - 'uri' => '/res/2013e94f/rsrc/css/layout/phabricator-side-menu-view.css', + 'uri' => '/res/28a1e092/rsrc/css/layout/phabricator-side-menu-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/layout/phabricator-side-menu-view.css', ), '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/9373e769/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/5f013c46/rsrc/css/application/base/standard-page-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/base/standard-page-view.css', ), 'phabricator-tag-view-css' => array( 'uri' => '/res/e10bf844/rsrc/css/layout/phabricator-tag-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/layout/phabricator-tag-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/d87e1d60/rsrc/css/layout/phabricator-timeline-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/layout/phabricator-timeline-view.css', ), 'phabricator-tooltip' => array( 'uri' => '/res/55d76b9b/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/d3599152/rsrc/css/aphront/transaction.css', + 'uri' => '/res/4c5c16dc/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', ), 'phabricator-zindex-css' => array( 'uri' => '/res/fcbf82ad/rsrc/css/core/z-index.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/core/z-index.css', ), 'phame-css' => array( 'uri' => '/res/8e3edb71/rsrc/css/application/phame/phame.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/phame/phame.css', ), 'pholio-css' => array( - 'uri' => '/res/e454c33f/rsrc/css/application/pholio/pholio.css', + 'uri' => '/res/f101ad7c/rsrc/css/application/pholio/pholio.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/pholio/pholio.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', ), 'setup-issue-css' => array( 'uri' => '/res/efbb3673/rsrc/css/application/config/setup-issue.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/config/setup-issue.css', ), 'sprite-apps-css' => array( 'uri' => '/res/8de495b4/rsrc/css/sprite-apps.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/sprite-apps.css', ), 'sprite-apps-large-css' => array( 'uri' => '/res/174143b7/rsrc/css/sprite-apps-large.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/sprite-apps-large.css', ), 'sprite-apps-xlarge-css' => array( 'uri' => '/res/33a8e644/rsrc/css/sprite-apps-xlarge.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/sprite-apps-xlarge.css', ), + 'sprite-conpher-css' => + array( + 'uri' => '/res/f640f0c5/rsrc/css/sprite-conph.css', + 'type' => 'css', + 'requires' => + array( + ), + 'disk' => '/rsrc/css/sprite-conph.css', + ), 'sprite-gradient-css' => array( 'uri' => '/res/e62e7a0f/rsrc/css/sprite-gradient.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/sprite-gradient.css', ), 'sprite-icon-css' => array( 'uri' => '/res/e7d63fcf/rsrc/css/sprite-icon.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/sprite-icon.css', ), 'sprite-menu-css' => array( 'uri' => '/res/8e6624b0/rsrc/css/sprite-menu.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/sprite-menu.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( - '023adc14' => + '0cb71c48' => array( 'name' => 'core.pkg.css', 'symbols' => array( 0 => 'phabricator-core-css', 1 => 'phabricator-zindex-css', 2 => 'phabricator-core-buttons-css', 3 => 'phabricator-standard-page-view', 4 => 'aphront-dialog-view-css', 5 => 'aphront-form-view-css', 6 => 'aphront-panel-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-remarkup-css', 15 => 'syntax-highlighting-css', 16 => 'aphront-pager-view-css', 17 => 'phabricator-transaction-view-css', 18 => 'aphront-tooltip-css', 19 => 'aphront-headsup-view-css', 20 => 'phabricator-flag-css', 21 => 'aphront-error-view-css', 22 => 'sprite-icon-css', 23 => 'sprite-gradient-css', 24 => 'sprite-menu-css', 25 => 'sprite-apps-large-css', 26 => 'phabricator-main-menu-view', 27 => 'phabricator-notification-css', 28 => 'phabricator-notification-menu-css', 29 => 'lightbox-attachment-css', 30 => 'phabricator-header-view-css', 31 => 'phabricator-form-view-css', 32 => 'phabricator-filetree-view-css', 33 => 'phabricator-nav-view-css', 34 => 'phabricator-side-menu-view-css', 35 => 'phabricator-crumbs-view-css', 36 => 'phabricator-object-item-list-view-css', 37 => 'global-drag-and-drop-css', ), - 'uri' => '/res/pkg/023adc14/core.pkg.css', + 'uri' => '/res/pkg/0cb71c48/core.pkg.css', 'type' => 'css', ), - 'b3c1b6e7' => + 'ff199687' => 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', 31 => 'javelin-behavior-global-drag-and-drop', 32 => 'javelin-behavior-phabricator-home-reveal-tiles', ), - 'uri' => '/res/pkg/b3c1b6e7/core.pkg.js', + 'uri' => '/res/pkg/ff199687/core.pkg.js', 'type' => 'js', ), '032118cf' => array( 'name' => 'darkconsole.pkg.js', 'symbols' => array( 0 => 'javelin-behavior-dark-console', 1 => 'javelin-behavior-error-log', ), 'uri' => '/res/pkg/032118cf/darkconsole.pkg.js', 'type' => 'js', ), 'ec01d039' => 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/ec01d039/differential.pkg.css', 'type' => 'css', ), - '310cd201' => + '9dae5f20' => 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/310cd201/differential.pkg.js', + 'uri' => '/res/pkg/9dae5f20/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', ), 'f96657b8' => 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/f96657b8/diffusion.pkg.js', 'type' => 'js', ), '1c6f020b' => 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', ), 'uri' => '/res/pkg/1c6f020b/javelin.pkg.js', 'type' => 'js', ), 'e30a3fa8' => 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/e30a3fa8/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' => 'e30a3fa8', - 'aphront-crumbs-view-css' => '023adc14', - 'aphront-dialog-view-css' => '023adc14', - 'aphront-error-view-css' => '023adc14', - 'aphront-form-view-css' => '023adc14', + 'aphront-crumbs-view-css' => '0cb71c48', + 'aphront-dialog-view-css' => '0cb71c48', + 'aphront-error-view-css' => '0cb71c48', + 'aphront-form-view-css' => '0cb71c48', 'aphront-headsup-action-list-view-css' => 'ec01d039', - 'aphront-headsup-view-css' => '023adc14', - 'aphront-list-filter-view-css' => '023adc14', - 'aphront-pager-view-css' => '023adc14', - 'aphront-panel-view-css' => '023adc14', - 'aphront-table-view-css' => '023adc14', - 'aphront-tokenizer-control-css' => '023adc14', - 'aphront-tooltip-css' => '023adc14', - 'aphront-typeahead-control-css' => '023adc14', + 'aphront-headsup-view-css' => '0cb71c48', + 'aphront-list-filter-view-css' => '0cb71c48', + 'aphront-pager-view-css' => '0cb71c48', + 'aphront-panel-view-css' => '0cb71c48', + 'aphront-table-view-css' => '0cb71c48', + 'aphront-tokenizer-control-css' => '0cb71c48', + 'aphront-tooltip-css' => '0cb71c48', + 'aphront-typeahead-control-css' => '0cb71c48', 'differential-changeset-view-css' => 'ec01d039', 'differential-core-view-css' => 'ec01d039', - 'differential-inline-comment-editor' => '310cd201', + 'differential-inline-comment-editor' => '9dae5f20', 'differential-local-commits-view-css' => 'ec01d039', 'differential-results-table-css' => 'ec01d039', 'differential-revision-add-comment-css' => 'ec01d039', 'differential-revision-comment-css' => 'ec01d039', 'differential-revision-comment-list-css' => 'ec01d039', 'differential-revision-history-css' => 'ec01d039', 'differential-revision-list-css' => 'ec01d039', 'differential-table-of-contents-css' => 'ec01d039', 'diffusion-commit-view-css' => 'c8ce2d88', 'diffusion-icons-css' => 'c8ce2d88', - 'global-drag-and-drop-css' => '023adc14', + 'global-drag-and-drop-css' => '0cb71c48', 'inline-comment-summary-css' => 'ec01d039', - 'javelin-aphlict' => 'b3c1b6e7', + 'javelin-aphlict' => 'ff199687', 'javelin-behavior' => '1c6f020b', - 'javelin-behavior-aphlict-dropdown' => 'b3c1b6e7', - 'javelin-behavior-aphlict-listen' => 'b3c1b6e7', - 'javelin-behavior-aphront-basic-tokenizer' => 'b3c1b6e7', - 'javelin-behavior-aphront-drag-and-drop' => '310cd201', - 'javelin-behavior-aphront-drag-and-drop-textarea' => '310cd201', - 'javelin-behavior-aphront-form-disable-on-submit' => 'b3c1b6e7', + 'javelin-behavior-aphlict-dropdown' => 'ff199687', + 'javelin-behavior-aphlict-listen' => 'ff199687', + 'javelin-behavior-aphront-basic-tokenizer' => 'ff199687', + 'javelin-behavior-aphront-drag-and-drop' => '9dae5f20', + 'javelin-behavior-aphront-drag-and-drop-textarea' => '9dae5f20', + 'javelin-behavior-aphront-form-disable-on-submit' => 'ff199687', 'javelin-behavior-audit-preview' => 'f96657b8', 'javelin-behavior-dark-console' => '032118cf', - 'javelin-behavior-device' => 'b3c1b6e7', - 'javelin-behavior-differential-accept-with-errors' => '310cd201', - 'javelin-behavior-differential-add-reviewers-and-ccs' => '310cd201', - 'javelin-behavior-differential-comment-jump' => '310cd201', - 'javelin-behavior-differential-diff-radios' => '310cd201', - 'javelin-behavior-differential-dropdown-menus' => '310cd201', - 'javelin-behavior-differential-edit-inline-comments' => '310cd201', - 'javelin-behavior-differential-feedback-preview' => '310cd201', - 'javelin-behavior-differential-keyboard-navigation' => '310cd201', - 'javelin-behavior-differential-populate' => '310cd201', - 'javelin-behavior-differential-show-more' => '310cd201', - 'javelin-behavior-differential-toggle-files' => '310cd201', - 'javelin-behavior-differential-user-select' => '310cd201', + 'javelin-behavior-device' => 'ff199687', + 'javelin-behavior-differential-accept-with-errors' => '9dae5f20', + 'javelin-behavior-differential-add-reviewers-and-ccs' => '9dae5f20', + 'javelin-behavior-differential-comment-jump' => '9dae5f20', + 'javelin-behavior-differential-diff-radios' => '9dae5f20', + 'javelin-behavior-differential-dropdown-menus' => '9dae5f20', + 'javelin-behavior-differential-edit-inline-comments' => '9dae5f20', + 'javelin-behavior-differential-feedback-preview' => '9dae5f20', + 'javelin-behavior-differential-keyboard-navigation' => '9dae5f20', + 'javelin-behavior-differential-populate' => '9dae5f20', + 'javelin-behavior-differential-show-more' => '9dae5f20', + 'javelin-behavior-differential-toggle-files' => '9dae5f20', + 'javelin-behavior-differential-user-select' => '9dae5f20', 'javelin-behavior-diffusion-commit-graph' => 'f96657b8', 'javelin-behavior-diffusion-pull-lastmodified' => 'f96657b8', 'javelin-behavior-error-log' => '032118cf', - 'javelin-behavior-global-drag-and-drop' => 'b3c1b6e7', - 'javelin-behavior-konami' => 'b3c1b6e7', - 'javelin-behavior-lightbox-attachments' => 'b3c1b6e7', + 'javelin-behavior-global-drag-and-drop' => 'ff199687', + 'javelin-behavior-konami' => 'ff199687', + 'javelin-behavior-lightbox-attachments' => 'ff199687', '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' => 'b3c1b6e7', - 'javelin-behavior-phabricator-autofocus' => 'b3c1b6e7', - 'javelin-behavior-phabricator-home-reveal-tiles' => 'b3c1b6e7', - 'javelin-behavior-phabricator-keyboard-shortcuts' => 'b3c1b6e7', - 'javelin-behavior-phabricator-nav' => 'b3c1b6e7', - 'javelin-behavior-phabricator-object-selector' => '310cd201', - 'javelin-behavior-phabricator-oncopy' => 'b3c1b6e7', - 'javelin-behavior-phabricator-remarkup-assist' => 'b3c1b6e7', - 'javelin-behavior-phabricator-search-typeahead' => 'b3c1b6e7', - 'javelin-behavior-phabricator-tooltips' => 'b3c1b6e7', - 'javelin-behavior-phabricator-watch-anchor' => 'b3c1b6e7', - 'javelin-behavior-refresh-csrf' => 'b3c1b6e7', - 'javelin-behavior-repository-crossreference' => '310cd201', - 'javelin-behavior-toggle-class' => 'b3c1b6e7', - 'javelin-behavior-workflow' => 'b3c1b6e7', + 'javelin-behavior-phabricator-active-nav' => 'ff199687', + 'javelin-behavior-phabricator-autofocus' => 'ff199687', + 'javelin-behavior-phabricator-home-reveal-tiles' => 'ff199687', + 'javelin-behavior-phabricator-keyboard-shortcuts' => 'ff199687', + 'javelin-behavior-phabricator-nav' => 'ff199687', + 'javelin-behavior-phabricator-object-selector' => '9dae5f20', + 'javelin-behavior-phabricator-oncopy' => 'ff199687', + 'javelin-behavior-phabricator-remarkup-assist' => 'ff199687', + 'javelin-behavior-phabricator-search-typeahead' => 'ff199687', + 'javelin-behavior-phabricator-tooltips' => 'ff199687', + 'javelin-behavior-phabricator-watch-anchor' => 'ff199687', + 'javelin-behavior-refresh-csrf' => 'ff199687', + 'javelin-behavior-repository-crossreference' => '9dae5f20', + 'javelin-behavior-toggle-class' => 'ff199687', + 'javelin-behavior-workflow' => 'ff199687', 'javelin-dom' => '1c6f020b', 'javelin-event' => '1c6f020b', 'javelin-install' => '1c6f020b', 'javelin-json' => '1c6f020b', 'javelin-mask' => '1c6f020b', 'javelin-request' => '1c6f020b', 'javelin-resource' => '1c6f020b', 'javelin-stratcom' => '1c6f020b', 'javelin-tokenizer' => '1c6f020b', 'javelin-typeahead' => '1c6f020b', 'javelin-typeahead-normalizer' => '1c6f020b', 'javelin-typeahead-ondemand-source' => '1c6f020b', 'javelin-typeahead-preloaded-source' => '1c6f020b', 'javelin-typeahead-source' => '1c6f020b', 'javelin-uri' => '1c6f020b', 'javelin-util' => '1c6f020b', 'javelin-vector' => '1c6f020b', 'javelin-workflow' => '1c6f020b', - 'lightbox-attachment-css' => '023adc14', + 'lightbox-attachment-css' => '0cb71c48', 'maniphest-task-summary-css' => 'e30a3fa8', 'maniphest-transaction-detail-css' => 'e30a3fa8', - 'phabricator-busy' => 'b3c1b6e7', + 'phabricator-busy' => 'ff199687', 'phabricator-content-source-view-css' => 'ec01d039', - 'phabricator-core-buttons-css' => '023adc14', - 'phabricator-core-css' => '023adc14', - 'phabricator-crumbs-view-css' => '023adc14', - 'phabricator-directory-css' => '023adc14', - 'phabricator-drag-and-drop-file-upload' => '310cd201', - 'phabricator-dropdown-menu' => 'b3c1b6e7', - 'phabricator-file-upload' => 'b3c1b6e7', - 'phabricator-filetree-view-css' => '023adc14', - 'phabricator-flag-css' => '023adc14', - 'phabricator-form-view-css' => '023adc14', - 'phabricator-header-view-css' => '023adc14', - 'phabricator-jump-nav' => '023adc14', - 'phabricator-keyboard-shortcut' => 'b3c1b6e7', - 'phabricator-keyboard-shortcut-manager' => 'b3c1b6e7', - 'phabricator-main-menu-view' => '023adc14', - 'phabricator-menu-item' => 'b3c1b6e7', - 'phabricator-nav-view-css' => '023adc14', - 'phabricator-notification' => 'b3c1b6e7', - 'phabricator-notification-css' => '023adc14', - 'phabricator-notification-menu-css' => '023adc14', - 'phabricator-object-item-list-view-css' => '023adc14', + 'phabricator-core-buttons-css' => '0cb71c48', + 'phabricator-core-css' => '0cb71c48', + 'phabricator-crumbs-view-css' => '0cb71c48', + 'phabricator-directory-css' => '0cb71c48', + 'phabricator-drag-and-drop-file-upload' => '9dae5f20', + 'phabricator-dropdown-menu' => 'ff199687', + 'phabricator-file-upload' => 'ff199687', + 'phabricator-filetree-view-css' => '0cb71c48', + 'phabricator-flag-css' => '0cb71c48', + 'phabricator-form-view-css' => '0cb71c48', + 'phabricator-header-view-css' => '0cb71c48', + 'phabricator-jump-nav' => '0cb71c48', + 'phabricator-keyboard-shortcut' => 'ff199687', + 'phabricator-keyboard-shortcut-manager' => 'ff199687', + 'phabricator-main-menu-view' => '0cb71c48', + 'phabricator-menu-item' => 'ff199687', + 'phabricator-nav-view-css' => '0cb71c48', + 'phabricator-notification' => 'ff199687', + 'phabricator-notification-css' => '0cb71c48', + 'phabricator-notification-menu-css' => '0cb71c48', + 'phabricator-object-item-list-view-css' => '0cb71c48', 'phabricator-object-selector-css' => 'ec01d039', - 'phabricator-paste-file-upload' => 'b3c1b6e7', - 'phabricator-prefab' => 'b3c1b6e7', + 'phabricator-paste-file-upload' => 'ff199687', + 'phabricator-prefab' => 'ff199687', 'phabricator-project-tag-css' => 'e30a3fa8', - 'phabricator-remarkup-css' => '023adc14', - 'phabricator-shaped-request' => '310cd201', - 'phabricator-side-menu-view-css' => '023adc14', - 'phabricator-standard-page-view' => '023adc14', - 'phabricator-textareautils' => 'b3c1b6e7', - 'phabricator-tooltip' => 'b3c1b6e7', - 'phabricator-transaction-view-css' => '023adc14', - 'phabricator-zindex-css' => '023adc14', - 'sprite-apps-large-css' => '023adc14', - 'sprite-gradient-css' => '023adc14', - 'sprite-icon-css' => '023adc14', - 'sprite-menu-css' => '023adc14', - 'syntax-highlighting-css' => '023adc14', + 'phabricator-remarkup-css' => '0cb71c48', + 'phabricator-shaped-request' => '9dae5f20', + 'phabricator-side-menu-view-css' => '0cb71c48', + 'phabricator-standard-page-view' => '0cb71c48', + 'phabricator-textareautils' => 'ff199687', + 'phabricator-tooltip' => 'ff199687', + 'phabricator-transaction-view-css' => '0cb71c48', + 'phabricator-zindex-css' => '0cb71c48', + 'sprite-apps-large-css' => '0cb71c48', + 'sprite-gradient-css' => '0cb71c48', + 'sprite-icon-css' => '0cb71c48', + 'sprite-menu-css' => '0cb71c48', + 'syntax-highlighting-css' => '0cb71c48', ), )); diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index c5474942ed..7d83b3c810 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -1,2901 +1,2904 @@ 2, 'class' => array( 'Aphront304Response' => 'aphront/response/Aphront304Response.php', 'Aphront400Response' => 'aphront/response/Aphront400Response.php', 'Aphront403Response' => 'aphront/response/Aphront403Response.php', 'Aphront404Response' => 'aphront/response/Aphront404Response.php', 'AphrontAjaxResponse' => 'aphront/response/AphrontAjaxResponse.php', 'AphrontApplicationConfiguration' => 'aphront/configuration/AphrontApplicationConfiguration.php', 'AphrontAttachedFileView' => 'view/control/AphrontAttachedFileView.php', 'AphrontCSRFException' => 'aphront/exception/AphrontCSRFException.php', 'AphrontCalendarEventView' => 'applications/calendar/view/AphrontCalendarEventView.php', 'AphrontCalendarMonthView' => 'applications/calendar/view/AphrontCalendarMonthView.php', 'AphrontContextBarView' => 'view/layout/AphrontContextBarView.php', 'AphrontController' => 'aphront/AphrontController.php', 'AphrontCrumbsView' => 'view/layout/AphrontCrumbsView.php', 'AphrontCursorPagerView' => 'view/control/AphrontCursorPagerView.php', 'AphrontDefaultApplicationConfiguration' => 'aphront/configuration/AphrontDefaultApplicationConfiguration.php', 'AphrontDialogResponse' => 'aphront/response/AphrontDialogResponse.php', 'AphrontDialogView' => 'view/AphrontDialogView.php', 'AphrontErrorView' => 'view/form/AphrontErrorView.php', 'AphrontException' => 'aphront/exception/AphrontException.php', 'AphrontFileResponse' => 'aphront/response/AphrontFileResponse.php', 'AphrontFormCheckboxControl' => 'view/form/control/AphrontFormCheckboxControl.php', 'AphrontFormControl' => 'view/form/control/AphrontFormControl.php', 'AphrontFormDateControl' => 'view/form/control/AphrontFormDateControl.php', 'AphrontFormDividerControl' => 'view/form/control/AphrontFormDividerControl.php', 'AphrontFormDragAndDropUploadControl' => 'view/form/control/AphrontFormDragAndDropUploadControl.php', 'AphrontFormFileControl' => 'view/form/control/AphrontFormFileControl.php', 'AphrontFormImageControl' => 'view/form/control/AphrontFormImageControl.php', 'AphrontFormInsetView' => 'view/form/AphrontFormInsetView.php', 'AphrontFormLayoutView' => 'view/form/AphrontFormLayoutView.php', 'AphrontFormMarkupControl' => 'view/form/control/AphrontFormMarkupControl.php', 'AphrontFormPasswordControl' => 'view/form/control/AphrontFormPasswordControl.php', 'AphrontFormPolicyControl' => 'view/form/control/AphrontFormPolicyControl.php', 'AphrontFormRadioButtonControl' => 'view/form/control/AphrontFormRadioButtonControl.php', 'AphrontFormRecaptchaControl' => 'view/form/control/AphrontFormRecaptchaControl.php', 'AphrontFormSelectControl' => 'view/form/control/AphrontFormSelectControl.php', 'AphrontFormStaticControl' => 'view/form/control/AphrontFormStaticControl.php', 'AphrontFormSubmitControl' => 'view/form/control/AphrontFormSubmitControl.php', 'AphrontFormTextAreaControl' => 'view/form/control/AphrontFormTextAreaControl.php', 'AphrontFormTextControl' => 'view/form/control/AphrontFormTextControl.php', 'AphrontFormToggleButtonsControl' => 'view/form/control/AphrontFormToggleButtonsControl.php', 'AphrontFormTokenizerControl' => 'view/form/control/AphrontFormTokenizerControl.php', 'AphrontFormView' => 'view/form/AphrontFormView.php', 'AphrontHTMLResponse' => 'aphront/response/AphrontHTMLResponse.php', 'AphrontHTTPSink' => 'aphront/sink/AphrontHTTPSink.php', 'AphrontHTTPSinkTestCase' => 'aphront/sink/__tests__/AphrontHTTPSinkTestCase.php', 'AphrontHeadsupActionListView' => 'view/layout/headsup/AphrontHeadsupActionListView.php', 'AphrontHeadsupActionView' => 'view/layout/headsup/AphrontHeadsupActionView.php', 'AphrontHeadsupView' => 'view/layout/headsup/AphrontHeadsupView.php', 'AphrontIsolatedDatabaseConnectionTestCase' => 'infrastructure/storage/__tests__/AphrontIsolatedDatabaseConnectionTestCase.php', 'AphrontIsolatedHTTPSink' => 'aphront/sink/AphrontIsolatedHTTPSink.php', 'AphrontJSONResponse' => 'aphront/response/AphrontJSONResponse.php', 'AphrontJavelinView' => 'view/AphrontJavelinView.php', 'AphrontKeyboardShortcutsAvailableView' => 'view/widget/AphrontKeyboardShortcutsAvailableView.php', 'AphrontListFilterView' => 'view/layout/AphrontListFilterView.php', 'AphrontMiniPanelView' => 'view/layout/AphrontMiniPanelView.php', 'AphrontMoreView' => 'view/layout/AphrontMoreView.php', 'AphrontMySQLDatabaseConnectionTestCase' => 'infrastructure/storage/__tests__/AphrontMySQLDatabaseConnectionTestCase.php', 'AphrontNullView' => 'view/AphrontNullView.php', 'AphrontPHPHTTPSink' => 'aphront/sink/AphrontPHPHTTPSink.php', 'AphrontPageView' => 'view/page/AphrontPageView.php', 'AphrontPagerView' => 'view/control/AphrontPagerView.php', 'AphrontPanelView' => 'view/layout/AphrontPanelView.php', 'AphrontPlainTextResponse' => 'aphront/response/AphrontPlainTextResponse.php', 'AphrontProxyResponse' => 'aphront/response/AphrontProxyResponse.php', 'AphrontRedirectException' => 'aphront/exception/AphrontRedirectException.php', 'AphrontRedirectResponse' => 'aphront/response/AphrontRedirectResponse.php', 'AphrontReloadResponse' => 'aphront/response/AphrontReloadResponse.php', 'AphrontRequest' => 'aphront/AphrontRequest.php', 'AphrontRequestFailureView' => 'view/page/AphrontRequestFailureView.php', 'AphrontRequestTestCase' => 'aphront/__tests__/AphrontRequestTestCase.php', 'AphrontResponse' => 'aphront/response/AphrontResponse.php', 'AphrontSideNavFilterView' => 'view/layout/AphrontSideNavFilterView.php', 'AphrontTableView' => 'view/control/AphrontTableView.php', 'AphrontTagView' => 'view/AphrontTagView.php', 'AphrontTokenizerTemplateView' => 'view/control/AphrontTokenizerTemplateView.php', 'AphrontTypeaheadTemplateView' => 'view/control/AphrontTypeaheadTemplateView.php', 'AphrontURIMapper' => 'aphront/AphrontURIMapper.php', 'AphrontUsageException' => 'aphront/exception/AphrontUsageException.php', 'AphrontView' => 'view/AphrontView.php', 'AphrontWebpageResponse' => 'aphront/response/AphrontWebpageResponse.php', 'CelerityAPI' => 'infrastructure/celerity/CelerityAPI.php', 'CelerityPhabricatorResourceController' => 'infrastructure/celerity/CelerityPhabricatorResourceController.php', 'CelerityResourceController' => 'infrastructure/celerity/CelerityResourceController.php', 'CelerityResourceGraph' => 'infrastructure/celerity/CelerityResourceGraph.php', 'CelerityResourceMap' => 'infrastructure/celerity/CelerityResourceMap.php', 'CelerityResourceTransformer' => 'infrastructure/celerity/CelerityResourceTransformer.php', 'CelerityResourceTransformerTestCase' => 'infrastructure/celerity/__tests__/CelerityResourceTransformerTestCase.php', 'CeleritySpriteGenerator' => 'infrastructure/celerity/CeleritySpriteGenerator.php', 'CelerityStaticResourceResponse' => 'infrastructure/celerity/CelerityStaticResourceResponse.php', 'ConduitAPIMethod' => 'applications/conduit/method/ConduitAPIMethod.php', 'ConduitAPIRequest' => 'applications/conduit/protocol/ConduitAPIRequest.php', 'ConduitAPIResponse' => 'applications/conduit/protocol/ConduitAPIResponse.php', 'ConduitAPI_arcanist_Method' => 'applications/arcanist/conduit/ConduitAPI_arcanist_Method.php', 'ConduitAPI_arcanist_projectinfo_Method' => 'applications/arcanist/conduit/ConduitAPI_arcanist_projectinfo_Method.php', 'ConduitAPI_audit_Method' => 'applications/audit/conduit/ConduitAPI_audit_Method.php', 'ConduitAPI_audit_query_Method' => 'applications/audit/conduit/ConduitAPI_audit_query_Method.php', 'ConduitAPI_chatlog_Method' => 'applications/chatlog/conduit/ConduitAPI_chatlog_Method.php', 'ConduitAPI_chatlog_query_Method' => 'applications/chatlog/conduit/ConduitAPI_chatlog_query_Method.php', 'ConduitAPI_chatlog_record_Method' => 'applications/chatlog/conduit/ConduitAPI_chatlog_record_Method.php', 'ConduitAPI_conduit_connect_Method' => 'applications/conduit/method/ConduitAPI_conduit_connect_Method.php', 'ConduitAPI_conduit_getcertificate_Method' => 'applications/conduit/method/ConduitAPI_conduit_getcertificate_Method.php', 'ConduitAPI_conduit_ping_Method' => 'applications/conduit/method/ConduitAPI_conduit_ping_Method.php', 'ConduitAPI_conduit_query_Method' => 'applications/conduit/method/ConduitAPI_conduit_query_Method.php', 'ConduitAPI_daemon_launched_Method' => 'applications/daemon/conduit/ConduitAPI_daemon_launched_Method.php', 'ConduitAPI_daemon_log_Method' => 'applications/daemon/conduit/ConduitAPI_daemon_log_Method.php', 'ConduitAPI_daemon_setstatus_Method' => 'applications/daemon/conduit/ConduitAPI_daemon_setstatus_Method.php', 'ConduitAPI_differential_Method' => 'applications/differential/conduit/ConduitAPI_differential_Method.php', 'ConduitAPI_differential_close_Method' => 'applications/differential/conduit/ConduitAPI_differential_close_Method.php', 'ConduitAPI_differential_createcomment_Method' => 'applications/differential/conduit/ConduitAPI_differential_createcomment_Method.php', 'ConduitAPI_differential_creatediff_Method' => 'applications/differential/conduit/ConduitAPI_differential_creatediff_Method.php', 'ConduitAPI_differential_createinline_Method' => 'applications/differential/conduit/ConduitAPI_differential_createinline_Method.php', 'ConduitAPI_differential_createrawdiff_Method' => 'applications/differential/conduit/ConduitAPI_differential_createrawdiff_Method.php', 'ConduitAPI_differential_createrevision_Method' => 'applications/differential/conduit/ConduitAPI_differential_createrevision_Method.php', 'ConduitAPI_differential_find_Method' => 'applications/differential/conduit/ConduitAPI_differential_find_Method.php', 'ConduitAPI_differential_finishpostponedlinters_Method' => 'applications/differential/conduit/ConduitAPI_differential_finishpostponedlinters_Method.php', 'ConduitAPI_differential_getalldiffs_Method' => 'applications/differential/conduit/ConduitAPI_differential_getalldiffs_Method.php', 'ConduitAPI_differential_getcommitmessage_Method' => 'applications/differential/conduit/ConduitAPI_differential_getcommitmessage_Method.php', 'ConduitAPI_differential_getcommitpaths_Method' => 'applications/differential/conduit/ConduitAPI_differential_getcommitpaths_Method.php', 'ConduitAPI_differential_getdiff_Method' => 'applications/differential/conduit/ConduitAPI_differential_getdiff_Method.php', 'ConduitAPI_differential_getrevision_Method' => 'applications/differential/conduit/ConduitAPI_differential_getrevision_Method.php', 'ConduitAPI_differential_getrevisioncomments_Method' => 'applications/differential/conduit/ConduitAPI_differential_getrevisioncomments_Method.php', 'ConduitAPI_differential_getrevisionfeedback_Method' => 'applications/differential/conduit/ConduitAPI_differential_getrevisionfeedback_Method.php', 'ConduitAPI_differential_markcommitted_Method' => 'applications/differential/conduit/ConduitAPI_differential_markcommitted_Method.php', 'ConduitAPI_differential_parsecommitmessage_Method' => 'applications/differential/conduit/ConduitAPI_differential_parsecommitmessage_Method.php', 'ConduitAPI_differential_query_Method' => 'applications/differential/conduit/ConduitAPI_differential_query_Method.php', 'ConduitAPI_differential_setdiffproperty_Method' => 'applications/differential/conduit/ConduitAPI_differential_setdiffproperty_Method.php', 'ConduitAPI_differential_updaterevision_Method' => 'applications/differential/conduit/ConduitAPI_differential_updaterevision_Method.php', 'ConduitAPI_differential_updateunitresults_Method' => 'applications/differential/conduit/ConduitAPI_differential_updateunitresults_Method.php', 'ConduitAPI_diffusion_findsymbols_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_findsymbols_Method.php', 'ConduitAPI_diffusion_getcommits_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_getcommits_Method.php', 'ConduitAPI_diffusion_getlintmessages_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_getlintmessages_Method.php', 'ConduitAPI_diffusion_getrecentcommitsbypath_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_getrecentcommitsbypath_Method.php', 'ConduitAPI_feed_publish_Method' => 'applications/feed/conduit/ConduitAPI_feed_publish_Method.php', 'ConduitAPI_feed_query_Method' => 'applications/feed/conduit/ConduitAPI_feed_query_Method.php', 'ConduitAPI_file_download_Method' => 'applications/files/conduit/ConduitAPI_file_download_Method.php', 'ConduitAPI_file_info_Method' => 'applications/files/conduit/ConduitAPI_file_info_Method.php', 'ConduitAPI_file_upload_Method' => 'applications/files/conduit/ConduitAPI_file_upload_Method.php', 'ConduitAPI_flag_Method' => 'applications/flag/conduit/ConduitAPI_flag_Method.php', 'ConduitAPI_flag_delete_Method' => 'applications/flag/conduit/ConduitAPI_flag_delete_Method.php', 'ConduitAPI_flag_edit_Method' => 'applications/flag/conduit/ConduitAPI_flag_edit_Method.php', 'ConduitAPI_flag_query_Method' => 'applications/flag/conduit/ConduitAPI_flag_query_Method.php', 'ConduitAPI_macro_Method' => 'applications/macro/conduit/ConduitAPI_macro_Method.php', 'ConduitAPI_macro_query_Method' => 'applications/macro/conduit/ConduitAPI_macro_query_Method.php', 'ConduitAPI_maniphest_Method' => 'applications/maniphest/conduit/ConduitAPI_maniphest_Method.php', 'ConduitAPI_maniphest_createtask_Method' => 'applications/maniphest/conduit/ConduitAPI_maniphest_createtask_Method.php', 'ConduitAPI_maniphest_find_Method' => 'applications/maniphest/conduit/ConduitAPI_maniphest_find_Method.php', 'ConduitAPI_maniphest_gettasktransactions_Method' => 'applications/maniphest/conduit/ConduitAPI_maniphest_gettasktransactions_Method.php', 'ConduitAPI_maniphest_info_Method' => 'applications/maniphest/conduit/ConduitAPI_maniphest_info_Method.php', 'ConduitAPI_maniphest_query_Method' => 'applications/maniphest/conduit/ConduitAPI_maniphest_query_Method.php', 'ConduitAPI_maniphest_update_Method' => 'applications/maniphest/conduit/ConduitAPI_maniphest_update_Method.php', 'ConduitAPI_owners_query_Method' => 'applications/owners/conduit/ConduitAPI_owners_query_Method.php', 'ConduitAPI_paste_Method' => 'applications/paste/conduit/ConduitAPI_paste_Method.php', 'ConduitAPI_paste_create_Method' => 'applications/paste/conduit/ConduitAPI_paste_create_Method.php', 'ConduitAPI_paste_info_Method' => 'applications/paste/conduit/ConduitAPI_paste_info_Method.php', 'ConduitAPI_paste_query_Method' => 'applications/paste/conduit/ConduitAPI_paste_query_Method.php', 'ConduitAPI_phid_Method' => 'applications/phid/conduit/ConduitAPI_phid_Method.php', 'ConduitAPI_phid_info_Method' => 'applications/phid/conduit/ConduitAPI_phid_info_Method.php', 'ConduitAPI_phid_lookup_Method' => 'applications/phid/conduit/ConduitAPI_phid_lookup_Method.php', 'ConduitAPI_phid_query_Method' => 'applications/phid/conduit/ConduitAPI_phid_query_Method.php', 'ConduitAPI_phpast_getast_Method' => 'applications/phpast/conduit/ConduitAPI_phpast_getast_Method.php', 'ConduitAPI_phpast_version_Method' => 'applications/phpast/conduit/ConduitAPI_phpast_version_Method.php', 'ConduitAPI_phriction_Method' => 'applications/phriction/conduit/ConduitAPI_phriction_Method.php', 'ConduitAPI_phriction_edit_Method' => 'applications/phriction/conduit/ConduitAPI_phriction_edit_Method.php', 'ConduitAPI_phriction_history_Method' => 'applications/phriction/conduit/ConduitAPI_phriction_history_Method.php', 'ConduitAPI_phriction_info_Method' => 'applications/phriction/conduit/ConduitAPI_phriction_info_Method.php', 'ConduitAPI_project_Method' => 'applications/project/conduit/ConduitAPI_project_Method.php', 'ConduitAPI_project_query_Method' => 'applications/project/conduit/ConduitAPI_project_query_Method.php', 'ConduitAPI_remarkup_process_Method' => 'applications/remarkup/conduit/ConduitAPI_remarkup_process_Method.php', 'ConduitAPI_repository_Method' => 'applications/repository/conduit/ConduitAPI_repository_Method.php', 'ConduitAPI_repository_create_Method' => 'applications/repository/conduit/ConduitAPI_repository_create_Method.php', 'ConduitAPI_repository_query_Method' => 'applications/repository/conduit/ConduitAPI_repository_query_Method.php', 'ConduitAPI_slowvote_info_Method' => 'applications/slowvote/conduit/ConduitAPI_slowvote_info_Method.php', 'ConduitAPI_user_Method' => 'applications/people/conduit/ConduitAPI_user_Method.php', 'ConduitAPI_user_addstatus_Method' => 'applications/people/conduit/ConduitAPI_user_addstatus_Method.php', 'ConduitAPI_user_disable_Method' => 'applications/people/conduit/ConduitAPI_user_disable_Method.php', 'ConduitAPI_user_enable_Method' => 'applications/people/conduit/ConduitAPI_user_enable_Method.php', 'ConduitAPI_user_find_Method' => 'applications/people/conduit/ConduitAPI_user_find_Method.php', 'ConduitAPI_user_info_Method' => 'applications/people/conduit/ConduitAPI_user_info_Method.php', 'ConduitAPI_user_query_Method' => 'applications/people/conduit/ConduitAPI_user_query_Method.php', 'ConduitAPI_user_removestatus_Method' => 'applications/people/conduit/ConduitAPI_user_removestatus_Method.php', 'ConduitAPI_user_whoami_Method' => 'applications/people/conduit/ConduitAPI_user_whoami_Method.php', 'ConduitCall' => 'applications/conduit/call/ConduitCall.php', 'ConduitCallTestCase' => 'applications/conduit/call/__tests__/ConduitCallTestCase.php', 'ConduitException' => 'applications/conduit/protocol/ConduitException.php', 'ConduitSSHWorkflow' => 'applications/conduit/ssh/ConduitSSHWorkflow.php', 'ConpherenceConfigOptions' => 'applications/conpherence/config/ConpherenceConfigOptions.php', 'ConpherenceConstants' => 'applications/conpherence/constants/ConpherenceConstants.php', 'ConpherenceController' => 'applications/conpherence/controller/ConpherenceController.php', 'ConpherenceDAO' => 'applications/conpherence/storage/ConpherenceDAO.php', 'ConpherenceEditor' => 'applications/conpherence/editor/ConpherenceEditor.php', 'ConpherenceListController' => 'applications/conpherence/controller/ConpherenceListController.php', 'ConpherenceMenuItemView' => 'applications/conpherence/view/ConpherenceMenuItemView.php', 'ConpherenceNewController' => 'applications/conpherence/controller/ConpherenceNewController.php', 'ConpherenceParticipant' => 'applications/conpherence/storage/ConpherenceParticipant.php', 'ConpherenceParticipantQuery' => 'applications/conpherence/query/ConpherenceParticipantQuery.php', 'ConpherenceParticipationStatus' => 'applications/conpherence/constants/ConpherenceParticipationStatus.php', 'ConpherenceReplyHandler' => 'applications/conpherence/mail/ConpherenceReplyHandler.php', 'ConpherenceThread' => 'applications/conpherence/storage/ConpherenceThread.php', 'ConpherenceThreadQuery' => 'applications/conpherence/query/ConpherenceThreadQuery.php', 'ConpherenceTransaction' => 'applications/conpherence/storage/ConpherenceTransaction.php', 'ConpherenceTransactionComment' => 'applications/conpherence/storage/ConpherenceTransactionComment.php', 'ConpherenceTransactionQuery' => 'applications/conpherence/query/ConpherenceTransactionQuery.php', 'ConpherenceTransactionType' => 'applications/conpherence/constants/ConpherenceTransactionType.php', 'ConpherenceTransactionView' => 'applications/conpherence/view/ConpherenceTransactionView.php', 'ConpherenceUpdateController' => 'applications/conpherence/controller/ConpherenceUpdateController.php', 'ConpherenceViewController' => 'applications/conpherence/controller/ConpherenceViewController.php', 'DarkConsoleController' => 'aphront/console/DarkConsoleController.php', 'DarkConsoleCore' => 'aphront/console/DarkConsoleCore.php', 'DarkConsoleDataController' => 'aphront/console/DarkConsoleDataController.php', 'DarkConsoleErrorLogPlugin' => 'aphront/console/plugin/DarkConsoleErrorLogPlugin.php', 'DarkConsoleErrorLogPluginAPI' => 'aphront/console/plugin/errorlog/DarkConsoleErrorLogPluginAPI.php', 'DarkConsoleEventPlugin' => 'aphront/console/plugin/DarkConsoleEventPlugin.php', 'DarkConsoleEventPluginAPI' => 'aphront/console/plugin/event/DarkConsoleEventPluginAPI.php', 'DarkConsolePlugin' => 'aphront/console/plugin/DarkConsolePlugin.php', 'DarkConsoleRequestPlugin' => 'aphront/console/plugin/DarkConsoleRequestPlugin.php', 'DarkConsoleServicesPlugin' => 'aphront/console/plugin/DarkConsoleServicesPlugin.php', 'DarkConsoleXHProfPlugin' => 'aphront/console/plugin/DarkConsoleXHProfPlugin.php', 'DarkConsoleXHProfPluginAPI' => 'aphront/console/plugin/xhprof/DarkConsoleXHProfPluginAPI.php', 'DatabaseConfigurationProvider' => 'infrastructure/storage/configuration/DatabaseConfigurationProvider.php', 'DefaultDatabaseConfigurationProvider' => 'infrastructure/storage/configuration/DefaultDatabaseConfigurationProvider.php', 'DifferentialAction' => 'applications/differential/constants/DifferentialAction.php', 'DifferentialActionHasNoEffectException' => 'applications/differential/exception/DifferentialActionHasNoEffectException.php', 'DifferentialAddCommentView' => 'applications/differential/view/DifferentialAddCommentView.php', 'DifferentialAffectedPath' => 'applications/differential/storage/DifferentialAffectedPath.php', 'DifferentialApplyPatchFieldSpecification' => 'applications/differential/field/specification/DifferentialApplyPatchFieldSpecification.php', 'DifferentialArcanistProjectFieldSpecification' => 'applications/differential/field/specification/DifferentialArcanistProjectFieldSpecification.php', 'DifferentialAuditorsFieldSpecification' => 'applications/differential/field/specification/DifferentialAuditorsFieldSpecification.php', 'DifferentialAuthorFieldSpecification' => 'applications/differential/field/specification/DifferentialAuthorFieldSpecification.php', 'DifferentialAuxiliaryField' => 'applications/differential/storage/DifferentialAuxiliaryField.php', 'DifferentialBlameRevisionFieldSpecification' => 'applications/differential/field/specification/DifferentialBlameRevisionFieldSpecification.php', 'DifferentialBranchFieldSpecification' => 'applications/differential/field/specification/DifferentialBranchFieldSpecification.php', 'DifferentialCCWelcomeMail' => 'applications/differential/mail/DifferentialCCWelcomeMail.php', 'DifferentialCCsFieldSpecification' => 'applications/differential/field/specification/DifferentialCCsFieldSpecification.php', 'DifferentialChangeType' => 'applications/differential/constants/DifferentialChangeType.php', 'DifferentialChangeset' => 'applications/differential/storage/DifferentialChangeset.php', 'DifferentialChangesetDetailView' => 'applications/differential/view/DifferentialChangesetDetailView.php', 'DifferentialChangesetFileTreeSideNavBuilder' => 'applications/differential/view/DifferentialChangesetFileTreeSideNavBuilder.php', 'DifferentialChangesetHTMLRenderer' => 'applications/differential/render/DifferentialChangesetHTMLRenderer.php', 'DifferentialChangesetListView' => 'applications/differential/view/DifferentialChangesetListView.php', 'DifferentialChangesetOneUpRenderer' => 'applications/differential/render/DifferentialChangesetOneUpRenderer.php', 'DifferentialChangesetOneUpTestRenderer' => 'applications/differential/render/DifferentialChangesetOneUpTestRenderer.php', 'DifferentialChangesetParser' => 'applications/differential/parser/DifferentialChangesetParser.php', 'DifferentialChangesetParserTestCase' => 'applications/differential/parser/__tests__/DifferentialChangesetParserTestCase.php', 'DifferentialChangesetRenderer' => 'applications/differential/render/DifferentialChangesetRenderer.php', 'DifferentialChangesetTestRenderer' => 'applications/differential/render/DifferentialChangesetTestRenderer.php', 'DifferentialChangesetTwoUpRenderer' => 'applications/differential/render/DifferentialChangesetTwoUpRenderer.php', 'DifferentialChangesetTwoUpTestRenderer' => 'applications/differential/render/DifferentialChangesetTwoUpTestRenderer.php', 'DifferentialChangesetViewController' => 'applications/differential/controller/DifferentialChangesetViewController.php', 'DifferentialComment' => 'applications/differential/storage/DifferentialComment.php', 'DifferentialCommentEditor' => 'applications/differential/editor/DifferentialCommentEditor.php', 'DifferentialCommentMail' => 'applications/differential/mail/DifferentialCommentMail.php', 'DifferentialCommentPreviewController' => 'applications/differential/controller/DifferentialCommentPreviewController.php', 'DifferentialCommentSaveController' => 'applications/differential/controller/DifferentialCommentSaveController.php', 'DifferentialCommitsFieldSpecification' => 'applications/differential/field/specification/DifferentialCommitsFieldSpecification.php', 'DifferentialConflictsFieldSpecification' => 'applications/differential/field/specification/DifferentialConflictsFieldSpecification.php', 'DifferentialController' => 'applications/differential/controller/DifferentialController.php', 'DifferentialDAO' => 'applications/differential/storage/DifferentialDAO.php', 'DifferentialDateCreatedFieldSpecification' => 'applications/differential/field/specification/DifferentialDateCreatedFieldSpecification.php', 'DifferentialDateModifiedFieldSpecification' => 'applications/differential/field/specification/DifferentialDateModifiedFieldSpecification.php', 'DifferentialDefaultFieldSelector' => 'applications/differential/field/selector/DifferentialDefaultFieldSelector.php', 'DifferentialDependenciesFieldSpecification' => 'applications/differential/field/specification/DifferentialDependenciesFieldSpecification.php', 'DifferentialDependsOnFieldSpecification' => 'applications/differential/field/specification/DifferentialDependsOnFieldSpecification.php', 'DifferentialDiff' => 'applications/differential/storage/DifferentialDiff.php', 'DifferentialDiffContentMail' => 'applications/differential/mail/DifferentialDiffContentMail.php', 'DifferentialDiffCreateController' => 'applications/differential/controller/DifferentialDiffCreateController.php', 'DifferentialDiffProperty' => 'applications/differential/storage/DifferentialDiffProperty.php', 'DifferentialDiffTableOfContentsView' => 'applications/differential/view/DifferentialDiffTableOfContentsView.php', 'DifferentialDiffTestCase' => 'applications/differential/storage/__tests__/DifferentialDiffTestCase.php', 'DifferentialDiffViewController' => 'applications/differential/controller/DifferentialDiffViewController.php', 'DifferentialException' => 'applications/differential/exception/DifferentialException.php', 'DifferentialExceptionMail' => 'applications/differential/mail/DifferentialExceptionMail.php', 'DifferentialExportPatchFieldSpecification' => 'applications/differential/field/specification/DifferentialExportPatchFieldSpecification.php', 'DifferentialFieldDataNotAvailableException' => 'applications/differential/field/exception/DifferentialFieldDataNotAvailableException.php', 'DifferentialFieldParseException' => 'applications/differential/field/exception/DifferentialFieldParseException.php', 'DifferentialFieldSelector' => 'applications/differential/field/selector/DifferentialFieldSelector.php', 'DifferentialFieldSpecification' => 'applications/differential/field/specification/DifferentialFieldSpecification.php', 'DifferentialFieldSpecificationIncompleteException' => 'applications/differential/field/exception/DifferentialFieldSpecificationIncompleteException.php', 'DifferentialFieldValidationException' => 'applications/differential/field/exception/DifferentialFieldValidationException.php', 'DifferentialFreeformFieldSpecification' => 'applications/differential/field/specification/DifferentialFreeformFieldSpecification.php', 'DifferentialGitSVNIDFieldSpecification' => 'applications/differential/field/specification/DifferentialGitSVNIDFieldSpecification.php', 'DifferentialHostFieldSpecification' => 'applications/differential/field/specification/DifferentialHostFieldSpecification.php', 'DifferentialHunk' => 'applications/differential/storage/DifferentialHunk.php', 'DifferentialHunkParser' => 'applications/differential/parser/DifferentialHunkParser.php', 'DifferentialHunkParserTestCase' => 'applications/differential/parser/__tests__/DifferentialHunkParserTestCase.php', 'DifferentialHunkTestCase' => 'applications/differential/storage/__tests__/DifferentialHunkTestCase.php', 'DifferentialInlineComment' => 'applications/differential/storage/DifferentialInlineComment.php', 'DifferentialInlineCommentEditController' => 'applications/differential/controller/DifferentialInlineCommentEditController.php', 'DifferentialInlineCommentEditView' => 'applications/differential/view/DifferentialInlineCommentEditView.php', 'DifferentialInlineCommentPreviewController' => 'applications/differential/controller/DifferentialInlineCommentPreviewController.php', 'DifferentialInlineCommentView' => 'applications/differential/view/DifferentialInlineCommentView.php', 'DifferentialLinesFieldSpecification' => 'applications/differential/field/specification/DifferentialLinesFieldSpecification.php', 'DifferentialLintFieldSpecification' => 'applications/differential/field/specification/DifferentialLintFieldSpecification.php', 'DifferentialLintStatus' => 'applications/differential/constants/DifferentialLintStatus.php', 'DifferentialLocalCommitsView' => 'applications/differential/view/DifferentialLocalCommitsView.php', 'DifferentialMail' => 'applications/differential/mail/DifferentialMail.php', 'DifferentialMailPhase' => 'applications/differential/constants/DifferentialMailPhase.php', 'DifferentialManiphestTasksFieldSpecification' => 'applications/differential/field/specification/DifferentialManiphestTasksFieldSpecification.php', 'DifferentialNewDiffMail' => 'applications/differential/mail/DifferentialNewDiffMail.php', 'DifferentialParseRenderTestCase' => 'applications/differential/__tests__/DifferentialParseRenderTestCase.php', 'DifferentialPathFieldSpecification' => 'applications/differential/field/specification/DifferentialPathFieldSpecification.php', 'DifferentialPrimaryPaneView' => 'applications/differential/view/DifferentialPrimaryPaneView.php', 'DifferentialReplyHandler' => 'applications/differential/DifferentialReplyHandler.php', 'DifferentialResultsTableView' => 'applications/differential/view/DifferentialResultsTableView.php', 'DifferentialRevertPlanFieldSpecification' => 'applications/differential/field/specification/DifferentialRevertPlanFieldSpecification.php', 'DifferentialReviewRequestMail' => 'applications/differential/mail/DifferentialReviewRequestMail.php', 'DifferentialReviewedByFieldSpecification' => 'applications/differential/field/specification/DifferentialReviewedByFieldSpecification.php', 'DifferentialReviewerStats' => 'applications/differential/stats/DifferentialReviewerStats.php', 'DifferentialReviewerStatsTestCase' => 'applications/differential/stats/__tests__/DifferentialReviewerStatsTestCase.php', 'DifferentialReviewersFieldSpecification' => 'applications/differential/field/specification/DifferentialReviewersFieldSpecification.php', 'DifferentialRevision' => 'applications/differential/storage/DifferentialRevision.php', 'DifferentialRevisionCommentListView' => 'applications/differential/view/DifferentialRevisionCommentListView.php', 'DifferentialRevisionCommentView' => 'applications/differential/view/DifferentialRevisionCommentView.php', 'DifferentialRevisionControlSystem' => 'applications/differential/constants/DifferentialRevisionControlSystem.php', 'DifferentialRevisionDetailRenderer' => 'applications/differential/controller/DifferentialRevisionDetailRenderer.php', 'DifferentialRevisionDetailView' => 'applications/differential/view/DifferentialRevisionDetailView.php', 'DifferentialRevisionEditController' => 'applications/differential/controller/DifferentialRevisionEditController.php', 'DifferentialRevisionEditor' => 'applications/differential/editor/DifferentialRevisionEditor.php', 'DifferentialRevisionIDFieldParserTestCase' => 'applications/differential/field/specification/__tests__/DifferentialRevisionIDFieldParserTestCase.php', 'DifferentialRevisionIDFieldSpecification' => 'applications/differential/field/specification/DifferentialRevisionIDFieldSpecification.php', 'DifferentialRevisionListController' => 'applications/differential/controller/DifferentialRevisionListController.php', 'DifferentialRevisionListData' => 'applications/differential/data/DifferentialRevisionListData.php', 'DifferentialRevisionListView' => 'applications/differential/view/DifferentialRevisionListView.php', 'DifferentialRevisionQuery' => 'applications/differential/query/DifferentialRevisionQuery.php', 'DifferentialRevisionStatsController' => 'applications/differential/controller/DifferentialRevisionStatsController.php', 'DifferentialRevisionStatsView' => 'applications/differential/view/DifferentialRevisionStatsView.php', 'DifferentialRevisionStatus' => 'applications/differential/constants/DifferentialRevisionStatus.php', 'DifferentialRevisionStatusFieldSpecification' => 'applications/differential/field/specification/DifferentialRevisionStatusFieldSpecification.php', 'DifferentialRevisionUpdateHistoryView' => 'applications/differential/view/DifferentialRevisionUpdateHistoryView.php', 'DifferentialRevisionViewController' => 'applications/differential/controller/DifferentialRevisionViewController.php', 'DifferentialSearchIndexer' => 'applications/differential/search/DifferentialSearchIndexer.php', 'DifferentialSubscribeController' => 'applications/differential/controller/DifferentialSubscribeController.php', 'DifferentialSummaryFieldSpecification' => 'applications/differential/field/specification/DifferentialSummaryFieldSpecification.php', 'DifferentialTasksAttacher' => 'applications/differential/DifferentialTasksAttacher.php', 'DifferentialTestPlanFieldSpecification' => 'applications/differential/field/specification/DifferentialTestPlanFieldSpecification.php', 'DifferentialTitleFieldSpecification' => 'applications/differential/field/specification/DifferentialTitleFieldSpecification.php', 'DifferentialUnitFieldSpecification' => 'applications/differential/field/specification/DifferentialUnitFieldSpecification.php', 'DifferentialUnitStatus' => 'applications/differential/constants/DifferentialUnitStatus.php', 'DifferentialUnitTestResult' => 'applications/differential/constants/DifferentialUnitTestResult.php', 'DiffusionBranchInformation' => 'applications/diffusion/data/DiffusionBranchInformation.php', 'DiffusionBranchQuery' => 'applications/diffusion/query/branch/DiffusionBranchQuery.php', 'DiffusionBranchTableController' => 'applications/diffusion/controller/DiffusionBranchTableController.php', 'DiffusionBranchTableView' => 'applications/diffusion/view/DiffusionBranchTableView.php', 'DiffusionBrowseController' => 'applications/diffusion/controller/DiffusionBrowseController.php', 'DiffusionBrowseFileController' => 'applications/diffusion/controller/DiffusionBrowseFileController.php', 'DiffusionBrowseQuery' => 'applications/diffusion/query/browse/DiffusionBrowseQuery.php', 'DiffusionBrowseTableView' => 'applications/diffusion/view/DiffusionBrowseTableView.php', 'DiffusionChangeController' => 'applications/diffusion/controller/DiffusionChangeController.php', 'DiffusionCommentListView' => 'applications/diffusion/view/DiffusionCommentListView.php', 'DiffusionCommentView' => 'applications/diffusion/view/DiffusionCommentView.php', 'DiffusionCommitBranchesController' => 'applications/diffusion/controller/DiffusionCommitBranchesController.php', 'DiffusionCommitChangeTableView' => 'applications/diffusion/view/DiffusionCommitChangeTableView.php', 'DiffusionCommitController' => 'applications/diffusion/controller/DiffusionCommitController.php', 'DiffusionCommitEditController' => 'applications/diffusion/controller/DiffusionCommitEditController.php', 'DiffusionCommitParentsQuery' => 'applications/diffusion/query/parents/DiffusionCommitParentsQuery.php', 'DiffusionCommitTagsController' => 'applications/diffusion/controller/DiffusionCommitTagsController.php', 'DiffusionCommitTagsQuery' => 'applications/diffusion/query/committags/DiffusionCommitTagsQuery.php', 'DiffusionContainsQuery' => 'applications/diffusion/query/contains/DiffusionContainsQuery.php', 'DiffusionController' => 'applications/diffusion/controller/DiffusionController.php', 'DiffusionDiffController' => 'applications/diffusion/controller/DiffusionDiffController.php', 'DiffusionDiffQuery' => 'applications/diffusion/query/diff/DiffusionDiffQuery.php', 'DiffusionEmptyResultView' => 'applications/diffusion/view/DiffusionEmptyResultView.php', 'DiffusionExistsQuery' => 'applications/diffusion/query/exists/DiffusionExistsQuery.php', 'DiffusionExternalController' => 'applications/diffusion/controller/DiffusionExternalController.php', 'DiffusionFileContent' => 'applications/diffusion/data/DiffusionFileContent.php', 'DiffusionFileContentQuery' => 'applications/diffusion/query/filecontent/DiffusionFileContentQuery.php', 'DiffusionGitBranchQuery' => 'applications/diffusion/query/branch/DiffusionGitBranchQuery.php', 'DiffusionGitBranchQueryTestCase' => 'applications/diffusion/query/branch/__tests__/DiffusionGitBranchQueryTestCase.php', 'DiffusionGitBrowseQuery' => 'applications/diffusion/query/browse/DiffusionGitBrowseQuery.php', 'DiffusionGitCommitParentsQuery' => 'applications/diffusion/query/parents/DiffusionGitCommitParentsQuery.php', 'DiffusionGitCommitTagsQuery' => 'applications/diffusion/query/committags/DiffusionGitCommitTagsQuery.php', 'DiffusionGitContainsQuery' => 'applications/diffusion/query/contains/DiffusionGitContainsQuery.php', 'DiffusionGitDiffQuery' => 'applications/diffusion/query/diff/DiffusionGitDiffQuery.php', 'DiffusionGitExistsQuery' => 'applications/diffusion/query/exists/DiffusionGitExistsQuery.php', 'DiffusionGitFileContentQuery' => 'applications/diffusion/query/filecontent/DiffusionGitFileContentQuery.php', 'DiffusionGitHistoryQuery' => 'applications/diffusion/query/history/DiffusionGitHistoryQuery.php', 'DiffusionGitLastModifiedQuery' => 'applications/diffusion/query/lastmodified/DiffusionGitLastModifiedQuery.php', 'DiffusionGitMergedCommitsQuery' => 'applications/diffusion/query/mergedcommits/DiffusionGitMergedCommitsQuery.php', 'DiffusionGitRawDiffQuery' => 'applications/diffusion/query/rawdiff/DiffusionGitRawDiffQuery.php', 'DiffusionGitRequest' => 'applications/diffusion/request/DiffusionGitRequest.php', 'DiffusionGitTagListQuery' => 'applications/diffusion/query/taglist/DiffusionGitTagListQuery.php', 'DiffusionHistoryController' => 'applications/diffusion/controller/DiffusionHistoryController.php', 'DiffusionHistoryQuery' => 'applications/diffusion/query/history/DiffusionHistoryQuery.php', 'DiffusionHistoryTableView' => 'applications/diffusion/view/DiffusionHistoryTableView.php', 'DiffusionHomeController' => 'applications/diffusion/controller/DiffusionHomeController.php', 'DiffusionInlineCommentController' => 'applications/diffusion/controller/DiffusionInlineCommentController.php', 'DiffusionInlineCommentPreviewController' => 'applications/diffusion/controller/DiffusionInlineCommentPreviewController.php', 'DiffusionLastModifiedController' => 'applications/diffusion/controller/DiffusionLastModifiedController.php', 'DiffusionLastModifiedQuery' => 'applications/diffusion/query/lastmodified/DiffusionLastModifiedQuery.php', 'DiffusionLintController' => 'applications/diffusion/controller/DiffusionLintController.php', 'DiffusionLintDetailsController' => 'applications/diffusion/controller/DiffusionLintDetailsController.php', 'DiffusionLintSaveRunner' => 'applications/diffusion/DiffusionLintSaveRunner.php', 'DiffusionMercurialBranchQuery' => 'applications/diffusion/query/branch/DiffusionMercurialBranchQuery.php', 'DiffusionMercurialBrowseQuery' => 'applications/diffusion/query/browse/DiffusionMercurialBrowseQuery.php', 'DiffusionMercurialCommitParentsQuery' => 'applications/diffusion/query/parents/DiffusionMercurialCommitParentsQuery.php', 'DiffusionMercurialCommitTagsQuery' => 'applications/diffusion/query/committags/DiffusionMercurialCommitTagsQuery.php', 'DiffusionMercurialContainsQuery' => 'applications/diffusion/query/contains/DiffusionMercurialContainsQuery.php', 'DiffusionMercurialDiffQuery' => 'applications/diffusion/query/diff/DiffusionMercurialDiffQuery.php', 'DiffusionMercurialExistsQuery' => 'applications/diffusion/query/exists/DiffusionMercurialExistsQuery.php', 'DiffusionMercurialFileContentQuery' => 'applications/diffusion/query/filecontent/DiffusionMercurialFileContentQuery.php', 'DiffusionMercurialHistoryQuery' => 'applications/diffusion/query/history/DiffusionMercurialHistoryQuery.php', 'DiffusionMercurialLastModifiedQuery' => 'applications/diffusion/query/lastmodified/DiffusionMercurialLastModifiedQuery.php', 'DiffusionMercurialMergedCommitsQuery' => 'applications/diffusion/query/mergedcommits/DiffusionMercurialMergedCommitsQuery.php', 'DiffusionMercurialRawDiffQuery' => 'applications/diffusion/query/rawdiff/DiffusionMercurialRawDiffQuery.php', 'DiffusionMercurialRequest' => 'applications/diffusion/request/DiffusionMercurialRequest.php', 'DiffusionMercurialTagListQuery' => 'applications/diffusion/query/taglist/DiffusionMercurialTagListQuery.php', 'DiffusionMergedCommitsQuery' => 'applications/diffusion/query/mergedcommits/DiffusionMergedCommitsQuery.php', 'DiffusionPathChange' => 'applications/diffusion/data/DiffusionPathChange.php', 'DiffusionPathChangeQuery' => 'applications/diffusion/query/pathchange/DiffusionPathChangeQuery.php', 'DiffusionPathCompleteController' => 'applications/diffusion/controller/DiffusionPathCompleteController.php', 'DiffusionPathIDQuery' => 'applications/diffusion/query/pathid/DiffusionPathIDQuery.php', 'DiffusionPathQuery' => 'applications/diffusion/query/DiffusionPathQuery.php', 'DiffusionPathQueryTestCase' => 'applications/diffusion/query/pathid/__tests__/DiffusionPathQueryTestCase.php', 'DiffusionPathValidateController' => 'applications/diffusion/controller/DiffusionPathValidateController.php', 'DiffusionQuery' => 'applications/diffusion/query/DiffusionQuery.php', 'DiffusionRawDiffQuery' => 'applications/diffusion/query/rawdiff/DiffusionRawDiffQuery.php', 'DiffusionRenameHistoryQuery' => 'applications/diffusion/query/DiffusionRenameHistoryQuery.php', 'DiffusionRepositoryController' => 'applications/diffusion/controller/DiffusionRepositoryController.php', 'DiffusionRepositoryPath' => 'applications/diffusion/data/DiffusionRepositoryPath.php', 'DiffusionRepositoryTag' => 'applications/diffusion/DiffusionRepositoryTag.php', 'DiffusionRequest' => 'applications/diffusion/request/DiffusionRequest.php', 'DiffusionSetupException' => 'applications/diffusion/exception/DiffusionSetupException.php', 'DiffusionSvnBrowseQuery' => 'applications/diffusion/query/browse/DiffusionSvnBrowseQuery.php', 'DiffusionSvnCommitParentsQuery' => 'applications/diffusion/query/parents/DiffusionSvnCommitParentsQuery.php', 'DiffusionSvnCommitTagsQuery' => 'applications/diffusion/query/committags/DiffusionSvnCommitTagsQuery.php', 'DiffusionSvnContainsQuery' => 'applications/diffusion/query/contains/DiffusionSvnContainsQuery.php', 'DiffusionSvnDiffQuery' => 'applications/diffusion/query/diff/DiffusionSvnDiffQuery.php', 'DiffusionSvnExistsQuery' => 'applications/diffusion/query/exists/DiffusionSvnExistsQuery.php', 'DiffusionSvnFileContentQuery' => 'applications/diffusion/query/filecontent/DiffusionSvnFileContentQuery.php', 'DiffusionSvnHistoryQuery' => 'applications/diffusion/query/history/DiffusionSvnHistoryQuery.php', 'DiffusionSvnLastModifiedQuery' => 'applications/diffusion/query/lastmodified/DiffusionSvnLastModifiedQuery.php', 'DiffusionSvnMergedCommitsQuery' => 'applications/diffusion/query/mergedcommits/DiffusionSvnMergedCommitsQuery.php', 'DiffusionSvnRawDiffQuery' => 'applications/diffusion/query/rawdiff/DiffusionSvnRawDiffQuery.php', 'DiffusionSvnRequest' => 'applications/diffusion/request/DiffusionSvnRequest.php', 'DiffusionSvnTagListQuery' => 'applications/diffusion/query/taglist/DiffusionSvnTagListQuery.php', 'DiffusionSymbolController' => 'applications/diffusion/controller/DiffusionSymbolController.php', 'DiffusionSymbolQuery' => 'applications/diffusion/query/DiffusionSymbolQuery.php', 'DiffusionTagListController' => 'applications/diffusion/controller/DiffusionTagListController.php', 'DiffusionTagListQuery' => 'applications/diffusion/query/taglist/DiffusionTagListQuery.php', 'DiffusionTagListView' => 'applications/diffusion/view/DiffusionTagListView.php', 'DiffusionURITestCase' => 'applications/diffusion/request/__tests__/DiffusionURITestCase.php', 'DiffusionView' => 'applications/diffusion/view/DiffusionView.php', 'DivinerArticleAtomizer' => 'applications/diviner/atomizer/DivinerArticleAtomizer.php', 'DivinerAtom' => 'applications/diviner/atom/DivinerAtom.php', 'DivinerAtomCache' => 'applications/diviner/cache/DivinerAtomCache.php', 'DivinerAtomRef' => 'applications/diviner/atom/DivinerAtomRef.php', 'DivinerAtomizeWorkflow' => 'applications/diviner/workflow/DivinerAtomizeWorkflow.php', 'DivinerAtomizer' => 'applications/diviner/atomizer/DivinerAtomizer.php', 'DivinerFileAtomizer' => 'applications/diviner/atomizer/DivinerFileAtomizer.php', 'DivinerGenerateWorkflow' => 'applications/diviner/workflow/DivinerGenerateWorkflow.php', 'DivinerListController' => 'applications/diviner/controller/DivinerListController.php', 'DivinerWorkflow' => 'applications/diviner/workflow/DivinerWorkflow.php', 'DrydockAllocatorWorker' => 'applications/drydock/worker/DrydockAllocatorWorker.php', 'DrydockApacheWebrootInterface' => 'applications/drydock/interface/webroot/DrydockApacheWebrootInterface.php', 'DrydockBlueprint' => 'applications/drydock/blueprint/DrydockBlueprint.php', 'DrydockBlueprintScopeGuard' => 'applications/drydock/util/DrydockBlueprintScopeGuard.php', 'DrydockCommandInterface' => 'applications/drydock/interface/command/DrydockCommandInterface.php', 'DrydockConstants' => 'applications/drydock/constants/DrydockConstants.php', 'DrydockController' => 'applications/drydock/controller/DrydockController.php', 'DrydockDAO' => 'applications/drydock/storage/DrydockDAO.php', 'DrydockInterface' => 'applications/drydock/interface/DrydockInterface.php', 'DrydockLease' => 'applications/drydock/storage/DrydockLease.php', 'DrydockLeaseListController' => 'applications/drydock/controller/DrydockLeaseListController.php', 'DrydockLeaseQuery' => 'applications/drydock/query/DrydockLeaseQuery.php', 'DrydockLeaseReleaseController' => 'applications/drydock/controller/DrydockLeaseReleaseController.php', 'DrydockLeaseStatus' => 'applications/drydock/constants/DrydockLeaseStatus.php', 'DrydockLeaseViewController' => 'applications/drydock/controller/DrydockLeaseViewController.php', 'DrydockLocalCommandInterface' => 'applications/drydock/interface/command/DrydockLocalCommandInterface.php', 'DrydockLocalHostBlueprint' => 'applications/drydock/blueprint/DrydockLocalHostBlueprint.php', 'DrydockLog' => 'applications/drydock/storage/DrydockLog.php', 'DrydockLogController' => 'applications/drydock/controller/DrydockLogController.php', 'DrydockLogQuery' => 'applications/drydock/query/DrydockLogQuery.php', 'DrydockManagementCloseWorkflow' => 'applications/drydock/management/DrydockManagementCloseWorkflow.php', 'DrydockManagementLeaseWorkflow' => 'applications/drydock/management/DrydockManagementLeaseWorkflow.php', 'DrydockManagementReleaseWorkflow' => 'applications/drydock/management/DrydockManagementReleaseWorkflow.php', 'DrydockManagementWaitForLeaseWorkflow' => 'applications/drydock/management/DrydockManagementWaitForLeaseWorkflow.php', 'DrydockManagementWorkflow' => 'applications/drydock/management/DrydockManagementWorkflow.php', 'DrydockResource' => 'applications/drydock/storage/DrydockResource.php', 'DrydockResourceCloseController' => 'applications/drydock/controller/DrydockResourceCloseController.php', 'DrydockResourceListController' => 'applications/drydock/controller/DrydockResourceListController.php', 'DrydockResourceQuery' => 'applications/drydock/query/DrydockResourceQuery.php', 'DrydockResourceStatus' => 'applications/drydock/constants/DrydockResourceStatus.php', 'DrydockResourceViewController' => 'applications/drydock/controller/DrydockResourceViewController.php', 'DrydockSSHCommandInterface' => 'applications/drydock/interface/command/DrydockSSHCommandInterface.php', 'DrydockWebrootInterface' => 'applications/drydock/interface/webroot/DrydockWebrootInterface.php', 'DrydockWorkingCopyBlueprint' => 'applications/drydock/blueprint/DrydockWorkingCopyBlueprint.php', 'FeedPublisherWorker' => 'applications/feed/worker/FeedPublisherWorker.php', 'HarbormasterDAO' => 'applications/harbormaster/storage/HarbormasterDAO.php', 'HarbormasterObject' => 'applications/harbormaster/storage/HarbormasterObject.php', 'HarbormasterRunnerWorker' => 'applications/harbormaster/worker/HarbormasterRunnerWorker.php', 'HarbormasterScratchTable' => 'applications/harbormaster/storage/HarbormasterScratchTable.php', 'HeraldAction' => 'applications/herald/storage/HeraldAction.php', 'HeraldActionConfig' => 'applications/herald/config/HeraldActionConfig.php', 'HeraldApplyTranscript' => 'applications/herald/storage/transcript/HeraldApplyTranscript.php', 'HeraldCommitAdapter' => 'applications/herald/adapter/HeraldCommitAdapter.php', 'HeraldCondition' => 'applications/herald/storage/HeraldCondition.php', 'HeraldConditionConfig' => 'applications/herald/config/HeraldConditionConfig.php', 'HeraldConditionTranscript' => 'applications/herald/storage/transcript/HeraldConditionTranscript.php', 'HeraldContentTypeConfig' => 'applications/herald/config/HeraldContentTypeConfig.php', 'HeraldController' => 'applications/herald/controller/HeraldController.php', 'HeraldDAO' => 'applications/herald/storage/HeraldDAO.php', 'HeraldDeleteController' => 'applications/herald/controller/HeraldDeleteController.php', 'HeraldDifferentialRevisionAdapter' => 'applications/herald/adapter/HeraldDifferentialRevisionAdapter.php', 'HeraldDryRunAdapter' => 'applications/herald/adapter/HeraldDryRunAdapter.php', 'HeraldEditLogQuery' => 'applications/herald/query/HeraldEditLogQuery.php', 'HeraldEffect' => 'applications/herald/engine/HeraldEffect.php', 'HeraldEngine' => 'applications/herald/engine/HeraldEngine.php', 'HeraldFieldConfig' => 'applications/herald/config/HeraldFieldConfig.php', 'HeraldHomeController' => 'applications/herald/controller/HeraldHomeController.php', 'HeraldInvalidConditionException' => 'applications/herald/engine/engine/HeraldInvalidConditionException.php', 'HeraldInvalidFieldException' => 'applications/herald/engine/engine/HeraldInvalidFieldException.php', 'HeraldNewController' => 'applications/herald/controller/HeraldNewController.php', 'HeraldObjectAdapter' => 'applications/herald/adapter/HeraldObjectAdapter.php', 'HeraldObjectTranscript' => 'applications/herald/storage/transcript/HeraldObjectTranscript.php', 'HeraldRecursiveConditionsException' => 'applications/herald/engine/engine/HeraldRecursiveConditionsException.php', 'HeraldRepetitionPolicyConfig' => 'applications/herald/config/HeraldRepetitionPolicyConfig.php', 'HeraldRule' => 'applications/herald/storage/HeraldRule.php', 'HeraldRuleController' => 'applications/herald/controller/HeraldRuleController.php', 'HeraldRuleEdit' => 'applications/herald/storage/HeraldRuleEdit.php', 'HeraldRuleEditHistoryController' => 'applications/herald/controller/HeraldRuleEditHistoryController.php', 'HeraldRuleEditHistoryView' => 'applications/herald/view/HeraldRuleEditHistoryView.php', 'HeraldRuleListView' => 'applications/herald/view/HeraldRuleListView.php', 'HeraldRuleQuery' => 'applications/herald/query/HeraldRuleQuery.php', 'HeraldRuleTranscript' => 'applications/herald/storage/transcript/HeraldRuleTranscript.php', 'HeraldRuleTypeConfig' => 'applications/herald/config/HeraldRuleTypeConfig.php', 'HeraldTestConsoleController' => 'applications/herald/controller/HeraldTestConsoleController.php', 'HeraldTranscript' => 'applications/herald/storage/transcript/HeraldTranscript.php', 'HeraldTranscriptController' => 'applications/herald/controller/HeraldTranscriptController.php', 'HeraldTranscriptListController' => 'applications/herald/controller/HeraldTranscriptListController.php', 'HeraldValueTypeConfig' => 'applications/herald/config/HeraldValueTypeConfig.php', 'Javelin' => 'infrastructure/javelin/Javelin.php', 'JavelinReactorExample' => 'applications/uiexample/examples/JavelinReactorExample.php', 'JavelinUIExample' => 'applications/uiexample/examples/JavelinUIExample.php', 'JavelinViewExample' => 'applications/uiexample/examples/JavelinViewExample.php', 'JavelinViewExampleServerView' => 'applications/uiexample/examples/JavelinViewExampleServerView.php', 'LiskChunkTestCase' => 'infrastructure/storage/lisk/__tests__/LiskChunkTestCase.php', 'LiskDAO' => 'infrastructure/storage/lisk/LiskDAO.php', 'LiskDAOSet' => 'infrastructure/storage/lisk/LiskDAOSet.php', 'LiskDAOTestCase' => 'infrastructure/storage/lisk/__tests__/LiskDAOTestCase.php', 'LiskEphemeralObjectException' => 'infrastructure/storage/lisk/LiskEphemeralObjectException.php', 'LiskFixtureTestCase' => 'infrastructure/storage/lisk/__tests__/LiskFixtureTestCase.php', 'LiskIsolationTestCase' => 'infrastructure/storage/lisk/__tests__/LiskIsolationTestCase.php', 'LiskIsolationTestDAO' => 'infrastructure/storage/lisk/__tests__/LiskIsolationTestDAO.php', 'LiskIsolationTestDAOException' => 'infrastructure/storage/lisk/__tests__/LiskIsolationTestDAOException.php', 'LiskMigrationIterator' => 'infrastructure/storage/lisk/LiskMigrationIterator.php', 'ManiphestAction' => 'applications/maniphest/constants/ManiphestAction.php', 'ManiphestAuxiliaryFieldDefaultSpecification' => 'applications/maniphest/auxiliaryfield/ManiphestAuxiliaryFieldDefaultSpecification.php', 'ManiphestAuxiliaryFieldSpecification' => 'applications/maniphest/auxiliaryfield/ManiphestAuxiliaryFieldSpecification.php', 'ManiphestAuxiliaryFieldTypeException' => 'applications/maniphest/auxiliaryfield/ManiphestAuxiliaryFieldTypeException.php', 'ManiphestAuxiliaryFieldValidationException' => 'applications/maniphest/auxiliaryfield/ManiphestAuxiliaryFieldValidationException.php', 'ManiphestBatchEditController' => 'applications/maniphest/controller/ManiphestBatchEditController.php', 'ManiphestConstants' => 'applications/maniphest/constants/ManiphestConstants.php', 'ManiphestController' => 'applications/maniphest/controller/ManiphestController.php', 'ManiphestDAO' => 'applications/maniphest/storage/ManiphestDAO.php', 'ManiphestDefaultTaskExtensions' => 'applications/maniphest/extensions/ManiphestDefaultTaskExtensions.php', 'ManiphestEdgeEventListener' => 'applications/maniphest/event/ManiphestEdgeEventListener.php', 'ManiphestExportController' => 'applications/maniphest/controller/ManiphestExportController.php', 'ManiphestReplyHandler' => 'applications/maniphest/ManiphestReplyHandler.php', 'ManiphestReportController' => 'applications/maniphest/controller/ManiphestReportController.php', 'ManiphestSavedQuery' => 'applications/maniphest/storage/ManiphestSavedQuery.php', 'ManiphestSavedQueryDeleteController' => 'applications/maniphest/controller/ManiphestSavedQueryDeleteController.php', 'ManiphestSavedQueryEditController' => 'applications/maniphest/controller/ManiphestSavedQueryEditController.php', 'ManiphestSavedQueryListController' => 'applications/maniphest/controller/ManiphestSavedQueryListController.php', 'ManiphestSearchIndexer' => 'applications/maniphest/search/ManiphestSearchIndexer.php', 'ManiphestSubpriorityController' => 'applications/maniphest/controller/ManiphestSubpriorityController.php', 'ManiphestTask' => 'applications/maniphest/storage/ManiphestTask.php', 'ManiphestTaskAuxiliaryStorage' => 'applications/maniphest/storage/ManiphestTaskAuxiliaryStorage.php', 'ManiphestTaskDescriptionChangeController' => 'applications/maniphest/controller/ManiphestTaskDescriptionChangeController.php', 'ManiphestTaskDescriptionPreviewController' => 'applications/maniphest/controller/ManiphestTaskDescriptionPreviewController.php', 'ManiphestTaskDetailController' => 'applications/maniphest/controller/ManiphestTaskDetailController.php', 'ManiphestTaskEditController' => 'applications/maniphest/controller/ManiphestTaskEditController.php', 'ManiphestTaskExtensions' => 'applications/maniphest/extensions/ManiphestTaskExtensions.php', 'ManiphestTaskListController' => 'applications/maniphest/controller/ManiphestTaskListController.php', 'ManiphestTaskListView' => 'applications/maniphest/view/ManiphestTaskListView.php', 'ManiphestTaskOwner' => 'applications/maniphest/constants/ManiphestTaskOwner.php', 'ManiphestTaskPriority' => 'applications/maniphest/constants/ManiphestTaskPriority.php', 'ManiphestTaskProject' => 'applications/maniphest/storage/ManiphestTaskProject.php', 'ManiphestTaskProjectsView' => 'applications/maniphest/view/ManiphestTaskProjectsView.php', 'ManiphestTaskQuery' => 'applications/maniphest/ManiphestTaskQuery.php', 'ManiphestTaskStatus' => 'applications/maniphest/constants/ManiphestTaskStatus.php', 'ManiphestTaskSubscriber' => 'applications/maniphest/storage/ManiphestTaskSubscriber.php', 'ManiphestTaskSummaryView' => 'applications/maniphest/view/ManiphestTaskSummaryView.php', 'ManiphestTransaction' => 'applications/maniphest/storage/ManiphestTransaction.php', 'ManiphestTransactionDetailView' => 'applications/maniphest/view/ManiphestTransactionDetailView.php', 'ManiphestTransactionEditor' => 'applications/maniphest/editor/ManiphestTransactionEditor.php', 'ManiphestTransactionListView' => 'applications/maniphest/view/ManiphestTransactionListView.php', 'ManiphestTransactionPreviewController' => 'applications/maniphest/controller/ManiphestTransactionPreviewController.php', 'ManiphestTransactionSaveController' => 'applications/maniphest/controller/ManiphestTransactionSaveController.php', 'ManiphestTransactionType' => 'applications/maniphest/constants/ManiphestTransactionType.php', 'ManiphestView' => 'applications/maniphest/view/ManiphestView.php', 'MetaMTAConstants' => 'applications/metamta/constants/MetaMTAConstants.php', 'MetaMTANotificationType' => 'applications/metamta/constants/MetaMTANotificationType.php', 'ObjectHandleLoader' => 'applications/phid/handle/ObjectHandleLoader.php', 'OwnersPackageReplyHandler' => 'applications/owners/OwnersPackageReplyHandler.php', 'PackageCreateMail' => 'applications/owners/mail/PackageCreateMail.php', 'PackageDeleteMail' => 'applications/owners/mail/PackageDeleteMail.php', 'PackageMail' => 'applications/owners/mail/PackageMail.php', 'PackageModifyMail' => 'applications/owners/mail/PackageModifyMail.php', 'Phabricator404Controller' => 'applications/base/controller/Phabricator404Controller.php', 'PhabricatorAWSConfigOptions' => 'applications/config/option/PhabricatorAWSConfigOptions.php', 'PhabricatorAccessLog' => 'infrastructure/PhabricatorAccessLog.php', 'PhabricatorAccessLogConfigOptions' => 'applications/config/option/PhabricatorAccessLogConfigOptions.php', 'PhabricatorActionListExample' => 'applications/uiexample/examples/PhabricatorActionListExample.php', 'PhabricatorActionListView' => 'view/layout/PhabricatorActionListView.php', 'PhabricatorActionView' => 'view/layout/PhabricatorActionView.php', 'PhabricatorAllCapsTranslation' => 'infrastructure/internationalization/PhabricatorAllCapsTranslation.php', 'PhabricatorAnchorView' => 'view/layout/PhabricatorAnchorView.php', 'PhabricatorApplication' => 'applications/base/PhabricatorApplication.php', 'PhabricatorApplicationApplications' => 'applications/meta/application/PhabricatorApplicationApplications.php', 'PhabricatorApplicationAudit' => 'applications/audit/application/PhabricatorApplicationAudit.php', 'PhabricatorApplicationAuth' => 'applications/auth/application/PhabricatorApplicationAuth.php', 'PhabricatorApplicationCalendar' => 'applications/calendar/application/PhabricatorApplicationCalendar.php', 'PhabricatorApplicationConduit' => 'applications/conduit/application/PhabricatorApplicationConduit.php', 'PhabricatorApplicationConfig' => 'applications/config/application/PhabricatorApplicationConfig.php', 'PhabricatorApplicationConfigOptions' => 'applications/config/option/PhabricatorApplicationConfigOptions.php', 'PhabricatorApplicationConpherence' => 'applications/conpherence/application/PhabricatorApplicationConpherence.php', 'PhabricatorApplicationCountdown' => 'applications/countdown/application/PhabricatorApplicationCountdown.php', 'PhabricatorApplicationDaemons' => 'applications/daemon/application/PhabricatorApplicationDaemons.php', 'PhabricatorApplicationDetailViewController' => 'applications/meta/controller/PhabricatorApplicationDetailViewController.php', 'PhabricatorApplicationDifferential' => 'applications/differential/application/PhabricatorApplicationDifferential.php', 'PhabricatorApplicationDiffusion' => 'applications/diffusion/application/PhabricatorApplicationDiffusion.php', 'PhabricatorApplicationDiviner' => 'applications/diviner/application/PhabricatorApplicationDiviner.php', 'PhabricatorApplicationDrydock' => 'applications/drydock/application/PhabricatorApplicationDrydock.php', 'PhabricatorApplicationFact' => 'applications/fact/application/PhabricatorApplicationFact.php', 'PhabricatorApplicationFeed' => 'applications/feed/application/PhabricatorApplicationFeed.php', 'PhabricatorApplicationFiles' => 'applications/files/application/PhabricatorApplicationFiles.php', 'PhabricatorApplicationFlags' => 'applications/flag/application/PhabricatorApplicationFlags.php', 'PhabricatorApplicationHerald' => 'applications/herald/application/PhabricatorApplicationHerald.php', 'PhabricatorApplicationLaunchView' => 'applications/meta/view/PhabricatorApplicationLaunchView.php', 'PhabricatorApplicationMacro' => 'applications/macro/application/PhabricatorApplicationMacro.php', 'PhabricatorApplicationMailingLists' => 'applications/mailinglists/application/PhabricatorApplicationMailingLists.php', 'PhabricatorApplicationManiphest' => 'applications/maniphest/application/PhabricatorApplicationManiphest.php', 'PhabricatorApplicationMetaMTA' => 'applications/metamta/application/PhabricatorApplicationMetaMTA.php', 'PhabricatorApplicationOwners' => 'applications/owners/application/PhabricatorApplicationOwners.php', 'PhabricatorApplicationPHID' => 'applications/phid/application/PhabricatorApplicationPHID.php', 'PhabricatorApplicationPHPAST' => 'applications/phpast/application/PhabricatorApplicationPHPAST.php', 'PhabricatorApplicationPaste' => 'applications/paste/application/PhabricatorApplicationPaste.php', 'PhabricatorApplicationPeople' => 'applications/people/application/PhabricatorApplicationPeople.php', 'PhabricatorApplicationPhame' => 'applications/phame/application/PhabricatorApplicationPhame.php', 'PhabricatorApplicationPholio' => 'applications/pholio/application/PhabricatorApplicationPholio.php', 'PhabricatorApplicationPhriction' => 'applications/phriction/application/PhabricatorApplicationPhriction.php', 'PhabricatorApplicationPonder' => 'applications/ponder/application/PhabricatorApplicationPonder.php', 'PhabricatorApplicationProject' => 'applications/project/application/PhabricatorApplicationProject.php', 'PhabricatorApplicationRepositories' => 'applications/repository/application/PhabricatorApplicationRepositories.php', 'PhabricatorApplicationSettings' => 'applications/settings/application/PhabricatorApplicationSettings.php', 'PhabricatorApplicationSlowvote' => 'applications/slowvote/application/PhabricatorApplicationSlowvote.php', 'PhabricatorApplicationStatusView' => 'applications/meta/view/PhabricatorApplicationStatusView.php', 'PhabricatorApplicationSubscriptions' => 'applications/subscriptions/application/PhabricatorApplicationSubscriptions.php', 'PhabricatorApplicationTransaction' => 'applications/transactions/storage/PhabricatorApplicationTransaction.php', 'PhabricatorApplicationTransactionComment' => 'applications/transactions/storage/PhabricatorApplicationTransactionComment.php', 'PhabricatorApplicationTransactionCommentEditController' => 'applications/transactions/controller/PhabricatorApplicationTransactionCommentEditController.php', 'PhabricatorApplicationTransactionCommentEditor' => 'applications/transactions/editor/PhabricatorApplicationTransactionCommentEditor.php', 'PhabricatorApplicationTransactionCommentHistoryController' => 'applications/transactions/controller/PhabricatorApplicationTransactionCommentHistoryController.php', 'PhabricatorApplicationTransactionCommentQuery' => 'applications/transactions/query/PhabricatorApplicationTransactionCommentQuery.php', 'PhabricatorApplicationTransactionCommentView' => 'applications/transactions/view/PhabricatorApplicationTransactionCommentView.php', 'PhabricatorApplicationTransactionController' => 'applications/transactions/controller/PhabricatorApplicationTransactionController.php', 'PhabricatorApplicationTransactionEditor' => 'applications/transactions/editor/PhabricatorApplicationTransactionEditor.php', 'PhabricatorApplicationTransactionFeedStory' => 'applications/transactions/feed/PhabricatorApplicationTransactionFeedStory.php', 'PhabricatorApplicationTransactionNoEffectException' => 'applications/transactions/exception/PhabricatorApplicationTransactionNoEffectException.php', 'PhabricatorApplicationTransactionNoEffectResponse' => 'applications/transactions/response/PhabricatorApplicationTransactionNoEffectResponse.php', 'PhabricatorApplicationTransactionQuery' => 'applications/transactions/query/PhabricatorApplicationTransactionQuery.php', 'PhabricatorApplicationTransactionResponse' => 'applications/transactions/response/PhabricatorApplicationTransactionResponse.php', 'PhabricatorApplicationTransactionView' => 'applications/transactions/view/PhabricatorApplicationTransactionView.php', 'PhabricatorApplicationTransactions' => 'applications/transactions/application/PhabricatorApplicationTransactions.php', 'PhabricatorApplicationUIExamples' => 'applications/uiexample/application/PhabricatorApplicationUIExamples.php', + 'PhabricatorApplicationUninstallController' => 'applications/meta/controller/PhabricatorApplicationUninstallController.php', 'PhabricatorApplicationsController' => 'applications/meta/controller/PhabricatorApplicationsController.php', 'PhabricatorApplicationsListController' => 'applications/meta/controller/PhabricatorApplicationsListController.php', 'PhabricatorAuditActionConstants' => 'applications/audit/constants/PhabricatorAuditActionConstants.php', 'PhabricatorAuditAddCommentController' => 'applications/audit/controller/PhabricatorAuditAddCommentController.php', 'PhabricatorAuditComment' => 'applications/audit/storage/PhabricatorAuditComment.php', 'PhabricatorAuditCommentEditor' => 'applications/audit/editor/PhabricatorAuditCommentEditor.php', 'PhabricatorAuditCommitListView' => 'applications/audit/view/PhabricatorAuditCommitListView.php', 'PhabricatorAuditCommitQuery' => 'applications/audit/query/PhabricatorAuditCommitQuery.php', 'PhabricatorAuditCommitStatusConstants' => 'applications/audit/constants/PhabricatorAuditCommitStatusConstants.php', 'PhabricatorAuditController' => 'applications/audit/controller/PhabricatorAuditController.php', 'PhabricatorAuditDAO' => 'applications/audit/storage/PhabricatorAuditDAO.php', 'PhabricatorAuditInlineComment' => 'applications/audit/storage/PhabricatorAuditInlineComment.php', 'PhabricatorAuditListController' => 'applications/audit/controller/PhabricatorAuditListController.php', 'PhabricatorAuditListView' => 'applications/audit/view/PhabricatorAuditListView.php', 'PhabricatorAuditPreviewController' => 'applications/audit/controller/PhabricatorAuditPreviewController.php', 'PhabricatorAuditQuery' => 'applications/audit/query/PhabricatorAuditQuery.php', 'PhabricatorAuditReplyHandler' => 'applications/audit/PhabricatorAuditReplyHandler.php', 'PhabricatorAuditStatusConstants' => 'applications/audit/constants/PhabricatorAuditStatusConstants.php', 'PhabricatorAuthController' => 'applications/auth/controller/PhabricatorAuthController.php', 'PhabricatorAuthenticationConfigOptions' => 'applications/config/option/PhabricatorAuthenticationConfigOptions.php', 'PhabricatorBarePageExample' => 'applications/uiexample/examples/PhabricatorBarePageExample.php', 'PhabricatorBarePageView' => 'view/page/PhabricatorBarePageView.php', 'PhabricatorBaseEnglishTranslation' => 'infrastructure/internationalization/PhabricatorBaseEnglishTranslation.php', 'PhabricatorBuiltinPatchList' => 'infrastructure/storage/patch/PhabricatorBuiltinPatchList.php', 'PhabricatorButtonsExample' => 'applications/uiexample/examples/PhabricatorButtonsExample.php', 'PhabricatorCacheDAO' => 'applications/cache/storage/PhabricatorCacheDAO.php', 'PhabricatorCaches' => 'applications/cache/PhabricatorCaches.php', 'PhabricatorCalendarBrowseController' => 'applications/calendar/controller/PhabricatorCalendarBrowseController.php', 'PhabricatorCalendarController' => 'applications/calendar/controller/PhabricatorCalendarController.php', 'PhabricatorCalendarDAO' => 'applications/calendar/storage/PhabricatorCalendarDAO.php', 'PhabricatorCalendarDeleteStatusController' => 'applications/calendar/controller/PhabricatorCalendarDeleteStatusController.php', 'PhabricatorCalendarEditStatusController' => 'applications/calendar/controller/PhabricatorCalendarEditStatusController.php', 'PhabricatorCalendarHoliday' => 'applications/calendar/storage/PhabricatorCalendarHoliday.php', 'PhabricatorCalendarHolidayTestCase' => 'applications/calendar/storage/__tests__/PhabricatorCalendarHolidayTestCase.php', 'PhabricatorCalendarViewStatusController' => 'applications/calendar/controller/PhabricatorCalendarViewStatusController.php', 'PhabricatorChangesetResponse' => 'infrastructure/diff/PhabricatorChangesetResponse.php', 'PhabricatorChatLogChannelListController' => 'applications/chatlog/controller/PhabricatorChatLogChannelListController.php', 'PhabricatorChatLogChannelLogController' => 'applications/chatlog/controller/PhabricatorChatLogChannelLogController.php', 'PhabricatorChatLogConstants' => 'applications/chatlog/constants/PhabricatorChatLogConstants.php', 'PhabricatorChatLogController' => 'applications/chatlog/controller/PhabricatorChatLogController.php', 'PhabricatorChatLogDAO' => 'applications/chatlog/storage/PhabricatorChatLogDAO.php', 'PhabricatorChatLogEvent' => 'applications/chatlog/storage/PhabricatorChatLogEvent.php', 'PhabricatorChatLogEventType' => 'applications/chatlog/constants/PhabricatorChatLogEventType.php', 'PhabricatorChatLogQuery' => 'applications/chatlog/PhabricatorChatLogQuery.php', 'PhabricatorConduitAPIController' => 'applications/conduit/controller/PhabricatorConduitAPIController.php', 'PhabricatorConduitCertificateToken' => 'applications/conduit/storage/PhabricatorConduitCertificateToken.php', 'PhabricatorConduitConnectionLog' => 'applications/conduit/storage/PhabricatorConduitConnectionLog.php', 'PhabricatorConduitConsoleController' => 'applications/conduit/controller/PhabricatorConduitConsoleController.php', 'PhabricatorConduitController' => 'applications/conduit/controller/PhabricatorConduitController.php', 'PhabricatorConduitDAO' => 'applications/conduit/storage/PhabricatorConduitDAO.php', 'PhabricatorConduitListController' => 'applications/conduit/controller/PhabricatorConduitListController.php', 'PhabricatorConduitLogController' => 'applications/conduit/controller/PhabricatorConduitLogController.php', 'PhabricatorConduitMethodCallLog' => 'applications/conduit/storage/PhabricatorConduitMethodCallLog.php', 'PhabricatorConduitTokenController' => 'applications/conduit/controller/PhabricatorConduitTokenController.php', 'PhabricatorConfigAllController' => 'applications/config/controller/PhabricatorConfigAllController.php', 'PhabricatorConfigController' => 'applications/config/controller/PhabricatorConfigController.php', 'PhabricatorConfigDatabaseSource' => 'infrastructure/env/PhabricatorConfigDatabaseSource.php', 'PhabricatorConfigDefaultSource' => 'infrastructure/env/PhabricatorConfigDefaultSource.php', 'PhabricatorConfigDictionarySource' => 'infrastructure/env/PhabricatorConfigDictionarySource.php', 'PhabricatorConfigEditController' => 'applications/config/controller/PhabricatorConfigEditController.php', 'PhabricatorConfigEditor' => 'applications/config/editor/PhabricatorConfigEditor.php', 'PhabricatorConfigEntry' => 'applications/config/storage/PhabricatorConfigEntry.php', 'PhabricatorConfigEntryDAO' => 'applications/config/storage/PhabricatorConfigEntryDAO.php', 'PhabricatorConfigFileSource' => 'infrastructure/env/PhabricatorConfigFileSource.php', 'PhabricatorConfigGroupController' => 'applications/config/controller/PhabricatorConfigGroupController.php', 'PhabricatorConfigIssueListController' => 'applications/config/controller/PhabricatorConfigIssueListController.php', 'PhabricatorConfigIssueViewController' => 'applications/config/controller/PhabricatorConfigIssueViewController.php', 'PhabricatorConfigJSON' => 'applications/config/json/PhabricatorConfigJSON.php', 'PhabricatorConfigListController' => 'applications/config/controller/PhabricatorConfigListController.php', 'PhabricatorConfigLocalSource' => 'infrastructure/env/PhabricatorConfigLocalSource.php', 'PhabricatorConfigManagementDeleteWorkflow' => 'applications/config/management/PhabricatorConfigManagementDeleteWorkflow.php', 'PhabricatorConfigManagementGetWorkflow' => 'applications/config/management/PhabricatorConfigManagementGetWorkflow.php', 'PhabricatorConfigManagementListWorkflow' => 'applications/config/management/PhabricatorConfigManagementListWorkflow.php', 'PhabricatorConfigManagementSetWorkflow' => 'applications/config/management/PhabricatorConfigManagementSetWorkflow.php', 'PhabricatorConfigManagementWorkflow' => 'applications/config/management/PhabricatorConfigManagementWorkflow.php', 'PhabricatorConfigOption' => 'applications/config/option/PhabricatorConfigOption.php', 'PhabricatorConfigProxySource' => 'infrastructure/env/PhabricatorConfigProxySource.php', 'PhabricatorConfigResponse' => 'applications/config/response/PhabricatorConfigResponse.php', 'PhabricatorConfigSource' => 'infrastructure/env/PhabricatorConfigSource.php', 'PhabricatorConfigStackSource' => 'infrastructure/env/PhabricatorConfigStackSource.php', 'PhabricatorConfigTransaction' => 'applications/config/storage/PhabricatorConfigTransaction.php', 'PhabricatorConfigTransactionQuery' => 'applications/config/query/PhabricatorConfigTransactionQuery.php', 'PhabricatorConfigValidationException' => 'applications/config/exception/PhabricatorConfigValidationException.php', 'PhabricatorContentSource' => 'applications/metamta/contentsource/PhabricatorContentSource.php', 'PhabricatorContentSourceView' => 'applications/metamta/contentsource/PhabricatorContentSourceView.php', 'PhabricatorController' => 'applications/base/controller/PhabricatorController.php', 'PhabricatorCoreConfigOptions' => 'applications/config/option/PhabricatorCoreConfigOptions.php', 'PhabricatorCountdownController' => 'applications/countdown/controller/PhabricatorCountdownController.php', 'PhabricatorCountdownDAO' => 'applications/countdown/storage/PhabricatorCountdownDAO.php', 'PhabricatorCountdownDeleteController' => 'applications/countdown/controller/PhabricatorCountdownDeleteController.php', 'PhabricatorCountdownEditController' => 'applications/countdown/controller/PhabricatorCountdownEditController.php', 'PhabricatorCountdownListController' => 'applications/countdown/controller/PhabricatorCountdownListController.php', 'PhabricatorCountdownViewController' => 'applications/countdown/controller/PhabricatorCountdownViewController.php', 'PhabricatorCrumbView' => 'view/layout/PhabricatorCrumbView.php', 'PhabricatorCrumbsView' => 'view/layout/PhabricatorCrumbsView.php', 'PhabricatorCursorPagedPolicyAwareQuery' => 'infrastructure/query/policy/PhabricatorCursorPagedPolicyAwareQuery.php', 'PhabricatorDaemon' => 'infrastructure/daemon/PhabricatorDaemon.php', 'PhabricatorDaemonCombinedLogController' => 'applications/daemon/controller/PhabricatorDaemonCombinedLogController.php', 'PhabricatorDaemonConsoleController' => 'applications/daemon/controller/PhabricatorDaemonConsoleController.php', 'PhabricatorDaemonControl' => 'infrastructure/daemon/PhabricatorDaemonControl.php', 'PhabricatorDaemonController' => 'applications/daemon/controller/PhabricatorDaemonController.php', 'PhabricatorDaemonDAO' => 'infrastructure/daemon/storage/PhabricatorDaemonDAO.php', 'PhabricatorDaemonLog' => 'infrastructure/daemon/storage/PhabricatorDaemonLog.php', 'PhabricatorDaemonLogEvent' => 'infrastructure/daemon/storage/PhabricatorDaemonLogEvent.php', 'PhabricatorDaemonLogEventsView' => 'applications/daemon/view/PhabricatorDaemonLogEventsView.php', 'PhabricatorDaemonLogListController' => 'applications/daemon/controller/PhabricatorDaemonLogListController.php', 'PhabricatorDaemonLogListView' => 'applications/daemon/view/PhabricatorDaemonLogListView.php', 'PhabricatorDaemonLogViewController' => 'applications/daemon/controller/PhabricatorDaemonLogViewController.php', 'PhabricatorDaemonReference' => 'infrastructure/daemon/control/PhabricatorDaemonReference.php', 'PhabricatorDefaultFileStorageEngineSelector' => 'applications/files/engineselector/PhabricatorDefaultFileStorageEngineSelector.php', 'PhabricatorDefaultSearchEngineSelector' => 'applications/search/selector/PhabricatorDefaultSearchEngineSelector.php', 'PhabricatorDeveloperConfigOptions' => 'applications/config/option/PhabricatorDeveloperConfigOptions.php', 'PhabricatorDifferenceEngine' => 'infrastructure/diff/PhabricatorDifferenceEngine.php', 'PhabricatorDifferentialConfigOptions' => 'applications/differential/config/PhabricatorDifferentialConfigOptions.php', 'PhabricatorDiffusionConfigOptions' => 'applications/diffusion/config/PhabricatorDiffusionConfigOptions.php', 'PhabricatorDirectoryController' => 'applications/directory/controller/PhabricatorDirectoryController.php', 'PhabricatorDirectoryMainController' => 'applications/directory/controller/PhabricatorDirectoryMainController.php', 'PhabricatorDisabledUserController' => 'applications/auth/controller/PhabricatorDisabledUserController.php', 'PhabricatorDisqusConfigOptions' => 'applications/config/option/PhabricatorDisqusConfigOptions.php', 'PhabricatorDraft' => 'applications/draft/storage/PhabricatorDraft.php', 'PhabricatorDraftDAO' => 'applications/draft/storage/PhabricatorDraftDAO.php', 'PhabricatorEdgeConfig' => 'infrastructure/edges/constants/PhabricatorEdgeConfig.php', 'PhabricatorEdgeConstants' => 'infrastructure/edges/constants/PhabricatorEdgeConstants.php', 'PhabricatorEdgeCycleException' => 'infrastructure/edges/exception/PhabricatorEdgeCycleException.php', 'PhabricatorEdgeEditor' => 'infrastructure/edges/editor/PhabricatorEdgeEditor.php', 'PhabricatorEdgeGraph' => 'infrastructure/edges/util/PhabricatorEdgeGraph.php', 'PhabricatorEdgeQuery' => 'infrastructure/edges/query/PhabricatorEdgeQuery.php', 'PhabricatorEdgeTestCase' => 'infrastructure/edges/__tests__/PhabricatorEdgeTestCase.php', 'PhabricatorEditor' => 'infrastructure/PhabricatorEditor.php', 'PhabricatorEmailLoginController' => 'applications/auth/controller/PhabricatorEmailLoginController.php', 'PhabricatorEmailTokenController' => 'applications/auth/controller/PhabricatorEmailTokenController.php', 'PhabricatorEmailVerificationController' => 'applications/people/controller/PhabricatorEmailVerificationController.php', 'PhabricatorEnglishTranslation' => 'infrastructure/internationalization/PhabricatorEnglishTranslation.php', 'PhabricatorEnv' => 'infrastructure/env/PhabricatorEnv.php', 'PhabricatorEnvTestCase' => 'infrastructure/env/__tests__/PhabricatorEnvTestCase.php', 'PhabricatorErrorExample' => 'applications/uiexample/examples/PhabricatorErrorExample.php', 'PhabricatorEvent' => 'infrastructure/events/PhabricatorEvent.php', 'PhabricatorEventEngine' => 'infrastructure/events/PhabricatorEventEngine.php', 'PhabricatorEventType' => 'infrastructure/events/constant/PhabricatorEventType.php', 'PhabricatorExampleEventListener' => 'infrastructure/events/PhabricatorExampleEventListener.php', 'PhabricatorExtendingPhabricatorConfigOptions' => 'applications/config/option/PhabricatorExtendingPhabricatorConfigOptions.php', 'PhabricatorFacebookConfigOptions' => 'applications/config/option/PhabricatorFacebookConfigOptions.php', 'PhabricatorFactAggregate' => 'applications/fact/storage/PhabricatorFactAggregate.php', 'PhabricatorFactChartController' => 'applications/fact/controller/PhabricatorFactChartController.php', 'PhabricatorFactController' => 'applications/fact/controller/PhabricatorFactController.php', 'PhabricatorFactCountEngine' => 'applications/fact/engine/PhabricatorFactCountEngine.php', 'PhabricatorFactCursor' => 'applications/fact/storage/PhabricatorFactCursor.php', 'PhabricatorFactDAO' => 'applications/fact/storage/PhabricatorFactDAO.php', 'PhabricatorFactDaemon' => 'applications/fact/daemon/PhabricatorFactDaemon.php', 'PhabricatorFactEngine' => 'applications/fact/engine/PhabricatorFactEngine.php', 'PhabricatorFactHomeController' => 'applications/fact/controller/PhabricatorFactHomeController.php', 'PhabricatorFactLastUpdatedEngine' => 'applications/fact/engine/PhabricatorFactLastUpdatedEngine.php', 'PhabricatorFactManagementAnalyzeWorkflow' => 'applications/fact/management/PhabricatorFactManagementAnalyzeWorkflow.php', 'PhabricatorFactManagementCursorsWorkflow' => 'applications/fact/management/PhabricatorFactManagementCursorsWorkflow.php', 'PhabricatorFactManagementDestroyWorkflow' => 'applications/fact/management/PhabricatorFactManagementDestroyWorkflow.php', 'PhabricatorFactManagementListWorkflow' => 'applications/fact/management/PhabricatorFactManagementListWorkflow.php', 'PhabricatorFactManagementStatusWorkflow' => 'applications/fact/management/PhabricatorFactManagementStatusWorkflow.php', 'PhabricatorFactManagementWorkflow' => 'applications/fact/management/PhabricatorFactManagementWorkflow.php', 'PhabricatorFactRaw' => 'applications/fact/storage/PhabricatorFactRaw.php', 'PhabricatorFactSimpleSpec' => 'applications/fact/spec/PhabricatorFactSimpleSpec.php', 'PhabricatorFactSpec' => 'applications/fact/spec/PhabricatorFactSpec.php', 'PhabricatorFactUpdateIterator' => 'applications/fact/extract/PhabricatorFactUpdateIterator.php', 'PhabricatorFeedBuilder' => 'applications/feed/builder/PhabricatorFeedBuilder.php', 'PhabricatorFeedConfigOptions' => 'applications/feed/config/PhabricatorFeedConfigOptions.php', 'PhabricatorFeedConstants' => 'applications/feed/constants/PhabricatorFeedConstants.php', 'PhabricatorFeedController' => 'applications/feed/controller/PhabricatorFeedController.php', 'PhabricatorFeedDAO' => 'applications/feed/storage/PhabricatorFeedDAO.php', 'PhabricatorFeedMainController' => 'applications/feed/controller/PhabricatorFeedMainController.php', 'PhabricatorFeedPublicStreamController' => 'applications/feed/controller/PhabricatorFeedPublicStreamController.php', 'PhabricatorFeedQuery' => 'applications/feed/PhabricatorFeedQuery.php', 'PhabricatorFeedStory' => 'applications/feed/story/PhabricatorFeedStory.php', 'PhabricatorFeedStoryAggregate' => 'applications/feed/story/PhabricatorFeedStoryAggregate.php', 'PhabricatorFeedStoryAudit' => 'applications/feed/story/PhabricatorFeedStoryAudit.php', 'PhabricatorFeedStoryCommit' => 'applications/feed/story/PhabricatorFeedStoryCommit.php', 'PhabricatorFeedStoryData' => 'applications/feed/storage/PhabricatorFeedStoryData.php', 'PhabricatorFeedStoryDifferential' => 'applications/feed/story/PhabricatorFeedStoryDifferential.php', 'PhabricatorFeedStoryDifferentialAggregate' => 'applications/feed/story/PhabricatorFeedStoryDifferentialAggregate.php', 'PhabricatorFeedStoryManiphest' => 'applications/feed/story/PhabricatorFeedStoryManiphest.php', 'PhabricatorFeedStoryManiphestAggregate' => 'applications/feed/story/PhabricatorFeedStoryManiphestAggregate.php', 'PhabricatorFeedStoryNotification' => 'applications/notification/storage/PhabricatorFeedStoryNotification.php', 'PhabricatorFeedStoryPhriction' => 'applications/feed/story/PhabricatorFeedStoryPhriction.php', 'PhabricatorFeedStoryProject' => 'applications/feed/story/PhabricatorFeedStoryProject.php', 'PhabricatorFeedStoryPublisher' => 'applications/feed/PhabricatorFeedStoryPublisher.php', 'PhabricatorFeedStoryReference' => 'applications/feed/storage/PhabricatorFeedStoryReference.php', 'PhabricatorFeedStoryStatus' => 'applications/feed/story/PhabricatorFeedStoryStatus.php', 'PhabricatorFeedStoryTypeConstants' => 'applications/feed/constants/PhabricatorFeedStoryTypeConstants.php', 'PhabricatorFeedStoryView' => 'applications/feed/view/PhabricatorFeedStoryView.php', 'PhabricatorFeedView' => 'applications/feed/view/PhabricatorFeedView.php', 'PhabricatorFile' => 'applications/files/storage/PhabricatorFile.php', 'PhabricatorFileController' => 'applications/files/controller/PhabricatorFileController.php', 'PhabricatorFileDAO' => 'applications/files/storage/PhabricatorFileDAO.php', 'PhabricatorFileDataController' => 'applications/files/controller/PhabricatorFileDataController.php', 'PhabricatorFileDeleteController' => 'applications/files/controller/PhabricatorFileDeleteController.php', 'PhabricatorFileDropUploadController' => 'applications/files/controller/PhabricatorFileDropUploadController.php', 'PhabricatorFileImageMacro' => 'applications/macro/storage/PhabricatorFileImageMacro.php', 'PhabricatorFileInfoController' => 'applications/files/controller/PhabricatorFileInfoController.php', 'PhabricatorFileLinkListView' => 'view/layout/PhabricatorFileLinkListView.php', 'PhabricatorFileLinkView' => 'view/layout/PhabricatorFileLinkView.php', 'PhabricatorFileListController' => 'applications/files/controller/PhabricatorFileListController.php', 'PhabricatorFileQuery' => 'applications/files/query/PhabricatorFileQuery.php', 'PhabricatorFileShortcutController' => 'applications/files/controller/PhabricatorFileShortcutController.php', 'PhabricatorFileStorageBlob' => 'applications/files/storage/PhabricatorFileStorageBlob.php', 'PhabricatorFileStorageConfigurationException' => 'applications/files/exception/PhabricatorFileStorageConfigurationException.php', 'PhabricatorFileStorageEngine' => 'applications/files/engine/PhabricatorFileStorageEngine.php', 'PhabricatorFileStorageEngineSelector' => 'applications/files/engineselector/PhabricatorFileStorageEngineSelector.php', 'PhabricatorFileTransformController' => 'applications/files/controller/PhabricatorFileTransformController.php', 'PhabricatorFileUploadController' => 'applications/files/controller/PhabricatorFileUploadController.php', 'PhabricatorFileUploadException' => 'applications/files/exception/PhabricatorFileUploadException.php', 'PhabricatorFilesConfigOptions' => 'applications/files/config/PhabricatorFilesConfigOptions.php', 'PhabricatorFilesManagementEnginesWorkflow' => 'applications/files/management/PhabricatorFilesManagementEnginesWorkflow.php', 'PhabricatorFilesManagementMetadataWorkflow' => 'applications/files/management/PhabricatorFilesManagementMetadataWorkflow.php', 'PhabricatorFilesManagementMigrateWorkflow' => 'applications/files/management/PhabricatorFilesManagementMigrateWorkflow.php', 'PhabricatorFilesManagementWorkflow' => 'applications/files/management/PhabricatorFilesManagementWorkflow.php', 'PhabricatorFlag' => 'applications/flag/storage/PhabricatorFlag.php', 'PhabricatorFlagColor' => 'applications/flag/constants/PhabricatorFlagColor.php', 'PhabricatorFlagConstants' => 'applications/flag/constants/PhabricatorFlagConstants.php', 'PhabricatorFlagController' => 'applications/flag/controller/PhabricatorFlagController.php', 'PhabricatorFlagDAO' => 'applications/flag/storage/PhabricatorFlagDAO.php', 'PhabricatorFlagDeleteController' => 'applications/flag/controller/PhabricatorFlagDeleteController.php', 'PhabricatorFlagEditController' => 'applications/flag/controller/PhabricatorFlagEditController.php', 'PhabricatorFlagListController' => 'applications/flag/controller/PhabricatorFlagListController.php', 'PhabricatorFlagListView' => 'applications/flag/view/PhabricatorFlagListView.php', 'PhabricatorFlagQuery' => 'applications/flag/query/PhabricatorFlagQuery.php', 'PhabricatorFlagsUIEventListener' => 'applications/flag/events/PhabricatorFlagsUIEventListener.php', 'PhabricatorFormExample' => 'applications/uiexample/examples/PhabricatorFormExample.php', 'PhabricatorGarbageCollectorConfigOptions' => 'applications/config/option/PhabricatorGarbageCollectorConfigOptions.php', 'PhabricatorGarbageCollectorDaemon' => 'infrastructure/daemon/PhabricatorGarbageCollectorDaemon.php', 'PhabricatorGitGraphStream' => 'applications/repository/daemon/PhabricatorGitGraphStream.php', 'PhabricatorGitHubConfigOptions' => 'applications/config/option/PhabricatorGitHubConfigOptions.php', 'PhabricatorGlobalLock' => 'infrastructure/util/PhabricatorGlobalLock.php', 'PhabricatorGlobalUploadTargetView' => 'applications/files/view/PhabricatorGlobalUploadTargetView.php', 'PhabricatorGoogleConfigOptions' => 'applications/config/option/PhabricatorGoogleConfigOptions.php', 'PhabricatorHandleObjectSelectorDataView' => 'applications/phid/handle/view/PhabricatorHandleObjectSelectorDataView.php', 'PhabricatorHash' => 'infrastructure/util/PhabricatorHash.php', 'PhabricatorHashTestCase' => 'infrastructure/util/__tests__/PhabricatorHashTestCase.php', 'PhabricatorHeaderView' => 'view/layout/PhabricatorHeaderView.php', 'PhabricatorHelpController' => 'applications/help/controller/PhabricatorHelpController.php', 'PhabricatorHelpKeyboardShortcutController' => 'applications/help/controller/PhabricatorHelpKeyboardShortcutController.php', 'PhabricatorIRCBot' => 'infrastructure/daemon/irc/PhabricatorIRCBot.php', 'PhabricatorIRCDifferentialNotificationHandler' => 'infrastructure/daemon/irc/handler/PhabricatorIRCDifferentialNotificationHandler.php', 'PhabricatorIRCFeedNotificationHandler' => 'infrastructure/daemon/irc/handler/PhabricatorIRCFeedNotificationHandler.php', 'PhabricatorIRCHandler' => 'infrastructure/daemon/irc/handler/PhabricatorIRCHandler.php', 'PhabricatorIRCLogHandler' => 'infrastructure/daemon/irc/handler/PhabricatorIRCLogHandler.php', 'PhabricatorIRCMacroHandler' => 'infrastructure/daemon/irc/handler/PhabricatorIRCMacroHandler.php', 'PhabricatorIRCMessage' => 'infrastructure/daemon/irc/PhabricatorIRCMessage.php', 'PhabricatorIRCObjectNameHandler' => 'infrastructure/daemon/irc/handler/PhabricatorIRCObjectNameHandler.php', 'PhabricatorIRCProtocolHandler' => 'infrastructure/daemon/irc/handler/PhabricatorIRCProtocolHandler.php', 'PhabricatorIRCSymbolHandler' => 'infrastructure/daemon/irc/handler/PhabricatorIRCSymbolHandler.php', 'PhabricatorIRCWhatsNewHandler' => 'infrastructure/daemon/irc/handler/PhabricatorIRCWhatsNewHandler.php', 'PhabricatorImageTransformer' => 'applications/files/PhabricatorImageTransformer.php', 'PhabricatorInfrastructureTestCase' => 'infrastructure/__tests__/PhabricatorInfrastructureTestCase.php', 'PhabricatorInlineCommentController' => 'infrastructure/diff/PhabricatorInlineCommentController.php', 'PhabricatorInlineCommentInterface' => 'infrastructure/diff/interface/PhabricatorInlineCommentInterface.php', 'PhabricatorInlineCommentPreviewController' => 'infrastructure/diff/PhabricatorInlineCommentPreviewController.php', 'PhabricatorInlineSummaryView' => 'infrastructure/diff/view/PhabricatorInlineSummaryView.php', 'PhabricatorJavelinLinter' => 'infrastructure/lint/linter/PhabricatorJavelinLinter.php', 'PhabricatorJumpNavHandler' => 'applications/search/engine/PhabricatorJumpNavHandler.php', 'PhabricatorKeyValueDatabaseCache' => 'applications/cache/PhabricatorKeyValueDatabaseCache.php', 'PhabricatorLDAPConfigOptions' => 'applications/config/option/PhabricatorLDAPConfigOptions.php', 'PhabricatorLDAPLoginController' => 'applications/auth/controller/PhabricatorLDAPLoginController.php', 'PhabricatorLDAPProvider' => 'applications/auth/ldap/PhabricatorLDAPProvider.php', 'PhabricatorLDAPRegistrationController' => 'applications/auth/controller/PhabricatorLDAPRegistrationController.php', 'PhabricatorLDAPUnknownUserException' => 'applications/auth/ldap/PhabricatorLDAPUnknownUserException.php', 'PhabricatorLDAPUnlinkController' => 'applications/auth/controller/PhabricatorLDAPUnlinkController.php', 'PhabricatorLintEngine' => 'infrastructure/lint/PhabricatorLintEngine.php', 'PhabricatorLiskDAO' => 'infrastructure/storage/lisk/PhabricatorLiskDAO.php', 'PhabricatorLocalDiskFileStorageEngine' => 'applications/files/engine/PhabricatorLocalDiskFileStorageEngine.php', 'PhabricatorLocalTimeTestCase' => 'view/__tests__/PhabricatorLocalTimeTestCase.php', 'PhabricatorLoginController' => 'applications/auth/controller/PhabricatorLoginController.php', 'PhabricatorLoginValidateController' => 'applications/auth/controller/PhabricatorLoginValidateController.php', 'PhabricatorLogoutController' => 'applications/auth/controller/PhabricatorLogoutController.php', 'PhabricatorMacroCommentController' => 'applications/macro/controller/PhabricatorMacroCommentController.php', 'PhabricatorMacroConfigOptions' => 'applications/macro/config/PhabricatorMacroConfigOptions.php', 'PhabricatorMacroController' => 'applications/macro/controller/PhabricatorMacroController.php', 'PhabricatorMacroDisableController' => 'applications/macro/controller/PhabricatorMacroDisableController.php', 'PhabricatorMacroEditController' => 'applications/macro/controller/PhabricatorMacroEditController.php', 'PhabricatorMacroEditor' => 'applications/macro/editor/PhabricatorMacroEditor.php', 'PhabricatorMacroListController' => 'applications/macro/controller/PhabricatorMacroListController.php', 'PhabricatorMacroMemeController' => 'applications/macro/controller/PhabricatorMacroMemeController.php', 'PhabricatorMacroMemeDialogController' => 'applications/macro/controller/PhabricatorMacroMemeDialogController.php', 'PhabricatorMacroReplyHandler' => 'applications/macro/mail/PhabricatorMacroReplyHandler.php', 'PhabricatorMacroTransaction' => 'applications/macro/storage/PhabricatorMacroTransaction.php', 'PhabricatorMacroTransactionComment' => 'applications/macro/storage/PhabricatorMacroTransactionComment.php', 'PhabricatorMacroTransactionQuery' => 'applications/macro/query/PhabricatorMacroTransactionQuery.php', 'PhabricatorMacroTransactionType' => 'applications/macro/constants/PhabricatorMacroTransactionType.php', 'PhabricatorMacroViewController' => 'applications/macro/controller/PhabricatorMacroViewController.php', 'PhabricatorMailImplementationAdapter' => 'applications/metamta/adapter/PhabricatorMailImplementationAdapter.php', 'PhabricatorMailImplementationAmazonSESAdapter' => 'applications/metamta/adapter/PhabricatorMailImplementationAmazonSESAdapter.php', 'PhabricatorMailImplementationPHPMailerAdapter' => 'applications/metamta/adapter/PhabricatorMailImplementationPHPMailerAdapter.php', 'PhabricatorMailImplementationPHPMailerLiteAdapter' => 'applications/metamta/adapter/PhabricatorMailImplementationPHPMailerLiteAdapter.php', 'PhabricatorMailImplementationSendGridAdapter' => 'applications/metamta/adapter/PhabricatorMailImplementationSendGridAdapter.php', 'PhabricatorMailImplementationTestAdapter' => 'applications/metamta/adapter/PhabricatorMailImplementationTestAdapter.php', 'PhabricatorMailReplyHandler' => 'applications/metamta/replyhandler/PhabricatorMailReplyHandler.php', 'PhabricatorMailingListsController' => 'applications/mailinglists/controller/PhabricatorMailingListsController.php', 'PhabricatorMailingListsEditController' => 'applications/mailinglists/controller/PhabricatorMailingListsEditController.php', 'PhabricatorMailingListsListController' => 'applications/mailinglists/controller/PhabricatorMailingListsListController.php', 'PhabricatorMainMenuGroupView' => 'view/page/menu/PhabricatorMainMenuGroupView.php', 'PhabricatorMainMenuIconView' => 'view/page/menu/PhabricatorMainMenuIconView.php', 'PhabricatorMainMenuSearchView' => 'view/page/menu/PhabricatorMainMenuSearchView.php', 'PhabricatorMainMenuView' => 'view/page/menu/PhabricatorMainMenuView.php', 'PhabricatorManiphestConfigOptions' => 'applications/maniphest/config/PhabricatorManiphestConfigOptions.php', 'PhabricatorMarkupCache' => 'applications/cache/storage/PhabricatorMarkupCache.php', 'PhabricatorMarkupEngine' => 'infrastructure/markup/PhabricatorMarkupEngine.php', 'PhabricatorMarkupInterface' => 'infrastructure/markup/PhabricatorMarkupInterface.php', 'PhabricatorMenuItemView' => 'view/layout/PhabricatorMenuItemView.php', 'PhabricatorMenuView' => 'view/layout/PhabricatorMenuView.php', 'PhabricatorMercurialGraphStream' => 'applications/repository/daemon/PhabricatorMercurialGraphStream.php', 'PhabricatorMetaMTAAttachment' => 'applications/metamta/storage/PhabricatorMetaMTAAttachment.php', 'PhabricatorMetaMTAConfigOptions' => 'applications/config/option/PhabricatorMetaMTAConfigOptions.php', 'PhabricatorMetaMTAController' => 'applications/metamta/controller/PhabricatorMetaMTAController.php', 'PhabricatorMetaMTADAO' => 'applications/metamta/storage/PhabricatorMetaMTADAO.php', 'PhabricatorMetaMTAEmailBodyParser' => 'applications/metamta/PhabricatorMetaMTAEmailBodyParser.php', 'PhabricatorMetaMTAEmailBodyParserTestCase' => 'applications/metamta/__tests__/PhabricatorMetaMTAEmailBodyParserTestCase.php', 'PhabricatorMetaMTAListController' => 'applications/metamta/controller/PhabricatorMetaMTAListController.php', 'PhabricatorMetaMTAMail' => 'applications/metamta/storage/PhabricatorMetaMTAMail.php', 'PhabricatorMetaMTAMailBody' => 'applications/metamta/view/PhabricatorMetaMTAMailBody.php', 'PhabricatorMetaMTAMailBodyTestCase' => 'applications/metamta/view/__tests__/PhabricatorMetaMTAMailBodyTestCase.php', 'PhabricatorMetaMTAMailTestCase' => 'applications/metamta/storage/__tests__/PhabricatorMetaMTAMailTestCase.php', 'PhabricatorMetaMTAMailingList' => 'applications/mailinglists/storage/PhabricatorMetaMTAMailingList.php', 'PhabricatorMetaMTAReceiveController' => 'applications/metamta/controller/PhabricatorMetaMTAReceiveController.php', 'PhabricatorMetaMTAReceivedListController' => 'applications/metamta/controller/PhabricatorMetaMTAReceivedListController.php', 'PhabricatorMetaMTAReceivedMail' => 'applications/metamta/storage/PhabricatorMetaMTAReceivedMail.php', 'PhabricatorMetaMTASendController' => 'applications/metamta/controller/PhabricatorMetaMTASendController.php', 'PhabricatorMetaMTASendGridReceiveController' => 'applications/metamta/controller/PhabricatorMetaMTASendGridReceiveController.php', 'PhabricatorMetaMTAViewController' => 'applications/metamta/controller/PhabricatorMetaMTAViewController.php', 'PhabricatorMetaMTAWorker' => 'applications/metamta/PhabricatorMetaMTAWorker.php', 'PhabricatorMustVerifyEmailController' => 'applications/auth/controller/PhabricatorMustVerifyEmailController.php', 'PhabricatorMySQLConfigOptions' => 'applications/config/option/PhabricatorMySQLConfigOptions.php', 'PhabricatorMySQLFileStorageEngine' => 'applications/files/engine/PhabricatorMySQLFileStorageEngine.php', 'PhabricatorNotificationBuilder' => 'applications/notification/builder/PhabricatorNotificationBuilder.php', 'PhabricatorNotificationClearController' => 'applications/notification/controller/PhabricatorNotificationClearController.php', 'PhabricatorNotificationConfigOptions' => 'applications/config/option/PhabricatorNotificationConfigOptions.php', 'PhabricatorNotificationController' => 'applications/notification/controller/PhabricatorNotificationController.php', 'PhabricatorNotificationIndividualController' => 'applications/notification/controller/PhabricatorNotificationIndividualController.php', 'PhabricatorNotificationListController' => 'applications/notification/controller/PhabricatorNotificationListController.php', 'PhabricatorNotificationPanelController' => 'applications/notification/controller/PhabricatorNotificationPanelController.php', 'PhabricatorNotificationQuery' => 'applications/notification/PhabricatorNotificationQuery.php', 'PhabricatorNotificationStatusController' => 'applications/notification/controller/PhabricatorNotificationStatusController.php', 'PhabricatorOAuthClientAuthorization' => 'applications/oauthserver/storage/PhabricatorOAuthClientAuthorization.php', 'PhabricatorOAuthClientAuthorizationBaseController' => 'applications/oauthserver/controller/clientauthorization/PhabricatorOAuthClientAuthorizationBaseController.php', 'PhabricatorOAuthClientAuthorizationDeleteController' => 'applications/oauthserver/controller/clientauthorization/PhabricatorOAuthClientAuthorizationDeleteController.php', 'PhabricatorOAuthClientAuthorizationEditController' => 'applications/oauthserver/controller/clientauthorization/PhabricatorOAuthClientAuthorizationEditController.php', 'PhabricatorOAuthClientAuthorizationListController' => 'applications/oauthserver/controller/clientauthorization/PhabricatorOAuthClientAuthorizationListController.php', 'PhabricatorOAuthClientAuthorizationQuery' => 'applications/oauthserver/query/PhabricatorOAuthClientAuthorizationQuery.php', 'PhabricatorOAuthClientBaseController' => 'applications/oauthserver/controller/client/PhabricatorOAuthClientBaseController.php', 'PhabricatorOAuthClientDeleteController' => 'applications/oauthserver/controller/client/PhabricatorOAuthClientDeleteController.php', 'PhabricatorOAuthClientEditController' => 'applications/oauthserver/controller/client/PhabricatorOAuthClientEditController.php', 'PhabricatorOAuthClientListController' => 'applications/oauthserver/controller/client/PhabricatorOAuthClientListController.php', 'PhabricatorOAuthClientViewController' => 'applications/oauthserver/controller/client/PhabricatorOAuthClientViewController.php', 'PhabricatorOAuthDefaultRegistrationController' => 'applications/auth/controller/oauthregistration/PhabricatorOAuthDefaultRegistrationController.php', 'PhabricatorOAuthDiagnosticsController' => 'applications/auth/controller/PhabricatorOAuthDiagnosticsController.php', 'PhabricatorOAuthFailureView' => 'applications/auth/view/PhabricatorOAuthFailureView.php', 'PhabricatorOAuthLoginController' => 'applications/auth/controller/PhabricatorOAuthLoginController.php', 'PhabricatorOAuthProvider' => 'applications/auth/oauth/provider/PhabricatorOAuthProvider.php', 'PhabricatorOAuthProviderDisqus' => 'applications/auth/oauth/provider/PhabricatorOAuthProviderDisqus.php', 'PhabricatorOAuthProviderException' => 'applications/auth/oauth/provider/PhabricatorOAuthProviderException.php', 'PhabricatorOAuthProviderFacebook' => 'applications/auth/oauth/provider/PhabricatorOAuthProviderFacebook.php', 'PhabricatorOAuthProviderGitHub' => 'applications/auth/oauth/provider/PhabricatorOAuthProviderGitHub.php', 'PhabricatorOAuthProviderGoogle' => 'applications/auth/oauth/provider/PhabricatorOAuthProviderGoogle.php', 'PhabricatorOAuthProviderPhabricator' => 'applications/auth/oauth/provider/PhabricatorOAuthProviderPhabricator.php', 'PhabricatorOAuthRegistrationController' => 'applications/auth/controller/oauthregistration/PhabricatorOAuthRegistrationController.php', 'PhabricatorOAuthResponse' => 'applications/oauthserver/PhabricatorOAuthResponse.php', 'PhabricatorOAuthServer' => 'applications/oauthserver/PhabricatorOAuthServer.php', 'PhabricatorOAuthServerAccessToken' => 'applications/oauthserver/storage/PhabricatorOAuthServerAccessToken.php', 'PhabricatorOAuthServerAuthController' => 'applications/oauthserver/controller/PhabricatorOAuthServerAuthController.php', 'PhabricatorOAuthServerAuthorizationCode' => 'applications/oauthserver/storage/PhabricatorOAuthServerAuthorizationCode.php', 'PhabricatorOAuthServerClient' => 'applications/oauthserver/storage/PhabricatorOAuthServerClient.php', 'PhabricatorOAuthServerClientQuery' => 'applications/oauthserver/query/PhabricatorOAuthServerClientQuery.php', 'PhabricatorOAuthServerController' => 'applications/oauthserver/controller/PhabricatorOAuthServerController.php', 'PhabricatorOAuthServerDAO' => 'applications/oauthserver/storage/PhabricatorOAuthServerDAO.php', 'PhabricatorOAuthServerScope' => 'applications/oauthserver/PhabricatorOAuthServerScope.php', 'PhabricatorOAuthServerTestCase' => 'applications/oauthserver/__tests__/PhabricatorOAuthServerTestCase.php', 'PhabricatorOAuthServerTestController' => 'applications/oauthserver/controller/PhabricatorOAuthServerTestController.php', 'PhabricatorOAuthServerTokenController' => 'applications/oauthserver/controller/PhabricatorOAuthServerTokenController.php', 'PhabricatorOAuthUnlinkController' => 'applications/auth/controller/PhabricatorOAuthUnlinkController.php', 'PhabricatorObjectHandle' => 'applications/phid/PhabricatorObjectHandle.php', 'PhabricatorObjectHandleConstants' => 'applications/phid/handle/const/PhabricatorObjectHandleConstants.php', 'PhabricatorObjectHandleData' => 'applications/phid/handle/PhabricatorObjectHandleData.php', 'PhabricatorObjectHandleStatus' => 'applications/phid/handle/const/PhabricatorObjectHandleStatus.php', 'PhabricatorObjectItemListView' => 'view/layout/PhabricatorObjectItemListView.php', 'PhabricatorObjectItemView' => 'view/layout/PhabricatorObjectItemView.php', 'PhabricatorObjectListView' => 'view/control/PhabricatorObjectListView.php', 'PhabricatorObjectSelectorDialog' => 'view/control/PhabricatorObjectSelectorDialog.php', 'PhabricatorOffsetPagedQuery' => 'infrastructure/query/PhabricatorOffsetPagedQuery.php', 'PhabricatorOwnerPathQuery' => 'applications/owners/query/PhabricatorOwnerPathQuery.php', 'PhabricatorOwnersConfigOptions' => 'applications/owners/config/PhabricatorOwnersConfigOptions.php', 'PhabricatorOwnersController' => 'applications/owners/controller/PhabricatorOwnersController.php', 'PhabricatorOwnersDAO' => 'applications/owners/storage/PhabricatorOwnersDAO.php', 'PhabricatorOwnersDeleteController' => 'applications/owners/controller/PhabricatorOwnersDeleteController.php', 'PhabricatorOwnersDetailController' => 'applications/owners/controller/PhabricatorOwnersDetailController.php', 'PhabricatorOwnersEditController' => 'applications/owners/controller/PhabricatorOwnersEditController.php', 'PhabricatorOwnersListController' => 'applications/owners/controller/PhabricatorOwnersListController.php', 'PhabricatorOwnersOwner' => 'applications/owners/storage/PhabricatorOwnersOwner.php', 'PhabricatorOwnersPackage' => 'applications/owners/storage/PhabricatorOwnersPackage.php', 'PhabricatorOwnersPackagePathValidator' => 'applications/repository/worker/commitchangeparser/PhabricatorOwnersPackagePathValidator.php', 'PhabricatorOwnersPackageQuery' => 'applications/owners/query/PhabricatorOwnersPackageQuery.php', 'PhabricatorOwnersPackageTestCase' => 'applications/owners/storage/__tests__/PhabricatorOwnersPackageTestCase.php', 'PhabricatorOwnersPath' => 'applications/owners/storage/PhabricatorOwnersPath.php', 'PhabricatorPHDConfigOptions' => 'applications/config/option/PhabricatorPHDConfigOptions.php', 'PhabricatorPHID' => 'applications/phid/storage/PhabricatorPHID.php', 'PhabricatorPHIDConfigOptions' => 'applications/phid/config/PhabricatorPHIDConfigOptions.php', 'PhabricatorPHIDConstants' => 'applications/phid/PhabricatorPHIDConstants.php', 'PhabricatorPHIDController' => 'applications/phid/controller/PhabricatorPHIDController.php', 'PhabricatorPHIDLookupController' => 'applications/phid/controller/PhabricatorPHIDLookupController.php', 'PhabricatorPHPMailerConfigOptions' => 'applications/config/option/PhabricatorPHPMailerConfigOptions.php', 'PhabricatorPaste' => 'applications/paste/storage/PhabricatorPaste.php', 'PhabricatorPasteController' => 'applications/paste/controller/PhabricatorPasteController.php', 'PhabricatorPasteDAO' => 'applications/paste/storage/PhabricatorPasteDAO.php', 'PhabricatorPasteEditController' => 'applications/paste/controller/PhabricatorPasteEditController.php', 'PhabricatorPasteListController' => 'applications/paste/controller/PhabricatorPasteListController.php', 'PhabricatorPasteQuery' => 'applications/paste/query/PhabricatorPasteQuery.php', 'PhabricatorPasteViewController' => 'applications/paste/controller/PhabricatorPasteViewController.php', 'PhabricatorPeopleController' => 'applications/people/controller/PhabricatorPeopleController.php', 'PhabricatorPeopleEditController' => 'applications/people/controller/PhabricatorPeopleEditController.php', 'PhabricatorPeopleLdapController' => 'applications/people/controller/PhabricatorPeopleLdapController.php', 'PhabricatorPeopleListController' => 'applications/people/controller/PhabricatorPeopleListController.php', 'PhabricatorPeopleLogsController' => 'applications/people/controller/PhabricatorPeopleLogsController.php', 'PhabricatorPeopleProfileController' => 'applications/people/controller/PhabricatorPeopleProfileController.php', 'PhabricatorPeopleQuery' => 'applications/people/PhabricatorPeopleQuery.php', 'PhabricatorPhabricatorOAuthConfigOptions' => 'applications/config/option/PhabricatorPhabricatorOAuthConfigOptions.php', 'PhabricatorPhameConfigOptions' => 'applications/phame/config/PhabricatorPhameConfigOptions.php', 'PhabricatorPholioConfigOptions' => 'applications/pholio/config/PhabricatorPholioConfigOptions.php', 'PhabricatorPhrictionConfigOptions' => 'applications/phriction/config/PhabricatorPhrictionConfigOptions.php', 'PhabricatorPinboardItemView' => 'view/layout/PhabricatorPinboardItemView.php', 'PhabricatorPinboardView' => 'view/layout/PhabricatorPinboardView.php', 'PhabricatorPolicies' => 'applications/policy/constants/PhabricatorPolicies.php', 'PhabricatorPolicy' => 'applications/policy/filter/PhabricatorPolicy.php', 'PhabricatorPolicyAwareQuery' => 'infrastructure/query/policy/PhabricatorPolicyAwareQuery.php', 'PhabricatorPolicyAwareTestQuery' => 'applications/policy/__tests__/PhabricatorPolicyAwareTestQuery.php', 'PhabricatorPolicyCapability' => 'applications/policy/constants/PhabricatorPolicyCapability.php', 'PhabricatorPolicyConfigOptions' => 'applications/config/option/PhabricatorPolicyConfigOptions.php', 'PhabricatorPolicyConstants' => 'applications/policy/constants/PhabricatorPolicyConstants.php', 'PhabricatorPolicyException' => 'applications/policy/exception/PhabricatorPolicyException.php', 'PhabricatorPolicyFilter' => 'applications/policy/filter/PhabricatorPolicyFilter.php', 'PhabricatorPolicyInterface' => 'applications/policy/interface/PhabricatorPolicyInterface.php', 'PhabricatorPolicyQuery' => 'applications/policy/query/PhabricatorPolicyQuery.php', 'PhabricatorPolicyTestCase' => 'applications/policy/__tests__/PhabricatorPolicyTestCase.php', 'PhabricatorPolicyTestObject' => 'applications/policy/__tests__/PhabricatorPolicyTestObject.php', 'PhabricatorPolicyType' => 'applications/policy/constants/PhabricatorPolicyType.php', 'PhabricatorProfileHeaderView' => 'view/layout/PhabricatorProfileHeaderView.php', 'PhabricatorProject' => 'applications/project/storage/PhabricatorProject.php', 'PhabricatorProjectConstants' => 'applications/project/constants/PhabricatorProjectConstants.php', 'PhabricatorProjectController' => 'applications/project/controller/PhabricatorProjectController.php', 'PhabricatorProjectCreateController' => 'applications/project/controller/PhabricatorProjectCreateController.php', 'PhabricatorProjectDAO' => 'applications/project/storage/PhabricatorProjectDAO.php', 'PhabricatorProjectEditor' => 'applications/project/editor/PhabricatorProjectEditor.php', 'PhabricatorProjectEditorTestCase' => 'applications/project/editor/__tests__/PhabricatorProjectEditorTestCase.php', 'PhabricatorProjectListController' => 'applications/project/controller/PhabricatorProjectListController.php', 'PhabricatorProjectMembersEditController' => 'applications/project/controller/PhabricatorProjectMembersEditController.php', 'PhabricatorProjectNameCollisionException' => 'applications/project/exception/PhabricatorProjectNameCollisionException.php', 'PhabricatorProjectProfile' => 'applications/project/storage/PhabricatorProjectProfile.php', 'PhabricatorProjectProfileController' => 'applications/project/controller/PhabricatorProjectProfileController.php', 'PhabricatorProjectProfileEditController' => 'applications/project/controller/PhabricatorProjectProfileEditController.php', 'PhabricatorProjectQuery' => 'applications/project/query/PhabricatorProjectQuery.php', 'PhabricatorProjectStatus' => 'applications/project/constants/PhabricatorProjectStatus.php', 'PhabricatorProjectTransaction' => 'applications/project/storage/PhabricatorProjectTransaction.php', 'PhabricatorProjectTransactionType' => 'applications/project/constants/PhabricatorProjectTransactionType.php', 'PhabricatorProjectUpdateController' => 'applications/project/controller/PhabricatorProjectUpdateController.php', 'PhabricatorPropertyListExample' => 'applications/uiexample/examples/PhabricatorPropertyListExample.php', 'PhabricatorPropertyListView' => 'view/layout/PhabricatorPropertyListView.php', 'PhabricatorQuery' => 'infrastructure/query/PhabricatorQuery.php', 'PhabricatorRecaptchaConfigOptions' => 'applications/config/option/PhabricatorRecaptchaConfigOptions.php', 'PhabricatorRedirectController' => 'applications/base/controller/PhabricatorRedirectController.php', 'PhabricatorRefreshCSRFController' => 'applications/auth/controller/PhabricatorRefreshCSRFController.php', 'PhabricatorRemarkupControl' => 'view/form/control/PhabricatorRemarkupControl.php', 'PhabricatorRemarkupRuleCountdown' => 'infrastructure/markup/rule/PhabricatorRemarkupRuleCountdown.php', 'PhabricatorRemarkupRuleDifferential' => 'infrastructure/markup/rule/PhabricatorRemarkupRuleDifferential.php', 'PhabricatorRemarkupRuleDifferentialHandle' => 'infrastructure/markup/rule/handle/PhabricatorRemarkupRuleDifferentialHandle.php', 'PhabricatorRemarkupRuleDiffusion' => 'infrastructure/markup/rule/PhabricatorRemarkupRuleDiffusion.php', 'PhabricatorRemarkupRuleEmbedFile' => 'infrastructure/markup/rule/PhabricatorRemarkupRuleEmbedFile.php', 'PhabricatorRemarkupRuleImageMacro' => 'infrastructure/markup/rule/PhabricatorRemarkupRuleImageMacro.php', 'PhabricatorRemarkupRuleManiphest' => 'infrastructure/markup/rule/PhabricatorRemarkupRuleManiphest.php', 'PhabricatorRemarkupRuleManiphestHandle' => 'infrastructure/markup/rule/handle/PhabricatorRemarkupRuleManiphestHandle.php', 'PhabricatorRemarkupRuleMeme' => 'infrastructure/markup/rule/PhabricatorRemarkupRuleMeme.php', 'PhabricatorRemarkupRuleMention' => 'infrastructure/markup/rule/PhabricatorRemarkupRuleMention.php', 'PhabricatorRemarkupRuleObjectHandle' => 'infrastructure/markup/rule/PhabricatorRemarkupRuleObjectHandle.php', 'PhabricatorRemarkupRuleObjectName' => 'infrastructure/markup/rule/PhabricatorRemarkupRuleObjectName.php', 'PhabricatorRemarkupRulePaste' => 'infrastructure/markup/rule/PhabricatorRemarkupRulePaste.php', 'PhabricatorRemarkupRulePhriction' => 'infrastructure/markup/rule/PhabricatorRemarkupRulePhriction.php', 'PhabricatorRemarkupRuleYoutube' => 'infrastructure/markup/rule/PhabricatorRemarkupRuleYoutube.php', 'PhabricatorRepository' => 'applications/repository/storage/PhabricatorRepository.php', 'PhabricatorRepositoryArcanistProject' => 'applications/repository/storage/PhabricatorRepositoryArcanistProject.php', 'PhabricatorRepositoryArcanistProjectDeleteController' => 'applications/repository/controller/PhabricatorRepositoryArcanistProjectDeleteController.php', 'PhabricatorRepositoryArcanistProjectEditController' => 'applications/repository/controller/PhabricatorRepositoryArcanistProjectEditController.php', 'PhabricatorRepositoryAuditRequest' => 'applications/repository/storage/PhabricatorRepositoryAuditRequest.php', 'PhabricatorRepositoryBranch' => 'applications/repository/storage/PhabricatorRepositoryBranch.php', 'PhabricatorRepositoryCommit' => 'applications/repository/storage/PhabricatorRepositoryCommit.php', 'PhabricatorRepositoryCommitChangeParserWorker' => 'applications/repository/worker/commitchangeparser/PhabricatorRepositoryCommitChangeParserWorker.php', 'PhabricatorRepositoryCommitData' => 'applications/repository/storage/PhabricatorRepositoryCommitData.php', 'PhabricatorRepositoryCommitHeraldWorker' => 'applications/repository/worker/PhabricatorRepositoryCommitHeraldWorker.php', 'PhabricatorRepositoryCommitMessageParserWorker' => 'applications/repository/worker/commitmessageparser/PhabricatorRepositoryCommitMessageParserWorker.php', 'PhabricatorRepositoryCommitOwnersWorker' => 'applications/repository/worker/PhabricatorRepositoryCommitOwnersWorker.php', 'PhabricatorRepositoryCommitParserWorker' => 'applications/repository/worker/PhabricatorRepositoryCommitParserWorker.php', 'PhabricatorRepositoryCommitSearchIndexer' => 'applications/repository/search/PhabricatorRepositoryCommitSearchIndexer.php', 'PhabricatorRepositoryConfigOptions' => 'applications/repository/PhabricatorRepositoryConfigOptions.php', 'PhabricatorRepositoryController' => 'applications/repository/controller/PhabricatorRepositoryController.php', 'PhabricatorRepositoryCreateController' => 'applications/repository/controller/PhabricatorRepositoryCreateController.php', 'PhabricatorRepositoryDAO' => 'applications/repository/storage/PhabricatorRepositoryDAO.php', 'PhabricatorRepositoryDeleteController' => 'applications/repository/controller/PhabricatorRepositoryDeleteController.php', 'PhabricatorRepositoryEditController' => 'applications/repository/controller/PhabricatorRepositoryEditController.php', 'PhabricatorRepositoryGitCommitChangeParserWorker' => 'applications/repository/worker/commitchangeparser/PhabricatorRepositoryGitCommitChangeParserWorker.php', 'PhabricatorRepositoryGitCommitMessageParserWorker' => 'applications/repository/worker/commitmessageparser/PhabricatorRepositoryGitCommitMessageParserWorker.php', 'PhabricatorRepositoryListController' => 'applications/repository/controller/PhabricatorRepositoryListController.php', 'PhabricatorRepositoryManagementDeleteWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementDeleteWorkflow.php', 'PhabricatorRepositoryManagementDiscoverWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementDiscoverWorkflow.php', 'PhabricatorRepositoryManagementListWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementListWorkflow.php', 'PhabricatorRepositoryManagementPullWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementPullWorkflow.php', 'PhabricatorRepositoryManagementWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementWorkflow.php', 'PhabricatorRepositoryMercurialCommitChangeParserWorker' => 'applications/repository/worker/commitchangeparser/PhabricatorRepositoryMercurialCommitChangeParserWorker.php', 'PhabricatorRepositoryMercurialCommitMessageParserWorker' => 'applications/repository/worker/commitmessageparser/PhabricatorRepositoryMercurialCommitMessageParserWorker.php', 'PhabricatorRepositoryPullLocalDaemon' => 'applications/repository/daemon/PhabricatorRepositoryPullLocalDaemon.php', 'PhabricatorRepositoryPullLocalDaemonTestCase' => 'applications/repository/daemon/__tests__/PhabricatorRepositoryPullLocalDaemonTestCase.php', 'PhabricatorRepositoryQuery' => 'applications/repository/query/PhabricatorRepositoryQuery.php', 'PhabricatorRepositoryShortcut' => 'applications/repository/storage/PhabricatorRepositoryShortcut.php', 'PhabricatorRepositorySvnCommitChangeParserWorker' => 'applications/repository/worker/commitchangeparser/PhabricatorRepositorySvnCommitChangeParserWorker.php', 'PhabricatorRepositorySvnCommitMessageParserWorker' => 'applications/repository/worker/commitmessageparser/PhabricatorRepositorySvnCommitMessageParserWorker.php', 'PhabricatorRepositorySymbol' => 'applications/repository/storage/PhabricatorRepositorySymbol.php', 'PhabricatorRepositoryTestCase' => 'applications/repository/storage/__tests__/PhabricatorRepositoryTestCase.php', 'PhabricatorRepositoryType' => 'applications/repository/constants/PhabricatorRepositoryType.php', 'PhabricatorS3FileStorageEngine' => 'applications/files/engine/PhabricatorS3FileStorageEngine.php', 'PhabricatorSQLPatchList' => 'infrastructure/storage/patch/PhabricatorSQLPatchList.php', 'PhabricatorSSHWorkflow' => 'infrastructure/ssh/PhabricatorSSHWorkflow.php', 'PhabricatorScopedEnv' => 'infrastructure/env/PhabricatorScopedEnv.php', 'PhabricatorSearchAbstractDocument' => 'applications/search/index/PhabricatorSearchAbstractDocument.php', 'PhabricatorSearchAttachController' => 'applications/search/controller/PhabricatorSearchAttachController.php', 'PhabricatorSearchBaseController' => 'applications/search/controller/PhabricatorSearchBaseController.php', 'PhabricatorSearchConfigOptions' => 'applications/search/config/PhabricatorSearchConfigOptions.php', 'PhabricatorSearchController' => 'applications/search/controller/PhabricatorSearchController.php', 'PhabricatorSearchDAO' => 'applications/search/storage/PhabricatorSearchDAO.php', 'PhabricatorSearchDocument' => 'applications/search/storage/document/PhabricatorSearchDocument.php', 'PhabricatorSearchDocumentField' => 'applications/search/storage/document/PhabricatorSearchDocumentField.php', 'PhabricatorSearchDocumentIndexer' => 'applications/search/index/PhabricatorSearchDocumentIndexer.php', 'PhabricatorSearchDocumentRelationship' => 'applications/search/storage/document/PhabricatorSearchDocumentRelationship.php', 'PhabricatorSearchEngine' => 'applications/search/engine/PhabricatorSearchEngine.php', 'PhabricatorSearchEngineElastic' => 'applications/search/engine/PhabricatorSearchEngineElastic.php', 'PhabricatorSearchEngineMySQL' => 'applications/search/engine/PhabricatorSearchEngineMySQL.php', 'PhabricatorSearchEngineSelector' => 'applications/search/selector/PhabricatorSearchEngineSelector.php', 'PhabricatorSearchField' => 'applications/search/constants/PhabricatorSearchField.php', 'PhabricatorSearchIndexer' => 'applications/search/index/PhabricatorSearchIndexer.php', 'PhabricatorSearchManagementIndexWorkflow' => 'applications/search/management/PhabricatorSearchManagementIndexWorkflow.php', 'PhabricatorSearchManagementWorkflow' => 'applications/search/management/PhabricatorSearchManagementWorkflow.php', 'PhabricatorSearchQuery' => 'applications/search/storage/PhabricatorSearchQuery.php', 'PhabricatorSearchRelationship' => 'applications/search/constants/PhabricatorSearchRelationship.php', 'PhabricatorSearchResultView' => 'applications/search/view/PhabricatorSearchResultView.php', 'PhabricatorSearchScope' => 'applications/search/constants/PhabricatorSearchScope.php', 'PhabricatorSearchSelectController' => 'applications/search/controller/PhabricatorSearchSelectController.php', 'PhabricatorSecurityConfigOptions' => 'applications/config/option/PhabricatorSecurityConfigOptions.php', 'PhabricatorSendGridConfigOptions' => 'applications/config/option/PhabricatorSendGridConfigOptions.php', 'PhabricatorSettingsAdjustController' => 'applications/settings/controller/PhabricatorSettingsAdjustController.php', 'PhabricatorSettingsMainController' => 'applications/settings/controller/PhabricatorSettingsMainController.php', 'PhabricatorSettingsPanel' => 'applications/settings/panel/PhabricatorSettingsPanel.php', 'PhabricatorSettingsPanelAccount' => 'applications/settings/panel/PhabricatorSettingsPanelAccount.php', 'PhabricatorSettingsPanelConduit' => 'applications/settings/panel/PhabricatorSettingsPanelConduit.php', 'PhabricatorSettingsPanelDisplayPreferences' => 'applications/settings/panel/PhabricatorSettingsPanelDisplayPreferences.php', 'PhabricatorSettingsPanelEmailAddresses' => 'applications/settings/panel/PhabricatorSettingsPanelEmailAddresses.php', 'PhabricatorSettingsPanelEmailPreferences' => 'applications/settings/panel/PhabricatorSettingsPanelEmailPreferences.php', 'PhabricatorSettingsPanelHomePreferences' => 'applications/settings/panel/PhabricatorSettingsPanelHomePreferences.php', 'PhabricatorSettingsPanelLDAP' => 'applications/settings/panel/PhabricatorSettingsPanelLDAP.php', 'PhabricatorSettingsPanelOAuth' => 'applications/settings/panel/PhabricatorSettingsPanelOAuth.php', 'PhabricatorSettingsPanelPassword' => 'applications/settings/panel/PhabricatorSettingsPanelPassword.php', 'PhabricatorSettingsPanelProfile' => 'applications/settings/panel/PhabricatorSettingsPanelProfile.php', 'PhabricatorSettingsPanelSSHKeys' => 'applications/settings/panel/PhabricatorSettingsPanelSSHKeys.php', 'PhabricatorSettingsPanelSearchPreferences' => 'applications/settings/panel/PhabricatorSettingsPanelSearchPreferences.php', 'PhabricatorSetupCheck' => 'applications/config/check/PhabricatorSetupCheck.php', 'PhabricatorSetupCheckAPC' => 'applications/config/check/PhabricatorSetupCheckAPC.php', 'PhabricatorSetupCheckBaseURI' => 'applications/config/check/PhabricatorSetupCheckBaseURI.php', 'PhabricatorSetupCheckDatabase' => 'applications/config/check/PhabricatorSetupCheckDatabase.php', 'PhabricatorSetupCheckExtensions' => 'applications/config/check/PhabricatorSetupCheckExtensions.php', 'PhabricatorSetupCheckExtraConfig' => 'applications/config/check/PhabricatorSetupCheckExtraConfig.php', 'PhabricatorSetupCheckFacebook' => 'applications/config/check/PhabricatorSetupCheckFacebook.php', 'PhabricatorSetupCheckGD' => 'applications/config/check/PhabricatorSetupCheckGD.php', 'PhabricatorSetupCheckInvalidConfig' => 'applications/config/check/PhabricatorSetupCheckInvalidConfig.php', 'PhabricatorSetupCheckMail' => 'applications/config/check/PhabricatorSetupCheckMail.php', 'PhabricatorSetupCheckMySQL' => 'applications/config/check/PhabricatorSetupCheckMySQL.php', 'PhabricatorSetupCheckPHPConfig' => 'applications/config/check/PhabricatorSetupCheckPHPConfig.php', 'PhabricatorSetupCheckPath' => 'applications/config/check/PhabricatorSetupCheckPath.php', 'PhabricatorSetupCheckStorage' => 'applications/config/check/PhabricatorSetupCheckStorage.php', 'PhabricatorSetupCheckTimezone' => 'applications/config/check/PhabricatorSetupCheckTimezone.php', 'PhabricatorSetupIssue' => 'applications/config/issue/PhabricatorSetupIssue.php', 'PhabricatorSetupIssueView' => 'applications/config/view/PhabricatorSetupIssueView.php', 'PhabricatorSlowvoteChoice' => 'applications/slowvote/storage/PhabricatorSlowvoteChoice.php', 'PhabricatorSlowvoteComment' => 'applications/slowvote/storage/PhabricatorSlowvoteComment.php', 'PhabricatorSlowvoteController' => 'applications/slowvote/controller/PhabricatorSlowvoteController.php', 'PhabricatorSlowvoteCreateController' => 'applications/slowvote/controller/PhabricatorSlowvoteCreateController.php', 'PhabricatorSlowvoteDAO' => 'applications/slowvote/storage/PhabricatorSlowvoteDAO.php', 'PhabricatorSlowvoteListController' => 'applications/slowvote/controller/PhabricatorSlowvoteListController.php', 'PhabricatorSlowvoteOption' => 'applications/slowvote/storage/PhabricatorSlowvoteOption.php', 'PhabricatorSlowvotePoll' => 'applications/slowvote/storage/PhabricatorSlowvotePoll.php', 'PhabricatorSlowvotePollController' => 'applications/slowvote/controller/PhabricatorSlowvotePollController.php', 'PhabricatorSlug' => 'infrastructure/util/PhabricatorSlug.php', 'PhabricatorSlugTestCase' => 'infrastructure/util/__tests__/PhabricatorSlugTestCase.php', 'PhabricatorSortTableExample' => 'applications/uiexample/examples/PhabricatorSortTableExample.php', 'PhabricatorSourceCodeView' => 'view/layout/PhabricatorSourceCodeView.php', 'PhabricatorStandardPageView' => 'view/page/PhabricatorStandardPageView.php', 'PhabricatorStatusController' => 'applications/status/PhabricatorStatusController.php', 'PhabricatorStorageFixtureScopeGuard' => 'infrastructure/testing/fixture/PhabricatorStorageFixtureScopeGuard.php', 'PhabricatorStorageManagementAPI' => 'infrastructure/storage/management/PhabricatorStorageManagementAPI.php', 'PhabricatorStorageManagementDatabasesWorkflow' => 'infrastructure/storage/management/workflow/PhabricatorStorageManagementDatabasesWorkflow.php', 'PhabricatorStorageManagementDestroyWorkflow' => 'infrastructure/storage/management/workflow/PhabricatorStorageManagementDestroyWorkflow.php', 'PhabricatorStorageManagementDumpWorkflow' => 'infrastructure/storage/management/workflow/PhabricatorStorageManagementDumpWorkflow.php', 'PhabricatorStorageManagementStatusWorkflow' => 'infrastructure/storage/management/workflow/PhabricatorStorageManagementStatusWorkflow.php', 'PhabricatorStorageManagementUpgradeWorkflow' => 'infrastructure/storage/management/workflow/PhabricatorStorageManagementUpgradeWorkflow.php', 'PhabricatorStorageManagementWorkflow' => 'infrastructure/storage/management/workflow/PhabricatorStorageManagementWorkflow.php', 'PhabricatorStoragePatch' => 'infrastructure/storage/management/PhabricatorStoragePatch.php', 'PhabricatorSubscribableInterface' => 'applications/subscriptions/interface/PhabricatorSubscribableInterface.php', 'PhabricatorSubscribersQuery' => 'applications/subscriptions/query/PhabricatorSubscribersQuery.php', 'PhabricatorSubscriptionsEditController' => 'applications/subscriptions/controller/PhabricatorSubscriptionsEditController.php', 'PhabricatorSubscriptionsEditor' => 'applications/subscriptions/editor/PhabricatorSubscriptionsEditor.php', 'PhabricatorSubscriptionsUIEventListener' => 'applications/subscriptions/events/PhabricatorSubscriptionsUIEventListener.php', 'PhabricatorSymbolNameLinter' => 'infrastructure/lint/hook/PhabricatorSymbolNameLinter.php', 'PhabricatorSyntaxHighlighter' => 'infrastructure/markup/PhabricatorSyntaxHighlighter.php', 'PhabricatorSyntaxHighlightingConfigOptions' => 'applications/config/option/PhabricatorSyntaxHighlightingConfigOptions.php', 'PhabricatorTagExample' => 'applications/uiexample/examples/PhabricatorTagExample.php', 'PhabricatorTagView' => 'view/layout/PhabricatorTagView.php', 'PhabricatorTaskmasterDaemon' => 'infrastructure/daemon/workers/PhabricatorTaskmasterDaemon.php', 'PhabricatorTestCase' => 'infrastructure/testing/PhabricatorTestCase.php', 'PhabricatorTestWorker' => 'infrastructure/daemon/workers/__tests__/PhabricatorTestWorker.php', 'PhabricatorTimelineCursor' => 'infrastructure/daemon/timeline/storage/PhabricatorTimelineCursor.php', 'PhabricatorTimelineDAO' => 'infrastructure/daemon/timeline/storage/PhabricatorTimelineDAO.php', 'PhabricatorTimelineEvent' => 'infrastructure/daemon/timeline/storage/PhabricatorTimelineEvent.php', 'PhabricatorTimelineEventData' => 'infrastructure/daemon/timeline/storage/PhabricatorTimelineEventData.php', 'PhabricatorTimelineEventView' => 'view/layout/PhabricatorTimelineEventView.php', 'PhabricatorTimelineExample' => 'applications/uiexample/examples/PhabricatorTimelineExample.php', 'PhabricatorTimelineIterator' => 'infrastructure/daemon/timeline/cursor/PhabricatorTimelineIterator.php', 'PhabricatorTimelineView' => 'view/layout/PhabricatorTimelineView.php', 'PhabricatorTimer' => 'applications/countdown/storage/PhabricatorTimer.php', 'PhabricatorTransactionView' => 'view/layout/PhabricatorTransactionView.php', 'PhabricatorTransactions' => 'applications/transactions/constants/PhabricatorTransactions.php', 'PhabricatorTransformedFile' => 'applications/files/storage/PhabricatorTransformedFile.php', 'PhabricatorTranslation' => 'infrastructure/internationalization/PhabricatorTranslation.php', 'PhabricatorTranslationsConfigOptions' => 'applications/config/option/PhabricatorTranslationsConfigOptions.php', 'PhabricatorTrivialTestCase' => 'infrastructure/testing/__tests__/PhabricatorTrivialTestCase.php', 'PhabricatorTypeaheadCommonDatasourceController' => 'applications/typeahead/controller/PhabricatorTypeaheadCommonDatasourceController.php', 'PhabricatorTypeaheadDatasourceController' => 'applications/typeahead/controller/PhabricatorTypeaheadDatasourceController.php', 'PhabricatorTypeaheadResult' => 'applications/typeahead/storage/PhabricatorTypeaheadResult.php', 'PhabricatorUIExample' => 'applications/uiexample/examples/PhabricatorUIExample.php', 'PhabricatorUIExampleRenderController' => 'applications/uiexample/controller/PhabricatorUIExampleRenderController.php', 'PhabricatorUIListFilterExample' => 'applications/uiexample/examples/PhabricatorUIListFilterExample.php', 'PhabricatorUINotificationExample' => 'applications/uiexample/examples/PhabricatorUINotificationExample.php', 'PhabricatorUIPagerExample' => 'applications/uiexample/examples/PhabricatorUIPagerExample.php', 'PhabricatorUITooltipExample' => 'applications/uiexample/examples/PhabricatorUITooltipExample.php', 'PhabricatorUnitsTestCase' => 'view/__tests__/PhabricatorUnitsTestCase.php', 'PhabricatorUser' => 'applications/people/storage/PhabricatorUser.php', 'PhabricatorUserDAO' => 'applications/people/storage/PhabricatorUserDAO.php', 'PhabricatorUserEditor' => 'applications/people/PhabricatorUserEditor.php', 'PhabricatorUserEmail' => 'applications/people/storage/PhabricatorUserEmail.php', 'PhabricatorUserLDAPInfo' => 'applications/people/storage/PhabricatorUserLDAPInfo.php', 'PhabricatorUserLog' => 'applications/people/storage/PhabricatorUserLog.php', 'PhabricatorUserOAuthInfo' => 'applications/people/storage/PhabricatorUserOAuthInfo.php', 'PhabricatorUserPreferences' => 'applications/settings/storage/PhabricatorUserPreferences.php', 'PhabricatorUserProfile' => 'applications/people/storage/PhabricatorUserProfile.php', 'PhabricatorUserSSHKey' => 'applications/settings/storage/PhabricatorUserSSHKey.php', 'PhabricatorUserSearchIndexer' => 'applications/people/search/PhabricatorUserSearchIndexer.php', 'PhabricatorUserStatus' => 'applications/people/storage/PhabricatorUserStatus.php', 'PhabricatorUserStatusInvalidEpochException' => 'applications/people/exception/PhabricatorUserStatusInvalidEpochException.php', 'PhabricatorUserStatusOverlapException' => 'applications/people/exception/PhabricatorUserStatusOverlapException.php', 'PhabricatorUserTestCase' => 'applications/people/storage/__tests__/PhabricatorUserTestCase.php', 'PhabricatorWorker' => 'infrastructure/daemon/workers/PhabricatorWorker.php', 'PhabricatorWorkerActiveTask' => 'infrastructure/daemon/workers/storage/PhabricatorWorkerActiveTask.php', 'PhabricatorWorkerArchiveTask' => 'infrastructure/daemon/workers/storage/PhabricatorWorkerArchiveTask.php', 'PhabricatorWorkerDAO' => 'infrastructure/daemon/workers/storage/PhabricatorWorkerDAO.php', 'PhabricatorWorkerLeaseQuery' => 'infrastructure/daemon/workers/query/PhabricatorWorkerLeaseQuery.php', 'PhabricatorWorkerPermanentFailureException' => 'infrastructure/daemon/workers/exception/PhabricatorWorkerPermanentFailureException.php', 'PhabricatorWorkerTask' => 'infrastructure/daemon/workers/storage/PhabricatorWorkerTask.php', 'PhabricatorWorkerTaskData' => 'infrastructure/daemon/workers/storage/PhabricatorWorkerTaskData.php', 'PhabricatorWorkerTaskDetailController' => 'applications/daemon/controller/PhabricatorWorkerTaskDetailController.php', 'PhabricatorWorkerTaskUpdateController' => 'applications/daemon/controller/PhabricatorWorkerTaskUpdateController.php', 'PhabricatorWorkerTestCase' => 'infrastructure/daemon/workers/__tests__/PhabricatorWorkerTestCase.php', 'PhabricatorXHPASTViewController' => 'applications/phpast/controller/PhabricatorXHPASTViewController.php', 'PhabricatorXHPASTViewDAO' => 'applications/phpast/storage/PhabricatorXHPASTViewDAO.php', 'PhabricatorXHPASTViewFrameController' => 'applications/phpast/controller/PhabricatorXHPASTViewFrameController.php', 'PhabricatorXHPASTViewFramesetController' => 'applications/phpast/controller/PhabricatorXHPASTViewFramesetController.php', 'PhabricatorXHPASTViewInputController' => 'applications/phpast/controller/PhabricatorXHPASTViewInputController.php', 'PhabricatorXHPASTViewPanelController' => 'applications/phpast/controller/PhabricatorXHPASTViewPanelController.php', 'PhabricatorXHPASTViewParseTree' => 'applications/phpast/storage/PhabricatorXHPASTViewParseTree.php', 'PhabricatorXHPASTViewRunController' => 'applications/phpast/controller/PhabricatorXHPASTViewRunController.php', 'PhabricatorXHPASTViewStreamController' => 'applications/phpast/controller/PhabricatorXHPASTViewStreamController.php', 'PhabricatorXHPASTViewTreeController' => 'applications/phpast/controller/PhabricatorXHPASTViewTreeController.php', 'PhabricatorXHProfController' => 'applications/xhprof/controller/PhabricatorXHProfController.php', 'PhabricatorXHProfDAO' => 'applications/xhprof/storage/PhabricatorXHProfDAO.php', 'PhabricatorXHProfProfileController' => 'applications/xhprof/controller/PhabricatorXHProfProfileController.php', 'PhabricatorXHProfProfileSymbolView' => 'applications/xhprof/view/PhabricatorXHProfProfileSymbolView.php', 'PhabricatorXHProfProfileTopLevelView' => 'applications/xhprof/view/PhabricatorXHProfProfileTopLevelView.php', 'PhabricatorXHProfProfileView' => 'applications/xhprof/view/PhabricatorXHProfProfileView.php', 'PhabricatorXHProfSample' => 'applications/xhprof/storage/PhabricatorXHProfSample.php', 'PhabricatorXHProfSampleListController' => 'applications/xhprof/controller/PhabricatorXHProfSampleListController.php', 'PhabricatorXHProfSampleListView' => 'applications/xhprof/view/PhabricatorXHProfSampleListView.php', 'PhameBasicBlogSkin' => 'applications/phame/skins/PhameBasicBlogSkin.php', 'PhameBasicTemplateBlogSkin' => 'applications/phame/skins/PhameBasicTemplateBlogSkin.php', 'PhameBlog' => 'applications/phame/storage/PhameBlog.php', 'PhameBlogDeleteController' => 'applications/phame/controller/blog/PhameBlogDeleteController.php', 'PhameBlogEditController' => 'applications/phame/controller/blog/PhameBlogEditController.php', 'PhameBlogFeedController' => 'applications/phame/controller/blog/PhameBlogFeedController.php', 'PhameBlogListController' => 'applications/phame/controller/blog/PhameBlogListController.php', 'PhameBlogLiveController' => 'applications/phame/controller/blog/PhameBlogLiveController.php', 'PhameBlogQuery' => 'applications/phame/query/PhameBlogQuery.php', 'PhameBlogSkin' => 'applications/phame/skins/PhameBlogSkin.php', 'PhameBlogViewController' => 'applications/phame/controller/blog/PhameBlogViewController.php', 'PhameController' => 'applications/phame/controller/PhameController.php', 'PhameDAO' => 'applications/phame/storage/PhameDAO.php', 'PhamePost' => 'applications/phame/storage/PhamePost.php', 'PhamePostDeleteController' => 'applications/phame/controller/post/PhamePostDeleteController.php', 'PhamePostEditController' => 'applications/phame/controller/post/PhamePostEditController.php', 'PhamePostFramedController' => 'applications/phame/controller/post/PhamePostFramedController.php', 'PhamePostListController' => 'applications/phame/controller/post/PhamePostListController.php', 'PhamePostNewController' => 'applications/phame/controller/post/PhamePostNewController.php', 'PhamePostNotLiveController' => 'applications/phame/controller/post/PhamePostNotLiveController.php', 'PhamePostPreviewController' => 'applications/phame/controller/post/PhamePostPreviewController.php', 'PhamePostPublishController' => 'applications/phame/controller/post/PhamePostPublishController.php', 'PhamePostQuery' => 'applications/phame/query/PhamePostQuery.php', 'PhamePostUnpublishController' => 'applications/phame/controller/post/PhamePostUnpublishController.php', 'PhamePostView' => 'applications/phame/view/PhamePostView.php', 'PhamePostViewController' => 'applications/phame/controller/post/PhamePostViewController.php', 'PhameResourceController' => 'applications/phame/controller/PhameResourceController.php', 'PhameSkinSpecification' => 'applications/phame/skins/PhameSkinSpecification.php', 'PholioConstants' => 'applications/pholio/constants/PholioConstants.php', 'PholioController' => 'applications/pholio/controller/PholioController.php', 'PholioDAO' => 'applications/pholio/storage/PholioDAO.php', 'PholioImage' => 'applications/pholio/storage/PholioImage.php', 'PholioMock' => 'applications/pholio/storage/PholioMock.php', 'PholioMockCommentController' => 'applications/pholio/controller/PholioMockCommentController.php', 'PholioMockEditController' => 'applications/pholio/controller/PholioMockEditController.php', 'PholioMockEditor' => 'applications/pholio/editor/PholioMockEditor.php', 'PholioMockImagesView' => 'applications/pholio/view/PholioMockImagesView.php', 'PholioMockListController' => 'applications/pholio/controller/PholioMockListController.php', 'PholioMockQuery' => 'applications/pholio/query/PholioMockQuery.php', 'PholioMockViewController' => 'applications/pholio/controller/PholioMockViewController.php', 'PholioReplyHandler' => 'applications/pholio/mail/PholioReplyHandler.php', 'PholioSearchIndexer' => 'applications/pholio/search/PholioSearchIndexer.php', 'PholioTransaction' => 'applications/pholio/storage/PholioTransaction.php', 'PholioTransactionComment' => 'applications/pholio/storage/PholioTransactionComment.php', 'PholioTransactionQuery' => 'applications/pholio/query/PholioTransactionQuery.php', 'PholioTransactionType' => 'applications/pholio/constants/PholioTransactionType.php', 'PhortuneMonthYearExpiryControl' => 'applications/phortune/control/PhortuneMonthYearExpiryControl.php', 'PhortuneStripeBaseController' => 'applications/phortune/stripe/controller/PhortuneStripeBaseController.php', 'PhortuneStripePaymentFormView' => 'applications/phortune/stripe/view/PhortuneStripePaymentFormView.php', 'PhortuneStripeTestPaymentFormController' => 'applications/phortune/stripe/controller/PhortuneStripeTestPaymentFormController.php', 'PhrictionActionConstants' => 'applications/phriction/constants/PhrictionActionConstants.php', 'PhrictionChangeType' => 'applications/phriction/constants/PhrictionChangeType.php', 'PhrictionConstants' => 'applications/phriction/constants/PhrictionConstants.php', 'PhrictionContent' => 'applications/phriction/storage/PhrictionContent.php', 'PhrictionController' => 'applications/phriction/controller/PhrictionController.php', 'PhrictionDAO' => 'applications/phriction/storage/PhrictionDAO.php', 'PhrictionDeleteController' => 'applications/phriction/controller/PhrictionDeleteController.php', 'PhrictionDiffController' => 'applications/phriction/controller/PhrictionDiffController.php', 'PhrictionDocument' => 'applications/phriction/storage/PhrictionDocument.php', 'PhrictionDocumentController' => 'applications/phriction/controller/PhrictionDocumentController.php', 'PhrictionDocumentEditor' => 'applications/phriction/editor/PhrictionDocumentEditor.php', 'PhrictionDocumentPreviewController' => 'applications/phriction/controller/PhrictionDocumentPreviewController.php', 'PhrictionDocumentStatus' => 'applications/phriction/constants/PhrictionDocumentStatus.php', 'PhrictionDocumentTestCase' => 'applications/phriction/storage/__tests__/PhrictionDocumentTestCase.php', 'PhrictionEditController' => 'applications/phriction/controller/PhrictionEditController.php', 'PhrictionHistoryController' => 'applications/phriction/controller/PhrictionHistoryController.php', 'PhrictionListController' => 'applications/phriction/controller/PhrictionListController.php', 'PhrictionNewController' => 'applications/phriction/controller/PhrictionNewController.php', 'PhrictionSearchIndexer' => 'applications/phriction/search/PhrictionSearchIndexer.php', 'PonderAddAnswerView' => 'applications/ponder/view/PonderAddAnswerView.php', 'PonderAddCommentView' => 'applications/ponder/view/PonderAddCommentView.php', 'PonderAnswer' => 'applications/ponder/storage/PonderAnswer.php', 'PonderAnswerEditor' => 'applications/ponder/editor/PonderAnswerEditor.php', 'PonderAnswerListView' => 'applications/ponder/view/PonderAnswerListView.php', 'PonderAnswerPreviewController' => 'applications/ponder/controller/PonderAnswerPreviewController.php', 'PonderAnswerQuery' => 'applications/ponder/query/PonderAnswerQuery.php', 'PonderAnswerSaveController' => 'applications/ponder/controller/PonderAnswerSaveController.php', 'PonderAnswerViewController' => 'applications/ponder/controller/PonderAnswerViewController.php', 'PonderAnsweredMail' => 'applications/ponder/mail/PonderAnsweredMail.php', 'PonderComment' => 'applications/ponder/storage/PonderComment.php', 'PonderCommentEditor' => 'applications/ponder/editor/PonderCommentEditor.php', 'PonderCommentListView' => 'applications/ponder/view/PonderCommentListView.php', 'PonderCommentMail' => 'applications/ponder/mail/PonderCommentMail.php', 'PonderCommentQuery' => 'applications/ponder/query/PonderCommentQuery.php', 'PonderCommentSaveController' => 'applications/ponder/controller/PonderCommentSaveController.php', 'PonderConstants' => 'applications/ponder/PonderConstants.php', 'PonderController' => 'applications/ponder/controller/PonderController.php', 'PonderDAO' => 'applications/ponder/storage/PonderDAO.php', 'PonderFeedController' => 'applications/ponder/controller/PonderFeedController.php', 'PonderMail' => 'applications/ponder/mail/PonderMail.php', 'PonderMentionMail' => 'applications/ponder/mail/PonderMentionMail.php', 'PonderPostBodyView' => 'applications/ponder/view/PonderPostBodyView.php', 'PonderQuestion' => 'applications/ponder/storage/PonderQuestion.php', 'PonderQuestionAskController' => 'applications/ponder/controller/PonderQuestionAskController.php', 'PonderQuestionDetailView' => 'applications/ponder/view/PonderQuestionDetailView.php', 'PonderQuestionEditor' => 'applications/ponder/editor/PonderQuestionEditor.php', 'PonderQuestionPreviewController' => 'applications/ponder/controller/PonderQuestionPreviewController.php', 'PonderQuestionQuery' => 'applications/ponder/query/PonderQuestionQuery.php', 'PonderQuestionSummaryView' => 'applications/ponder/view/PonderQuestionSummaryView.php', 'PonderQuestionViewController' => 'applications/ponder/controller/PonderQuestionViewController.php', 'PonderReplyHandler' => 'applications/ponder/PonderReplyHandler.php', 'PonderRuleQuestion' => 'infrastructure/markup/rule/PonderRuleQuestion.php', 'PonderSearchIndexer' => 'applications/ponder/search/PonderSearchIndexer.php', 'PonderUserProfileView' => 'applications/ponder/view/PonderUserProfileView.php', 'PonderVotableInterface' => 'applications/ponder/storage/PonderVotableInterface.php', 'PonderVotableView' => 'applications/ponder/view/PonderVotableView.php', 'PonderVoteEditor' => 'applications/ponder/editor/PonderVoteEditor.php', 'PonderVoteSaveController' => 'applications/ponder/controller/PonderVoteSaveController.php', 'QueryFormattingTestCase' => 'infrastructure/storage/__tests__/QueryFormattingTestCase.php', ), 'function' => array( '_phabricator_date_format' => 'view/viewutils.php', 'celerity_generate_unique_node_id' => 'infrastructure/celerity/api.php', 'celerity_get_resource_uri' => 'infrastructure/celerity/api.php', 'celerity_register_resource_map' => 'infrastructure/celerity/map.php', 'javelin_render_tag' => 'infrastructure/javelin/markup.php', + 'javelin_tag' => 'infrastructure/javelin/markup.php', 'phabricator_date' => 'view/viewutils.php', 'phabricator_datetime' => 'view/viewutils.php', 'phabricator_format_bytes' => 'view/viewutils.php', 'phabricator_format_local_time' => 'view/viewutils.php', 'phabricator_format_relative_time' => 'view/viewutils.php', 'phabricator_format_relative_time_detailed' => 'view/viewutils.php', 'phabricator_format_units_generic' => 'view/viewutils.php', 'phabricator_on_relative_date' => 'view/viewutils.php', 'phabricator_parse_bytes' => 'view/viewutils.php', 'phabricator_relative_date' => 'view/viewutils.php', 'phabricator_render_form' => 'infrastructure/javelin/markup.php', 'phabricator_render_form_magic' => 'infrastructure/javelin/markup.php', 'phabricator_time' => 'view/viewutils.php', 'phid_get_subtype' => 'applications/phid/utils.php', 'phid_get_type' => 'applications/phid/utils.php', 'phid_group_by_type' => 'applications/phid/utils.php', 'require_celerity_resource' => 'infrastructure/celerity/api.php', ), 'xmap' => array( 'Aphront304Response' => 'AphrontResponse', 'Aphront400Response' => 'AphrontResponse', 'Aphront403Response' => 'AphrontHTMLResponse', 'Aphront404Response' => 'AphrontHTMLResponse', 'AphrontAjaxResponse' => 'AphrontResponse', 'AphrontAttachedFileView' => 'AphrontView', 'AphrontCSRFException' => 'AphrontException', 'AphrontCalendarEventView' => 'AphrontView', 'AphrontCalendarMonthView' => 'AphrontView', 'AphrontContextBarView' => 'AphrontView', 'AphrontController' => 'Phobject', 'AphrontCrumbsView' => 'AphrontView', 'AphrontCursorPagerView' => 'AphrontView', 'AphrontDefaultApplicationConfiguration' => 'AphrontApplicationConfiguration', 'AphrontDialogResponse' => 'AphrontResponse', 'AphrontDialogView' => 'AphrontView', 'AphrontErrorView' => 'AphrontView', 'AphrontException' => 'Exception', 'AphrontFileResponse' => 'AphrontResponse', 'AphrontFormCheckboxControl' => 'AphrontFormControl', 'AphrontFormControl' => 'AphrontView', 'AphrontFormDateControl' => 'AphrontFormControl', 'AphrontFormDividerControl' => 'AphrontFormControl', 'AphrontFormDragAndDropUploadControl' => 'AphrontFormControl', 'AphrontFormFileControl' => 'AphrontFormControl', 'AphrontFormImageControl' => 'AphrontFormControl', 'AphrontFormInsetView' => 'AphrontView', 'AphrontFormLayoutView' => 'AphrontView', 'AphrontFormMarkupControl' => 'AphrontFormControl', 'AphrontFormPasswordControl' => 'AphrontFormControl', 'AphrontFormPolicyControl' => 'AphrontFormControl', 'AphrontFormRadioButtonControl' => 'AphrontFormControl', 'AphrontFormRecaptchaControl' => 'AphrontFormControl', 'AphrontFormSelectControl' => 'AphrontFormControl', 'AphrontFormStaticControl' => 'AphrontFormControl', 'AphrontFormSubmitControl' => 'AphrontFormControl', 'AphrontFormTextAreaControl' => 'AphrontFormControl', 'AphrontFormTextControl' => 'AphrontFormControl', 'AphrontFormToggleButtonsControl' => 'AphrontFormControl', 'AphrontFormTokenizerControl' => 'AphrontFormControl', 'AphrontFormView' => 'AphrontView', 'AphrontHTMLResponse' => 'AphrontResponse', 'AphrontHTTPSinkTestCase' => 'PhabricatorTestCase', 'AphrontHeadsupActionListView' => 'AphrontView', 'AphrontHeadsupActionView' => 'AphrontView', 'AphrontHeadsupView' => 'AphrontView', 'AphrontIsolatedDatabaseConnectionTestCase' => 'PhabricatorTestCase', 'AphrontIsolatedHTTPSink' => 'AphrontHTTPSink', 'AphrontJSONResponse' => 'AphrontResponse', 'AphrontJavelinView' => 'AphrontView', 'AphrontKeyboardShortcutsAvailableView' => 'AphrontView', 'AphrontListFilterView' => 'AphrontView', 'AphrontMiniPanelView' => 'AphrontView', 'AphrontMoreView' => 'AphrontView', 'AphrontMySQLDatabaseConnectionTestCase' => 'PhabricatorTestCase', 'AphrontNullView' => 'AphrontView', 'AphrontPHPHTTPSink' => 'AphrontHTTPSink', 'AphrontPageView' => 'AphrontView', 'AphrontPagerView' => 'AphrontView', 'AphrontPanelView' => 'AphrontView', 'AphrontPlainTextResponse' => 'AphrontResponse', 'AphrontProxyResponse' => 'AphrontResponse', 'AphrontRedirectException' => 'AphrontException', 'AphrontRedirectResponse' => 'AphrontResponse', 'AphrontReloadResponse' => 'AphrontRedirectResponse', 'AphrontRequestFailureView' => 'AphrontView', 'AphrontRequestTestCase' => 'PhabricatorTestCase', 'AphrontSideNavFilterView' => 'AphrontView', 'AphrontTableView' => 'AphrontView', 'AphrontTagView' => 'AphrontView', 'AphrontTokenizerTemplateView' => 'AphrontView', 'AphrontTypeaheadTemplateView' => 'AphrontView', 'AphrontUsageException' => 'AphrontException', 'AphrontView' => 'Phobject', 'AphrontWebpageResponse' => 'AphrontHTMLResponse', 'CelerityPhabricatorResourceController' => 'CelerityResourceController', 'CelerityResourceController' => 'PhabricatorController', 'CelerityResourceGraph' => 'AbstractDirectedGraph', 'CelerityResourceTransformerTestCase' => 'PhabricatorTestCase', 'ConduitAPI_arcanist_Method' => 'ConduitAPIMethod', 'ConduitAPI_arcanist_projectinfo_Method' => 'ConduitAPI_arcanist_Method', 'ConduitAPI_audit_Method' => 'ConduitAPIMethod', 'ConduitAPI_audit_query_Method' => 'ConduitAPI_audit_Method', 'ConduitAPI_chatlog_Method' => 'ConduitAPIMethod', 'ConduitAPI_chatlog_query_Method' => 'ConduitAPI_chatlog_Method', 'ConduitAPI_chatlog_record_Method' => 'ConduitAPI_chatlog_Method', 'ConduitAPI_conduit_connect_Method' => 'ConduitAPIMethod', 'ConduitAPI_conduit_getcertificate_Method' => 'ConduitAPIMethod', 'ConduitAPI_conduit_ping_Method' => 'ConduitAPIMethod', 'ConduitAPI_conduit_query_Method' => 'ConduitAPIMethod', 'ConduitAPI_daemon_launched_Method' => 'ConduitAPIMethod', 'ConduitAPI_daemon_log_Method' => 'ConduitAPIMethod', 'ConduitAPI_daemon_setstatus_Method' => 'ConduitAPIMethod', 'ConduitAPI_differential_Method' => 'ConduitAPIMethod', 'ConduitAPI_differential_close_Method' => 'ConduitAPIMethod', 'ConduitAPI_differential_createcomment_Method' => 'ConduitAPIMethod', 'ConduitAPI_differential_creatediff_Method' => 'ConduitAPIMethod', 'ConduitAPI_differential_createinline_Method' => 'ConduitAPI_differential_Method', 'ConduitAPI_differential_createrawdiff_Method' => 'ConduitAPI_differential_Method', 'ConduitAPI_differential_createrevision_Method' => 'ConduitAPIMethod', 'ConduitAPI_differential_find_Method' => 'ConduitAPIMethod', 'ConduitAPI_differential_finishpostponedlinters_Method' => 'ConduitAPIMethod', 'ConduitAPI_differential_getalldiffs_Method' => 'ConduitAPIMethod', 'ConduitAPI_differential_getcommitmessage_Method' => 'ConduitAPIMethod', 'ConduitAPI_differential_getcommitpaths_Method' => 'ConduitAPIMethod', 'ConduitAPI_differential_getdiff_Method' => 'ConduitAPIMethod', 'ConduitAPI_differential_getrevision_Method' => 'ConduitAPIMethod', 'ConduitAPI_differential_getrevisioncomments_Method' => 'ConduitAPI_differential_Method', 'ConduitAPI_differential_getrevisionfeedback_Method' => 'ConduitAPIMethod', 'ConduitAPI_differential_markcommitted_Method' => 'ConduitAPIMethod', 'ConduitAPI_differential_parsecommitmessage_Method' => 'ConduitAPIMethod', 'ConduitAPI_differential_query_Method' => 'ConduitAPIMethod', 'ConduitAPI_differential_setdiffproperty_Method' => 'ConduitAPIMethod', 'ConduitAPI_differential_updaterevision_Method' => 'ConduitAPIMethod', 'ConduitAPI_differential_updateunitresults_Method' => 'ConduitAPIMethod', 'ConduitAPI_diffusion_findsymbols_Method' => 'ConduitAPIMethod', 'ConduitAPI_diffusion_getcommits_Method' => 'ConduitAPIMethod', 'ConduitAPI_diffusion_getlintmessages_Method' => 'ConduitAPIMethod', 'ConduitAPI_diffusion_getrecentcommitsbypath_Method' => 'ConduitAPIMethod', 'ConduitAPI_feed_publish_Method' => 'ConduitAPIMethod', 'ConduitAPI_feed_query_Method' => 'ConduitAPIMethod', 'ConduitAPI_file_download_Method' => 'ConduitAPIMethod', 'ConduitAPI_file_info_Method' => 'ConduitAPIMethod', 'ConduitAPI_file_upload_Method' => 'ConduitAPIMethod', 'ConduitAPI_flag_Method' => 'ConduitAPIMethod', 'ConduitAPI_flag_delete_Method' => 'ConduitAPI_flag_Method', 'ConduitAPI_flag_edit_Method' => 'ConduitAPI_flag_Method', 'ConduitAPI_flag_query_Method' => 'ConduitAPI_flag_Method', 'ConduitAPI_macro_Method' => 'ConduitAPIMethod', 'ConduitAPI_macro_query_Method' => 'ConduitAPI_macro_Method', 'ConduitAPI_maniphest_Method' => 'ConduitAPIMethod', 'ConduitAPI_maniphest_createtask_Method' => 'ConduitAPI_maniphest_Method', 'ConduitAPI_maniphest_find_Method' => 'ConduitAPI_maniphest_query_Method', 'ConduitAPI_maniphest_gettasktransactions_Method' => 'ConduitAPI_maniphest_Method', 'ConduitAPI_maniphest_info_Method' => 'ConduitAPI_maniphest_Method', 'ConduitAPI_maniphest_query_Method' => 'ConduitAPI_maniphest_Method', 'ConduitAPI_maniphest_update_Method' => 'ConduitAPI_maniphest_Method', 'ConduitAPI_owners_query_Method' => 'ConduitAPIMethod', 'ConduitAPI_paste_Method' => 'ConduitAPIMethod', 'ConduitAPI_paste_create_Method' => 'ConduitAPI_paste_Method', 'ConduitAPI_paste_info_Method' => 'ConduitAPI_paste_Method', 'ConduitAPI_paste_query_Method' => 'ConduitAPI_paste_Method', 'ConduitAPI_phid_Method' => 'ConduitAPIMethod', 'ConduitAPI_phid_info_Method' => 'ConduitAPI_phid_Method', 'ConduitAPI_phid_lookup_Method' => 'ConduitAPI_phid_Method', 'ConduitAPI_phid_query_Method' => 'ConduitAPI_phid_Method', 'ConduitAPI_phpast_getast_Method' => 'ConduitAPIMethod', 'ConduitAPI_phpast_version_Method' => 'ConduitAPIMethod', 'ConduitAPI_phriction_Method' => 'ConduitAPIMethod', 'ConduitAPI_phriction_edit_Method' => 'ConduitAPI_phriction_Method', 'ConduitAPI_phriction_history_Method' => 'ConduitAPI_phriction_Method', 'ConduitAPI_phriction_info_Method' => 'ConduitAPI_phriction_Method', 'ConduitAPI_project_Method' => 'ConduitAPIMethod', 'ConduitAPI_project_query_Method' => 'ConduitAPI_project_Method', 'ConduitAPI_remarkup_process_Method' => 'ConduitAPIMethod', 'ConduitAPI_repository_Method' => 'ConduitAPIMethod', 'ConduitAPI_repository_create_Method' => 'ConduitAPI_repository_Method', 'ConduitAPI_repository_query_Method' => 'ConduitAPI_repository_Method', 'ConduitAPI_slowvote_info_Method' => 'ConduitAPIMethod', 'ConduitAPI_user_Method' => 'ConduitAPIMethod', 'ConduitAPI_user_addstatus_Method' => 'ConduitAPI_user_Method', 'ConduitAPI_user_disable_Method' => 'ConduitAPI_user_Method', 'ConduitAPI_user_enable_Method' => 'ConduitAPI_user_Method', 'ConduitAPI_user_find_Method' => 'ConduitAPI_user_Method', 'ConduitAPI_user_info_Method' => 'ConduitAPI_user_Method', 'ConduitAPI_user_query_Method' => 'ConduitAPI_user_Method', 'ConduitAPI_user_removestatus_Method' => 'ConduitAPI_user_Method', 'ConduitAPI_user_whoami_Method' => 'ConduitAPI_user_Method', 'ConduitCallTestCase' => 'PhabricatorTestCase', 'ConduitException' => 'Exception', 'ConduitSSHWorkflow' => 'PhabricatorSSHWorkflow', 'ConpherenceConfigOptions' => 'PhabricatorApplicationConfigOptions', 'ConpherenceController' => 'PhabricatorController', 'ConpherenceDAO' => 'PhabricatorLiskDAO', 'ConpherenceEditor' => 'PhabricatorApplicationTransactionEditor', 'ConpherenceListController' => 'ConpherenceController', 'ConpherenceMenuItemView' => 'AphrontTagView', 'ConpherenceNewController' => 'ConpherenceController', 'ConpherenceParticipant' => 'ConpherenceDAO', 'ConpherenceParticipantQuery' => 'PhabricatorOffsetPagedQuery', 'ConpherenceParticipationStatus' => 'ConpherenceConstants', 'ConpherenceReplyHandler' => 'PhabricatorMailReplyHandler', 'ConpherenceThread' => array( 0 => 'ConpherenceDAO', 1 => 'PhabricatorPolicyInterface', ), 'ConpherenceThreadQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'ConpherenceTransaction' => 'PhabricatorApplicationTransaction', 'ConpherenceTransactionComment' => 'PhabricatorApplicationTransactionComment', 'ConpherenceTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 'ConpherenceTransactionType' => 'ConpherenceConstants', 'ConpherenceTransactionView' => 'AphrontView', 'ConpherenceUpdateController' => 'ConpherenceController', 'ConpherenceViewController' => 'ConpherenceController', 'DarkConsoleController' => 'PhabricatorController', 'DarkConsoleDataController' => 'PhabricatorController', 'DarkConsoleErrorLogPlugin' => 'DarkConsolePlugin', 'DarkConsoleEventPlugin' => 'DarkConsolePlugin', 'DarkConsoleEventPluginAPI' => 'PhutilEventListener', 'DarkConsoleRequestPlugin' => 'DarkConsolePlugin', 'DarkConsoleServicesPlugin' => 'DarkConsolePlugin', 'DarkConsoleXHProfPlugin' => 'DarkConsolePlugin', 'DefaultDatabaseConfigurationProvider' => 'DatabaseConfigurationProvider', 'DifferentialActionHasNoEffectException' => 'DifferentialException', 'DifferentialAddCommentView' => 'AphrontView', 'DifferentialAffectedPath' => 'DifferentialDAO', 'DifferentialApplyPatchFieldSpecification' => 'DifferentialFieldSpecification', 'DifferentialArcanistProjectFieldSpecification' => 'DifferentialFieldSpecification', 'DifferentialAuditorsFieldSpecification' => 'DifferentialFieldSpecification', 'DifferentialAuthorFieldSpecification' => 'DifferentialFieldSpecification', 'DifferentialAuxiliaryField' => 'DifferentialDAO', 'DifferentialBlameRevisionFieldSpecification' => 'DifferentialFieldSpecification', 'DifferentialBranchFieldSpecification' => 'DifferentialFieldSpecification', 'DifferentialCCWelcomeMail' => 'DifferentialReviewRequestMail', 'DifferentialCCsFieldSpecification' => 'DifferentialFieldSpecification', 'DifferentialChangeset' => 'DifferentialDAO', 'DifferentialChangesetDetailView' => 'AphrontView', 'DifferentialChangesetHTMLRenderer' => 'DifferentialChangesetRenderer', 'DifferentialChangesetListView' => 'AphrontView', 'DifferentialChangesetOneUpRenderer' => 'DifferentialChangesetHTMLRenderer', 'DifferentialChangesetOneUpTestRenderer' => 'DifferentialChangesetTestRenderer', 'DifferentialChangesetParserTestCase' => 'PhabricatorTestCase', 'DifferentialChangesetTestRenderer' => 'DifferentialChangesetRenderer', 'DifferentialChangesetTwoUpRenderer' => 'DifferentialChangesetHTMLRenderer', 'DifferentialChangesetTwoUpTestRenderer' => 'DifferentialChangesetTestRenderer', 'DifferentialChangesetViewController' => 'DifferentialController', 'DifferentialComment' => array( 0 => 'DifferentialDAO', 1 => 'PhabricatorMarkupInterface', ), 'DifferentialCommentEditor' => 'PhabricatorEditor', 'DifferentialCommentMail' => 'DifferentialMail', 'DifferentialCommentPreviewController' => 'DifferentialController', 'DifferentialCommentSaveController' => 'DifferentialController', 'DifferentialCommitsFieldSpecification' => 'DifferentialFieldSpecification', 'DifferentialConflictsFieldSpecification' => 'DifferentialFieldSpecification', 'DifferentialController' => 'PhabricatorController', 'DifferentialDAO' => 'PhabricatorLiskDAO', 'DifferentialDateCreatedFieldSpecification' => 'DifferentialFieldSpecification', 'DifferentialDateModifiedFieldSpecification' => 'DifferentialFieldSpecification', 'DifferentialDefaultFieldSelector' => 'DifferentialFieldSelector', 'DifferentialDependenciesFieldSpecification' => 'DifferentialFieldSpecification', 'DifferentialDependsOnFieldSpecification' => 'DifferentialFieldSpecification', 'DifferentialDiff' => 'DifferentialDAO', 'DifferentialDiffContentMail' => 'DifferentialMail', 'DifferentialDiffCreateController' => 'DifferentialController', 'DifferentialDiffProperty' => 'DifferentialDAO', 'DifferentialDiffTableOfContentsView' => 'AphrontView', 'DifferentialDiffTestCase' => 'ArcanistPhutilTestCase', 'DifferentialDiffViewController' => 'DifferentialController', 'DifferentialException' => 'Exception', 'DifferentialExceptionMail' => 'DifferentialMail', 'DifferentialExportPatchFieldSpecification' => 'DifferentialFieldSpecification', 'DifferentialFieldDataNotAvailableException' => 'Exception', 'DifferentialFieldParseException' => 'Exception', 'DifferentialFieldSpecificationIncompleteException' => 'Exception', 'DifferentialFieldValidationException' => 'Exception', 'DifferentialFreeformFieldSpecification' => 'DifferentialFieldSpecification', 'DifferentialGitSVNIDFieldSpecification' => 'DifferentialFieldSpecification', 'DifferentialHostFieldSpecification' => 'DifferentialFieldSpecification', 'DifferentialHunk' => 'DifferentialDAO', 'DifferentialHunkParserTestCase' => 'PhabricatorTestCase', 'DifferentialHunkTestCase' => 'ArcanistPhutilTestCase', 'DifferentialInlineComment' => array( 0 => 'DifferentialDAO', 1 => 'PhabricatorInlineCommentInterface', ), 'DifferentialInlineCommentEditController' => 'PhabricatorInlineCommentController', 'DifferentialInlineCommentEditView' => 'AphrontView', 'DifferentialInlineCommentPreviewController' => 'PhabricatorInlineCommentPreviewController', 'DifferentialInlineCommentView' => 'AphrontView', 'DifferentialLinesFieldSpecification' => 'DifferentialFieldSpecification', 'DifferentialLintFieldSpecification' => 'DifferentialFieldSpecification', 'DifferentialLocalCommitsView' => 'AphrontView', 'DifferentialManiphestTasksFieldSpecification' => 'DifferentialFieldSpecification', 'DifferentialNewDiffMail' => 'DifferentialReviewRequestMail', 'DifferentialParseRenderTestCase' => 'PhabricatorTestCase', 'DifferentialPathFieldSpecification' => 'DifferentialFieldSpecification', 'DifferentialPrimaryPaneView' => 'AphrontView', 'DifferentialReplyHandler' => 'PhabricatorMailReplyHandler', 'DifferentialResultsTableView' => 'AphrontView', 'DifferentialRevertPlanFieldSpecification' => 'DifferentialFieldSpecification', 'DifferentialReviewRequestMail' => 'DifferentialMail', 'DifferentialReviewedByFieldSpecification' => 'DifferentialFieldSpecification', 'DifferentialReviewerStatsTestCase' => 'PhabricatorTestCase', 'DifferentialReviewersFieldSpecification' => 'DifferentialFieldSpecification', 'DifferentialRevision' => 'DifferentialDAO', 'DifferentialRevisionCommentListView' => 'AphrontView', 'DifferentialRevisionCommentView' => 'AphrontView', 'DifferentialRevisionDetailView' => 'AphrontView', 'DifferentialRevisionEditController' => 'DifferentialController', 'DifferentialRevisionEditor' => 'PhabricatorEditor', 'DifferentialRevisionIDFieldParserTestCase' => 'PhabricatorTestCase', 'DifferentialRevisionIDFieldSpecification' => 'DifferentialFieldSpecification', 'DifferentialRevisionListController' => 'DifferentialController', 'DifferentialRevisionListView' => 'AphrontView', 'DifferentialRevisionStatsController' => 'DifferentialController', 'DifferentialRevisionStatsView' => 'AphrontView', 'DifferentialRevisionStatusFieldSpecification' => 'DifferentialFieldSpecification', 'DifferentialRevisionUpdateHistoryView' => 'AphrontView', 'DifferentialRevisionViewController' => 'DifferentialController', 'DifferentialSearchIndexer' => 'PhabricatorSearchDocumentIndexer', 'DifferentialSubscribeController' => 'DifferentialController', 'DifferentialSummaryFieldSpecification' => 'DifferentialFreeformFieldSpecification', 'DifferentialTestPlanFieldSpecification' => 'DifferentialFieldSpecification', 'DifferentialTitleFieldSpecification' => 'DifferentialFreeformFieldSpecification', 'DifferentialUnitFieldSpecification' => 'DifferentialFieldSpecification', 'DiffusionBranchTableController' => 'DiffusionController', 'DiffusionBranchTableView' => 'DiffusionView', 'DiffusionBrowseController' => 'DiffusionController', 'DiffusionBrowseFileController' => 'DiffusionController', 'DiffusionBrowseTableView' => 'DiffusionView', 'DiffusionChangeController' => 'DiffusionController', 'DiffusionCommentListView' => 'AphrontView', 'DiffusionCommentView' => 'AphrontView', 'DiffusionCommitBranchesController' => 'DiffusionController', 'DiffusionCommitChangeTableView' => 'DiffusionView', 'DiffusionCommitController' => 'DiffusionController', 'DiffusionCommitEditController' => 'DiffusionController', 'DiffusionCommitParentsQuery' => 'DiffusionQuery', 'DiffusionCommitTagsController' => 'DiffusionController', 'DiffusionCommitTagsQuery' => 'DiffusionQuery', 'DiffusionContainsQuery' => 'DiffusionQuery', 'DiffusionController' => 'PhabricatorController', 'DiffusionDiffController' => 'DiffusionController', 'DiffusionDiffQuery' => 'DiffusionQuery', 'DiffusionEmptyResultView' => 'DiffusionView', 'DiffusionExistsQuery' => 'DiffusionQuery', 'DiffusionExternalController' => 'DiffusionController', 'DiffusionFileContentQuery' => 'DiffusionQuery', 'DiffusionGitBranchQuery' => 'DiffusionBranchQuery', 'DiffusionGitBranchQueryTestCase' => 'PhabricatorTestCase', 'DiffusionGitBrowseQuery' => 'DiffusionBrowseQuery', 'DiffusionGitCommitParentsQuery' => 'DiffusionCommitParentsQuery', 'DiffusionGitCommitTagsQuery' => 'DiffusionCommitTagsQuery', 'DiffusionGitContainsQuery' => 'DiffusionContainsQuery', 'DiffusionGitDiffQuery' => 'DiffusionDiffQuery', 'DiffusionGitExistsQuery' => 'DiffusionExistsQuery', 'DiffusionGitFileContentQuery' => 'DiffusionFileContentQuery', 'DiffusionGitHistoryQuery' => 'DiffusionHistoryQuery', 'DiffusionGitLastModifiedQuery' => 'DiffusionLastModifiedQuery', 'DiffusionGitMergedCommitsQuery' => 'DiffusionMergedCommitsQuery', 'DiffusionGitRawDiffQuery' => 'DiffusionRawDiffQuery', 'DiffusionGitRequest' => 'DiffusionRequest', 'DiffusionGitTagListQuery' => 'DiffusionTagListQuery', 'DiffusionHistoryController' => 'DiffusionController', 'DiffusionHistoryQuery' => 'DiffusionQuery', 'DiffusionHistoryTableView' => 'DiffusionView', 'DiffusionHomeController' => 'DiffusionController', 'DiffusionInlineCommentController' => 'PhabricatorInlineCommentController', 'DiffusionInlineCommentPreviewController' => 'PhabricatorInlineCommentPreviewController', 'DiffusionLastModifiedController' => 'DiffusionController', 'DiffusionLastModifiedQuery' => 'DiffusionQuery', 'DiffusionLintController' => 'DiffusionController', 'DiffusionLintDetailsController' => 'DiffusionController', 'DiffusionMercurialBranchQuery' => 'DiffusionBranchQuery', 'DiffusionMercurialBrowseQuery' => 'DiffusionBrowseQuery', 'DiffusionMercurialCommitParentsQuery' => 'DiffusionCommitParentsQuery', 'DiffusionMercurialCommitTagsQuery' => 'DiffusionCommitTagsQuery', 'DiffusionMercurialContainsQuery' => 'DiffusionContainsQuery', 'DiffusionMercurialDiffQuery' => 'DiffusionDiffQuery', 'DiffusionMercurialExistsQuery' => 'DiffusionExistsQuery', 'DiffusionMercurialFileContentQuery' => 'DiffusionFileContentQuery', 'DiffusionMercurialHistoryQuery' => 'DiffusionHistoryQuery', 'DiffusionMercurialLastModifiedQuery' => 'DiffusionLastModifiedQuery', 'DiffusionMercurialMergedCommitsQuery' => 'DiffusionMergedCommitsQuery', 'DiffusionMercurialRawDiffQuery' => 'DiffusionRawDiffQuery', 'DiffusionMercurialRequest' => 'DiffusionRequest', 'DiffusionMercurialTagListQuery' => 'DiffusionTagListQuery', 'DiffusionMergedCommitsQuery' => 'DiffusionQuery', 'DiffusionPathCompleteController' => 'DiffusionController', 'DiffusionPathQueryTestCase' => 'PhabricatorTestCase', 'DiffusionPathValidateController' => 'DiffusionController', 'DiffusionRawDiffQuery' => 'DiffusionQuery', 'DiffusionRepositoryController' => 'DiffusionController', 'DiffusionSetupException' => 'AphrontUsageException', 'DiffusionSvnBrowseQuery' => 'DiffusionBrowseQuery', 'DiffusionSvnCommitParentsQuery' => 'DiffusionCommitParentsQuery', 'DiffusionSvnCommitTagsQuery' => 'DiffusionCommitTagsQuery', 'DiffusionSvnContainsQuery' => 'DiffusionContainsQuery', 'DiffusionSvnDiffQuery' => 'DiffusionDiffQuery', 'DiffusionSvnExistsQuery' => 'DiffusionExistsQuery', 'DiffusionSvnFileContentQuery' => 'DiffusionFileContentQuery', 'DiffusionSvnHistoryQuery' => 'DiffusionHistoryQuery', 'DiffusionSvnLastModifiedQuery' => 'DiffusionLastModifiedQuery', 'DiffusionSvnMergedCommitsQuery' => 'DiffusionMergedCommitsQuery', 'DiffusionSvnRawDiffQuery' => 'DiffusionRawDiffQuery', 'DiffusionSvnRequest' => 'DiffusionRequest', 'DiffusionSvnTagListQuery' => 'DiffusionTagListQuery', 'DiffusionSymbolController' => 'DiffusionController', 'DiffusionSymbolQuery' => 'PhabricatorOffsetPagedQuery', 'DiffusionTagListController' => 'DiffusionController', 'DiffusionTagListQuery' => 'DiffusionQuery', 'DiffusionTagListView' => 'DiffusionView', 'DiffusionURITestCase' => 'ArcanistPhutilTestCase', 'DiffusionView' => 'AphrontView', 'DivinerArticleAtomizer' => 'DivinerAtomizer', 'DivinerAtomizeWorkflow' => 'DivinerWorkflow', 'DivinerFileAtomizer' => 'DivinerAtomizer', 'DivinerGenerateWorkflow' => 'DivinerWorkflow', 'DivinerListController' => 'PhabricatorController', 'DivinerWorkflow' => 'PhutilArgumentWorkflow', 'DrydockAllocatorWorker' => 'PhabricatorWorker', 'DrydockApacheWebrootInterface' => 'DrydockWebrootInterface', 'DrydockCommandInterface' => 'DrydockInterface', 'DrydockController' => 'PhabricatorController', 'DrydockDAO' => 'PhabricatorLiskDAO', 'DrydockLease' => 'DrydockDAO', 'DrydockLeaseListController' => 'DrydockController', 'DrydockLeaseQuery' => 'PhabricatorOffsetPagedQuery', 'DrydockLeaseReleaseController' => 'DrydockController', 'DrydockLeaseStatus' => 'DrydockConstants', 'DrydockLeaseViewController' => 'DrydockController', 'DrydockLocalCommandInterface' => 'DrydockCommandInterface', 'DrydockLocalHostBlueprint' => 'DrydockBlueprint', 'DrydockLog' => 'DrydockDAO', 'DrydockLogController' => 'DrydockController', 'DrydockLogQuery' => 'PhabricatorOffsetPagedQuery', 'DrydockManagementCloseWorkflow' => 'DrydockManagementWorkflow', 'DrydockManagementLeaseWorkflow' => 'DrydockManagementWorkflow', 'DrydockManagementReleaseWorkflow' => 'DrydockManagementWorkflow', 'DrydockManagementWaitForLeaseWorkflow' => 'DrydockManagementWorkflow', 'DrydockManagementWorkflow' => 'PhutilArgumentWorkflow', 'DrydockResource' => 'DrydockDAO', 'DrydockResourceCloseController' => 'DrydockController', 'DrydockResourceListController' => 'DrydockController', 'DrydockResourceQuery' => 'PhabricatorOffsetPagedQuery', 'DrydockResourceStatus' => 'DrydockConstants', 'DrydockResourceViewController' => 'DrydockController', 'DrydockSSHCommandInterface' => 'DrydockCommandInterface', 'DrydockWebrootInterface' => 'DrydockInterface', 'DrydockWorkingCopyBlueprint' => 'DrydockBlueprint', 'FeedPublisherWorker' => 'PhabricatorWorker', 'HarbormasterDAO' => 'PhabricatorLiskDAO', 'HarbormasterObject' => 'HarbormasterDAO', 'HarbormasterRunnerWorker' => 'PhabricatorWorker', 'HarbormasterScratchTable' => 'HarbormasterDAO', 'HeraldAction' => 'HeraldDAO', 'HeraldApplyTranscript' => 'HeraldDAO', 'HeraldCommitAdapter' => 'HeraldObjectAdapter', 'HeraldCondition' => 'HeraldDAO', 'HeraldController' => 'PhabricatorController', 'HeraldDAO' => 'PhabricatorLiskDAO', 'HeraldDeleteController' => 'HeraldController', 'HeraldDifferentialRevisionAdapter' => 'HeraldObjectAdapter', 'HeraldDryRunAdapter' => 'HeraldObjectAdapter', 'HeraldEditLogQuery' => 'PhabricatorOffsetPagedQuery', 'HeraldHomeController' => 'HeraldController', 'HeraldInvalidConditionException' => 'Exception', 'HeraldInvalidFieldException' => 'Exception', 'HeraldNewController' => 'HeraldController', 'HeraldRecursiveConditionsException' => 'Exception', 'HeraldRule' => 'HeraldDAO', 'HeraldRuleController' => 'HeraldController', 'HeraldRuleEdit' => 'HeraldDAO', 'HeraldRuleEditHistoryController' => 'HeraldController', 'HeraldRuleEditHistoryView' => 'AphrontView', 'HeraldRuleListView' => 'AphrontView', 'HeraldRuleQuery' => 'PhabricatorOffsetPagedQuery', 'HeraldTestConsoleController' => 'HeraldController', 'HeraldTranscript' => 'HeraldDAO', 'HeraldTranscriptController' => 'HeraldController', 'HeraldTranscriptListController' => 'HeraldController', 'JavelinReactorExample' => 'PhabricatorUIExample', 'JavelinUIExample' => 'PhabricatorUIExample', 'JavelinViewExample' => 'PhabricatorUIExample', 'JavelinViewExampleServerView' => 'AphrontView', 'LiskChunkTestCase' => 'PhabricatorTestCase', 'LiskDAOTestCase' => 'PhabricatorTestCase', 'LiskEphemeralObjectException' => 'Exception', 'LiskFixtureTestCase' => 'PhabricatorTestCase', 'LiskIsolationTestCase' => 'PhabricatorTestCase', 'LiskIsolationTestDAO' => 'LiskDAO', 'LiskIsolationTestDAOException' => 'Exception', 'LiskMigrationIterator' => 'PhutilBufferedIterator', 'ManiphestAction' => 'ManiphestConstants', 'ManiphestAuxiliaryFieldDefaultSpecification' => 'ManiphestAuxiliaryFieldSpecification', 'ManiphestAuxiliaryFieldTypeException' => 'Exception', 'ManiphestAuxiliaryFieldValidationException' => 'Exception', 'ManiphestBatchEditController' => 'ManiphestController', 'ManiphestController' => 'PhabricatorController', 'ManiphestDAO' => 'PhabricatorLiskDAO', 'ManiphestDefaultTaskExtensions' => 'ManiphestTaskExtensions', 'ManiphestEdgeEventListener' => 'PhutilEventListener', 'ManiphestExportController' => 'ManiphestController', 'ManiphestReplyHandler' => 'PhabricatorMailReplyHandler', 'ManiphestReportController' => 'ManiphestController', 'ManiphestSavedQuery' => 'ManiphestDAO', 'ManiphestSavedQueryDeleteController' => 'ManiphestController', 'ManiphestSavedQueryEditController' => 'ManiphestController', 'ManiphestSavedQueryListController' => 'ManiphestController', 'ManiphestSearchIndexer' => 'PhabricatorSearchDocumentIndexer', 'ManiphestSubpriorityController' => 'ManiphestController', 'ManiphestTask' => array( 0 => 'ManiphestDAO', 1 => 'PhabricatorMarkupInterface', ), 'ManiphestTaskAuxiliaryStorage' => 'ManiphestDAO', 'ManiphestTaskDescriptionChangeController' => 'ManiphestController', 'ManiphestTaskDescriptionPreviewController' => 'ManiphestController', 'ManiphestTaskDetailController' => 'ManiphestController', 'ManiphestTaskEditController' => 'ManiphestController', 'ManiphestTaskListController' => 'ManiphestController', 'ManiphestTaskListView' => 'ManiphestView', 'ManiphestTaskOwner' => 'ManiphestConstants', 'ManiphestTaskPriority' => 'ManiphestConstants', 'ManiphestTaskProject' => 'ManiphestDAO', 'ManiphestTaskProjectsView' => 'ManiphestView', 'ManiphestTaskQuery' => 'PhabricatorQuery', 'ManiphestTaskStatus' => 'ManiphestConstants', 'ManiphestTaskSubscriber' => 'ManiphestDAO', 'ManiphestTaskSummaryView' => 'ManiphestView', 'ManiphestTransaction' => array( 0 => 'ManiphestDAO', 1 => 'PhabricatorMarkupInterface', ), 'ManiphestTransactionDetailView' => 'ManiphestView', 'ManiphestTransactionEditor' => 'PhabricatorEditor', 'ManiphestTransactionListView' => 'ManiphestView', 'ManiphestTransactionPreviewController' => 'ManiphestController', 'ManiphestTransactionSaveController' => 'ManiphestController', 'ManiphestTransactionType' => 'ManiphestConstants', 'ManiphestView' => 'AphrontView', 'MetaMTANotificationType' => 'MetaMTAConstants', 'OwnersPackageReplyHandler' => 'PhabricatorMailReplyHandler', 'PackageCreateMail' => 'PackageMail', 'PackageDeleteMail' => 'PackageMail', 'PackageModifyMail' => 'PackageMail', 'Phabricator404Controller' => 'PhabricatorController', 'PhabricatorAWSConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorAccessLogConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorActionListExample' => 'PhabricatorUIExample', 'PhabricatorActionListView' => 'AphrontView', 'PhabricatorActionView' => 'AphrontView', 'PhabricatorAllCapsTranslation' => 'PhabricatorTranslation', 'PhabricatorAnchorView' => 'AphrontView', 'PhabricatorApplicationApplications' => 'PhabricatorApplication', 'PhabricatorApplicationAudit' => 'PhabricatorApplication', 'PhabricatorApplicationAuth' => 'PhabricatorApplication', 'PhabricatorApplicationCalendar' => 'PhabricatorApplication', 'PhabricatorApplicationConduit' => 'PhabricatorApplication', 'PhabricatorApplicationConfig' => 'PhabricatorApplication', 'PhabricatorApplicationConfigOptions' => 'Phobject', 'PhabricatorApplicationConpherence' => 'PhabricatorApplication', 'PhabricatorApplicationCountdown' => 'PhabricatorApplication', 'PhabricatorApplicationDaemons' => 'PhabricatorApplication', 'PhabricatorApplicationDetailViewController' => 'PhabricatorApplicationsController', 'PhabricatorApplicationDifferential' => 'PhabricatorApplication', 'PhabricatorApplicationDiffusion' => 'PhabricatorApplication', 'PhabricatorApplicationDiviner' => 'PhabricatorApplication', 'PhabricatorApplicationDrydock' => 'PhabricatorApplication', 'PhabricatorApplicationFact' => 'PhabricatorApplication', 'PhabricatorApplicationFeed' => 'PhabricatorApplication', 'PhabricatorApplicationFiles' => 'PhabricatorApplication', 'PhabricatorApplicationFlags' => 'PhabricatorApplication', 'PhabricatorApplicationHerald' => 'PhabricatorApplication', 'PhabricatorApplicationLaunchView' => 'AphrontView', 'PhabricatorApplicationMacro' => 'PhabricatorApplication', 'PhabricatorApplicationMailingLists' => 'PhabricatorApplication', 'PhabricatorApplicationManiphest' => 'PhabricatorApplication', 'PhabricatorApplicationMetaMTA' => 'PhabricatorApplication', 'PhabricatorApplicationOwners' => 'PhabricatorApplication', 'PhabricatorApplicationPHID' => 'PhabricatorApplication', 'PhabricatorApplicationPHPAST' => 'PhabricatorApplication', 'PhabricatorApplicationPaste' => 'PhabricatorApplication', 'PhabricatorApplicationPeople' => 'PhabricatorApplication', 'PhabricatorApplicationPhame' => 'PhabricatorApplication', 'PhabricatorApplicationPholio' => 'PhabricatorApplication', 'PhabricatorApplicationPhriction' => 'PhabricatorApplication', 'PhabricatorApplicationPonder' => 'PhabricatorApplication', 'PhabricatorApplicationProject' => 'PhabricatorApplication', 'PhabricatorApplicationRepositories' => 'PhabricatorApplication', 'PhabricatorApplicationSettings' => 'PhabricatorApplication', 'PhabricatorApplicationSlowvote' => 'PhabricatorApplication', 'PhabricatorApplicationStatusView' => 'AphrontView', 'PhabricatorApplicationSubscriptions' => 'PhabricatorApplication', 'PhabricatorApplicationTransaction' => array( 0 => 'PhabricatorLiskDAO', 1 => 'PhabricatorPolicyInterface', ), 'PhabricatorApplicationTransactionComment' => array( 0 => 'PhabricatorLiskDAO', 1 => 'PhabricatorMarkupInterface', 2 => 'PhabricatorPolicyInterface', ), 'PhabricatorApplicationTransactionCommentEditController' => 'PhabricatorApplicationTransactionController', 'PhabricatorApplicationTransactionCommentEditor' => 'PhabricatorEditor', 'PhabricatorApplicationTransactionCommentHistoryController' => 'PhabricatorApplicationTransactionController', 'PhabricatorApplicationTransactionCommentQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'PhabricatorApplicationTransactionCommentView' => 'AphrontView', 'PhabricatorApplicationTransactionController' => 'PhabricatorController', 'PhabricatorApplicationTransactionEditor' => 'PhabricatorEditor', 'PhabricatorApplicationTransactionFeedStory' => 'PhabricatorFeedStory', 'PhabricatorApplicationTransactionNoEffectException' => 'Exception', 'PhabricatorApplicationTransactionNoEffectResponse' => 'AphrontProxyResponse', 'PhabricatorApplicationTransactionQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'PhabricatorApplicationTransactionResponse' => 'AphrontProxyResponse', 'PhabricatorApplicationTransactionView' => 'AphrontView', 'PhabricatorApplicationTransactions' => 'PhabricatorApplication', 'PhabricatorApplicationUIExamples' => 'PhabricatorApplication', + 'PhabricatorApplicationUninstallController' => 'PhabricatorApplicationsController', 'PhabricatorApplicationsController' => 'PhabricatorController', 'PhabricatorApplicationsListController' => 'PhabricatorApplicationsController', 'PhabricatorAuditAddCommentController' => 'PhabricatorAuditController', 'PhabricatorAuditComment' => array( 0 => 'PhabricatorAuditDAO', 1 => 'PhabricatorMarkupInterface', ), 'PhabricatorAuditCommentEditor' => 'PhabricatorEditor', 'PhabricatorAuditCommitListView' => 'AphrontView', 'PhabricatorAuditController' => 'PhabricatorController', 'PhabricatorAuditDAO' => 'PhabricatorLiskDAO', 'PhabricatorAuditInlineComment' => array( 0 => 'PhabricatorAuditDAO', 1 => 'PhabricatorInlineCommentInterface', ), 'PhabricatorAuditListController' => 'PhabricatorAuditController', 'PhabricatorAuditListView' => 'AphrontView', 'PhabricatorAuditPreviewController' => 'PhabricatorAuditController', 'PhabricatorAuditReplyHandler' => 'PhabricatorMailReplyHandler', 'PhabricatorAuthController' => 'PhabricatorController', 'PhabricatorAuthenticationConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorBarePageExample' => 'PhabricatorUIExample', 'PhabricatorBarePageView' => 'AphrontPageView', 'PhabricatorBaseEnglishTranslation' => 'PhabricatorTranslation', 'PhabricatorBuiltinPatchList' => 'PhabricatorSQLPatchList', 'PhabricatorButtonsExample' => 'PhabricatorUIExample', 'PhabricatorCacheDAO' => 'PhabricatorLiskDAO', 'PhabricatorCalendarBrowseController' => 'PhabricatorCalendarController', 'PhabricatorCalendarController' => 'PhabricatorController', 'PhabricatorCalendarDAO' => 'PhabricatorLiskDAO', 'PhabricatorCalendarDeleteStatusController' => 'PhabricatorCalendarController', 'PhabricatorCalendarEditStatusController' => 'PhabricatorCalendarController', 'PhabricatorCalendarHoliday' => 'PhabricatorCalendarDAO', 'PhabricatorCalendarHolidayTestCase' => 'PhabricatorTestCase', 'PhabricatorCalendarViewStatusController' => 'PhabricatorCalendarController', 'PhabricatorChangesetResponse' => 'AphrontProxyResponse', 'PhabricatorChatLogChannelListController' => 'PhabricatorChatLogController', 'PhabricatorChatLogChannelLogController' => 'PhabricatorChatLogController', 'PhabricatorChatLogController' => 'PhabricatorController', 'PhabricatorChatLogDAO' => 'PhabricatorLiskDAO', 'PhabricatorChatLogEvent' => array( 0 => 'PhabricatorChatLogDAO', 1 => 'PhabricatorPolicyInterface', ), 'PhabricatorChatLogEventType' => 'PhabricatorChatLogConstants', 'PhabricatorChatLogQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'PhabricatorConduitAPIController' => 'PhabricatorConduitController', 'PhabricatorConduitCertificateToken' => 'PhabricatorConduitDAO', 'PhabricatorConduitConnectionLog' => 'PhabricatorConduitDAO', 'PhabricatorConduitConsoleController' => 'PhabricatorConduitController', 'PhabricatorConduitController' => 'PhabricatorController', 'PhabricatorConduitDAO' => 'PhabricatorLiskDAO', 'PhabricatorConduitListController' => 'PhabricatorConduitController', 'PhabricatorConduitLogController' => 'PhabricatorConduitController', 'PhabricatorConduitMethodCallLog' => 'PhabricatorConduitDAO', 'PhabricatorConduitTokenController' => 'PhabricatorConduitController', 'PhabricatorConfigAllController' => 'PhabricatorConfigController', 'PhabricatorConfigController' => 'PhabricatorController', 'PhabricatorConfigDatabaseSource' => 'PhabricatorConfigProxySource', 'PhabricatorConfigDefaultSource' => 'PhabricatorConfigProxySource', 'PhabricatorConfigDictionarySource' => 'PhabricatorConfigSource', 'PhabricatorConfigEditController' => 'PhabricatorConfigController', 'PhabricatorConfigEditor' => 'PhabricatorApplicationTransactionEditor', 'PhabricatorConfigEntry' => 'PhabricatorConfigEntryDAO', 'PhabricatorConfigEntryDAO' => 'PhabricatorLiskDAO', 'PhabricatorConfigFileSource' => 'PhabricatorConfigProxySource', 'PhabricatorConfigGroupController' => 'PhabricatorConfigController', 'PhabricatorConfigIssueListController' => 'PhabricatorConfigController', 'PhabricatorConfigIssueViewController' => 'PhabricatorConfigController', 'PhabricatorConfigListController' => 'PhabricatorConfigController', 'PhabricatorConfigLocalSource' => 'PhabricatorConfigProxySource', 'PhabricatorConfigManagementDeleteWorkflow' => 'PhabricatorConfigManagementWorkflow', 'PhabricatorConfigManagementGetWorkflow' => 'PhabricatorConfigManagementWorkflow', 'PhabricatorConfigManagementListWorkflow' => 'PhabricatorConfigManagementWorkflow', 'PhabricatorConfigManagementSetWorkflow' => 'PhabricatorConfigManagementWorkflow', 'PhabricatorConfigManagementWorkflow' => 'PhutilArgumentWorkflow', 'PhabricatorConfigOption' => array( 0 => 'Phobject', 1 => 'PhabricatorMarkupInterface', ), 'PhabricatorConfigProxySource' => 'PhabricatorConfigSource', 'PhabricatorConfigResponse' => 'AphrontHTMLResponse', 'PhabricatorConfigStackSource' => 'PhabricatorConfigSource', 'PhabricatorConfigTransaction' => 'PhabricatorApplicationTransaction', 'PhabricatorConfigTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 'PhabricatorConfigValidationException' => 'Exception', 'PhabricatorContentSourceView' => 'AphrontView', 'PhabricatorController' => 'AphrontController', 'PhabricatorCoreConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorCountdownController' => 'PhabricatorController', 'PhabricatorCountdownDAO' => 'PhabricatorLiskDAO', 'PhabricatorCountdownDeleteController' => 'PhabricatorCountdownController', 'PhabricatorCountdownEditController' => 'PhabricatorCountdownController', 'PhabricatorCountdownListController' => 'PhabricatorCountdownController', 'PhabricatorCountdownViewController' => 'PhabricatorCountdownController', 'PhabricatorCrumbView' => 'AphrontView', 'PhabricatorCrumbsView' => 'AphrontView', 'PhabricatorCursorPagedPolicyAwareQuery' => 'PhabricatorPolicyAwareQuery', 'PhabricatorDaemon' => 'PhutilDaemon', 'PhabricatorDaemonCombinedLogController' => 'PhabricatorDaemonController', 'PhabricatorDaemonConsoleController' => 'PhabricatorDaemonController', 'PhabricatorDaemonController' => 'PhabricatorController', 'PhabricatorDaemonDAO' => 'PhabricatorLiskDAO', 'PhabricatorDaemonLog' => 'PhabricatorDaemonDAO', 'PhabricatorDaemonLogEvent' => 'PhabricatorDaemonDAO', 'PhabricatorDaemonLogEventsView' => 'AphrontView', 'PhabricatorDaemonLogListController' => 'PhabricatorDaemonController', 'PhabricatorDaemonLogListView' => 'AphrontView', 'PhabricatorDaemonLogViewController' => 'PhabricatorDaemonController', 'PhabricatorDefaultFileStorageEngineSelector' => 'PhabricatorFileStorageEngineSelector', 'PhabricatorDefaultSearchEngineSelector' => 'PhabricatorSearchEngineSelector', 'PhabricatorDeveloperConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorDifferentialConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorDiffusionConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorDirectoryController' => 'PhabricatorController', 'PhabricatorDirectoryMainController' => 'PhabricatorDirectoryController', 'PhabricatorDisabledUserController' => 'PhabricatorAuthController', 'PhabricatorDisqusConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorDraft' => 'PhabricatorDraftDAO', 'PhabricatorDraftDAO' => 'PhabricatorLiskDAO', 'PhabricatorEdgeConfig' => 'PhabricatorEdgeConstants', 'PhabricatorEdgeCycleException' => 'Exception', 'PhabricatorEdgeEditor' => 'PhabricatorEditor', 'PhabricatorEdgeGraph' => 'AbstractDirectedGraph', 'PhabricatorEdgeQuery' => 'PhabricatorQuery', 'PhabricatorEdgeTestCase' => 'PhabricatorTestCase', 'PhabricatorEditor' => 'Phobject', 'PhabricatorEmailLoginController' => 'PhabricatorAuthController', 'PhabricatorEmailTokenController' => 'PhabricatorAuthController', 'PhabricatorEmailVerificationController' => 'PhabricatorPeopleController', 'PhabricatorEnglishTranslation' => 'PhabricatorBaseEnglishTranslation', 'PhabricatorEnvTestCase' => 'PhabricatorTestCase', 'PhabricatorErrorExample' => 'PhabricatorUIExample', 'PhabricatorEvent' => 'PhutilEvent', 'PhabricatorEventType' => 'PhutilEventType', 'PhabricatorExampleEventListener' => 'PhutilEventListener', 'PhabricatorExtendingPhabricatorConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorFacebookConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorFactAggregate' => 'PhabricatorFactDAO', 'PhabricatorFactChartController' => 'PhabricatorFactController', 'PhabricatorFactController' => 'PhabricatorController', 'PhabricatorFactCountEngine' => 'PhabricatorFactEngine', 'PhabricatorFactCursor' => 'PhabricatorFactDAO', 'PhabricatorFactDAO' => 'PhabricatorLiskDAO', 'PhabricatorFactDaemon' => 'PhabricatorDaemon', 'PhabricatorFactHomeController' => 'PhabricatorFactController', 'PhabricatorFactLastUpdatedEngine' => 'PhabricatorFactEngine', 'PhabricatorFactManagementAnalyzeWorkflow' => 'PhabricatorFactManagementWorkflow', 'PhabricatorFactManagementCursorsWorkflow' => 'PhabricatorFactManagementWorkflow', 'PhabricatorFactManagementDestroyWorkflow' => 'PhabricatorFactManagementWorkflow', 'PhabricatorFactManagementListWorkflow' => 'PhabricatorFactManagementWorkflow', 'PhabricatorFactManagementStatusWorkflow' => 'PhabricatorFactManagementWorkflow', 'PhabricatorFactManagementWorkflow' => 'PhutilArgumentWorkflow', 'PhabricatorFactRaw' => 'PhabricatorFactDAO', 'PhabricatorFactSimpleSpec' => 'PhabricatorFactSpec', 'PhabricatorFactUpdateIterator' => 'PhutilBufferedIterator', 'PhabricatorFeedConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorFeedController' => 'PhabricatorController', 'PhabricatorFeedDAO' => 'PhabricatorLiskDAO', 'PhabricatorFeedMainController' => 'PhabricatorFeedController', 'PhabricatorFeedPublicStreamController' => 'PhabricatorFeedController', 'PhabricatorFeedQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'PhabricatorFeedStory' => 'PhabricatorPolicyInterface', 'PhabricatorFeedStoryAggregate' => 'PhabricatorFeedStory', 'PhabricatorFeedStoryAudit' => 'PhabricatorFeedStory', 'PhabricatorFeedStoryCommit' => 'PhabricatorFeedStory', 'PhabricatorFeedStoryData' => 'PhabricatorFeedDAO', 'PhabricatorFeedStoryDifferential' => 'PhabricatorFeedStory', 'PhabricatorFeedStoryDifferentialAggregate' => 'PhabricatorFeedStoryAggregate', 'PhabricatorFeedStoryManiphest' => 'PhabricatorFeedStory', 'PhabricatorFeedStoryManiphestAggregate' => 'PhabricatorFeedStoryAggregate', 'PhabricatorFeedStoryNotification' => 'PhabricatorFeedDAO', 'PhabricatorFeedStoryPhriction' => 'PhabricatorFeedStory', 'PhabricatorFeedStoryProject' => 'PhabricatorFeedStory', 'PhabricatorFeedStoryReference' => 'PhabricatorFeedDAO', 'PhabricatorFeedStoryStatus' => 'PhabricatorFeedStory', 'PhabricatorFeedStoryTypeConstants' => 'PhabricatorFeedConstants', 'PhabricatorFeedStoryView' => 'PhabricatorFeedView', 'PhabricatorFeedView' => 'AphrontView', 'PhabricatorFile' => array( 0 => 'PhabricatorFileDAO', 1 => 'PhabricatorPolicyInterface', ), 'PhabricatorFileController' => 'PhabricatorController', 'PhabricatorFileDAO' => 'PhabricatorLiskDAO', 'PhabricatorFileDataController' => 'PhabricatorFileController', 'PhabricatorFileDeleteController' => 'PhabricatorFileController', 'PhabricatorFileDropUploadController' => 'PhabricatorFileController', 'PhabricatorFileImageMacro' => array( 0 => 'PhabricatorFileDAO', 1 => 'PhabricatorSubscribableInterface', ), 'PhabricatorFileInfoController' => 'PhabricatorFileController', 'PhabricatorFileLinkListView' => 'AphrontView', 'PhabricatorFileLinkView' => 'AphrontView', 'PhabricatorFileListController' => 'PhabricatorFileController', 'PhabricatorFileQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'PhabricatorFileShortcutController' => 'PhabricatorFileController', 'PhabricatorFileStorageBlob' => 'PhabricatorFileDAO', 'PhabricatorFileStorageConfigurationException' => 'Exception', 'PhabricatorFileTransformController' => 'PhabricatorFileController', 'PhabricatorFileUploadController' => 'PhabricatorFileController', 'PhabricatorFileUploadException' => 'Exception', 'PhabricatorFilesConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorFilesManagementEnginesWorkflow' => 'PhabricatorFilesManagementWorkflow', 'PhabricatorFilesManagementMetadataWorkflow' => 'PhabricatorFilesManagementWorkflow', 'PhabricatorFilesManagementMigrateWorkflow' => 'PhabricatorFilesManagementWorkflow', 'PhabricatorFilesManagementWorkflow' => 'PhutilArgumentWorkflow', 'PhabricatorFlag' => 'PhabricatorFlagDAO', 'PhabricatorFlagColor' => 'PhabricatorFlagConstants', 'PhabricatorFlagController' => 'PhabricatorController', 'PhabricatorFlagDAO' => 'PhabricatorLiskDAO', 'PhabricatorFlagDeleteController' => 'PhabricatorFlagController', 'PhabricatorFlagEditController' => 'PhabricatorFlagController', 'PhabricatorFlagListController' => 'PhabricatorFlagController', 'PhabricatorFlagListView' => 'AphrontView', 'PhabricatorFlagsUIEventListener' => 'PhutilEventListener', 'PhabricatorFormExample' => 'PhabricatorUIExample', 'PhabricatorGarbageCollectorConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorGarbageCollectorDaemon' => 'PhabricatorDaemon', 'PhabricatorGitHubConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorGlobalLock' => 'PhutilLock', 'PhabricatorGlobalUploadTargetView' => 'AphrontView', 'PhabricatorGoogleConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorHashTestCase' => 'PhabricatorTestCase', 'PhabricatorHeaderView' => 'AphrontView', 'PhabricatorHelpController' => 'PhabricatorController', 'PhabricatorHelpKeyboardShortcutController' => 'PhabricatorHelpController', 'PhabricatorIRCBot' => 'PhabricatorDaemon', 'PhabricatorIRCDifferentialNotificationHandler' => 'PhabricatorIRCHandler', 'PhabricatorIRCFeedNotificationHandler' => 'PhabricatorIRCHandler', 'PhabricatorIRCLogHandler' => 'PhabricatorIRCHandler', 'PhabricatorIRCMacroHandler' => 'PhabricatorIRCHandler', 'PhabricatorIRCObjectNameHandler' => 'PhabricatorIRCHandler', 'PhabricatorIRCProtocolHandler' => 'PhabricatorIRCHandler', 'PhabricatorIRCSymbolHandler' => 'PhabricatorIRCHandler', 'PhabricatorIRCWhatsNewHandler' => 'PhabricatorIRCHandler', 'PhabricatorInfrastructureTestCase' => 'PhabricatorTestCase', 'PhabricatorInlineCommentController' => 'PhabricatorController', 'PhabricatorInlineCommentInterface' => 'PhabricatorMarkupInterface', 'PhabricatorInlineCommentPreviewController' => 'PhabricatorController', 'PhabricatorInlineSummaryView' => 'AphrontView', 'PhabricatorJavelinLinter' => 'ArcanistLinter', 'PhabricatorKeyValueDatabaseCache' => 'PhutilKeyValueCache', 'PhabricatorLDAPConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorLDAPLoginController' => 'PhabricatorAuthController', 'PhabricatorLDAPRegistrationController' => 'PhabricatorAuthController', 'PhabricatorLDAPUnknownUserException' => 'Exception', 'PhabricatorLDAPUnlinkController' => 'PhabricatorAuthController', 'PhabricatorLintEngine' => 'PhutilLintEngine', 'PhabricatorLiskDAO' => 'LiskDAO', 'PhabricatorLocalDiskFileStorageEngine' => 'PhabricatorFileStorageEngine', 'PhabricatorLocalTimeTestCase' => 'PhabricatorTestCase', 'PhabricatorLoginController' => 'PhabricatorAuthController', 'PhabricatorLoginValidateController' => 'PhabricatorAuthController', 'PhabricatorLogoutController' => 'PhabricatorAuthController', 'PhabricatorMacroCommentController' => 'PhabricatorMacroController', 'PhabricatorMacroConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorMacroController' => 'PhabricatorController', 'PhabricatorMacroDisableController' => 'PhabricatorMacroController', 'PhabricatorMacroEditController' => 'PhabricatorMacroController', 'PhabricatorMacroEditor' => 'PhabricatorApplicationTransactionEditor', 'PhabricatorMacroListController' => 'PhabricatorMacroController', 'PhabricatorMacroMemeController' => 'PhabricatorMacroController', 'PhabricatorMacroMemeDialogController' => 'PhabricatorMacroController', 'PhabricatorMacroReplyHandler' => 'PhabricatorMailReplyHandler', 'PhabricatorMacroTransaction' => 'PhabricatorApplicationTransaction', 'PhabricatorMacroTransactionComment' => 'PhabricatorApplicationTransactionComment', 'PhabricatorMacroTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 'PhabricatorMacroViewController' => 'PhabricatorMacroController', 'PhabricatorMailImplementationAmazonSESAdapter' => 'PhabricatorMailImplementationPHPMailerLiteAdapter', 'PhabricatorMailImplementationPHPMailerAdapter' => 'PhabricatorMailImplementationAdapter', 'PhabricatorMailImplementationPHPMailerLiteAdapter' => 'PhabricatorMailImplementationAdapter', 'PhabricatorMailImplementationSendGridAdapter' => 'PhabricatorMailImplementationAdapter', 'PhabricatorMailImplementationTestAdapter' => 'PhabricatorMailImplementationAdapter', 'PhabricatorMailingListsController' => 'PhabricatorController', 'PhabricatorMailingListsEditController' => 'PhabricatorMailingListsController', 'PhabricatorMailingListsListController' => 'PhabricatorMailingListsController', 'PhabricatorMainMenuGroupView' => 'AphrontView', 'PhabricatorMainMenuIconView' => 'AphrontView', 'PhabricatorMainMenuSearchView' => 'AphrontView', 'PhabricatorMainMenuView' => 'AphrontView', 'PhabricatorManiphestConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorMarkupCache' => 'PhabricatorCacheDAO', 'PhabricatorMenuItemView' => 'AphrontTagView', 'PhabricatorMenuView' => 'AphrontTagView', 'PhabricatorMetaMTAConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorMetaMTAController' => 'PhabricatorController', 'PhabricatorMetaMTADAO' => 'PhabricatorLiskDAO', 'PhabricatorMetaMTAEmailBodyParserTestCase' => 'PhabricatorTestCase', 'PhabricatorMetaMTAListController' => 'PhabricatorMetaMTAController', 'PhabricatorMetaMTAMail' => 'PhabricatorMetaMTADAO', 'PhabricatorMetaMTAMailBodyTestCase' => 'PhabricatorTestCase', 'PhabricatorMetaMTAMailTestCase' => 'PhabricatorTestCase', 'PhabricatorMetaMTAMailingList' => 'PhabricatorMetaMTADAO', 'PhabricatorMetaMTAReceiveController' => 'PhabricatorMetaMTAController', 'PhabricatorMetaMTAReceivedListController' => 'PhabricatorMetaMTAController', 'PhabricatorMetaMTAReceivedMail' => 'PhabricatorMetaMTADAO', 'PhabricatorMetaMTASendController' => 'PhabricatorMetaMTAController', 'PhabricatorMetaMTASendGridReceiveController' => 'PhabricatorMetaMTAController', 'PhabricatorMetaMTAViewController' => 'PhabricatorMetaMTAController', 'PhabricatorMetaMTAWorker' => 'PhabricatorWorker', 'PhabricatorMustVerifyEmailController' => 'PhabricatorAuthController', 'PhabricatorMySQLConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorMySQLFileStorageEngine' => 'PhabricatorFileStorageEngine', 'PhabricatorNotificationClearController' => 'PhabricatorNotificationController', 'PhabricatorNotificationConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorNotificationController' => 'PhabricatorController', 'PhabricatorNotificationIndividualController' => 'PhabricatorNotificationController', 'PhabricatorNotificationListController' => 'PhabricatorNotificationController', 'PhabricatorNotificationPanelController' => 'PhabricatorNotificationController', 'PhabricatorNotificationQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'PhabricatorNotificationStatusController' => 'PhabricatorNotificationController', 'PhabricatorOAuthClientAuthorization' => 'PhabricatorOAuthServerDAO', 'PhabricatorOAuthClientAuthorizationBaseController' => 'PhabricatorOAuthServerController', 'PhabricatorOAuthClientAuthorizationDeleteController' => 'PhabricatorOAuthClientAuthorizationBaseController', 'PhabricatorOAuthClientAuthorizationEditController' => 'PhabricatorOAuthClientAuthorizationBaseController', 'PhabricatorOAuthClientAuthorizationListController' => 'PhabricatorOAuthClientAuthorizationBaseController', 'PhabricatorOAuthClientAuthorizationQuery' => 'PhabricatorOffsetPagedQuery', 'PhabricatorOAuthClientBaseController' => 'PhabricatorOAuthServerController', 'PhabricatorOAuthClientDeleteController' => 'PhabricatorOAuthClientBaseController', 'PhabricatorOAuthClientEditController' => 'PhabricatorOAuthClientBaseController', 'PhabricatorOAuthClientListController' => 'PhabricatorOAuthClientBaseController', 'PhabricatorOAuthClientViewController' => 'PhabricatorOAuthClientBaseController', 'PhabricatorOAuthDefaultRegistrationController' => 'PhabricatorOAuthRegistrationController', 'PhabricatorOAuthDiagnosticsController' => 'PhabricatorAuthController', 'PhabricatorOAuthFailureView' => 'AphrontView', 'PhabricatorOAuthLoginController' => 'PhabricatorAuthController', 'PhabricatorOAuthProviderDisqus' => 'PhabricatorOAuthProvider', 'PhabricatorOAuthProviderException' => 'Exception', 'PhabricatorOAuthProviderFacebook' => 'PhabricatorOAuthProvider', 'PhabricatorOAuthProviderGitHub' => 'PhabricatorOAuthProvider', 'PhabricatorOAuthProviderGoogle' => 'PhabricatorOAuthProvider', 'PhabricatorOAuthProviderPhabricator' => 'PhabricatorOAuthProvider', 'PhabricatorOAuthRegistrationController' => 'PhabricatorAuthController', 'PhabricatorOAuthResponse' => 'AphrontResponse', 'PhabricatorOAuthServerAccessToken' => 'PhabricatorOAuthServerDAO', 'PhabricatorOAuthServerAuthController' => 'PhabricatorAuthController', 'PhabricatorOAuthServerAuthorizationCode' => 'PhabricatorOAuthServerDAO', 'PhabricatorOAuthServerClient' => 'PhabricatorOAuthServerDAO', 'PhabricatorOAuthServerClientQuery' => 'PhabricatorOffsetPagedQuery', 'PhabricatorOAuthServerController' => 'PhabricatorController', 'PhabricatorOAuthServerDAO' => 'PhabricatorLiskDAO', 'PhabricatorOAuthServerTestCase' => 'PhabricatorTestCase', 'PhabricatorOAuthServerTestController' => 'PhabricatorOAuthServerController', 'PhabricatorOAuthServerTokenController' => 'PhabricatorAuthController', 'PhabricatorOAuthUnlinkController' => 'PhabricatorAuthController', 'PhabricatorObjectHandleStatus' => 'PhabricatorObjectHandleConstants', 'PhabricatorObjectItemListView' => 'AphrontView', 'PhabricatorObjectItemView' => 'AphrontView', 'PhabricatorObjectListView' => 'AphrontView', 'PhabricatorOffsetPagedQuery' => 'PhabricatorQuery', 'PhabricatorOwnersConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorOwnersController' => 'PhabricatorController', 'PhabricatorOwnersDAO' => 'PhabricatorLiskDAO', 'PhabricatorOwnersDeleteController' => 'PhabricatorOwnersController', 'PhabricatorOwnersDetailController' => 'PhabricatorOwnersController', 'PhabricatorOwnersEditController' => 'PhabricatorOwnersController', 'PhabricatorOwnersListController' => 'PhabricatorOwnersController', 'PhabricatorOwnersOwner' => 'PhabricatorOwnersDAO', 'PhabricatorOwnersPackage' => array( 0 => 'PhabricatorOwnersDAO', 1 => 'PhabricatorPolicyInterface', ), 'PhabricatorOwnersPackageQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'PhabricatorOwnersPackageTestCase' => 'PhabricatorTestCase', 'PhabricatorOwnersPath' => 'PhabricatorOwnersDAO', 'PhabricatorPHDConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorPHIDConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorPHIDController' => 'PhabricatorController', 'PhabricatorPHIDLookupController' => 'PhabricatorPHIDController', 'PhabricatorPHPMailerConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorPaste' => array( 0 => 'PhabricatorPasteDAO', 1 => 'PhabricatorPolicyInterface', ), 'PhabricatorPasteController' => 'PhabricatorController', 'PhabricatorPasteDAO' => 'PhabricatorLiskDAO', 'PhabricatorPasteEditController' => 'PhabricatorPasteController', 'PhabricatorPasteListController' => 'PhabricatorPasteController', 'PhabricatorPasteQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'PhabricatorPasteViewController' => 'PhabricatorPasteController', 'PhabricatorPeopleController' => 'PhabricatorController', 'PhabricatorPeopleEditController' => 'PhabricatorPeopleController', 'PhabricatorPeopleLdapController' => 'PhabricatorPeopleController', 'PhabricatorPeopleListController' => 'PhabricatorPeopleController', 'PhabricatorPeopleLogsController' => 'PhabricatorPeopleController', 'PhabricatorPeopleProfileController' => 'PhabricatorPeopleController', 'PhabricatorPeopleQuery' => 'PhabricatorOffsetPagedQuery', 'PhabricatorPhabricatorOAuthConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorPhameConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorPholioConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorPhrictionConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorPinboardItemView' => 'AphrontView', 'PhabricatorPinboardView' => 'AphrontView', 'PhabricatorPolicies' => 'PhabricatorPolicyConstants', 'PhabricatorPolicyAwareQuery' => 'PhabricatorOffsetPagedQuery', 'PhabricatorPolicyAwareTestQuery' => 'PhabricatorPolicyAwareQuery', 'PhabricatorPolicyCapability' => 'PhabricatorPolicyConstants', 'PhabricatorPolicyConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorPolicyException' => 'Exception', 'PhabricatorPolicyQuery' => 'PhabricatorQuery', 'PhabricatorPolicyTestCase' => 'PhabricatorTestCase', 'PhabricatorPolicyTestObject' => 'PhabricatorPolicyInterface', 'PhabricatorPolicyType' => 'PhabricatorPolicyConstants', 'PhabricatorProfileHeaderView' => 'AphrontView', 'PhabricatorProject' => array( 0 => 'PhabricatorProjectDAO', 1 => 'PhabricatorPolicyInterface', ), 'PhabricatorProjectController' => 'PhabricatorController', 'PhabricatorProjectCreateController' => 'PhabricatorProjectController', 'PhabricatorProjectDAO' => 'PhabricatorLiskDAO', 'PhabricatorProjectEditor' => 'PhabricatorEditor', 'PhabricatorProjectEditorTestCase' => 'PhabricatorTestCase', 'PhabricatorProjectListController' => 'PhabricatorProjectController', 'PhabricatorProjectMembersEditController' => 'PhabricatorProjectController', 'PhabricatorProjectNameCollisionException' => 'Exception', 'PhabricatorProjectProfile' => 'PhabricatorProjectDAO', 'PhabricatorProjectProfileController' => 'PhabricatorProjectController', 'PhabricatorProjectProfileEditController' => 'PhabricatorProjectController', 'PhabricatorProjectQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'PhabricatorProjectTransaction' => 'PhabricatorProjectDAO', 'PhabricatorProjectTransactionType' => 'PhabricatorProjectConstants', 'PhabricatorProjectUpdateController' => 'PhabricatorProjectController', 'PhabricatorPropertyListExample' => 'PhabricatorUIExample', 'PhabricatorPropertyListView' => 'AphrontView', 'PhabricatorRecaptchaConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorRedirectController' => 'PhabricatorController', 'PhabricatorRefreshCSRFController' => 'PhabricatorAuthController', 'PhabricatorRemarkupControl' => 'AphrontFormTextAreaControl', 'PhabricatorRemarkupRuleCountdown' => 'PhutilRemarkupRule', 'PhabricatorRemarkupRuleDifferential' => 'PhabricatorRemarkupRuleObjectName', 'PhabricatorRemarkupRuleDifferentialHandle' => 'PhabricatorRemarkupRuleObjectHandle', 'PhabricatorRemarkupRuleDiffusion' => 'PhabricatorRemarkupRuleObjectName', 'PhabricatorRemarkupRuleEmbedFile' => 'PhutilRemarkupRule', 'PhabricatorRemarkupRuleImageMacro' => 'PhutilRemarkupRule', 'PhabricatorRemarkupRuleManiphest' => 'PhabricatorRemarkupRuleObjectName', 'PhabricatorRemarkupRuleManiphestHandle' => 'PhabricatorRemarkupRuleObjectHandle', 'PhabricatorRemarkupRuleMeme' => 'PhutilRemarkupRule', 'PhabricatorRemarkupRuleMention' => 'PhutilRemarkupRule', 'PhabricatorRemarkupRuleObjectHandle' => 'PhutilRemarkupRule', 'PhabricatorRemarkupRuleObjectName' => 'PhutilRemarkupRule', 'PhabricatorRemarkupRulePaste' => 'PhabricatorRemarkupRuleObjectName', 'PhabricatorRemarkupRulePhriction' => 'PhutilRemarkupRule', 'PhabricatorRemarkupRuleYoutube' => 'PhutilRemarkupRule', 'PhabricatorRepository' => array( 0 => 'PhabricatorRepositoryDAO', 1 => 'PhabricatorPolicyInterface', ), 'PhabricatorRepositoryArcanistProject' => 'PhabricatorRepositoryDAO', 'PhabricatorRepositoryArcanistProjectDeleteController' => 'PhabricatorRepositoryController', 'PhabricatorRepositoryArcanistProjectEditController' => 'PhabricatorRepositoryController', 'PhabricatorRepositoryAuditRequest' => 'PhabricatorRepositoryDAO', 'PhabricatorRepositoryBranch' => 'PhabricatorRepositoryDAO', 'PhabricatorRepositoryCommit' => 'PhabricatorRepositoryDAO', 'PhabricatorRepositoryCommitChangeParserWorker' => 'PhabricatorRepositoryCommitParserWorker', 'PhabricatorRepositoryCommitData' => 'PhabricatorRepositoryDAO', 'PhabricatorRepositoryCommitHeraldWorker' => 'PhabricatorRepositoryCommitParserWorker', 'PhabricatorRepositoryCommitMessageParserWorker' => 'PhabricatorRepositoryCommitParserWorker', 'PhabricatorRepositoryCommitOwnersWorker' => 'PhabricatorRepositoryCommitParserWorker', 'PhabricatorRepositoryCommitParserWorker' => 'PhabricatorWorker', 'PhabricatorRepositoryCommitSearchIndexer' => 'PhabricatorSearchDocumentIndexer', 'PhabricatorRepositoryConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorRepositoryController' => 'PhabricatorController', 'PhabricatorRepositoryCreateController' => 'PhabricatorRepositoryController', 'PhabricatorRepositoryDAO' => 'PhabricatorLiskDAO', 'PhabricatorRepositoryDeleteController' => 'PhabricatorRepositoryController', 'PhabricatorRepositoryEditController' => 'PhabricatorRepositoryController', 'PhabricatorRepositoryGitCommitChangeParserWorker' => 'PhabricatorRepositoryCommitChangeParserWorker', 'PhabricatorRepositoryGitCommitMessageParserWorker' => 'PhabricatorRepositoryCommitMessageParserWorker', 'PhabricatorRepositoryListController' => 'PhabricatorRepositoryController', 'PhabricatorRepositoryManagementDeleteWorkflow' => 'PhabricatorRepositoryManagementWorkflow', 'PhabricatorRepositoryManagementDiscoverWorkflow' => 'PhabricatorRepositoryManagementWorkflow', 'PhabricatorRepositoryManagementListWorkflow' => 'PhabricatorRepositoryManagementWorkflow', 'PhabricatorRepositoryManagementPullWorkflow' => 'PhabricatorRepositoryManagementWorkflow', 'PhabricatorRepositoryManagementWorkflow' => 'PhutilArgumentWorkflow', 'PhabricatorRepositoryMercurialCommitChangeParserWorker' => 'PhabricatorRepositoryCommitChangeParserWorker', 'PhabricatorRepositoryMercurialCommitMessageParserWorker' => 'PhabricatorRepositoryCommitMessageParserWorker', 'PhabricatorRepositoryPullLocalDaemon' => 'PhabricatorDaemon', 'PhabricatorRepositoryPullLocalDaemonTestCase' => 'PhabricatorTestCase', 'PhabricatorRepositoryQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'PhabricatorRepositoryShortcut' => 'PhabricatorRepositoryDAO', 'PhabricatorRepositorySvnCommitChangeParserWorker' => 'PhabricatorRepositoryCommitChangeParserWorker', 'PhabricatorRepositorySvnCommitMessageParserWorker' => 'PhabricatorRepositoryCommitMessageParserWorker', 'PhabricatorRepositorySymbol' => 'PhabricatorRepositoryDAO', 'PhabricatorRepositoryTestCase' => 'PhabricatorTestCase', 'PhabricatorS3FileStorageEngine' => 'PhabricatorFileStorageEngine', 'PhabricatorSSHWorkflow' => 'PhutilArgumentWorkflow', 'PhabricatorSearchAttachController' => 'PhabricatorSearchBaseController', 'PhabricatorSearchBaseController' => 'PhabricatorController', 'PhabricatorSearchConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorSearchController' => 'PhabricatorSearchBaseController', 'PhabricatorSearchDAO' => 'PhabricatorLiskDAO', 'PhabricatorSearchDocument' => 'PhabricatorSearchDAO', 'PhabricatorSearchDocumentField' => 'PhabricatorSearchDAO', 'PhabricatorSearchDocumentRelationship' => 'PhabricatorSearchDAO', 'PhabricatorSearchEngineElastic' => 'PhabricatorSearchEngine', 'PhabricatorSearchEngineMySQL' => 'PhabricatorSearchEngine', 'PhabricatorSearchManagementIndexWorkflow' => 'PhabricatorSearchManagementWorkflow', 'PhabricatorSearchManagementWorkflow' => 'PhutilArgumentWorkflow', 'PhabricatorSearchQuery' => 'PhabricatorSearchDAO', 'PhabricatorSearchResultView' => 'AphrontView', 'PhabricatorSearchSelectController' => 'PhabricatorSearchBaseController', 'PhabricatorSecurityConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorSendGridConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorSettingsAdjustController' => 'PhabricatorController', 'PhabricatorSettingsMainController' => 'PhabricatorController', 'PhabricatorSettingsPanelAccount' => 'PhabricatorSettingsPanel', 'PhabricatorSettingsPanelConduit' => 'PhabricatorSettingsPanel', 'PhabricatorSettingsPanelDisplayPreferences' => 'PhabricatorSettingsPanel', 'PhabricatorSettingsPanelEmailAddresses' => 'PhabricatorSettingsPanel', 'PhabricatorSettingsPanelEmailPreferences' => 'PhabricatorSettingsPanel', 'PhabricatorSettingsPanelHomePreferences' => 'PhabricatorSettingsPanel', 'PhabricatorSettingsPanelLDAP' => 'PhabricatorSettingsPanel', 'PhabricatorSettingsPanelOAuth' => 'PhabricatorSettingsPanel', 'PhabricatorSettingsPanelPassword' => 'PhabricatorSettingsPanel', 'PhabricatorSettingsPanelProfile' => 'PhabricatorSettingsPanel', 'PhabricatorSettingsPanelSSHKeys' => 'PhabricatorSettingsPanel', 'PhabricatorSettingsPanelSearchPreferences' => 'PhabricatorSettingsPanel', 'PhabricatorSetupCheckAPC' => 'PhabricatorSetupCheck', 'PhabricatorSetupCheckBaseURI' => 'PhabricatorSetupCheck', 'PhabricatorSetupCheckDatabase' => 'PhabricatorSetupCheck', 'PhabricatorSetupCheckExtensions' => 'PhabricatorSetupCheck', 'PhabricatorSetupCheckExtraConfig' => 'PhabricatorSetupCheck', 'PhabricatorSetupCheckFacebook' => 'PhabricatorSetupCheck', 'PhabricatorSetupCheckGD' => 'PhabricatorSetupCheck', 'PhabricatorSetupCheckInvalidConfig' => 'PhabricatorSetupCheck', 'PhabricatorSetupCheckMail' => 'PhabricatorSetupCheck', 'PhabricatorSetupCheckMySQL' => 'PhabricatorSetupCheck', 'PhabricatorSetupCheckPHPConfig' => 'PhabricatorSetupCheck', 'PhabricatorSetupCheckPath' => 'PhabricatorSetupCheck', 'PhabricatorSetupCheckStorage' => 'PhabricatorSetupCheck', 'PhabricatorSetupCheckTimezone' => 'PhabricatorSetupCheck', 'PhabricatorSetupIssueView' => 'AphrontView', 'PhabricatorSlowvoteChoice' => 'PhabricatorSlowvoteDAO', 'PhabricatorSlowvoteComment' => 'PhabricatorSlowvoteDAO', 'PhabricatorSlowvoteController' => 'PhabricatorController', 'PhabricatorSlowvoteCreateController' => 'PhabricatorSlowvoteController', 'PhabricatorSlowvoteDAO' => 'PhabricatorLiskDAO', 'PhabricatorSlowvoteListController' => 'PhabricatorSlowvoteController', 'PhabricatorSlowvoteOption' => 'PhabricatorSlowvoteDAO', 'PhabricatorSlowvotePoll' => 'PhabricatorSlowvoteDAO', 'PhabricatorSlowvotePollController' => 'PhabricatorSlowvoteController', 'PhabricatorSlugTestCase' => 'PhabricatorTestCase', 'PhabricatorSortTableExample' => 'PhabricatorUIExample', 'PhabricatorSourceCodeView' => 'AphrontView', 'PhabricatorStandardPageView' => 'PhabricatorBarePageView', 'PhabricatorStatusController' => 'PhabricatorController', 'PhabricatorStorageManagementDatabasesWorkflow' => 'PhabricatorStorageManagementWorkflow', 'PhabricatorStorageManagementDestroyWorkflow' => 'PhabricatorStorageManagementWorkflow', 'PhabricatorStorageManagementDumpWorkflow' => 'PhabricatorStorageManagementWorkflow', 'PhabricatorStorageManagementStatusWorkflow' => 'PhabricatorStorageManagementWorkflow', 'PhabricatorStorageManagementUpgradeWorkflow' => 'PhabricatorStorageManagementWorkflow', 'PhabricatorStorageManagementWorkflow' => 'PhutilArgumentWorkflow', 'PhabricatorSubscribersQuery' => 'PhabricatorQuery', 'PhabricatorSubscriptionsEditController' => 'PhabricatorController', 'PhabricatorSubscriptionsEditor' => 'PhabricatorEditor', 'PhabricatorSubscriptionsUIEventListener' => 'PhutilEventListener', 'PhabricatorSymbolNameLinter' => 'ArcanistXHPASTLintNamingHook', 'PhabricatorSyntaxHighlightingConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorTagExample' => 'PhabricatorUIExample', 'PhabricatorTagView' => 'AphrontView', 'PhabricatorTaskmasterDaemon' => 'PhabricatorDaemon', 'PhabricatorTestCase' => 'ArcanistPhutilTestCase', 'PhabricatorTestWorker' => 'PhabricatorWorker', 'PhabricatorTimelineCursor' => 'PhabricatorTimelineDAO', 'PhabricatorTimelineDAO' => 'PhabricatorLiskDAO', 'PhabricatorTimelineEvent' => 'PhabricatorTimelineDAO', 'PhabricatorTimelineEventData' => 'PhabricatorTimelineDAO', 'PhabricatorTimelineEventView' => 'AphrontView', 'PhabricatorTimelineExample' => 'PhabricatorUIExample', 'PhabricatorTimelineIterator' => 'Iterator', 'PhabricatorTimelineView' => 'AphrontView', 'PhabricatorTimer' => 'PhabricatorCountdownDAO', 'PhabricatorTransactionView' => 'AphrontView', 'PhabricatorTransformedFile' => 'PhabricatorFileDAO', 'PhabricatorTranslationsConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorTrivialTestCase' => 'PhabricatorTestCase', 'PhabricatorTypeaheadCommonDatasourceController' => 'PhabricatorTypeaheadDatasourceController', 'PhabricatorTypeaheadDatasourceController' => 'PhabricatorController', 'PhabricatorUIExampleRenderController' => 'PhabricatorController', 'PhabricatorUIListFilterExample' => 'PhabricatorUIExample', 'PhabricatorUINotificationExample' => 'PhabricatorUIExample', 'PhabricatorUIPagerExample' => 'PhabricatorUIExample', 'PhabricatorUITooltipExample' => 'PhabricatorUIExample', 'PhabricatorUnitsTestCase' => 'PhabricatorTestCase', 'PhabricatorUser' => array( 0 => 'PhabricatorUserDAO', 1 => 'PhutilPerson', ), 'PhabricatorUserDAO' => 'PhabricatorLiskDAO', 'PhabricatorUserEditor' => 'PhabricatorEditor', 'PhabricatorUserEmail' => 'PhabricatorUserDAO', 'PhabricatorUserLDAPInfo' => 'PhabricatorUserDAO', 'PhabricatorUserLog' => 'PhabricatorUserDAO', 'PhabricatorUserOAuthInfo' => 'PhabricatorUserDAO', 'PhabricatorUserPreferences' => 'PhabricatorUserDAO', 'PhabricatorUserProfile' => 'PhabricatorUserDAO', 'PhabricatorUserSSHKey' => 'PhabricatorUserDAO', 'PhabricatorUserSearchIndexer' => 'PhabricatorSearchDocumentIndexer', 'PhabricatorUserStatus' => 'PhabricatorUserDAO', 'PhabricatorUserStatusInvalidEpochException' => 'Exception', 'PhabricatorUserStatusOverlapException' => 'Exception', 'PhabricatorUserTestCase' => 'PhabricatorTestCase', 'PhabricatorWorkerActiveTask' => 'PhabricatorWorkerTask', 'PhabricatorWorkerArchiveTask' => 'PhabricatorWorkerTask', 'PhabricatorWorkerDAO' => 'PhabricatorLiskDAO', 'PhabricatorWorkerLeaseQuery' => 'PhabricatorQuery', 'PhabricatorWorkerPermanentFailureException' => 'Exception', 'PhabricatorWorkerTask' => 'PhabricatorWorkerDAO', 'PhabricatorWorkerTaskData' => 'PhabricatorWorkerDAO', 'PhabricatorWorkerTaskDetailController' => 'PhabricatorDaemonController', 'PhabricatorWorkerTaskUpdateController' => 'PhabricatorDaemonController', 'PhabricatorWorkerTestCase' => 'PhabricatorTestCase', 'PhabricatorXHPASTViewController' => 'PhabricatorController', 'PhabricatorXHPASTViewDAO' => 'PhabricatorLiskDAO', 'PhabricatorXHPASTViewFrameController' => 'PhabricatorXHPASTViewController', 'PhabricatorXHPASTViewFramesetController' => 'PhabricatorXHPASTViewController', 'PhabricatorXHPASTViewInputController' => 'PhabricatorXHPASTViewPanelController', 'PhabricatorXHPASTViewPanelController' => 'PhabricatorXHPASTViewController', 'PhabricatorXHPASTViewParseTree' => 'PhabricatorXHPASTViewDAO', 'PhabricatorXHPASTViewRunController' => 'PhabricatorXHPASTViewController', 'PhabricatorXHPASTViewStreamController' => 'PhabricatorXHPASTViewPanelController', 'PhabricatorXHPASTViewTreeController' => 'PhabricatorXHPASTViewPanelController', 'PhabricatorXHProfController' => 'PhabricatorController', 'PhabricatorXHProfDAO' => 'PhabricatorLiskDAO', 'PhabricatorXHProfProfileController' => 'PhabricatorXHProfController', 'PhabricatorXHProfProfileSymbolView' => 'PhabricatorXHProfProfileView', 'PhabricatorXHProfProfileTopLevelView' => 'PhabricatorXHProfProfileView', 'PhabricatorXHProfProfileView' => 'AphrontView', 'PhabricatorXHProfSample' => 'PhabricatorXHProfDAO', 'PhabricatorXHProfSampleListController' => 'PhabricatorXHProfController', 'PhabricatorXHProfSampleListView' => 'AphrontView', 'PhameBasicBlogSkin' => 'PhameBlogSkin', 'PhameBasicTemplateBlogSkin' => 'PhameBasicBlogSkin', 'PhameBlog' => array( 0 => 'PhameDAO', 1 => 'PhabricatorPolicyInterface', 2 => 'PhabricatorMarkupInterface', ), 'PhameBlogDeleteController' => 'PhameController', 'PhameBlogEditController' => 'PhameController', 'PhameBlogFeedController' => 'PhameController', 'PhameBlogListController' => 'PhameController', 'PhameBlogLiveController' => 'PhameController', 'PhameBlogQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'PhameBlogSkin' => 'PhabricatorController', 'PhameBlogViewController' => 'PhameController', 'PhameController' => 'PhabricatorController', 'PhameDAO' => 'PhabricatorLiskDAO', 'PhamePost' => array( 0 => 'PhameDAO', 1 => 'PhabricatorPolicyInterface', 2 => 'PhabricatorMarkupInterface', ), 'PhamePostDeleteController' => 'PhameController', 'PhamePostEditController' => 'PhameController', 'PhamePostFramedController' => 'PhameController', 'PhamePostListController' => 'PhameController', 'PhamePostNewController' => 'PhameController', 'PhamePostNotLiveController' => 'PhameController', 'PhamePostPreviewController' => 'PhameController', 'PhamePostPublishController' => 'PhameController', 'PhamePostQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'PhamePostUnpublishController' => 'PhameController', 'PhamePostView' => 'AphrontView', 'PhamePostViewController' => 'PhameController', 'PhameResourceController' => 'CelerityResourceController', 'PholioController' => 'PhabricatorController', 'PholioDAO' => 'PhabricatorLiskDAO', 'PholioImage' => array( 0 => 'PholioDAO', 1 => 'PhabricatorMarkupInterface', ), 'PholioMock' => array( 0 => 'PholioDAO', 1 => 'PhabricatorMarkupInterface', 2 => 'PhabricatorPolicyInterface', 3 => 'PhabricatorSubscribableInterface', ), 'PholioMockCommentController' => 'PholioController', 'PholioMockEditController' => 'PholioController', 'PholioMockEditor' => 'PhabricatorApplicationTransactionEditor', 'PholioMockImagesView' => 'AphrontView', 'PholioMockListController' => 'PholioController', 'PholioMockQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'PholioMockViewController' => 'PholioController', 'PholioReplyHandler' => 'PhabricatorMailReplyHandler', 'PholioSearchIndexer' => 'PhabricatorSearchDocumentIndexer', 'PholioTransaction' => 'PhabricatorApplicationTransaction', 'PholioTransactionComment' => 'PhabricatorApplicationTransactionComment', 'PholioTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 'PholioTransactionType' => 'PholioConstants', 'PhortuneMonthYearExpiryControl' => 'AphrontFormControl', 'PhortuneStripeBaseController' => 'PhabricatorController', 'PhortuneStripePaymentFormView' => 'AphrontView', 'PhortuneStripeTestPaymentFormController' => 'PhortuneStripeBaseController', 'PhrictionActionConstants' => 'PhrictionConstants', 'PhrictionChangeType' => 'PhrictionConstants', 'PhrictionContent' => array( 0 => 'PhrictionDAO', 1 => 'PhabricatorMarkupInterface', ), 'PhrictionController' => 'PhabricatorController', 'PhrictionDAO' => 'PhabricatorLiskDAO', 'PhrictionDeleteController' => 'PhrictionController', 'PhrictionDiffController' => 'PhrictionController', 'PhrictionDocument' => array( 0 => 'PhrictionDAO', 1 => 'PhabricatorPolicyInterface', ), 'PhrictionDocumentController' => 'PhrictionController', 'PhrictionDocumentEditor' => 'PhabricatorEditor', 'PhrictionDocumentPreviewController' => 'PhrictionController', 'PhrictionDocumentStatus' => 'PhrictionConstants', 'PhrictionDocumentTestCase' => 'PhabricatorTestCase', 'PhrictionEditController' => 'PhrictionController', 'PhrictionHistoryController' => 'PhrictionController', 'PhrictionListController' => 'PhrictionController', 'PhrictionNewController' => 'PhrictionController', 'PhrictionSearchIndexer' => 'PhabricatorSearchDocumentIndexer', 'PonderAddAnswerView' => 'AphrontView', 'PonderAddCommentView' => 'AphrontView', 'PonderAnswer' => array( 0 => 'PonderDAO', 1 => 'PhabricatorMarkupInterface', 2 => 'PonderVotableInterface', ), 'PonderAnswerEditor' => 'PhabricatorEditor', 'PonderAnswerListView' => 'AphrontView', 'PonderAnswerPreviewController' => 'PonderController', 'PonderAnswerQuery' => 'PhabricatorOffsetPagedQuery', 'PonderAnswerSaveController' => 'PonderController', 'PonderAnswerViewController' => 'PonderController', 'PonderAnsweredMail' => 'PonderMail', 'PonderComment' => array( 0 => 'PonderDAO', 1 => 'PhabricatorMarkupInterface', ), 'PonderCommentEditor' => 'PhabricatorEditor', 'PonderCommentListView' => 'AphrontView', 'PonderCommentMail' => 'PonderMail', 'PonderCommentQuery' => 'PhabricatorQuery', 'PonderCommentSaveController' => 'PonderController', 'PonderController' => 'PhabricatorController', 'PonderDAO' => 'PhabricatorLiskDAO', 'PonderFeedController' => 'PonderController', 'PonderMentionMail' => 'PonderMail', 'PonderPostBodyView' => 'AphrontView', 'PonderQuestion' => array( 0 => 'PonderDAO', 1 => 'PhabricatorMarkupInterface', 2 => 'PonderVotableInterface', 3 => 'PhabricatorSubscribableInterface', 4 => 'PhabricatorPolicyInterface', ), 'PonderQuestionAskController' => 'PonderController', 'PonderQuestionDetailView' => 'AphrontView', 'PonderQuestionEditor' => 'PhabricatorEditor', 'PonderQuestionPreviewController' => 'PonderController', 'PonderQuestionQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'PonderQuestionSummaryView' => 'AphrontView', 'PonderQuestionViewController' => 'PonderController', 'PonderReplyHandler' => 'PhabricatorMailReplyHandler', 'PonderRuleQuestion' => 'PhabricatorRemarkupRuleObjectName', 'PonderSearchIndexer' => 'PhabricatorSearchDocumentIndexer', 'PonderUserProfileView' => 'AphrontView', 'PonderVotableView' => 'AphrontView', 'PonderVoteEditor' => 'PhabricatorEditor', 'PonderVoteSaveController' => 'PonderController', 'QueryFormattingTestCase' => 'PhabricatorTestCase', ), )); diff --git a/src/applications/auth/application/PhabricatorApplicationAuth.php b/src/applications/auth/application/PhabricatorApplicationAuth.php index 18819a9410..acd98344ea 100644 --- a/src/applications/auth/application/PhabricatorApplicationAuth.php +++ b/src/applications/auth/application/PhabricatorApplicationAuth.php @@ -1,29 +1,33 @@ isLoggedIn()) { $item = new PhabricatorMenuItemView(); $item->setName(pht('Log Out')); $item->setIcon('power'); $item->setWorkflow(true); $item->setHref('/logout/'); $item->setSortOrder(2.0); $item->setSelected(($controller instanceof PhabricatorLogoutController)); $items[] = $item; } return $items; } } diff --git a/src/applications/base/PhabricatorApplication.php b/src/applications/base/PhabricatorApplication.php index 9642a57fba..6bed54389a 100644 --- a/src/applications/base/PhabricatorApplication.php +++ b/src/applications/base/PhabricatorApplication.php @@ -1,248 +1,291 @@ pht('Core Applications'), self::GROUP_COMMUNICATION => pht('Communication'), self::GROUP_ORGANIZATION => pht('Organization'), self::GROUP_UTILITIES => pht('Utilities'), self::GROUP_ADMIN => pht('Administration'), self::GROUP_DEVELOPER => pht('Developer Tools'), self::GROUP_MISC => pht('Miscellaneous Applications'), ); } public static function getTileDisplayName($constant) { $names = array( self::TILE_INVISIBLE => pht('Invisible'), self::TILE_HIDE => pht('Hidden'), self::TILE_SHOW => pht('Show Small Tile'), self::TILE_FULL => pht('Show Large Tile'), ); return idx($names, $constant); } /* -( Application Information )-------------------------------------------- */ public function getName() { return substr(get_class($this), strlen('PhabricatorApplication')); } public function getShortDescription() { return $this->getName().' Application'; } public function isEnabled() { return true; } + public function isInstalled() { + $uninstalled = + PhabricatorEnv::getEnvConfig('phabricator.uninstalled-applications'); + + if (isset($uninstalled[get_class($this)])) { + return false; + } else { + return true; + } + } + public function isBeta() { return false; } + public function canUninstall() { + return true; + } + public function getPHID() { return 'PHID-APPS-'.get_class($this); } public function getTypeaheadURI() { return $this->getBaseURI(); } public function getBaseURI() { return null; } public function getIconURI() { return null; } public function getIconName() { return 'application'; } public function shouldAppearInLaunchView() { return true; } public function getApplicationOrder() { return PHP_INT_MAX; } public function getApplicationGroup() { return self::GROUP_MISC; } public function getTitleGlyph() { return null; } public function getHelpURI() { // TODO: When these applications get created, link to their docs: // // - Drydock // - OAuth Server return null; } public function getEventListeners() { return array(); } public function getDefaultTileDisplay(PhabricatorUser $user) { switch ($this->getApplicationGroup()) { case self::GROUP_CORE: return self::TILE_FULL; case self::GROUP_UTILITIES: case self::GROUP_DEVELOPER: return self::TILE_HIDE; case self::GROUP_ADMIN: if ($user->getIsAdmin()) { return self::TILE_SHOW; } else { return self::TILE_INVISIBLE; } break; default: return self::TILE_SHOW; } } /* -( URI Routing )-------------------------------------------------------- */ public function getRoutes() { return array(); } /* -( Fact Integration )--------------------------------------------------- */ public function getFactObjectsForAnalysis() { return array(); } /* -( UI Integration )----------------------------------------------------- */ /** * Render status elements (like "3 Waiting Reviews") for application list * views. These provide a way to alert users to new or pending action items * in applications. * * @param PhabricatorUser Viewing user. * @return list Application status elements. * @task ui */ public function loadStatus(PhabricatorUser $user) { return array(); } /** * You can provide an optional piece of flavor text for the application. This * is currently rendered in application launch views if the application has no * status elements. * * @return string|null Flavor text. * @task ui */ public function getFlavorText() { return null; } /** * Build items for the main menu. * * @param PhabricatorUser The viewing user. * @param AphrontController The current controller. May be null for special * pages like 404, exception handlers, etc. * @return list List of menu items. * @task ui */ public function buildMainMenuItems( PhabricatorUser $user, PhabricatorController $controller = null) { return array(); } /** * On the Phabricator homepage sidebar, this function returns the URL for * a quick create X link which is displayed in the wide button only. * * @return string * @task ui */ public function getQuickCreateURI() { return null; } /* -( Application Management )--------------------------------------------- */ + public static function getAllApplications() { + + $classes = id(new PhutilSymbolLoader()) + ->setAncestorClass(__CLASS__) + ->setConcreteOnly(true) + ->selectAndLoadSymbols(); + + $apps = array(); + + foreach ($classes as $class) { + $app = newv($class['name'], array()); + $apps[] = $app; + } + + return $apps; + } public static function getAllInstalledApplications() { static $applications; $show_beta = PhabricatorEnv::getEnvConfig('phabricator.show-beta-applications'); + $uninstalled = + PhabricatorEnv::getEnvConfig('phabricator.uninstalled-applications'); + + + if (empty($applications)) { $classes = id(new PhutilSymbolLoader()) ->setAncestorClass(__CLASS__) ->setConcreteOnly(true) ->selectAndLoadSymbols(); $apps = array(); foreach ($classes as $class) { - $app = newv($class['name'], array()); - if (!$app->isEnabled()) { + + if (isset($uninstalled[$class['name']])) { + continue; + } + + $app = newv($class['name'], array()); + + if (!$app->isEnabled()) { continue; - } + } - if (!$show_beta && $app->isBeta()) { + if (!$show_beta && $app->isBeta()) { continue; - } + } - $apps[] = $app; + $apps[] = $app; } + $applications = $apps; } return $applications; } - } + diff --git a/src/applications/config/application/PhabricatorApplicationConfig.php b/src/applications/config/application/PhabricatorApplicationConfig.php index 70c542c217..5c78cef272 100644 --- a/src/applications/config/application/PhabricatorApplicationConfig.php +++ b/src/applications/config/application/PhabricatorApplicationConfig.php @@ -1,36 +1,40 @@ array( '' => 'PhabricatorConfigListController', 'all/' => 'PhabricatorConfigAllController', 'edit/(?P[\w\.\-]+)/' => 'PhabricatorConfigEditController', 'group/(?P[^/]+)/' => 'PhabricatorConfigGroupController', 'issue/' => array( '' => 'PhabricatorConfigIssueListController', '(?P[^/]+)/' => 'PhabricatorConfigIssueViewController', ), ), ); } } diff --git a/src/applications/config/check/PhabricatorSetupCheckBaseURI.php b/src/applications/config/check/PhabricatorSetupCheckBaseURI.php index 34bcfb9599..1a5671a737 100644 --- a/src/applications/config/check/PhabricatorSetupCheckBaseURI.php +++ b/src/applications/config/check/PhabricatorSetupCheckBaseURI.php @@ -1,47 +1,67 @@ newIssue('config.phabricator.domain') + ->setShortName(pht('Dotless Domain')) + ->setName(pht('No Dot Character in Domain')) + ->setSummary($summary) + ->setMessage($message) + ->setIsFatal(true); + } + if ($base_uri) { return; } $base_uri_guess = PhabricatorEnv::getRequestBaseURI(); $summary = pht( 'The base URI for this install is not configured. Configuring it will '. 'improve security and enable features.'); $message = pht( 'The base URI for this install is not configured. Configuring it will '. 'improve security and allow background processes (like daemons and '. 'scripts) to generate links.'. "\n\n". 'You should set the base URI to the URI you will use to access '. 'Phabricator, like "http://phabricator.example.com/".'. "\n\n". 'Include the protocol (http or https), domain name, and port number if '. 'you are using a port other than 80 (http) or 443 (https).'. "\n\n". 'Based on this request, it appears that the correct setting is:'. "\n\n". '%s'. "\n\n". 'To configure the base URI, run the command shown below.', $base_uri_guess); $this ->newIssue('config.phabricator.base-uri') ->setShortName(pht('No Base URI')) ->setName(pht("Base URI Not Configured")) ->setSummary($summary) ->setMessage($message) ->addCommand( csprintf( 'phabricator/ $ '. './bin/config set phabricator.base-uri %s', $base_uri_guess)); } } diff --git a/src/applications/config/option/PhabricatorCoreConfigOptions.php b/src/applications/config/option/PhabricatorCoreConfigOptions.php index c1dddac3d1..6dadb5c816 100644 --- a/src/applications/config/option/PhabricatorCoreConfigOptions.php +++ b/src/applications/config/option/PhabricatorCoreConfigOptions.php @@ -1,199 +1,204 @@ newOption('phabricator.base-uri', 'string', null) ->setLocked(true) ->setSummary(pht("URI where Phabricator is installed.")) ->setDescription( pht( "Set the URI where Phabricator is installed. Setting this ". "improves security by preventing cookies from being set on other ". "domains, and allows daemons to send emails with links that have ". "the correct domain.")) ->addExample('http://phabricator.example.com/', pht('Valid Setting')), $this->newOption('phabricator.production-uri', 'string', null) ->setSummary( pht("Primary install URI, for multi-environment installs.")) ->setDescription( pht( "If you have multiple Phabricator environments (like a ". "development/staging environment for working on testing ". "Phabricator, and a production environment for deploying it), ". "set the production environment URI here so that emails and other ". "durable URIs will always generate with links pointing at the ". "production environment. If unset, defaults to ". "{{phabricator.base-uri}}. Most installs do not need to set ". "this option.")) ->addExample('http://phabricator.example.com/', pht('Valid Setting')), $this->newOption('phabricator.timezone', 'string', null) ->setSummary( pht("The timezone Phabricator should use.")) ->setDescription( pht( "PHP requires that you set a timezone in your php.ini before ". "using date functions, or it will emit a warning. If this isn't ". "possible (for instance, because you are using HPHP) you can set ". "some valid constant for date_default_timezone_set() here and ". "Phabricator will set it on your behalf, silencing the warning.")) ->addExample('America/New_York', pht('US East (EDT)')) ->addExample('America/Chicago', pht('US Central (CDT)')) ->addExample('America/Boise', pht('US Mountain (MDT)')) ->addExample('America/Los_Angeles', pht('US West (PDT)')), $this->newOption('phabricator.show-beta-applications', 'bool', false) ->setBoolOptions( array( pht('Visible'), pht('Invisible') ))->setDescription(pht('Show beta applications on the home page.')), $this->newOption('phabricator.serious-business', 'bool', false) ->setBoolOptions( array( pht('Serious business'), pht('Shenanigans'), // That should be interesting to translate. :P )) ->setSummary( pht("Should Phabricator be serious?")) ->setDescription( pht( "By default, Phabricator includes some silly nonsense in the UI, ". "such as a submit button called 'Clowncopterize' in Differential ". "and a call to 'Leap Into Action'. If you'd prefer more ". "traditional UI strings like 'Submit', you can set this flag to ". "disable most of the jokes and easter eggs.")), $this->newOption('environment.append-paths', 'list', array()) ->setSummary( pht("These paths get appended to your \$PATH envrionment variable.")) ->setDescription( pht( "Phabricator occasionally shells out to other binaries on the ". "server. An example of this is the \"pygmentize\" command, used ". "to syntax-highlight code written in languages other than PHP. ". "By default, it is assumed that these binaries are in the \$PATH ". "of the user running Phabricator (normally 'apache', 'httpd', or ". "'nobody'). Here you can add extra directories to the \$PATH ". "environment variable, for when these binaries are in ". "non-standard locations.")) ->addExample('/usr/local/bin', pht('Add One Path')) ->addExample("/usr/bin\n/usr/local/bin", pht('Add Multiple Paths')), $this->newOption('tokenizer.ondemand', 'bool', false) ->setBoolOptions( array( pht("Query on demand"), pht("Query on page load"), )) ->setSummary( pht("Query for tokenizer fields on demand.")) ->setDescription( pht( "Tokenizers are UI controls which let the user select other ". "users, email addresses, project names, etc., by typing the ". "first few letters and having the control autocomplete from a ". "list. They can load their data in two ways: either in a big ". "chunk up front, or as the user types. By default, the data is ". "loaded in a big chunk. This is simpler and performs better for ". "small datasets. However, if you have a very large number of ". "users or projects, (in the ballpark of more than a thousand), ". "loading all that data may become slow enough that it's ". "worthwhile to query on demand instead. This makes the typeahead ". "slightly less responsive but overall performance will be much ". "better if you have a ton of stuff. You can figure out which ". "setting is best for your install by changing this setting and ". "then playing with a user tokenizer (like the user selectors in ". "Maniphest or Differential) and seeing which setting loads ". "faster and feels better.")), $this->newOption('config.lock', 'set', array()) ->setLocked(true) ->setDescription(pht('Additional configuration options to lock.')), $this->newOption('config.hide', 'set', array()) ->setLocked(true) ->setDescription(pht('Additional configuration options to hide.')), $this->newOption('config.mask', 'set', array()) ->setLocked(true) ->setDescription(pht('Additional configuration options to mask.')), $this->newOption('phabricator.env', 'string', null) ->setLocked(true) ->setDescription(pht('Internal.')), $this->newOption('test.value', 'wild', null) ->setLocked(true) ->setDescription(pht('Unit test value.')), + $this->newOption('phabricator.uninstalled-applications', 'set', array()) + ->setLocked(true) + ->setDescription( + pht('Array containing list of Uninstalled applications.') + ), ); } protected function didValidateOption( PhabricatorConfigOption $option, $value) { $key = $option->getKey(); if ($key == 'phabricator.base-uri' || $key == 'phabricator.production-uri') { $uri = new PhutilURI($value); $protocol = $uri->getProtocol(); if ($protocol !== 'http' && $protocol !== 'https') { throw new PhabricatorConfigValidationException( pht( "Config option '%s' is invalid. The URI must start with ". "'http://' or 'https://'.", $key)); } $domain = $uri->getDomain(); if (strpos($domain, '.') === false) { throw new PhabricatorConfigValidationException( pht( "Config option '%s' is invalid. The URI must contain a dot ('.'), ". "like 'http://example.com/', not just a bare name like ". "'http://example/'. Some web browsers will not set cookies on ". "domains with no TLD.", $key)); } $path = $uri->getPath(); if ($path !== '' && $path !== '/') { throw new PhabricatorConfigValidationException( pht( "Config option '%s' is invalid. The URI must NOT have a path, ". "e.g. 'http://phabricator.example.com/' is OK, but ". "'http://example.com/phabricator/' is not. Phabricator must be ". "installed on an entire domain; it can not be installed on a ". "path.", $key)); } } if ($key === 'phabricator.timezone') { $old = date_default_timezone_get(); $ok = @date_default_timezone_set($value); @date_default_timezone_set($old); if (!$ok) { throw new PhabricatorConfigValidationException( pht( "Config option '%s' is invalid. The timezone identifier must ". "be a valid timezone identifier recognized by PHP, like ". "'America/Los_Angeles'. You can find a list of valid identifiers ". "here: %s", $key, 'http://php.net/manual/timezones.php')); } } } } diff --git a/src/applications/conpherence/controller/ConpherenceController.php b/src/applications/conpherence/controller/ConpherenceController.php index fbe8e3cd6a..6ca418661d 100644 --- a/src/applications/conpherence/controller/ConpherenceController.php +++ b/src/applications/conpherence/controller/ConpherenceController.php @@ -1,222 +1,222 @@ unreadConpherences = $conpherences; return $this; } public function getUnreadConpherences() { return $this->unreadConpherences; } public function setReadConpherences(array $conpherences) { assert_instances_of($conpherences, 'ConpherenceThread'); $this->readConpherences = $conpherences; return $this; } public function getReadConpherences() { return $this->readConpherences; } public function setSelectedConpherencePHID($phid) { $this->selectedConpherencePHID = $phid; return $this; } public function getSelectedConpherencePHID() { return $this->selectedConpherencePHID; } /** * Try for a full set of unread conpherences, and if we fail * load read conpherences. Additional conpherences in either category * are loaded asynchronously. */ public function loadStartingConpherences($current_selection_epoch = null) { $user = $this->getRequest()->getUser(); $read_participant_query = id(new ConpherenceParticipantQuery()) ->withParticipantPHIDs(array($user->getPHID())); $read_status = ConpherenceParticipationStatus::UP_TO_DATE; if ($current_selection_epoch) { $read_one = $read_participant_query ->withParticipationStatus($read_status) ->withDateTouched($current_selection_epoch, '>') ->execute(); $read_two = $read_participant_query ->withDateTouched($current_selection_epoch, '<=') ->execute(); $read = array_merge($read_one, $read_two); } else { $read = $read_participant_query ->withParticipationStatus($read_status) ->execute(); } $unread_status = ConpherenceParticipationStatus::BEHIND; $unread = id(new ConpherenceParticipantQuery()) ->withParticipantPHIDs(array($user->getPHID())) ->withParticipationStatus($unread_status) ->execute(); $all_participation = $unread + $read; $all_conpherence_phids = array_keys($all_participation); $all_conpherences = id(new ConpherenceThreadQuery()) ->setViewer($user) ->withPHIDs($all_conpherence_phids) ->execute(); $unread_conpherences = array_select_keys( $all_conpherences, array_keys($unread) ); $this->setUnreadConpherences($unread_conpherences); $read_conpherences = array_select_keys( $all_conpherences, array_keys($read) ); $this->setReadConpherences($read_conpherences); if (!$this->getSelectedConpherencePHID()) { $this->setSelectedConpherencePHID(reset($all_conpherence_phids)); } return $this; } public function buildSideNavView($filter = null) { require_celerity_resource('conpherence-menu-css'); $unread_conpherences = $this->getUnreadConpherences(); $read_conpherences = $this->getReadConpherences(); $user = $this->getRequest()->getUser(); $menu = new PhabricatorMenuView(); $nav = AphrontSideNavFilterView::newFromMenu($menu); $nav->addClass('conpherence-menu'); $nav->setMenuID('conpherence-menu'); - $nav->addFilter( + $nav->addButton( 'new', - pht('New Conpherence'), + pht('New Conversation'), $this->getApplicationURI('new/') ); $nav->addLabel(pht('Unread')); $nav = $this->addConpherencesToNav($unread_conpherences, $nav); $nav->addLabel(pht('Read')); $nav = $this->addConpherencesToNav($read_conpherences, $nav, true); $nav->selectFilter($filter); return $nav; } private function addConpherencesToNav( array $conpherences, AphrontSideNavFilterView $nav, $read = false) { $user = $this->getRequest()->getUser(); foreach ($conpherences as $conpherence) { $uri = $this->getApplicationURI('view/'.$conpherence->getID().'/'); $data = $conpherence->getDisplayData($user); $title = $data['title']; $subtitle = $data['subtitle']; $unread_count = $data['unread_count']; $epoch = $data['epoch']; $image = $data['image']; $snippet = $data['snippet']; $item = id(new ConpherenceMenuItemView()) ->setUser($user) ->setTitle($title) ->setSubtitle($subtitle) ->setHref($uri) ->setEpoch($epoch) ->setImageURI($image) ->setMessageText($snippet) ->setUnreadCount($unread_count) ->setID($conpherence->getPHID()) ->addSigil('conpherence-menu-click') ->setMetadata(array('id' => $conpherence->getID())); if ($this->getSelectedConpherencePHID() == $conpherence->getPHID()) { $item->addClass('conpherence-selected'); $item->addClass('hide-unread-count'); } $nav->addCustomBlock($item->render()); } if (empty($conpherences) || $read) { $nav->addCustomBlock($this->getNoConpherencesBlock()); } return $nav; } private function getNoConpherencesBlock() { return phutil_tag( 'div', array( 'class' => 'no-conpherences-menu-item' ), pht('No more conpherences.')); } public function buildApplicationMenu() { return $this->buildSideNavView()->getMenu(); } public function buildApplicationCrumbs() { $crumbs = parent::buildApplicationCrumbs(); $crumbs ->addAction( id(new PhabricatorMenuItemView()) - ->setName(pht('New Conpherence')) + ->setName(pht('New Conversation')) ->setHref($this->getApplicationURI('new/')) ->setIcon('create') ) ->addCrumb( id(new PhabricatorCrumbView()) ->setName(pht('Conpherence')) ); return $crumbs; } protected function initJavelinBehaviors() { Javelin::initBehavior('conpherence-menu', array( 'base_uri' => $this->getApplicationURI(''), 'header' => 'conpherence-header-pane', 'messages' => 'conpherence-messages', 'widgets_pane' => 'conpherence-widget-pane', 'form_pane' => 'conpherence-form', 'fancy_ajax' => (bool) $this->getSelectedConpherencePHID() ) ); Javelin::initBehavior('conpherence-init', array( 'selected_conpherence_id' => $this->getSelectedConpherencePHID(), 'menu_pane' => 'conpherence-menu', 'messages_pane' => 'conpherence-message-pane', 'messages' => 'conpherence-messages', 'widgets_pane' => 'conpherence-widget-pane', 'form_pane' => 'conpherence-form' ) ); } } diff --git a/src/applications/conpherence/controller/ConpherenceNewController.php b/src/applications/conpherence/controller/ConpherenceNewController.php index ded3b75f6f..dff27bcf9a 100644 --- a/src/applications/conpherence/controller/ConpherenceNewController.php +++ b/src/applications/conpherence/controller/ConpherenceNewController.php @@ -1,201 +1,201 @@ getRequest(); $user = $request->getUser(); $conpherence = id(new ConpherenceThread()) ->attachParticipants(array()) ->attachFilePHIDs(array()); - $title = pht('New Conpherence'); + $title = pht('New Conversation'); $participants = array(); $message = ''; $files = array(); $errors = array(); $e_participants = null; $e_message = null; // this comes from ajax requests from all over. should be a single phid. $participant_prefill = $request->getStr('participant'); if ($participant_prefill) { $participants[] = $participant_prefill; } if ($request->isFormPost()) { $participants = $request->getArr('participants'); if (empty($participants)) { $e_participants = true; $errors[] = pht('You must specify participants.'); } else { $participants[] = $user->getPHID(); $participants = array_unique($participants); } $message = $request->getStr('message'); if (empty($message)) { $e_message = true; $errors[] = pht('You must write a message.'); } $file_phids = PhabricatorMarkupEngine::extractFilePHIDsFromEmbeddedFiles( array($message) ); if ($file_phids) { $files = id(new PhabricatorFileQuery()) ->setViewer($user) ->withPHIDs($file_phids) ->execute(); } if (!$errors) { $conpherence->openTransaction(); $conpherence->save(); $xactions = array(); $xactions[] = id(new ConpherenceTransaction()) ->setTransactionType(ConpherenceTransactionType::TYPE_PARTICIPANTS) ->setNewValue(array('+' => $participants)); if ($files) { $xactions[] = id(new ConpherenceTransaction()) ->setTransactionType(ConpherenceTransactionType::TYPE_FILES) ->setNewValue(array('+' => mpull($files, 'getPHID'))); } $xactions[] = id(new ConpherenceTransaction()) ->setTransactionType(PhabricatorTransactions::TYPE_COMMENT) ->attachComment( id(new ConpherenceTransactionComment()) ->setContent($message) ->setConpherencePHID($conpherence->getPHID()) ); $content_source = PhabricatorContentSource::newForSource( PhabricatorContentSource::SOURCE_WEB, array( 'ip' => $request->getRemoteAddr() ) ); id(new ConpherenceEditor()) ->setContentSource($content_source) ->setContinueOnNoEffect(true) ->setActor($user) ->applyTransactions($conpherence, $xactions); $conpherence->saveTransaction(); if ($request->isAjax()) { $dialog = id(new AphrontDialogView()) ->setUser($user) ->setTitle('Success') ->addCancelButton('#', 'Okay') ->appendChild( phutil_tag( 'p', array(), pht('Message sent successfully.')) ); $response = id(new AphrontDialogResponse()) ->setDialog($dialog); } else { $uri = $this->getApplicationURI($conpherence->getID()); $response = id(new AphrontRedirectResponse()) ->setURI($uri); } return $response; } } $error_view = null; if ($errors) { $error_view = id(new AphrontErrorView()) ->setTitle(pht('Conpherence Errors')) ->setErrors($errors); } $participant_handles = array(); if ($participants) { $handles = id(new PhabricatorObjectHandleData($participants)) ->setViewer($user) ->loadHandles(); $participant_handles = mpull($handles, 'getFullName', 'getPHID'); } $submit_uri = $this->getApplicationURI('new/'); $cancel_uri = $this->getApplicationURI(); if ($request->isAjax()) { // TODO - we can get a better cancel_uri once we get better at crazy // ajax jonx T2086 if ($participant_prefill) { $handle = $handles[$participant_prefill]; $cancel_uri = $handle->getURI(); } $form = id(new AphrontDialogView()) ->setSubmitURI($submit_uri) ->addSubmitButton() ->setWidth(AphrontDialogView::WIDTH_FORM) ->addCancelButton($cancel_uri); } else { $form = id(new AphrontFormView()) ->setID('conpherence-message-pane') ->setAction($submit_uri); } $form ->setUser($user) ->appendChild( id(new AphrontFormTokenizerControl()) ->setName('participants') ->setValue($participant_handles) ->setUser($user) ->setDatasource('/typeahead/common/users/') ->setLabel(pht('To')) ->setError($e_participants) ) ->appendChild( id(new PhabricatorRemarkupControl()) ->setName('message') ->setValue($message) ->setLabel(pht('Message')) ->setPlaceHolder(pht('Drag and drop to include files...')) ->setError($e_message) ); if ($request->isAjax()) { $form->setTitle($title); return id(new AphrontDialogResponse()) ->setDialog($form); } $form ->appendChild( id(new AphrontFormSubmitControl()) ->setValue(pht('Submit')) ->addCancelButton($cancel_uri) ); $this->loadStartingConpherences(); $this->setSelectedConpherencePHID(null); $this->initJavelinBehaviors(); $nav = $this->buildSideNavView('new'); $header = id(new PhabricatorHeaderView()) ->setHeader($title); $nav->appendChild( array( $header, $error_view, $form, )); return $this->buildApplicationPage( $nav, array( 'title' => $title, 'device' => true, ) ); } } diff --git a/src/applications/daemon/application/PhabricatorApplicationDaemons.php b/src/applications/daemon/application/PhabricatorApplicationDaemons.php index 4d02d15680..344a80ebcd 100644 --- a/src/applications/daemon/application/PhabricatorApplicationDaemons.php +++ b/src/applications/daemon/application/PhabricatorApplicationDaemons.php @@ -1,45 +1,49 @@ array( '' => 'PhabricatorDaemonConsoleController', 'task/(?P[1-9]\d*)/' => 'PhabricatorWorkerTaskDetailController', 'task/(?P[1-9]\d*)/(?P[^/]+)/' => 'PhabricatorWorkerTaskUpdateController', 'log/' => array( '' => 'PhabricatorDaemonLogListController', 'combined/' => 'PhabricatorDaemonCombinedLogController', '(?P[1-9]\d*)/' => 'PhabricatorDaemonLogViewController', ), ), ); } } diff --git a/src/applications/differential/controller/DifferentialRevisionViewController.php b/src/applications/differential/controller/DifferentialRevisionViewController.php index 9b5edc1077..3096cfaeb4 100644 --- a/src/applications/differential/controller/DifferentialRevisionViewController.php +++ b/src/applications/differential/controller/DifferentialRevisionViewController.php @@ -1,976 +1,979 @@ allowsAnonymousAccess(); } public function willProcessRequest(array $data) { $this->revisionID = $data['id']; } public function processRequest() { $request = $this->getRequest(); $user = $request->getUser(); $viewer_is_anonymous = !$user->isLoggedIn(); $revision = id(new DifferentialRevision())->load($this->revisionID); if (!$revision) { return new Aphront404Response(); } $revision->loadRelationships(); $diffs = $revision->loadDiffs(); if (!$diffs) { throw new Exception( "This revision has no diffs. Something has gone quite wrong."); } $diff_vs = $request->getInt('vs'); $target_id = $request->getInt('id'); $target = idx($diffs, $target_id, end($diffs)); $target_manual = $target; if (!$target_id) { foreach ($diffs as $diff) { if ($diff->getCreationMethod() != 'commit') { $target_manual = $diff; } } } if (empty($diffs[$diff_vs])) { $diff_vs = null; } $arc_project = $target->loadArcanistProject(); $repository = ($arc_project ? $arc_project->loadRepository() : null); list($changesets, $vs_map, $vs_changesets, $rendering_references) = $this->loadChangesetsAndVsMap( $target, idx($diffs, $diff_vs), $repository); if ($request->getExists('download')) { return $this->buildRawDiffResponse( $changesets, $vs_changesets, $vs_map, $repository); } $props = id(new DifferentialDiffProperty())->loadAllWhere( 'diffID = %d', $target_manual->getID()); $props = mpull($props, 'getData', 'getName'); $aux_fields = $this->loadAuxiliaryFields($revision); $comments = $revision->loadComments(); $comments = array_merge( $this->getImplicitComments($revision, reset($diffs)), $comments); $all_changesets = $changesets; $inlines = $this->loadInlineComments($comments, $all_changesets); $object_phids = array_merge( $revision->getReviewers(), $revision->getCCPHIDs(), $revision->loadCommitPHIDs(), array( $revision->getAuthorPHID(), $user->getPHID(), ), mpull($comments, 'getAuthorPHID')); foreach ($comments as $comment) { $metadata = $comment->getMetadata(); $added_reviewers = idx( $metadata, DifferentialComment::METADATA_ADDED_REVIEWERS); if ($added_reviewers) { foreach ($added_reviewers as $phid) { $object_phids[] = $phid; } } $added_ccs = idx( $metadata, DifferentialComment::METADATA_ADDED_CCS); if ($added_ccs) { foreach ($added_ccs as $phid) { $object_phids[] = $phid; } } } foreach ($revision->getAttached() as $type => $phids) { foreach ($phids as $phid => $info) { $object_phids[] = $phid; } } $aux_phids = array(); foreach ($aux_fields as $key => $aux_field) { $aux_field->setDiff($target); $aux_field->setManualDiff($target_manual); $aux_field->setDiffProperties($props); $aux_phids[$key] = $aux_field->getRequiredHandlePHIDsForRevisionView(); } $object_phids = array_merge($object_phids, array_mergev($aux_phids)); $object_phids = array_unique($object_phids); $handles = $this->loadViewerHandles($object_phids); foreach ($aux_fields as $key => $aux_field) { // Make sure each field only has access to handles it specifically // requested, not all handles. Otherwise you can get a field which works // only in the presence of other fields. $aux_field->setHandles(array_select_keys($handles, $aux_phids[$key])); } $reviewer_warning = null; if ($revision->getStatus() == ArcanistDifferentialRevisionStatus::NEEDS_REVIEW) { $has_live_reviewer = false; foreach ($revision->getReviewers() as $reviewer) { if (!$handles[$reviewer]->isDisabled()) { $has_live_reviewer = true; break; } } if (!$has_live_reviewer) { $reviewer_warning = new AphrontErrorView(); $reviewer_warning->setSeverity(AphrontErrorView::SEVERITY_WARNING); $reviewer_warning->setTitle(pht('No Active Reviewers')); if ($revision->getReviewers()) { $reviewer_warning->appendChild( phutil_tag( 'p', array(), pht('All specified reviewers are disabled and this revision '. 'needs review. You may want to add some new reviewers.') )); } else { $reviewer_warning->appendChild( phutil_tag( 'p', array(), pht('This revision has no specified reviewers and needs '. 'review. You may want to add some reviewers.') )); } } } $request_uri = $request->getRequestURI(); $limit = 100; $large = $request->getStr('large'); if (count($changesets) > $limit && !$large) { - $count = number_format(count($changesets)); + $count = count($changesets); $warning = new AphrontErrorView(); $warning->setTitle('Very Large Diff'); $warning->setSeverity(AphrontErrorView::SEVERITY_WARNING); $warning->appendChild( - '

'.pht('This diff is very large and affects %d files. Load '. - 'each file individually. ', $count). - "". + pht( + 'This diff is very large and affects %2$s files. Load each file '. + 'individually.', + $count, + PhutilTranslator::getInstance()->formatNumber($count)). + " ". phutil_tag( 'a', array( 'href' => $request_uri ->alter('large', 'true') ->setFragment('toc'), ), pht('Show All Files Inline')). ""); $warning = $warning->render(); $my_inlines = id(new DifferentialInlineComment())->loadAllWhere( 'revisionID = %d AND commentID IS NULL AND authorPHID = %s AND '. 'changesetID IN (%Ld)', $this->revisionID, $user->getPHID(), mpull($changesets, 'getID')); $visible_changesets = array(); foreach ($inlines + $my_inlines as $inline) { $changeset_id = $inline->getChangesetID(); if (isset($changesets[$changeset_id])) { $visible_changesets[$changeset_id] = $changesets[$changeset_id]; } } if (!empty($props['arc:lint'])) { $changeset_paths = mpull($changesets, null, 'getFilename'); foreach ($props['arc:lint'] as $lint) { $changeset = idx($changeset_paths, $lint['path']); if ($changeset) { $visible_changesets[$changeset->getID()] = $changeset; } } } } else { $warning = null; $visible_changesets = $changesets; } $revision_detail = new DifferentialRevisionDetailView(); $revision_detail->setRevision($revision); $revision_detail->setDiff(reset($diffs)); $revision_detail->setAuxiliaryFields($aux_fields); $actions = $this->getRevisionActions($revision); $custom_renderer_class = PhabricatorEnv::getEnvConfig( 'differential.revision-custom-detail-renderer'); if ($custom_renderer_class) { // TODO: build a better version of the action links and deprecate the // whole DifferentialRevisionDetailRenderer class. $custom_renderer = newv($custom_renderer_class, array()); $custom_renderer->setDiff($target); if ($diff_vs) { $custom_renderer->setVSDiff($diffs[$diff_vs]); } $actions = array_merge( $actions, $custom_renderer->generateActionLinks($revision, $target_manual)); } $whitespace = $request->getStr( 'whitespace', DifferentialChangesetParser::WHITESPACE_IGNORE_ALL); if ($arc_project) { list($symbol_indexes, $project_phids) = $this->buildSymbolIndexes( $arc_project, $visible_changesets); } else { $symbol_indexes = array(); $project_phids = null; } $revision_detail->setActions($actions); $revision_detail->setUser($user); $comment_view = new DifferentialRevisionCommentListView(); $comment_view->setComments($comments); $comment_view->setHandles($handles); $comment_view->setInlineComments($inlines); $comment_view->setChangesets($all_changesets); $comment_view->setUser($user); $comment_view->setTargetDiff($target); $comment_view->setVersusDiffID($diff_vs); if ($arc_project) { Javelin::initBehavior( 'repository-crossreference', array( 'section' => $comment_view->getID(), 'projects' => $project_phids, )); } $changeset_view = new DifferentialChangesetListView(); $changeset_view->setChangesets($changesets); $changeset_view->setVisibleChangesets($visible_changesets); if (!$viewer_is_anonymous) { $changeset_view->setInlineCommentControllerURI( '/differential/comment/inline/edit/'.$revision->getID().'/'); } $changeset_view->setStandaloneURI('/differential/changeset/'); $changeset_view->setRawFileURIs( '/differential/changeset/?view=old', '/differential/changeset/?view=new'); $changeset_view->setUser($user); $changeset_view->setDiff($target); $changeset_view->setRenderingReferences($rendering_references); $changeset_view->setVsMap($vs_map); $changeset_view->setWhitespace($whitespace); if ($repository) { $changeset_view->setRepository($repository); } $changeset_view->setSymbolIndexes($symbol_indexes); $changeset_view->setTitle('Diff '.$target->getID()); $diff_history = new DifferentialRevisionUpdateHistoryView(); $diff_history->setDiffs($diffs); $diff_history->setSelectedVersusDiffID($diff_vs); $diff_history->setSelectedDiffID($target->getID()); $diff_history->setSelectedWhitespace($whitespace); $diff_history->setUser($user); $local_view = new DifferentialLocalCommitsView(); $local_view->setUser($user); $local_view->setLocalCommits(idx($props, 'local:commits')); if ($repository) { $other_revisions = $this->loadOtherRevisions( $changesets, $target, $repository); } else { $other_revisions = array(); } $other_view = null; if ($other_revisions) { $other_view = $this->renderOtherRevisions($other_revisions); } $toc_view = new DifferentialDiffTableOfContentsView(); $toc_view->setChangesets($changesets); $toc_view->setVisibleChangesets($visible_changesets); $toc_view->setRenderingReferences($rendering_references); $toc_view->setUnitTestData(idx($props, 'arc:unit', array())); if ($repository) { $toc_view->setRepository($repository); } $toc_view->setDiff($target); $toc_view->setUser($user); $toc_view->setRevisionID($revision->getID()); $toc_view->setWhitespace($whitespace); $comment_form = null; if (!$viewer_is_anonymous) { $draft = id(new PhabricatorDraft())->loadOneWhere( 'authorPHID = %s AND draftKey = %s', $user->getPHID(), 'differential-comment-'.$revision->getID()); $reviewers = array(); $ccs = array(); if ($draft) { $reviewers = idx($draft->getMetadata(), 'reviewers', array()); $ccs = idx($draft->getMetadata(), 'ccs', array()); if ($reviewers || $ccs) { $handles = $this->loadViewerHandles(array_merge($reviewers, $ccs)); $reviewers = array_select_keys($handles, $reviewers); $ccs = array_select_keys($handles, $ccs); } } $comment_form = new DifferentialAddCommentView(); $comment_form->setRevision($revision); $comment_form->setAuxFields($aux_fields); $comment_form->setActions($this->getRevisionCommentActions($revision)); $comment_form->setActionURI('/differential/comment/save/'); $comment_form->setUser($user); $comment_form->setDraft($draft); $comment_form->setReviewers(mpull($reviewers, 'getFullName', 'getPHID')); $comment_form->setCCs(mpull($ccs, 'getFullName', 'getPHID')); } $pane_id = celerity_generate_unique_node_id(); Javelin::initBehavior( 'differential-keyboard-navigation', array( 'haunt' => $pane_id, )); Javelin::initBehavior('differential-user-select'); $page_pane = id(new DifferentialPrimaryPaneView()) ->setID($pane_id) ->appendChild( $comment_view->render(). $diff_history->render(). $warning. $local_view->render(). $toc_view->render(). $other_view. $changeset_view->render()); if ($comment_form) { $page_pane->appendChild($comment_form->render()); } PhabricatorFeedStoryNotification::updateObjectNotificationViews( $user, $revision->getPHID()); $object_id = 'D'.$revision->getID(); $top_anchor = id(new PhabricatorAnchorView()) ->setAnchorName('top') ->setNavigationMarker(true); $nav = id(new DifferentialChangesetFileTreeSideNavBuilder()) ->setAnchorName('top') ->setTitle('D'.$revision->getID()) ->setBaseURI(new PhutilURI('/D'.$revision->getID())) ->build($changesets); $nav->appendChild( array( $reviewer_warning, $top_anchor, $revision_detail, $page_pane, )); $crumbs = $this->buildApplicationCrumbs(); $crumbs->addCrumb( id(new PhabricatorCrumbView()) ->setName($object_id) ->setHref('/'.$object_id)); $nav->setCrumbs($crumbs); return $this->buildApplicationPage( $nav, array( 'title' => $object_id.' '.$revision->getTitle(), )); } private function getImplicitComments( DifferentialRevision $revision, DifferentialDiff $diff) { $author_phid = nonempty( $diff->getAuthorPHID(), $revision->getAuthorPHID()); $template = new DifferentialComment(); $template->setAuthorPHID($author_phid); $template->setRevisionID($revision->getID()); $template->setDateCreated($revision->getDateCreated()); $comments = array(); if (strlen($revision->getSummary())) { $summary_comment = clone $template; $summary_comment->setContent($revision->getSummary()); $summary_comment->setAction(DifferentialAction::ACTION_SUMMARIZE); $comments[] = $summary_comment; } if (strlen($revision->getTestPlan())) { $testplan_comment = clone $template; $testplan_comment->setContent($revision->getTestPlan()); $testplan_comment->setAction(DifferentialAction::ACTION_TESTPLAN); $comments[] = $testplan_comment; } return $comments; } private function getRevisionActions(DifferentialRevision $revision) { $user = $this->getRequest()->getUser(); $viewer_phid = $user->getPHID(); $viewer_is_owner = ($revision->getAuthorPHID() == $viewer_phid); $viewer_is_reviewer = in_array($viewer_phid, $revision->getReviewers()); $viewer_is_cc = in_array($viewer_phid, $revision->getCCPHIDs()); $viewer_is_anonymous = !$this->getRequest()->getUser()->isLoggedIn(); $status = $revision->getStatus(); $revision_id = $revision->getID(); $revision_phid = $revision->getPHID(); $links = array(); if ($viewer_is_owner) { $links[] = array( 'icon' => 'edit', 'href' => "/differential/revision/edit/{$revision_id}/", 'name' => pht('Edit Revision'), ); } if (!$viewer_is_anonymous) { if (!$viewer_is_owner && !$viewer_is_reviewer) { $action = $viewer_is_cc ? 'rem' : 'add'; $links[] = array( 'icon' => $viewer_is_cc ? 'subscribe-delete' : 'subscribe-add', 'href' => "/differential/subscribe/{$action}/{$revision_id}/", 'name' => $viewer_is_cc ? pht('Unsubscribe') : pht('Subscribe'), 'instant' => true, 'sigil' => 'workflow', ); } else { $links[] = array( 'icon' => 'subscribe-auto', 'name' => pht('Automatically Subscribed'), 'disabled' => true, ); } require_celerity_resource('phabricator-object-selector-css'); require_celerity_resource('javelin-behavior-phabricator-object-selector'); $links[] = array( 'icon' => 'link', 'name' => pht('Edit Dependencies'), 'href' => "/search/attach/{$revision_phid}/DREV/dependencies/", 'sigil' => 'workflow', ); if (PhabricatorEnv::getEnvConfig('maniphest.enabled')) { $links[] = array( 'icon' => 'attach', 'name' => pht('Edit Maniphest Tasks'), 'href' => "/search/attach/{$revision_phid}/TASK/", 'sigil' => 'workflow', ); } if ($user->getIsAdmin()) { $links[] = array( 'icon' => 'file', 'name' => pht('MetaMTA Transcripts'), 'href' => "/mail/?phid={$revision_phid}", ); } $links[] = array( 'icon' => 'file', 'name' => pht('Herald Transcripts'), 'href' => "/herald/transcript/?phid={$revision_phid}", ); } $request_uri = $this->getRequest()->getRequestURI(); $links[] = array( 'icon' => 'download', 'name' => pht('Download Raw Diff'), 'href' => $request_uri->alter('download', 'true') ); return $links; } private function getRevisionCommentActions(DifferentialRevision $revision) { $actions = array( DifferentialAction::ACTION_COMMENT => true, ); $viewer = $this->getRequest()->getUser(); $viewer_phid = $viewer->getPHID(); $viewer_is_owner = ($viewer_phid == $revision->getAuthorPHID()); $viewer_is_reviewer = in_array($viewer_phid, $revision->getReviewers()); $viewer_did_accept = ($viewer_phid === $revision->loadReviewedBy()); $status = $revision->getStatus(); $allow_self_accept = PhabricatorEnv::getEnvConfig( 'differential.allow-self-accept'); $always_allow_close = PhabricatorEnv::getEnvConfig( 'differential.always-allow-close'); $allow_reopen = PhabricatorEnv::getEnvConfig( 'differential.allow-reopen'); if ($viewer_is_owner) { switch ($status) { case ArcanistDifferentialRevisionStatus::NEEDS_REVIEW: $actions[DifferentialAction::ACTION_ACCEPT] = $allow_self_accept; $actions[DifferentialAction::ACTION_ABANDON] = true; $actions[DifferentialAction::ACTION_RETHINK] = true; break; case ArcanistDifferentialRevisionStatus::NEEDS_REVISION: $actions[DifferentialAction::ACTION_ACCEPT] = $allow_self_accept; $actions[DifferentialAction::ACTION_ABANDON] = true; $actions[DifferentialAction::ACTION_REQUEST] = true; break; case ArcanistDifferentialRevisionStatus::ACCEPTED: $actions[DifferentialAction::ACTION_ABANDON] = true; $actions[DifferentialAction::ACTION_REQUEST] = true; $actions[DifferentialAction::ACTION_RETHINK] = true; $actions[DifferentialAction::ACTION_CLOSE] = true; break; case ArcanistDifferentialRevisionStatus::CLOSED: break; case ArcanistDifferentialRevisionStatus::ABANDONED: $actions[DifferentialAction::ACTION_RECLAIM] = true; break; } } else { switch ($status) { case ArcanistDifferentialRevisionStatus::NEEDS_REVIEW: $actions[DifferentialAction::ACTION_ACCEPT] = true; $actions[DifferentialAction::ACTION_REJECT] = true; $actions[DifferentialAction::ACTION_RESIGN] = $viewer_is_reviewer; break; case ArcanistDifferentialRevisionStatus::NEEDS_REVISION: $actions[DifferentialAction::ACTION_ACCEPT] = true; $actions[DifferentialAction::ACTION_RESIGN] = $viewer_is_reviewer; break; case ArcanistDifferentialRevisionStatus::ACCEPTED: $actions[DifferentialAction::ACTION_REJECT] = true; $actions[DifferentialAction::ACTION_RESIGN] = $viewer_is_reviewer && !$viewer_did_accept; break; case ArcanistDifferentialRevisionStatus::CLOSED: case ArcanistDifferentialRevisionStatus::ABANDONED: break; } if ($status != ArcanistDifferentialRevisionStatus::CLOSED) { $actions[DifferentialAction::ACTION_CLAIM] = true; $actions[DifferentialAction::ACTION_CLOSE] = $always_allow_close; } } $actions[DifferentialAction::ACTION_ADDREVIEWERS] = true; $actions[DifferentialAction::ACTION_ADDCCS] = true; $actions[DifferentialAction::ACTION_REOPEN] = $allow_reopen && ($status == ArcanistDifferentialRevisionStatus::CLOSED); $actions = array_keys(array_filter($actions)); $actions_dict = array(); foreach ($actions as $action) { $actions_dict[$action] = DifferentialAction::getActionVerb($action); } return $actions_dict; } private function loadInlineComments(array $comments, array &$changesets) { assert_instances_of($comments, 'DifferentialComment'); assert_instances_of($changesets, 'DifferentialChangeset'); $inline_comments = array(); $comment_ids = array_filter(mpull($comments, 'getID')); if (!$comment_ids) { return $inline_comments; } $inline_comments = id(new DifferentialInlineComment()) ->loadAllWhere( 'commentID in (%Ld)', $comment_ids); $load_changesets = array(); foreach ($inline_comments as $inline) { $changeset_id = $inline->getChangesetID(); if (isset($changesets[$changeset_id])) { continue; } $load_changesets[$changeset_id] = true; } $more_changesets = array(); if ($load_changesets) { $changeset_ids = array_keys($load_changesets); $more_changesets += id(new DifferentialChangeset()) ->loadAllWhere( 'id IN (%Ld)', $changeset_ids); } if ($more_changesets) { $changesets += $more_changesets; $changesets = msort($changesets, 'getSortKey'); } return $inline_comments; } private function loadChangesetsAndVsMap( DifferentialDiff $target, DifferentialDiff $diff_vs = null, PhabricatorRepository $repository = null) { $load_ids = array(); if ($diff_vs) { $load_ids[] = $diff_vs->getID(); } $load_ids[] = $target->getID(); $raw_changesets = id(new DifferentialChangeset()) ->loadAllWhere( 'diffID IN (%Ld)', $load_ids); $changeset_groups = mgroup($raw_changesets, 'getDiffID'); $changesets = idx($changeset_groups, $target->getID(), array()); $changesets = mpull($changesets, null, 'getID'); $refs = array(); $vs_map = array(); $vs_changesets = array(); if ($diff_vs) { $vs_id = $diff_vs->getID(); $vs_changesets_path_map = array(); foreach (idx($changeset_groups, $vs_id, array()) as $changeset) { $path = $changeset->getAbsoluteRepositoryPath($repository, $diff_vs); $vs_changesets_path_map[$path] = $changeset; $vs_changesets[$changeset->getID()] = $changeset; } foreach ($changesets as $key => $changeset) { $path = $changeset->getAbsoluteRepositoryPath($repository, $target); if (isset($vs_changesets_path_map[$path])) { $vs_map[$changeset->getID()] = $vs_changesets_path_map[$path]->getID(); $refs[$changeset->getID()] = $changeset->getID().'/'.$vs_changesets_path_map[$path]->getID(); unset($vs_changesets_path_map[$path]); } else { $refs[$changeset->getID()] = $changeset->getID(); } } foreach ($vs_changesets_path_map as $path => $changeset) { $changesets[$changeset->getID()] = $changeset; $vs_map[$changeset->getID()] = -1; $refs[$changeset->getID()] = $changeset->getID().'/-1'; } } else { foreach ($changesets as $changeset) { $refs[$changeset->getID()] = $changeset->getID(); } } $changesets = msort($changesets, 'getSortKey'); return array($changesets, $vs_map, $vs_changesets, $refs); } private function loadAuxiliaryFields(DifferentialRevision $revision) { $aux_fields = DifferentialFieldSelector::newSelector() ->getFieldSpecifications(); foreach ($aux_fields as $key => $aux_field) { if (!$aux_field->shouldAppearOnRevisionView()) { unset($aux_fields[$key]); } else { $aux_field->setUser($this->getRequest()->getUser()); } } $aux_fields = DifferentialAuxiliaryField::loadFromStorage( $revision, $aux_fields); return $aux_fields; } private function buildSymbolIndexes( PhabricatorRepositoryArcanistProject $arc_project, array $visible_changesets) { assert_instances_of($visible_changesets, 'DifferentialChangeset'); $engine = PhabricatorSyntaxHighlighter::newEngine(); $langs = $arc_project->getSymbolIndexLanguages(); if (!$langs) { return array(array(), array()); } $symbol_indexes = array(); $project_phids = array_merge( array($arc_project->getPHID()), nonempty($arc_project->getSymbolIndexProjects(), array())); $indexed_langs = array_fill_keys($langs, true); foreach ($visible_changesets as $key => $changeset) { $lang = $engine->getLanguageFromFilename($changeset->getFilename()); if (isset($indexed_langs[$lang])) { $symbol_indexes[$key] = array( 'lang' => $lang, 'projects' => $project_phids, ); } } return array($symbol_indexes, $project_phids); } private function loadOtherRevisions( array $changesets, DifferentialDiff $target, PhabricatorRepository $repository) { assert_instances_of($changesets, 'DifferentialChangeset'); $paths = array(); foreach ($changesets as $changeset) { $paths[] = $changeset->getAbsoluteRepositoryPath( $repository, $target); } if (!$paths) { return array(); } $path_map = id(new DiffusionPathIDQuery($paths))->loadPathIDs(); if (!$path_map) { return array(); } $query = id(new DifferentialRevisionQuery()) ->withStatus(DifferentialRevisionQuery::STATUS_OPEN) ->setOrder(DifferentialRevisionQuery::ORDER_PATH_MODIFIED) ->setLimit(10) ->needRelationships(true); foreach ($path_map as $path => $path_id) { $query->withPath($repository->getID(), $path_id); } $results = $query->execute(); // Strip out *this* revision. foreach ($results as $key => $result) { if ($result->getID() == $this->revisionID) { unset($results[$key]); } } return $results; } private function renderOtherRevisions(array $revisions) { assert_instances_of($revisions, 'DifferentialRevision'); $view = id(new DifferentialRevisionListView()) ->setRevisions($revisions) ->setFields(DifferentialRevisionListView::getDefaultFields()) ->setUser($this->getRequest()->getUser()) ->loadAssets(); $phids = $view->getRequiredHandlePHIDs(); $handles = $this->loadViewerHandles($phids); $view->setHandles($handles); return id(new PhabricatorHeaderView()) ->setHeader(pht('Open Revisions Affecting These Files')) ->render(). '

'. $view->render(). '
'; } /** * Straight copy of the loadFileByPhid method in * @{class:DifferentialReviewRequestMail}. * * This is because of the code similarity between the buildPatch method in * @{class:DifferentialReviewRequestMail} and @{method:buildRawDiffResponse} * in this class. Both of these methods end up using call_user_func and this * piece of code is the lucky function. * * @return mixed (@{class:PhabricatorFile} if found, null if not) */ public function loadFileByPHID($phid) { $file = id(new PhabricatorFile())->loadOneWhere( 'phid = %s', $phid); if (!$file) { return null; } return $file->loadFileData(); } /** * Note this code is somewhat similar to the buildPatch method in * @{class:DifferentialReviewRequestMail}. * * @return @{class:AphrontRedirectResponse} */ private function buildRawDiffResponse( array $changesets, array $vs_changesets, array $vs_map, PhabricatorRepository $repository = null) { assert_instances_of($changesets, 'DifferentialChangeset'); assert_instances_of($vs_changesets, 'DifferentialChangeset'); $engine = new PhabricatorDifferenceEngine(); $generated_changesets = array(); foreach ($changesets as $changeset) { $changeset->attachHunks($changeset->loadHunks()); $right = $changeset->makeNewFile(); $choice = $changeset; $vs = idx($vs_map, $changeset->getID()); if ($vs == -1) { $left = $right; $right = $changeset->makeOldFile(); } else if ($vs) { $choice = $vs_changeset = $vs_changesets[$vs]; $vs_changeset->attachHunks($vs_changeset->loadHunks()); $left = $vs_changeset->makeNewFile(); } else { $left = $changeset->makeOldFile(); } $synthetic = $engine->generateChangesetFromFileContent( $left, $right); if (!$synthetic->getAffectedLineCount()) { $filetype = $choice->getFileType(); if ($filetype == DifferentialChangeType::FILE_TEXT || $filetype == DifferentialChangeType::FILE_SYMLINK) { continue; } } $choice->attachHunks($synthetic->getHunks()); $generated_changesets[] = $choice; } $diff = new DifferentialDiff(); $diff->attachChangesets($generated_changesets); $diff_dict = $diff->getDiffDict(); $changes = array(); foreach ($diff_dict['changes'] as $changedict) { $changes[] = ArcanistDiffChange::newFromDictionary($changedict); } $bundle = ArcanistBundle::newFromChanges($changes); $bundle->setLoadFileDataCallback(array($this, 'loadFileByPHID')); $vcs = $repository ? $repository->getVersionControlSystem() : null; switch ($vcs) { case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT: case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL: $raw_diff = $bundle->toGitPatch(); break; case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN: default: $raw_diff = $bundle->toUnifiedDiff(); break; } $request_uri = $this->getRequest()->getRequestURI(); // this ends up being something like // D123.diff // or the verbose // D123.vs123.id123.whitespaceignore-all.diff // lame but nice to include these options $file_name = ltrim($request_uri->getPath(), '/').'.'; foreach ($request_uri->getQueryParams() as $key => $value) { if ($key == 'download') { continue; } $file_name .= $key.$value.'.'; } $file_name .= 'diff'; $file = PhabricatorFile::buildFromFileDataOrHash( $raw_diff, array( 'name' => $file_name, )); return id(new AphrontRedirectResponse())->setURI($file->getBestURI()); } } diff --git a/src/applications/differential/field/specification/DifferentialBlameRevisionFieldSpecification.php b/src/applications/differential/field/specification/DifferentialBlameRevisionFieldSpecification.php index 0c4bb8c366..11f7b5cf19 100644 --- a/src/applications/differential/field/specification/DifferentialBlameRevisionFieldSpecification.php +++ b/src/applications/differential/field/specification/DifferentialBlameRevisionFieldSpecification.php @@ -1,98 +1,99 @@ value; } public function setValueFromStorage($value) { $this->value = $value; return $this; } public function shouldAppearOnEdit() { return true; } public function setValueFromRequest(AphrontRequest $request) { $this->value = $request->getStr($this->getStorageKey()); return $this; } public function renderEditControl() { return id(new AphrontFormTextControl()) - ->setLabel('Blame Revision') - ->setCaption('Revision which broke the stuff which this change fixes.') + ->setLabel(pht('Blame Revision')) + ->setCaption( + pht('Revision which broke the stuff which this change fixes.')) ->setName($this->getStorageKey()) ->setValue($this->value); } public function shouldAppearOnRevisionView() { return true; } public function renderLabelForRevisionView() { - return 'Blame Revision:'; + return pht('Blame Revision:'); } public function renderValueForRevisionView() { if (!$this->value) { return null; } $engine = PhabricatorMarkupEngine::newDifferentialMarkupEngine(); return phutil_safe_html($engine->markupText($this->value)); } public function shouldAppearOnConduitView() { return true; } public function getValueForConduit() { return $this->value; } public function shouldAppearOnCommitMessage() { return true; } public function getCommitMessageKey() { return 'blameRevision'; } public function setValueFromParsedCommitMessage($value) { $this->value = $value; return $this; } public function shouldOverwriteWhenCommitMessageIsEdited() { return true; } public function renderLabelForCommitMessage() { return 'Blame Revision'; } public function renderValueForCommitMessage($is_edit) { return $this->value; } public function getSupportedCommitMessageLabels() { return array( 'Blame Revision', 'Blame Rev', ); } public function parseValueFromCommitMessage($value) { return $value; } } diff --git a/src/applications/feed/application/PhabricatorApplicationFeed.php b/src/applications/feed/application/PhabricatorApplicationFeed.php index 2c089ac344..d1c0e0cf3e 100644 --- a/src/applications/feed/application/PhabricatorApplicationFeed.php +++ b/src/applications/feed/application/PhabricatorApplicationFeed.php @@ -1,31 +1,35 @@ array( 'public/' => 'PhabricatorFeedPublicStreamController', '(?:(?P[^/]+)/)?' => 'PhabricatorFeedMainController', ), ); } public function getApplicationGroup() { return self::GROUP_COMMUNICATION; } } diff --git a/src/applications/files/PhabricatorImageTransformer.php b/src/applications/files/PhabricatorImageTransformer.php index 4f0f86edee..173b92b6c9 100644 --- a/src/applications/files/PhabricatorImageTransformer.php +++ b/src/applications/files/PhabricatorImageTransformer.php @@ -1,273 +1,273 @@ applyMemeTo($file, $upper_text, $lower_text); return PhabricatorFile::newFromFileData( $image, array( 'name' => 'meme-'.$file->getName(), )); } public function executeThumbTransform( PhabricatorFile $file, $x, $y) { $image = $this->crudelyScaleTo($file, $x, $y); return PhabricatorFile::newFromFileData( $image, array( 'name' => 'thumb-'.$file->getName(), )); } public function executeProfileTransform( PhabricatorFile $file, $x, $min_y, $max_y) { $image = $this->crudelyCropTo($file, $x, $min_y, $max_y); return PhabricatorFile::newFromFileData( $image, array( 'name' => 'profile-'.$file->getName(), )); } public function executePreviewTransform( PhabricatorFile $file, $size) { $image = $this->generatePreview($file, $size); return PhabricatorFile::newFromFileData( $image, array( 'name' => 'preview-'.$file->getName(), )); } private function crudelyCropTo(PhabricatorFile $file, $x, $min_y, $max_y) { $data = $file->loadFileData(); $img = imagecreatefromstring($data); $sx = imagesx($img); $sy = imagesy($img); $scaled_y = ($x / $sx) * $sy; if ($scaled_y > $max_y) { // This image is very tall and thin. $scaled_y = $max_y; } else if ($scaled_y < $min_y) { // This image is very short and wide. $scaled_y = $min_y; } $img = $this->applyScaleTo( $img, $x, $scaled_y); return $this->saveImageDataInAnyFormat($img, $file->getMimeType()); } /** * Very crudely scale an image up or down to an exact size. */ private function crudelyScaleTo(PhabricatorFile $file, $dx, $dy) { $data = $file->loadFileData(); $src = imagecreatefromstring($data); $dst = $this->applyScaleTo($src, $dx, $dy); return $this->saveImageDataInAnyFormat($dst, $file->getMimeType()); } private function applyScaleTo($src, $dx, $dy) { $x = imagesx($src); $y = imagesy($src); $scale = min(($dx / $x), ($dy / $y), 1); $dst = imagecreatetruecolor($dx, $dy); imagesavealpha($dst, true); imagefill($dst, 0, 0, imagecolorallocatealpha($dst, 255, 255, 255, 127)); $sdx = $scale * $x; $sdy = $scale * $y; imagecopyresampled( $dst, $src, ($dx - $sdx) / 2, ($dy - $sdy) / 2, 0, 0, $sdx, $sdy, $x, $y); return $dst; } private function generatePreview(PhabricatorFile $file, $size) { $data = $file->loadFileData(); $src = imagecreatefromstring($data); $x = imagesx($src); $y = imagesy($src); $scale = min($size / $x, $size / $y, 1); $dx = max($size / 4, $scale * $x); $dy = max($size / 4, $scale * $y); $dst = imagecreatetruecolor($dx, $dy); imagesavealpha($dst, true); imagefill($dst, 0, 0, imagecolorallocatealpha($dst, 255, 255, 255, 127)); $sdx = $scale * $x; $sdy = $scale * $y; imagecopyresampled( $dst, $src, ($dx - $sdx) / 2, ($dy - $sdy) / 2, 0, 0, $sdx, $sdy, $x, $y); return $this->saveImageDataInAnyFormat($dst, $file->getMimeType()); } private function applyMemeTo( PhabricatorFile $file, $upper_text, $lower_text) { $data = $file->loadFileData(); $img = imagecreatefromstring($data); $phabricator_root = dirname(phutil_get_library_root('phabricator')); $font_path = $phabricator_root.'/resources/font/tuffy.ttf'; $white = imagecolorallocate($img, 255, 255, 255); $black = imagecolorallocate($img, 0, 0, 0); $border_width = 3; $font_max = 200; $font_min = 5; for ($i = $font_max; $i > $font_min; $i--) { $fit = $this->doesTextBoundingBoxFitInImage( $img, $upper_text, $i, $font_path); if ($fit['doesfit']) { $x = ($fit['imgwidth'] - $fit['txtwidth']) / 2; $y = $fit['txtheight'] + 10; $this->makeImageWithTextBorder($img, $i, $x, $y, $white, $black, $border_width, $font_path, $upper_text); break; } } for ($i = $font_max; $i > $font_min; $i--) { $fit = $this->doesTextBoundingBoxFitInImage($img, $lower_text, $i, $font_path); if ($fit['doesfit']) { $x = ($fit['imgwidth'] - $fit['txtwidth']) / 2; $y = $fit['imgheight'] - 10; $this->makeImageWithTextBorder( $img, $i, $x, $y, $white, $black, $border_width, $font_path, $lower_text); break; } } return $this->saveImageDataInAnyFormat($img, $file->getMimeType()); } private function makeImageWithTextBorder($img, $font_size, $x, $y, $color, $stroke_color, $bw, $font, $text) { $angle = 0; $bw = abs($bw); for ($c1 = $x - $bw; $c1 <= $x + $bw; $c1++) { for ($c2 = $y - $bw; $c2 <= $y + $bw; $c2++) { if (!(($c1 == $x - $bw || $x + $bw) && $c2 == $y - $bw || $c2 == $y + $bw)) { $bg = imagettftext($img, $font_size, $angle, $c1, $c2, $stroke_color, $font, $text); } } } imagettftext($img, $font_size, $angle, $x , $y, $color , $font, $text); } private function doesTextBoundingBoxFitInImage($img, $text, $font_size, $font_path) { // Default Angle = 0 $angle = 0; $bbox = imagettfbbox($font_size, $angle, $font_path, $text); $text_height = abs($bbox[3] - $bbox[5]); $text_width = abs($bbox[0] - $bbox[2]); return array( - "doesfit" => ($text_height * 1.05 <= imagesy($img) + "doesfit" => ($text_height * 1.05 <= imagesy($img) / 2 && $text_width * 1.05 <= imagesx($img)), "txtwidth" => $text_width, "txtheight" => $text_height, "imgwidth" => imagesx($img), "imgheight" => imagesy($img), ); } private function saveImageDataInAnyFormat($data, $preferred_mime = '') { switch ($preferred_mime) { case 'image/gif': // GIF doesn't support true color. case 'image/png': if (function_exists('imagepng')) { ob_start(); imagepng($data); return ob_get_clean(); } break; } $img = null; if (function_exists('imagejpeg')) { ob_start(); imagejpeg($data); $img = ob_get_clean(); } else if (function_exists('imagepng')) { ob_start(); imagepng($data); $img = ob_get_clean(); } else if (function_exists('imagegif')) { ob_start(); imagegif($data); $img = ob_get_clean(); } else { throw new Exception("No image generation functions exist!"); } return $img; } } diff --git a/src/applications/files/application/PhabricatorApplicationFiles.php b/src/applications/files/application/PhabricatorApplicationFiles.php index 9c8491a4ca..2d79ac1003 100644 --- a/src/applications/files/application/PhabricatorApplicationFiles.php +++ b/src/applications/files/application/PhabricatorApplicationFiles.php @@ -1,52 +1,56 @@ getBaseURI().'upload/'; } + public function canUninstall() { + return false; + } + public function getRoutes() { return array( '/F(?P[1-9]\d*)' => 'PhabricatorFileShortcutController', '/file/' => array( '' => 'PhabricatorFileListController', 'filter/(?P\w+)/' => 'PhabricatorFileListController', 'upload/' => 'PhabricatorFileUploadController', 'dropupload/' => 'PhabricatorFileDropUploadController', 'delete/(?P[1-9]\d*)/' => 'PhabricatorFileDeleteController', 'info/(?P[^/]+)/' => 'PhabricatorFileInfoController', 'data/(?P[^/]+)/(?P[^/]+)/.*' => 'PhabricatorFileDataController', 'proxy/' => 'PhabricatorFileProxyController', 'xform/(?P[^/]+)/(?P[^/]+)/(?P[^/]+)/' => 'PhabricatorFileTransformController', ), ); } } diff --git a/src/applications/meta/application/PhabricatorApplicationApplications.php b/src/applications/meta/application/PhabricatorApplicationApplications.php index 6139945b6f..58a50e4cbe 100644 --- a/src/applications/meta/application/PhabricatorApplicationApplications.php +++ b/src/applications/meta/application/PhabricatorApplicationApplications.php @@ -1,38 +1,43 @@ array( '' => 'PhabricatorApplicationsListController', 'view/(?P\w+)/' => 'PhabricatorApplicationDetailViewController', - + '(?P\w+)/(?Pinstall|uninstall)/' => + 'PhabricatorApplicationUninstallController', ), ); } } diff --git a/src/applications/meta/controller/PhabricatorApplicationDetailViewController.php b/src/applications/meta/controller/PhabricatorApplicationDetailViewController.php index db9cd66199..460dd6b0f1 100644 --- a/src/applications/meta/controller/PhabricatorApplicationDetailViewController.php +++ b/src/applications/meta/controller/PhabricatorApplicationDetailViewController.php @@ -1,77 +1,101 @@ application = $data['application']; } public function processRequest() { $request = $this->getRequest(); $user = $request->getUser(); $selected = null; - $applications = PhabricatorApplication::getAllInstalledApplications(); + $applications = PhabricatorApplication::getAllApplications(); foreach ($applications as $application) { if (get_class($application) == $this->application) { - $selected = $application; - break; + $selected = $application; + break; } } if (!$selected) { return new Aphront404Response(); } $title = $selected->getName(); $crumbs = $this->buildApplicationCrumbs(); $crumbs->addCrumb( id(new PhabricatorCrumbView()) ->setName(pht('Applications')) ->setHref($this->getApplicationURI())); - $properties = $this->buildPropertyView($selected); - $actions = $this->buildActionView($user); - - return $this->buildApplicationPage( - array( - $crumbs, - id(new PhabricatorHeaderView())->setHeader($title), - $actions, - $properties, - ), - array( - 'title' => $title, - 'device' => true, - )); + $properties = $this->buildPropertyView($selected); + $actions = $this->buildActionView($user, $selected); + + return $this->buildApplicationPage( + array( + $crumbs, + id(new PhabricatorHeaderView())->setHeader($title), + $actions, + $properties, + ), + array( + 'title' => $title, + 'device' => true, + )); } private function buildPropertyView(PhabricatorApplication $selected) { $properties = new PhabricatorPropertyListView(); - $properties->addProperty( - pht('Status'), pht('Installed')); + if ($selected->isInstalled()) { + $properties->addProperty( + pht('Status'), pht('Installed')); + + } else { + $properties->addProperty( + pht('Status'), pht('Uninstalled')); + } $properties->addProperty( pht('Description'), $selected->getShortDescription()); return $properties; } - private function buildActionView(PhabricatorUser $user) { - - return id(new PhabricatorActionListView()) - ->setUser($user) - ->addAction( - id(new PhabricatorActionView()) - ->setName(pht('Uninstall')) - ->setIcon('delete') - ); + private function buildActionView( + PhabricatorUser $user, PhabricatorApplication $selected) { + + if ($selected->canUninstall()) { + if ($selected->isInstalled()) { + + return id(new PhabricatorActionListView()) + ->setUser($user) + ->addAction( + id(new PhabricatorActionView()) + ->setName(pht('Uninstall')) + ->setIcon('delete') + ->setHref( + $this->getApplicationURI(get_class($selected).'/uninstall/')) + ); + } else { + return id(new PhabricatorActionListView()) + ->setUser($user) + ->addAction( + id(new PhabricatorActionView()) + ->setName(pht('Install')) + ->setIcon('new') + ->setHref( + $this->getApplicationURI(get_class($selected).'/install/')) + ); + } + } } } diff --git a/src/applications/meta/controller/PhabricatorApplicationUninstallController.php b/src/applications/meta/controller/PhabricatorApplicationUninstallController.php new file mode 100644 index 0000000000..7ba660d3cf --- /dev/null +++ b/src/applications/meta/controller/PhabricatorApplicationUninstallController.php @@ -0,0 +1,93 @@ +application = $data['application']; + $this->action = $data['action']; + } + + public function processRequest() { + $request = $this->getRequest(); + $user = $request->getUser(); + $app_name = substr($this->application, strlen('PhabricatorApplication')); + + if ($request->isDialogFormPost()) { + $this->manageApplication(); + return id(new AphrontRedirectResponse())->setURI('/applications/'); + } + + if ($this->action == 'install') { + + $dialog = id(new AphrontDialogView()) + ->setUser($user) + ->setTitle('Confirmation') + ->appendChild('Install '. $app_name. ' application ?') + ->addSubmitButton('Install') + ->addCancelButton('/applications/view/'.$this->application); + } else { + $dialog = id(new AphrontDialogView()) + ->setUser($user) + ->setTitle('Confirmation') + ->appendChild('Really Uninstall '. $app_name. ' application ?') + ->addSubmitButton('Uninstall') + ->addCancelButton('/applications/view/'.$this->application); + } + + return id(new AphrontDialogResponse())->setDialog($dialog); + } + + public function manageApplication() { + $key = 'phabricator.uninstalled-applications'; + + $config_entry = id(new PhabricatorConfigEntry()) + ->loadOneWhere( + 'configKey = %s AND namespace = %s', + $key, + 'default'); + + if (!$config_entry) { + $config_entry = id(new PhabricatorConfigEntry()) + ->setConfigKey($key) + ->setNamespace('default'); + } + + $list = $config_entry->getValue(); + + $uninstalled = PhabricatorEnv::getEnvConfig($key); + + if ($uninstalled[$this->application]) { + unset($list[$this->application]); + } else { + $list[$this->application] = true; + } + + $xaction = id(new PhabricatorConfigTransaction()) + ->setTransactionType(PhabricatorConfigTransaction::TYPE_EDIT) + ->setNewValue( + array( + 'deleted' => false, + 'value' => $list + )); + + $editor = id(new PhabricatorConfigEditor()) + ->setActor($this->getRequest()->getUser()) + ->setContinueOnNoEffect(true) + ->setContentSource( + PhabricatorContentSource::newForSource( + PhabricatorContentSource::SOURCE_WEB, + array( + 'ip' => $this->getRequest()->getRemoteAddr(), + ))); + + + $editor->applyTransactions($config_entry, array($xaction)); + + } + +} + diff --git a/src/applications/meta/controller/PhabricatorApplicationsListController.php b/src/applications/meta/controller/PhabricatorApplicationsListController.php index 0b70056699..e3d1cfb8fb 100644 --- a/src/applications/meta/controller/PhabricatorApplicationsListController.php +++ b/src/applications/meta/controller/PhabricatorApplicationsListController.php @@ -1,60 +1,60 @@ getRequest(); $user = $request->getUser(); $nav = $this->buildSideNavView(); $nav->selectFilter('/'); - $applications = PhabricatorApplication::getAllInstalledApplications(); + $applications = PhabricatorApplication::getAllApplications(); $list = $this->buildInstalledApplicationsList($applications); $title = pht('Installed Applications'); $header = id(new PhabricatorHeaderView()) ->setHeader($title); $nav->appendChild( array( $header, $list )); $crumbs = $this ->buildApplicationCrumbs() ->addCrumb( id(new PhabricatorCrumbView()) ->setName(pht('Applications')) ->setHref($this->getApplicationURI())); $nav->setCrumbs($crumbs); return $this->buildApplicationPage( $nav, array( 'title' => $title, 'device' => true, ) ); } private function buildInstalledApplicationsList(array $applications) { $list = new PhabricatorObjectItemListView(); foreach ($applications as $application) { $item = id(new PhabricatorObjectItemView()) ->setHeader($application->getName()) ->setHref('/applications/view/'.get_class($application).'/') ->addAttribute($application->getShortDescription()); $list->addItem($item); } return $list; } } diff --git a/src/applications/metamta/application/PhabricatorApplicationMetaMTA.php b/src/applications/metamta/application/PhabricatorApplicationMetaMTA.php index 9c8acf9863..0ac2afd146 100644 --- a/src/applications/metamta/application/PhabricatorApplicationMetaMTA.php +++ b/src/applications/metamta/application/PhabricatorApplicationMetaMTA.php @@ -1,42 +1,46 @@ getBaseURI() => array( '' => 'PhabricatorMetaMTAListController', 'send/' => 'PhabricatorMetaMTASendController', 'view/(?P[1-9]\d*)/' => 'PhabricatorMetaMTAViewController', 'receive/' => 'PhabricatorMetaMTAReceiveController', 'received/' => 'PhabricatorMetaMTAReceivedListController', 'sendgrid/' => 'PhabricatorMetaMTASendGridReceiveController', ), ); } public function getTitleGlyph() { return '@'; } } diff --git a/src/applications/metamta/controller/PhabricatorMetaMTAController.php b/src/applications/metamta/controller/PhabricatorMetaMTAController.php index 1978cdaa1a..48acdf86ce 100644 --- a/src/applications/metamta/controller/PhabricatorMetaMTAController.php +++ b/src/applications/metamta/controller/PhabricatorMetaMTAController.php @@ -1,26 +1,26 @@ setBaseURI(new PhutilURI($this->getApplicationURI())); - $nav->addLabel('Mail Logs'); - $nav->addFilter('sent', 'Sent Mail', $this->getApplicationURI()); - $nav->addFilter('received', 'Received Mail'); + $nav->addLabel(pht('Mail Logs')); + $nav->addFilter('sent', pht('Sent Mail'), $this->getApplicationURI()); + $nav->addFilter('received', pht('Received Mail')); if ($this->getRequest()->getUser()->getIsAdmin()) { - $nav->addLabel('Diagnostics'); - $nav->addFilter('send', 'Send Test'); - $nav->addFilter('receive', 'Receive Test'); + $nav->addLabel(pht('Diagnostics')); + $nav->addFilter('send', pht('Send Test')); + $nav->addFilter('receive', pht('Receive Test')); } return $nav; } } diff --git a/src/applications/metamta/controller/PhabricatorMetaMTAListController.php b/src/applications/metamta/controller/PhabricatorMetaMTAListController.php index 5e419987c4..eca61ceaf9 100644 --- a/src/applications/metamta/controller/PhabricatorMetaMTAListController.php +++ b/src/applications/metamta/controller/PhabricatorMetaMTAListController.php @@ -1,119 +1,121 @@ getRequest(); $user = $request->getUser(); $offset = $request->getInt('offset', 0); $related_phid = $request->getStr('phid'); $status = $request->getStr('status'); $pager = new AphrontPagerView(); $pager->setOffset($offset); $pager->setURI($request->getRequestURI(), 'offset'); $mail = new PhabricatorMetaMTAMail(); $conn_r = $mail->establishConnection('r'); $wheres = array(); if ($status) { $wheres[] = qsprintf( $conn_r, 'status = %s', $status); } if ($related_phid) { $wheres[] = qsprintf( $conn_r, 'relatedPHID = %s', $related_phid); } if (count($wheres)) { $where_clause = 'WHERE '.implode($wheres, ' AND '); } else { $where_clause = 'WHERE 1 = 1'; } $data = queryfx_all( $conn_r, 'SELECT * FROM %T %Q ORDER BY id DESC LIMIT %d, %d', $mail->getTableName(), $where_clause, $pager->getOffset(), $pager->getPageSize() + 1); $data = $pager->sliceResults($data); $mails = $mail->loadAllFromArray($data); // Render the details table. $rows = array(); foreach ($mails as $mail) { $next_retry = $mail->getNextRetry() - time(); if ($next_retry <= 0) { $next_retry = "None"; } else { $next_retry = phabricator_format_relative_time_detailed($next_retry); } $rows[] = array( PhabricatorMetaMTAMail::getReadableStatus($mail->getStatus()), $mail->getRetryCount(), $next_retry, phabricator_datetime($mail->getDateCreated(), $user), phabricator_format_relative_time_detailed( time() - $mail->getDateModified()), phutil_escape_html($mail->getSubject()), phutil_tag( 'a', array( 'class' => 'button small grey', 'href' => $this->getApplicationURI('/view/'.$mail->getID().'/'), ), - 'View'), + pht('View')), ); } $table = new AphrontTableView($rows); $table->setHeaders( array( - 'Status', - 'Retry', - 'Next', - 'Created', - 'Updated', - 'Subject', + pht('Status'), + pht('Retry'), + pht('Next'), + pht('Created'), + pht('Updated'), + pht('Subject'), '', )); $table->setColumnClasses( array( null, null, null, null, null, 'wide', 'action', )); // Render the whole page. $panel = new AphrontPanelView(); $panel->appendChild($table); - $panel->setHeader('MetaMTA Messages'); + $panel->setHeader(pht('MetaMTA Messages')); $panel->appendChild($pager); + $panel->setNoBackground(); $nav = $this->buildSideNavView(); $nav->selectFilter('sent'); $nav->appendChild($panel); return $this->buildApplicationPage( $nav, array( - 'title' => 'Sent Mail', + 'title' => pht('Sent Mail'), + 'device' => true, )); } } diff --git a/src/applications/metamta/controller/PhabricatorMetaMTAReceiveController.php b/src/applications/metamta/controller/PhabricatorMetaMTAReceiveController.php index 2ae211e2ad..2d4591408c 100644 --- a/src/applications/metamta/controller/PhabricatorMetaMTAReceiveController.php +++ b/src/applications/metamta/controller/PhabricatorMetaMTAReceiveController.php @@ -1,84 +1,86 @@ getRequest(); $user = $request->getUser(); if ($request->isFormPost()) { $receiver = PhabricatorMetaMTAReceivedMail::loadReceiverObject( $request->getStr('obj')); if (!$receiver) { - throw new Exception("No such task or revision!"); + throw new Exception(pht("No such task or revision!")); } $hash = PhabricatorMetaMTAReceivedMail::computeMailHash( $receiver->getMailKey(), $user->getPHID()); $received = new PhabricatorMetaMTAReceivedMail(); $received->setHeaders( array( 'to' => $request->getStr('obj').'+'.$user->getID().'+'.$hash.'@', )); $received->setBodies( array( 'text' => $request->getStr('body'), )); // Make up some unique value, since this column isn't nullable. $received->setMessageIDHash( PhabricatorHash::digestForIndex( Filesystem::readRandomBytes(12))); $received->save(); $received->processReceivedMail(); $phid = $receiver->getPHID(); $handles = $this->loadViewerHandles(array($phid)); $uri = $handles[$phid]->getURI(); return id(new AphrontRedirectResponse())->setURI($uri); } $form = new AphrontFormView(); $form->setUser($request->getUser()); $form->setAction($this->getApplicationURI('/receive/')); $form ->appendChild( - '

This form will simulate '. - 'sending mail to an object.

') + '

'. + pht('This form will simulate sending mail to an object.'). + '

') ->appendChild( id(new AphrontFormTextControl()) - ->setLabel('To') + ->setLabel(pht('To')) ->setName('obj') - ->setCaption('e.g. D1234 or T1234')) + ->setCaption(pht('e.g. D1234 or T1234'))) ->appendChild( id(new AphrontFormTextAreaControl()) - ->setLabel('Body') + ->setLabel(pht('Body')) ->setName('body')) ->appendChild( id(new AphrontFormSubmitControl()) - ->setValue('Receive Mail')); + ->setValue(pht('Receive Mail'))); $panel = new AphrontPanelView(); - $panel->setHeader('Receive Email'); + $panel->setHeader(pht('Receive Email')); $panel->appendChild($form); - $panel->setWidth(AphrontPanelView::WIDTH_FORM); + $panel->setNoBackground(); $nav = $this->buildSideNavView(); $nav->selectFilter('receive'); $nav->appendChild($panel); return $this->buildApplicationPage( $nav, array( - 'title' => 'Receive Test', + 'title' => pht('Receive Test'), + 'device' => true, )); } } diff --git a/src/applications/metamta/controller/PhabricatorMetaMTAReceivedListController.php b/src/applications/metamta/controller/PhabricatorMetaMTAReceivedListController.php index 926bfb0be4..d55f4b7174 100644 --- a/src/applications/metamta/controller/PhabricatorMetaMTAReceivedListController.php +++ b/src/applications/metamta/controller/PhabricatorMetaMTAReceivedListController.php @@ -1,80 +1,82 @@ getRequest(); $user = $request->getUser(); $pager = new AphrontPagerView(); $pager->setOffset($request->getInt('page')); $pager->setURI($request->getRequestURI(), 'page'); $mails = id(new PhabricatorMetaMTAReceivedMail())->loadAllWhere( '1 = 1 ORDER BY id DESC LIMIT %d, %d', $pager->getOffset(), $pager->getPageSize() + 1); $mails = $pager->sliceResults($mails); $phids = array_merge( mpull($mails, 'getAuthorPHID'), mpull($mails, 'getRelatedPHID') ); $phids = array_unique(array_filter($phids)); $handles = $this->loadViewerHandles($phids); $rows = array(); foreach ($mails as $mail) { $rows[] = array( $mail->getID(), phabricator_date($mail->getDateCreated(), $user), phabricator_time($mail->getDateCreated(), $user), $mail->getAuthorPHID() ? $handles[$mail->getAuthorPHID()]->renderLink() : '-', $mail->getRelatedPHID() ? $handles[$mail->getRelatedPHID()]->renderLink() : '-', phutil_escape_html($mail->getMessage()), ); } $table = new AphrontTableView($rows); $table->setHeaders( array( - 'ID', - 'Date', - 'Time', - 'Author', - 'Object', - 'Message', + pht('ID'), + pht('Date'), + pht('Time'), + pht('Author'), + pht('Object'), + pht('Message'), )); $table->setColumnClasses( array( null, null, 'right', null, null, 'wide', )); $panel = new AphrontPanelView(); - $panel->setHeader('Received Mail'); + $panel->setHeader(pht('Received Mail')); $panel->appendChild($table); $panel->appendChild($pager); + $panel->setNoBackground(); $nav = $this->buildSideNavView(); $nav->selectFilter('received'); $nav->appendChild($panel); return $this->buildApplicationPage( $nav, array( - 'title' => 'Received Mail', + 'title' => pht('Received Mail'), + 'device' => true, )); } } diff --git a/src/applications/metamta/controller/PhabricatorMetaMTASendController.php b/src/applications/metamta/controller/PhabricatorMetaMTASendController.php index bf1917e430..3c1d6a6a99 100644 --- a/src/applications/metamta/controller/PhabricatorMetaMTASendController.php +++ b/src/applications/metamta/controller/PhabricatorMetaMTASendController.php @@ -1,172 +1,174 @@ getRequest(); if ($request->isFormPost()) { $mail = new PhabricatorMetaMTAMail(); $mail->addTos($request->getArr('to')); $mail->addCCs($request->getArr('cc')); $mail->setSubject($request->getStr('subject')); $mail->setBody($request->getStr('body')); $files = $request->getArr('files'); if ($files) { foreach ($files as $phid) { $file = id(new PhabricatorFile())->loadOneWhere('phid = %s', $phid); $mail->addAttachment(new PhabricatorMetaMTAAttachment( $file->loadFileData(), $file->getName(), $file->getMimeType() )); } } $mail->setFrom($request->getUser()->getPHID()); $mail->setSimulatedFailureCount($request->getInt('failures')); $mail->setIsHTML($request->getInt('html')); $mail->setIsBulk($request->getInt('bulk')); $mail->setMailTags($request->getStrList('mailtags')); $mail->save(); if ($request->getInt('immediately')) { $mail->sendNow(); } return id(new AphrontRedirectResponse()) ->setURI($this->getApplicationURI('/view/'.$mail->getID().'/')); } $failure_caption = - "Enter a number to simulate that many consecutive send failures before ". - "really attempting to deliver via the underlying MTA."; + pht("Enter a number to simulate that many consecutive send failures ". + "brefore really attempting to deliver via the underlying MTA."); $doclink_href = PhabricatorEnv::getDoclink( 'article/Configuring_Outbound_Email.html'); $doclink = phutil_tag( 'a', array( 'href' => $doclink_href, 'target' => '_blank', ), - 'Configuring Outbound Email'); + pht('Configuring Outbound Email')); $instructions = - '

This form will send a normal '. - 'email using the settings you have configured for Phabricator. For more '. - 'information, see '.$doclink.'.

'; + '

'. + pht('This form will send a normal email using the settings you have '. + 'configured for Phabricator. For more information, see %s.', $doclink). + '

'; $adapter = PhabricatorEnv::getEnvConfig('metamta.mail-adapter'); $warning = null; if ($adapter == 'PhabricatorMailImplementationTestAdapter') { $warning = new AphrontErrorView(); $warning->setTitle('Email is Disabled'); $warning->setSeverity(AphrontErrorView::SEVERITY_WARNING); $warning->appendChild( - '

This installation of Phabricator is currently set to use '. + '

'.pht('This installation of Phabricator is currently set to use '. 'PhabricatorMailImplementationTestAdapter to deliver '. 'outbound email. This completely disables outbound email! All '. 'outbound email will be thrown in a deep, dark hole until you '. - 'configure a real adapter.

'); + 'configure a real adapter.').'

'); } $phdlink_href = PhabricatorEnv::getDoclink( 'article/Managing_Daemons_with_phd.html'); $phdlink = phutil_tag( 'a', array( 'href' => $phdlink_href, 'target' => '_blank', ), '"phd start"'); $form = new AphrontFormView(); $form->setUser($request->getUser()); $form ->appendChild($instructions) ->appendChild( id(new AphrontFormStaticControl()) - ->setLabel('Adapter') + ->setLabel(pht('Adapter')) ->setValue($adapter)) ->appendChild( id(new AphrontFormTokenizerControl()) - ->setLabel('To') + ->setLabel(pht('To')) ->setName('to') ->setDatasource('/typeahead/common/mailable/')) ->appendChild( id(new AphrontFormTokenizerControl()) - ->setLabel('CC') + ->setLabel(pht('CC')) ->setName('cc') ->setDatasource('/typeahead/common/mailable/')) ->appendChild( id(new AphrontFormTextControl()) - ->setLabel('Subject') + ->setLabel(pht('Subject')) ->setName('subject')) ->appendChild( id(new AphrontFormTextAreaControl()) - ->setLabel('Body') + ->setLabel(pht('Body')) ->setName('body')) ->appendChild( id(new AphrontFormTextControl()) - ->setLabel('Mail Tags') + ->setLabel(pht('Mail Tags')) ->setName('mailtags') ->setCaption( - 'Example: differential-cc, differential-comment')) + pht('Example:').' differential-cc, differential-comment')) ->appendChild( id(new AphrontFormDragAndDropUploadControl()) - ->setLabel('Attach Files') + ->setLabel(pht('Attach Files')) ->setName('files') ->setActivatedClass('aphront-panel-view-drag-and-drop')) ->appendChild( id(new AphrontFormTextControl()) - ->setLabel('Simulate Failures') + ->setLabel(pht('Simulate Failures')) ->setName('failures') ->setCaption($failure_caption)) ->appendChild( id(new AphrontFormCheckboxControl()) - ->setLabel('HTML') + ->setLabel(pht('HTML')) ->addCheckbox('html', '1', 'Send as HTML email.')) ->appendChild( id(new AphrontFormCheckboxControl()) - ->setLabel('Bulk') + ->setLabel(pht('Bulk')) ->addCheckbox('bulk', '1', 'Send with bulk email headers.')) ->appendChild( id(new AphrontFormCheckboxControl()) ->setLabel('Send Now') ->addCheckbox( 'immediately', '1', - 'Send immediately. (Do not enqueue for daemons.)', + pht('Send immediately. (Do not enqueue for daemons.)'), PhabricatorEnv::getEnvConfig('metamta.send-immediately')) - ->setCaption('Daemons can be started with '.$phdlink.'.') + ->setCaption(pht('Daemons can be started with %s.', $phdlink)) ) ->appendChild( id(new AphrontFormSubmitControl()) - ->setValue('Send Mail')); + ->setValue(pht('Send Mail'))); $panel = new AphrontPanelView(); - $panel->setHeader('Send Email'); + $panel->setHeader(pht('Send Email')); $panel->appendChild($form); - $panel->setWidth(AphrontPanelView::WIDTH_FORM); + $panel->setNoBackground(); $nav = $this->buildSideNavView(); $nav->selectFilter('send'); $nav->appendChild( array( $warning, $panel, )); return $this->buildApplicationPage( $nav, array( - 'title' => 'Send Test', + 'title' => pht('Send Test'), + 'device' => true, )); } } diff --git a/src/applications/metamta/controller/PhabricatorMetaMTASendGridReceiveController.php b/src/applications/metamta/controller/PhabricatorMetaMTASendGridReceiveController.php index fbd86a2871..ae75b348c2 100644 --- a/src/applications/metamta/controller/PhabricatorMetaMTASendGridReceiveController.php +++ b/src/applications/metamta/controller/PhabricatorMetaMTASendGridReceiveController.php @@ -1,68 +1,68 @@ getRequest(); $user = $request->getUser(); $raw_headers = $request->getStr('headers'); $raw_headers = explode("\n", rtrim($raw_headers)); $raw_dict = array(); foreach (array_filter($raw_headers) as $header) { list($name, $value) = explode(':', $header, 2); $raw_dict[$name] = ltrim($value); } $headers = array( 'to' => $request->getStr('to'), 'from' => $request->getStr('from'), 'subject' => $request->getStr('subject'), ) + $raw_dict; $received = new PhabricatorMetaMTAReceivedMail(); $received->setHeaders($headers); $received->setBodies(array( 'text' => $request->getStr('text'), 'html' => $request->getStr('from'), )); $received->setMessageIDHash( PhabricatorHash::digestForIndex($received->getMessageID())); $file_phids = array(); foreach ($_FILES as $file_raw) { try { $file = PhabricatorFile::newFromPHPUpload( $file_raw, array( 'authorPHID' => $user->getPHID(), )); $file_phids[] = $file->getPHID(); } catch (Exception $ex) { phlog($ex); } } $received->setAttachments($file_phids); $received->save(); $received->processReceivedMail(); $response = new AphrontWebpageResponse(); - $response->setContent("Got it! Thanks, SendGrid!\n"); + $response->setContent(pht("Got it! Thanks, SendGrid!\n")); return $response; } } diff --git a/src/applications/metamta/controller/PhabricatorMetaMTAViewController.php b/src/applications/metamta/controller/PhabricatorMetaMTAViewController.php index dd15b099e1..537678c381 100644 --- a/src/applications/metamta/controller/PhabricatorMetaMTAViewController.php +++ b/src/applications/metamta/controller/PhabricatorMetaMTAViewController.php @@ -1,67 +1,69 @@ id = $data['id']; } public function processRequest() { $request = $this->getRequest(); $user = $request->getUser(); $mail = id(new PhabricatorMetaMTAMail())->load($this->id); if (!$mail) { return new Aphront404Response(); } $status = PhabricatorMetaMTAMail::getReadableStatus($mail->getStatus()); $form = new AphrontFormView(); $form->setUser($request->getUser()); $form ->appendChild( id(new AphrontFormStaticControl()) - ->setLabel('Subject') + ->setLabel(pht('Subject')) ->setValue($mail->getSubject())) ->appendChild( id(new AphrontFormStaticControl()) - ->setLabel('Created') + ->setLabel(pht('Created')) ->setValue(phabricator_datetime($mail->getDateCreated(), $user))) ->appendChild( id(new AphrontFormStaticControl()) - ->setLabel('Status') + ->setLabel(pht('Status')) ->setValue($status)) ->appendChild( id(new AphrontFormStaticControl()) - ->setLabel('Retry Count') + ->setLabel(pht('Retry Count')) ->setValue($mail->getRetryCount())) ->appendChild( id(new AphrontFormStaticControl()) - ->setLabel('Message') + ->setLabel(pht('Message')) ->setValue($mail->getMessage())) ->appendChild( id(new AphrontFormStaticControl()) - ->setLabel('Related PHID') + ->setLabel(pht('Related PHID')) ->setValue($mail->getRelatedPHID())) ->appendChild( id(new AphrontFormSubmitControl()) - ->addCancelButton($this->getApplicationURI(), 'Done')); + ->addCancelButton($this->getApplicationURI(), pht('Done'))); $panel = new AphrontPanelView(); - $panel->setHeader('View Email'); + $panel->setHeader(pht('View Email')); $panel->appendChild($form); $panel->setWidth(AphrontPanelView::WIDTH_WIDE); + $panel->setNoBackground(); return $this->buildApplicationPage( $panel, array( - 'title' => 'View Mail', + 'title' => pht('View Mail'), + 'device' => true, )); } } diff --git a/src/applications/people/application/PhabricatorApplicationPeople.php b/src/applications/people/application/PhabricatorApplicationPeople.php index b37667196b..80217a143e 100644 --- a/src/applications/people/application/PhabricatorApplicationPeople.php +++ b/src/applications/people/application/PhabricatorApplicationPeople.php @@ -1,80 +1,84 @@ array( '' => 'PhabricatorPeopleListController', 'logs/' => 'PhabricatorPeopleLogsController', 'edit/(?:(?P[1-9]\d*)/(?:(?P\w+)/)?)?' => 'PhabricatorPeopleEditController', 'ldap/' => 'PhabricatorPeopleLdapController', ), '/p/(?P[\w._-]+)/(?:(?P\w+)/)?' => 'PhabricatorPeopleProfileController', '/emailverify/(?P[^/]+)/' => 'PhabricatorEmailVerificationController', ); } public function buildMainMenuItems( PhabricatorUser $user, PhabricatorController $controller = null) { $items = array(); if ($user->isLoggedIn()) { $image = $user->loadProfileImageURI(); $item = new PhabricatorMenuItemView(); $item->setName($user->getUsername()); $item->setHref('/p/'.$user->getUsername().'/'); $item->setSortOrder(0.0); $item->addClass('phabricator-core-menu-item-profile'); $classes = array( 'phabricator-core-menu-icon', 'phabricator-core-menu-profile-image', ); $item->appendChild( phutil_tag( 'span', array( 'class' => implode(' ', $classes), 'style' => 'background-image: url('.$image.')', ), '')); $items[] = $item; } return $items; } } diff --git a/src/applications/phid/handle/PhabricatorObjectHandleData.php b/src/applications/phid/handle/PhabricatorObjectHandleData.php index 8b216e8f5a..52c1bb7d0c 100644 --- a/src/applications/phid/handle/PhabricatorObjectHandleData.php +++ b/src/applications/phid/handle/PhabricatorObjectHandleData.php @@ -1,714 +1,663 @@ phids = array_unique($phids); } public function setViewer(PhabricatorUser $viewer) { $this->viewer = $viewer; return $this; } public static function loadOneHandle($phid, $viewer = null) { $query = new PhabricatorObjectHandleData(array($phid)); if ($viewer) { $query->setViewer($viewer); } $handles = $query->loadHandles(); return $handles[$phid]; } public function loadObjects() { - $types = array(); - foreach ($this->phids as $phid) { - $type = phid_get_type($phid); - $types[$type][] = $phid; - } + $types = phid_group_by_type($this->phids); $objects = array(); foreach ($types as $type => $phids) { - switch ($type) { - case PhabricatorPHIDConstants::PHID_TYPE_USER: - $user_dao = new PhabricatorUser(); - $users = $user_dao->loadAllWhere( - 'phid in (%Ls)', - $phids); - foreach ($users as $user) { - $objects[$user->getPHID()] = $user; - } - break; - case PhabricatorPHIDConstants::PHID_TYPE_CMIT: - $commit_dao = new PhabricatorRepositoryCommit(); - $commits = $commit_dao->loadAllWhere( - 'phid IN (%Ls)', - $phids); - $commit_data = array(); - if ($commits) { - $data_dao = new PhabricatorRepositoryCommitData(); - $commit_data = $data_dao->loadAllWhere( - 'commitID IN (%Ld)', - mpull($commits, 'getID')); - $commit_data = mpull($commit_data, null, 'getCommitID'); - } - foreach ($commits as $commit) { - $data = idx($commit_data, $commit->getID()); - if ($data) { - $commit->attachCommitData($data); - $objects[$commit->getPHID()] = $commit; - } else { - // If we couldn't load the commit data, just act as though we - // couldn't load the object at all so we don't load half an object. - } - } - break; - case PhabricatorPHIDConstants::PHID_TYPE_TASK: - $task_dao = new ManiphestTask(); - $tasks = $task_dao->loadAllWhere( - 'phid IN (%Ls)', - $phids); - foreach ($tasks as $task) { - $objects[$task->getPHID()] = $task; - } - break; - case PhabricatorPHIDConstants::PHID_TYPE_CONF: - $config_dao = new PhabricatorConfigEntry(); - $entries = $config_dao->loadAllWhere( - 'phid IN (%Ls)', - $phids); - foreach ($entries as $entry) { - $objects[$entry->getPHID()] = $entry; - } - break; - case PhabricatorPHIDConstants::PHID_TYPE_DREV: - $revision_dao = new DifferentialRevision(); - $revisions = $revision_dao->loadAllWhere( - 'phid IN (%Ls)', - $phids); - foreach ($revisions as $revision) { - $objects[$revision->getPHID()] = $revision; - } - break; - case PhabricatorPHIDConstants::PHID_TYPE_WIKI: - $document_dao = new PhrictionDocument(); - $documents = $document_dao->loadAllWhere( - 'phid IN (%Ls)', - $phids); - foreach ($documents as $document) { - $objects[$document->getPHID()] = $document; - } - break; - case PhabricatorPHIDConstants::PHID_TYPE_QUES: - $questions = id(new PonderQuestionQuery()) - ->setViewer($this->viewer) - ->withPHIDs($phids) - ->execute(); - foreach ($questions as $question) { - $objects[$question->getPHID()] = $question; - } - break; - case PhabricatorPHIDConstants::PHID_TYPE_MOCK: - $mocks = id(new PholioMockQuery()) + $objects += $this->loadObjectsOfType($type, $phids); + } + + return $objects; + } + + private function loadObjectsOfType($type, array $phids) { + switch ($type) { + + case PhabricatorPHIDConstants::PHID_TYPE_USER: + $user_dao = new PhabricatorUser(); + $users = $user_dao->loadAllWhere( + 'phid in (%Ls)', + $phids); + return mpull($users, null, 'getPHID'); + + case PhabricatorPHIDConstants::PHID_TYPE_CMIT: + $commit_dao = new PhabricatorRepositoryCommit(); + $commits = $commit_dao->putInSet(new LiskDAOSet())->loadAllWhere( + 'phid IN (%Ls)', + $phids); + return mpull($commits, null, 'getPHID'); + + case PhabricatorPHIDConstants::PHID_TYPE_TASK: + $task_dao = new ManiphestTask(); + $tasks = $task_dao->loadAllWhere( + 'phid IN (%Ls)', + $phids); + return mpull($tasks, null, 'getPHID'); + + case PhabricatorPHIDConstants::PHID_TYPE_CONF: + $config_dao = new PhabricatorConfigEntry(); + $entries = $config_dao->loadAllWhere( + 'phid IN (%Ls)', + $phids); + return mpull($entries, null, 'getPHID'); + + case PhabricatorPHIDConstants::PHID_TYPE_FILE: + $object = new PhabricatorFile(); + $files = $object->loadAllWhere('phid IN (%Ls)', $phids); + return mpull($files, null, 'getPHID'); + + case PhabricatorPHIDConstants::PHID_TYPE_PROJ: + $object = new PhabricatorProject(); + if ($this->viewer) { + $projects = id(new PhabricatorProjectQuery()) ->setViewer($this->viewer) ->withPHIDs($phids) ->execute(); - foreach ($mocks as $mock) { - $objects[$mock->getPHID()] = $mock; - } - break; - case PhabricatorPHIDConstants::PHID_TYPE_XACT: - $subtypes = array(); - foreach ($phids as $phid) { - $subtypes[phid_get_subtype($phid)][] = $phid; - } - $xactions = array(); - foreach ($subtypes as $subtype => $subtype_phids) { - // TODO: Do this magically. - switch ($subtype) { - case PhabricatorPHIDConstants::PHID_TYPE_MOCK: - $results = id(new PholioTransactionQuery()) - ->setViewer($this->viewer) - ->withPHIDs($subtype_phids) - ->execute(); - $xactions += mpull($results, null, 'getPHID'); - break; - case PhabricatorPHIDConstants::PHID_TYPE_MCRO: - $results = id(new PhabricatorMacroTransactionQuery()) - ->setViewer($this->viewer) - ->withPHIDs($subtype_phids) - ->execute(); - $xactions += mpull($results, null, 'getPHID'); - break; - } - } - foreach ($xactions as $xaction) { - $objects[$xaction->getPHID()] = $xaction; - } - break; - case PhabricatorPHIDConstants::PHID_TYPE_MCRO: - $macros = id(new PhabricatorFileImageMacro())->loadAllWhere( - 'phid IN (%Ls)', - $phids); - $objects += mpull($macros, null, 'getPHID'); - break; - } - } + } else { + $projects = $object->loadAllWhere('phid IN (%Ls)', $phids); + } + return mpull($projects, null, 'getPHID'); + + case PhabricatorPHIDConstants::PHID_TYPE_REPO: + $object = new PhabricatorRepository(); + $repositories = $object->loadAllWhere('phid in (%Ls)', $phids); + return mpull($repositories, null, 'getPHID'); + + case PhabricatorPHIDConstants::PHID_TYPE_OPKG: + $object = new PhabricatorOwnersPackage(); + $packages = $object->loadAllWhere('phid in (%Ls)', $phids); + return mpull($packages, null, 'getPHID'); + + case PhabricatorPHIDConstants::PHID_TYPE_APRJ: + $project_dao = new PhabricatorRepositoryArcanistProject(); + $projects = $project_dao->loadAllWhere( + 'phid IN (%Ls)', + $phids); + return mpull($projects, null, 'getPHID'); + + case PhabricatorPHIDConstants::PHID_TYPE_MLST: + $object = new PhabricatorMetaMTAMailingList(); + $lists = $object->loadAllWhere('phid IN (%Ls)', $phids); + return mpull($lists, null, 'getPHID'); + + case PhabricatorPHIDConstants::PHID_TYPE_DREV: + $revision_dao = new DifferentialRevision(); + $revisions = $revision_dao->loadAllWhere( + 'phid IN (%Ls)', + $phids); + return mpull($revisions, null, 'getPHID'); + + case PhabricatorPHIDConstants::PHID_TYPE_WIKI: + $document_dao = new PhrictionDocument(); + $documents = $document_dao->loadAllWhere( + 'phid IN (%Ls)', + $phids); + return mpull($documents, null, 'getPHID'); + + case PhabricatorPHIDConstants::PHID_TYPE_QUES: + $questions = id(new PonderQuestionQuery()) + ->setViewer($this->viewer) + ->withPHIDs($phids) + ->execute(); + return mpull($questions, null, 'getPHID'); + + case PhabricatorPHIDConstants::PHID_TYPE_MOCK: + $mocks = id(new PholioMockQuery()) + ->setViewer($this->viewer) + ->withPHIDs($phids) + ->execute(); + return mpull($mocks, null, 'getPHID'); + + case PhabricatorPHIDConstants::PHID_TYPE_XACT: + $subtypes = array(); + foreach ($phids as $phid) { + $subtypes[phid_get_subtype($phid)][] = $phid; + } + $xactions = array(); + foreach ($subtypes as $subtype => $subtype_phids) { + // TODO: Do this magically. + switch ($subtype) { + case PhabricatorPHIDConstants::PHID_TYPE_MOCK: + $results = id(new PholioTransactionQuery()) + ->setViewer($this->viewer) + ->withPHIDs($subtype_phids) + ->execute(); + $xactions += mpull($results, null, 'getPHID'); + break; + case PhabricatorPHIDConstants::PHID_TYPE_MCRO: + $results = id(new PhabricatorMacroTransactionQuery()) + ->setViewer($this->viewer) + ->withPHIDs($subtype_phids) + ->execute(); + $xactions += mpull($results, null, 'getPHID'); + break; + } + } + return mpull($xactions, null, 'getPHID'); + + case PhabricatorPHIDConstants::PHID_TYPE_MCRO: + $macros = id(new PhabricatorFileImageMacro())->loadAllWhere( + 'phid IN (%Ls)', + $phids); + return mpull($macros, null, 'getPHID'); + + case PhabricatorPHIDConstants::PHID_TYPE_PSTE: + $pastes = id(new PhabricatorPasteQuery()) + ->withPHIDs($phids) + ->setViewer($this->viewer) + ->execute(); + return mpull($pastes, null, 'getPHID'); + + case PhabricatorPHIDConstants::PHID_TYPE_BLOG: + $blogs = id(new PhameBlogQuery()) + ->withPHIDs($phids) + ->setViewer($this->viewer) + ->execute(); + return mpull($blogs, null, 'getPHID'); + + case PhabricatorPHIDConstants::PHID_TYPE_POST: + $posts = id(new PhamePostQuery()) + ->withPHIDs($phids) + ->setViewer($this->viewer) + ->execute(); + return mpull($posts, null, 'getPHID'); - return $objects; + } } public function loadHandles() { $types = phid_group_by_type($this->phids); $handles = array(); $external_loaders = PhabricatorEnv::getEnvConfig('phid.external-loaders'); foreach ($types as $type => $phids) { + $objects = $this->loadObjectsOfType($type, $phids); + switch ($type) { + case PhabricatorPHIDConstants::PHID_TYPE_MAGIC: // Black magic! foreach ($phids as $phid) { $handle = new PhabricatorObjectHandle(); $handle->setPHID($phid); $handle->setType($type); switch ($phid) { case ManiphestTaskOwner::OWNER_UP_FOR_GRABS: $handle->setName('Up For Grabs'); $handle->setFullName('upforgrabs (Up For Grabs)'); $handle->setComplete(true); break; case ManiphestTaskOwner::PROJECT_NO_PROJECT: $handle->setName('No Project'); $handle->setFullName('noproject (No Project)'); $handle->setComplete(true); break; default: $handle->setName('Foul Magicks'); break; } $handles[$phid] = $handle; } break; - case PhabricatorPHIDConstants::PHID_TYPE_USER: - $object = new PhabricatorUser(); - - $users = $object->loadAllWhere('phid IN (%Ls)', $phids); - $users = mpull($users, null, 'getPHID'); - $image_phids = mpull($users, 'getProfileImagePHID'); + case PhabricatorPHIDConstants::PHID_TYPE_USER: + $image_phids = mpull($objects, 'getProfileImagePHID'); $image_phids = array_unique(array_filter($image_phids)); $images = array(); if ($image_phids) { $images = id(new PhabricatorFile())->loadAllWhere( 'phid IN (%Ls)', $image_phids); $images = mpull($images, 'getBestURI', 'getPHID'); } $statuses = id(new PhabricatorUserStatus())->loadCurrentStatuses( $phids); foreach ($phids as $phid) { $handle = new PhabricatorObjectHandle(); $handle->setPHID($phid); $handle->setType($type); - if (empty($users[$phid])) { + if (empty($objects[$phid])) { $handle->setName('Unknown User'); } else { - $user = $users[$phid]; + $user = $objects[$phid]; $handle->setName($user->getUsername()); $handle->setURI('/p/'.$user->getUsername().'/'); $handle->setFullName( $user->getUsername().' ('.$user->getRealName().')'); $handle->setAlternateID($user->getID()); $handle->setComplete(true); if (isset($statuses[$phid])) { $handle->setStatus($statuses[$phid]->getTextStatus()); if ($this->viewer) { $handle->setTitle( $statuses[$phid]->getTerseSummary($this->viewer)); } } $handle->setDisabled($user->getIsDisabled()); $img_uri = idx($images, $user->getProfileImagePHID()); if ($img_uri) { $handle->setImageURI($img_uri); } else { $handle->setImageURI( PhabricatorUser::getDefaultProfileImageURI()); } } $handles[$phid] = $handle; } break; - case PhabricatorPHIDConstants::PHID_TYPE_MLST: - $object = new PhabricatorMetaMTAMailingList(); - - $lists = $object->loadAllWhere('phid IN (%Ls)', $phids); - $lists = mpull($lists, null, 'getPHID'); + case PhabricatorPHIDConstants::PHID_TYPE_MLST: foreach ($phids as $phid) { $handle = new PhabricatorObjectHandle(); $handle->setPHID($phid); $handle->setType($type); - if (empty($lists[$phid])) { + if (empty($objects[$phid])) { $handle->setName('Unknown Mailing List'); } else { - $list = $lists[$phid]; + $list = $objects[$phid]; $handle->setName($list->getName()); $handle->setURI($list->getURI()); $handle->setFullName($list->getName()); $handle->setComplete(true); } $handles[$phid] = $handle; } break; - case PhabricatorPHIDConstants::PHID_TYPE_DREV: - $object = new DifferentialRevision(); - - $revs = $object->loadAllWhere('phid in (%Ls)', $phids); - $revs = mpull($revs, null, 'getPHID'); + case PhabricatorPHIDConstants::PHID_TYPE_DREV: foreach ($phids as $phid) { $handle = new PhabricatorObjectHandle(); $handle->setPHID($phid); $handle->setType($type); - if (empty($revs[$phid])) { + if (empty($objects[$phid])) { $handle->setName('Unknown Revision'); } else { - $rev = $revs[$phid]; + $rev = $objects[$phid]; $handle->setName($rev->getTitle()); $handle->setURI('/D'.$rev->getID()); $handle->setFullName('D'.$rev->getID().': '.$rev->getTitle()); $handle->setComplete(true); $status = $rev->getStatus(); if (($status == ArcanistDifferentialRevisionStatus::CLOSED) || ($status == ArcanistDifferentialRevisionStatus::ABANDONED)) { $closed = PhabricatorObjectHandleStatus::STATUS_CLOSED; $handle->setStatus($closed); } } $handles[$phid] = $handle; } break; - case PhabricatorPHIDConstants::PHID_TYPE_CMIT: - $object = new PhabricatorRepositoryCommit(); - - $commits = $object->loadAllWhere('phid in (%Ls)', $phids); - $commits = mpull($commits, null, 'getPHID'); - - $repository_ids = array(); - $callsigns = array(); - if ($commits) { - $repository_ids = mpull($commits, 'getRepositoryID'); - $repositories = id(new PhabricatorRepository())->loadAllWhere( - 'id in (%Ld)', array_unique($repository_ids)); - $callsigns = mpull($repositories, 'getCallsign'); - } + case PhabricatorPHIDConstants::PHID_TYPE_CMIT: foreach ($phids as $phid) { $handle = new PhabricatorObjectHandle(); $handle->setPHID($phid); $handle->setType($type); - if (empty($commits[$phid]) || - !isset($callsigns[$repository_ids[$phid]])) { + $repository = null; + if (!empty($objects[$phid])) { + $repository = $objects[$phid]->loadOneRelative( + new PhabricatorRepository(), + 'id', + 'getRepositoryID'); + } + if (!$repository) { $handle->setName('Unknown Commit'); } else { - $commit = $commits[$phid]; - $callsign = $callsigns[$repository_ids[$phid]]; - $repository = $repositories[$repository_ids[$phid]]; + $commit = $objects[$phid]; + $callsign = $repository->getCallsign(); $commit_identifier = $commit->getCommitIdentifier(); // In case where the repository for the commit was deleted, - // we don't have have info about the repository anymore. + // we don't have info about the repository anymore. if ($repository) { $name = $repository->formatCommitName($commit_identifier); $handle->setName($name); } else { $handle->setName('Commit '.'r'.$callsign.$commit_identifier); } $handle->setURI('/r'.$callsign.$commit_identifier); $handle->setFullName('r'.$callsign.$commit_identifier); $handle->setTimestamp($commit->getEpoch()); $handle->setComplete(true); } $handles[$phid] = $handle; } break; - case PhabricatorPHIDConstants::PHID_TYPE_TASK: - $object = new ManiphestTask(); - - $tasks = $object->loadAllWhere('phid in (%Ls)', $phids); - $tasks = mpull($tasks, null, 'getPHID'); + case PhabricatorPHIDConstants::PHID_TYPE_TASK: foreach ($phids as $phid) { $handle = new PhabricatorObjectHandle(); $handle->setPHID($phid); $handle->setType($type); - if (empty($tasks[$phid])) { + if (empty($objects[$phid])) { $handle->setName('Unknown Task'); } else { - $task = $tasks[$phid]; + $task = $objects[$phid]; $handle->setName($task->getTitle()); $handle->setURI('/T'.$task->getID()); $handle->setFullName('T'.$task->getID().': '.$task->getTitle()); $handle->setComplete(true); $handle->setAlternateID($task->getID()); if ($task->getStatus() != ManiphestTaskStatus::STATUS_OPEN) { $closed = PhabricatorObjectHandleStatus::STATUS_CLOSED; $handle->setStatus($closed); } } $handles[$phid] = $handle; } break; - case PhabricatorPHIDConstants::PHID_TYPE_CONF: - $object = new PhabricatorConfigEntry(); - - $entries = $object->loadAllWhere('phid in (%Ls)', $phids); - $entries = mpull($entries, null, 'getPHID'); + case PhabricatorPHIDConstants::PHID_TYPE_CONF: foreach ($phids as $phid) { $handle = new PhabricatorObjectHandle(); $handle->setPHID($phid); $handle->setType($type); - if (empty($entries[$phid])) { + if (empty($objects[$phid])) { $handle->setName('Unknown Config Entry'); } else { - $entry = $entries[$phid]; + $entry = $objects[$phid]; $handle->setName($entry->getKey()); $handle->setURI('/config/edit/'.$entry->getKey()); $handle->setFullName($entry->getKey()); $handle->setComplete(true); } $handles[$phid] = $handle; } break; - case PhabricatorPHIDConstants::PHID_TYPE_FILE: - $object = new PhabricatorFile(); - - $files = $object->loadAllWhere('phid IN (%Ls)', $phids); - $files = mpull($files, null, 'getPHID'); + case PhabricatorPHIDConstants::PHID_TYPE_FILE: foreach ($phids as $phid) { $handle = new PhabricatorObjectHandle(); $handle->setPHID($phid); $handle->setType($type); - if (empty($files[$phid])) { + if (empty($objects[$phid])) { $handle->setName('Unknown File'); } else { - $file = $files[$phid]; + $file = $objects[$phid]; $handle->setName($file->getName()); $handle->setURI($file->getBestURI()); $handle->setComplete(true); if ($file->isViewableImage()) { $handle->setImageURI($file->getBestURI()); } } $handles[$phid] = $handle; } break; - case PhabricatorPHIDConstants::PHID_TYPE_PROJ: - $object = new PhabricatorProject(); - - if ($this->viewer) { - $projects = id(new PhabricatorProjectQuery()) - ->setViewer($this->viewer) - ->withPHIDs($phids) - ->execute(); - } else { - $projects = $object->loadAllWhere('phid IN (%Ls)', $phids); - } - - $projects = mpull($projects, null, 'getPHID'); + case PhabricatorPHIDConstants::PHID_TYPE_PROJ: foreach ($phids as $phid) { $handle = new PhabricatorObjectHandle(); $handle->setPHID($phid); $handle->setType($type); - if (empty($projects[$phid])) { + if (empty($objects[$phid])) { $handle->setName('Unknown Project'); } else { - $project = $projects[$phid]; + $project = $objects[$phid]; $handle->setName($project->getName()); $handle->setURI('/project/view/'.$project->getID().'/'); $handle->setComplete(true); } $handles[$phid] = $handle; } break; - case PhabricatorPHIDConstants::PHID_TYPE_REPO: - $object = new PhabricatorRepository(); - - $repositories = $object->loadAllWhere('phid in (%Ls)', $phids); - $repositories = mpull($repositories, null, 'getPHID'); + case PhabricatorPHIDConstants::PHID_TYPE_REPO: foreach ($phids as $phid) { $handle = new PhabricatorObjectHandle(); $handle->setPHID($phid); $handle->setType($type); - if (empty($repositories[$phid])) { + if (empty($objects[$phid])) { $handle->setName('Unknown Repository'); } else { - $repository = $repositories[$phid]; + $repository = $objects[$phid]; $handle->setName($repository->getCallsign()); $handle->setURI('/diffusion/'.$repository->getCallsign().'/'); $handle->setComplete(true); } $handles[$phid] = $handle; } break; - case PhabricatorPHIDConstants::PHID_TYPE_OPKG: - $object = new PhabricatorOwnersPackage(); - - $packages = $object->loadAllWhere('phid in (%Ls)', $phids); - $packages = mpull($packages, null, 'getPHID'); + case PhabricatorPHIDConstants::PHID_TYPE_OPKG: foreach ($phids as $phid) { $handle = new PhabricatorObjectHandle(); $handle->setPHID($phid); $handle->setType($type); - if (empty($packages[$phid])) { + if (empty($objects[$phid])) { $handle->setName('Unknown Package'); } else { - $package = $packages[$phid]; + $package = $objects[$phid]; $handle->setName($package->getName()); $handle->setURI('/owners/package/'.$package->getID().'/'); $handle->setComplete(true); } $handles[$phid] = $handle; } break; - case PhabricatorPHIDConstants::PHID_TYPE_APRJ: - $project_dao = new PhabricatorRepositoryArcanistProject(); - $projects = $project_dao->loadAllWhere( - 'phid IN (%Ls)', - $phids); - $projects = mpull($projects, null, 'getPHID'); + case PhabricatorPHIDConstants::PHID_TYPE_APRJ: foreach ($phids as $phid) { $handle = new PhabricatorObjectHandle(); $handle->setPHID($phid); $handle->setType($type); - if (empty($projects[$phid])) { + if (empty($objects[$phid])) { $handle->setName('Unknown Arcanist Project'); } else { - $project = $projects[$phid]; + $project = $objects[$phid]; $handle->setName($project->getName()); $handle->setComplete(true); } $handles[$phid] = $handle; } break; + case PhabricatorPHIDConstants::PHID_TYPE_WIKI: $document_dao = new PhrictionDocument(); $content_dao = new PhrictionContent(); $conn = $document_dao->establishConnection('r'); $documents = queryfx_all( $conn, 'SELECT * FROM %T document JOIN %T content ON document.contentID = content.id WHERE document.phid IN (%Ls)', $document_dao->getTableName(), $content_dao->getTableName(), $phids); $documents = ipull($documents, null, 'phid'); foreach ($phids as $phid) { $handle = new PhabricatorObjectHandle(); $handle->setPHID($phid); $handle->setType($type); if (empty($documents[$phid])) { $handle->setName('Unknown Document'); } else { $info = $documents[$phid]; $handle->setName($info['title']); $handle->setURI(PhrictionDocument::getSlugURI($info['slug'])); $handle->setComplete(true); if ($info['status'] != PhrictionDocumentStatus::STATUS_EXISTS) { $closed = PhabricatorObjectHandleStatus::STATUS_CLOSED; $handle->setStatus($closed); } } $handles[$phid] = $handle; } break; - case PhabricatorPHIDConstants::PHID_TYPE_QUES: - $questions = id(new PonderQuestionQuery()) - ->setViewer($this->viewer) - ->withPHIDs($phids) - ->execute(); - $questions = mpull($questions, null, 'getPHID'); + case PhabricatorPHIDConstants::PHID_TYPE_QUES: foreach ($phids as $phid) { $handle = new PhabricatorObjectHandle(); $handle->setPHID($phid); $handle->setType($type); - if (empty($questions[$phid])) { + if (empty($objects[$phid])) { $handle->setName('Unknown Ponder Question'); } else { - $question = $questions[$phid]; + $question = $objects[$phid]; $handle->setName(phutil_utf8_shorten($question->getTitle(), 60)); $handle->setURI(new PhutilURI('/Q' . $question->getID())); $handle->setComplete(true); } $handles[$phid] = $handle; } break; - case PhabricatorPHIDConstants::PHID_TYPE_PSTE: - $pastes = id(new PhabricatorPasteQuery()) - ->withPHIDs($phids) - ->setViewer($this->viewer) - ->execute(); - $pastes = mpull($pastes, null, 'getPHID'); + case PhabricatorPHIDConstants::PHID_TYPE_PSTE: foreach ($phids as $phid) { $handle = new PhabricatorObjectHandle(); $handle->setPHID($phid); $handle->setType($type); - if (empty($pastes[$phid])) { + if (empty($objects[$phid])) { $handle->setName('Unknown Paste'); } else { - $paste = $pastes[$phid]; + $paste = $objects[$phid]; $handle->setName($paste->getTitle()); $handle->setFullName($paste->getFullName()); $handle->setURI('/P'.$paste->getID()); $handle->setComplete(true); } $handles[$phid] = $handle; } break; - case PhabricatorPHIDConstants::PHID_TYPE_BLOG: - $blogs = id(new PhameBlogQuery()) - ->withPHIDs($phids) - ->setViewer($this->viewer) - ->execute(); - $blogs = mpull($blogs, null, 'getPHID'); + case PhabricatorPHIDConstants::PHID_TYPE_BLOG: foreach ($phids as $phid) { $handle = new PhabricatorObjectHandle(); $handle->setPHID($phid); $handle->setType($type); - if (empty($blogs[$phid])) { + if (empty($objects[$phid])) { $handle->setName('Unknown Blog'); } else { - $blog = $blogs[$phid]; + $blog = $objects[$phid]; $handle->setName($blog->getName()); $handle->setFullName($blog->getName()); $handle->setURI('/phame/blog/view/'.$blog->getID().'/'); $handle->setComplete(true); } $handles[$phid] = $handle; } break; - case PhabricatorPHIDConstants::PHID_TYPE_POST: - $posts = id(new PhamePostQuery()) - ->withPHIDs($phids) - ->setViewer($this->viewer) - ->execute(); - $posts = mpull($posts, null, 'getPHID'); + case PhabricatorPHIDConstants::PHID_TYPE_POST: foreach ($phids as $phid) { $handle = new PhabricatorObjectHandle(); $handle->setPHID($phid); $handle->setType($type); - if (empty($posts[$phid])) { + if (empty($objects[$phid])) { $handle->setName('Unknown Post'); } else { - $post = $posts[$phid]; + $post = $objects[$phid]; $handle->setName($post->getTitle()); $handle->setFullName($post->getTitle()); $handle->setURI('/phame/post/view/'.$post->getID().'/'); $handle->setComplete(true); } $handles[$phid] = $handle; } break; - case PhabricatorPHIDConstants::PHID_TYPE_MOCK: - $mocks = id(new PholioMockQuery()) - ->withPHIDs($phids) - ->setViewer($this->viewer) - ->execute(); - $mocks = mpull($mocks, null, 'getPHID'); + case PhabricatorPHIDConstants::PHID_TYPE_MOCK: foreach ($phids as $phid) { $handle = new PhabricatorObjectHandle(); $handle->setPHID($phid); $handle->setType($type); - if (empty($mocks[$phid])) { + if (empty($objects[$phid])) { $handle->setName('Unknown Mock'); } else { - $mock = $mocks[$phid]; + $mock = $objects[$phid]; $handle->setName($mock->getName()); $handle->setFullName('M'.$mock->getID().': '.$mock->getName()); $handle->setURI('/M'.$mock->getID()); $handle->setComplete(true); } $handles[$phid] = $handle; } break; + case PhabricatorPHIDConstants::PHID_TYPE_MCRO: - $macros = id(new PhabricatorFileImageMacro())->loadAllWhere( - 'phid IN (%Ls)', - $phids); - $macros = mpull($macros, null, 'getPHID'); foreach ($phids as $phid) { $handle = new PhabricatorObjectHandle(); $handle->setPHID($phid); $handle->setType($type); - if (empty($macros[$phid])) { + if (empty($objects[$phid])) { $handle->setName('Unknown Macro'); } else { - $macro = $macros[$phid]; + $macro = $objects[$phid]; $handle->setName($macro->getName()); $handle->setFullName('Image Macro "'.$macro->getName().'"'); $handle->setURI('/macro/view/'.$macro->getID().'/'); $handle->setComplete(true); } $handles[$phid] = $handle; } break; + default: $loader = null; if (isset($external_loaders[$type])) { $loader = $external_loaders[$type]; } else if (isset($external_loaders['*'])) { $loader = $external_loaders['*']; } if ($loader) { $object = newv($loader, array()); assert_instances_of(array($type => $object), 'ObjectHandleLoader'); $handles += $object->loadHandles($phids); break; } foreach ($phids as $phid) { $handle = new PhabricatorObjectHandle(); $handle->setType($type); $handle->setPHID($phid); $handle->setName('Unknown Object'); $handle->setFullName('An Unknown Object'); $handles[$phid] = $handle; } break; + } } return $handles; } } diff --git a/src/applications/pholio/controller/PholioMockViewController.php b/src/applications/pholio/controller/PholioMockViewController.php index a03452a6d4..5e0f72c016 100644 --- a/src/applications/pholio/controller/PholioMockViewController.php +++ b/src/applications/pholio/controller/PholioMockViewController.php @@ -1,194 +1,193 @@ id = $data['id']; } public function processRequest() { $request = $this->getRequest(); $user = $request->getUser(); $mock = id(new PholioMockQuery()) ->setViewer($user) ->withIDs(array($this->id)) ->needImages(true) ->needCoverFiles(true) ->executeOne(); if (!$mock) { return new Aphront404Response(); } $xactions = id(new PholioTransactionQuery()) ->setViewer($user) ->withObjectPHIDs(array($mock->getPHID())) ->execute(); $subscribers = PhabricatorSubscribersQuery::loadSubscribersForPHID( $mock->getPHID()); $phids = array(); $phids[] = $mock->getAuthorPHID(); foreach ($subscribers as $subscriber) { $phids[] = $subscriber; } $this->loadHandles($phids); $engine = id(new PhabricatorMarkupEngine()) ->setViewer($user); $engine->addObject($mock, PholioMock::MARKUP_FIELD_DESCRIPTION); foreach ($xactions as $xaction) { if ($xaction->getComment()) { $engine->addObject( $xaction->getComment(), PhabricatorApplicationTransactionComment::MARKUP_FIELD_COMMENT); } } $engine->process(); $title = 'M'.$mock->getID().' '.$mock->getName(); $header = id(new PhabricatorHeaderView()) ->setHeader($title); $actions = $this->buildActionView($mock); $properties = $this->buildPropertyView($mock, $engine, $subscribers); require_celerity_resource('pholio-css'); $output = new PholioMockImagesView(); $output->setMock($mock); - $carousel = $output->render(); - $xaction_view = id(new PhabricatorApplicationTransactionView()) ->setUser($this->getRequest()->getUser()) ->setTransactions($xactions) ->setMarkupEngine($engine); $add_comment = $this->buildAddCommentView($mock); $content = array( $header, $actions, $properties, - $carousel, + $output->render(), $xaction_view, $add_comment, ); + return $this->buildApplicationPage( $content, array( 'title' => $title, 'device' => true, )); } private function buildActionView(PholioMock $mock) { $user = $this->getRequest()->getUser(); $actions = id(new PhabricatorActionListView()) ->setUser($user) ->setObject($mock); $can_edit = PhabricatorPolicyFilter::hasCapability( $user, $mock, PhabricatorPolicyCapability::CAN_EDIT); $actions->addAction( id(new PhabricatorActionView()) ->setIcon('edit') ->setName(pht('Edit Mock')) ->setHref($this->getApplicationURI('/edit/'.$mock->getID())) ->setDisabled(!$can_edit) ->setWorkflow(!$can_edit)); return $actions; } private function buildPropertyView( PholioMock $mock, PhabricatorMarkupEngine $engine, array $subscribers) { $user = $this->getRequest()->getUser(); $properties = new PhabricatorPropertyListView(); $properties->addProperty( pht('Author'), $this->getHandle($mock->getAuthorPHID())->renderLink()); $properties->addProperty( pht('Created'), phabricator_datetime($mock->getDateCreated(), $user)); $descriptions = PhabricatorPolicyQuery::renderPolicyDescriptions( $user, $mock); $properties->addProperty( pht('Visible To'), $descriptions[PhabricatorPolicyCapability::CAN_VIEW]); if ($subscribers) { $sub_view = array(); foreach ($subscribers as $subscriber) { $sub_view[] = $this->getHandle($subscriber)->renderLink(); } $sub_view = implode(', ', $sub_view); } else { $sub_view = phutil_tag('em', array(), pht('None')); } $properties->addProperty( pht('Subscribers'), $sub_view); $properties->addTextContent( $engine->getOutput($mock, PholioMock::MARKUP_FIELD_DESCRIPTION)); return $properties; } private function buildAddCommentView(PholioMock $mock) { $user = $this->getRequest()->getUser(); $draft = PhabricatorDraft::newFromUserAndKey($user, $mock->getPHID()); $is_serious = PhabricatorEnv::getEnvConfig('phabricator.serious-business'); $title = $is_serious ? pht('Add Comment') : pht('History Beckons'); $header = id(new PhabricatorHeaderView()) ->setHeader($title); $button_name = $is_serious ? pht('Add Comment') : pht('Answer The Call'); $form = id(new PhabricatorApplicationTransactionCommentView()) ->setUser($user) ->setDraft($draft) ->setSubmitButtonName($button_name) ->setAction($this->getApplicationURI('/comment/'.$mock->getID().'/')); return array( $header, $form, ); } } diff --git a/src/applications/pholio/view/PholioMockImagesView.php b/src/applications/pholio/view/PholioMockImagesView.php index 5b6a28c7fb..33d6a91fe4 100644 --- a/src/applications/pholio/view/PholioMockImagesView.php +++ b/src/applications/pholio/view/PholioMockImagesView.php @@ -1,34 +1,71 @@ mock = $mock; } public function render() { if (!$this->mock) { throw new Exception("Call setMock() before render()!"); } + $mockview = array(); + $file = head($this->mock->getImages())->getFile(); - $image_tag = phutil_tag( + $main_image_id = celerity_generate_unique_node_id(); + + $main_image_tag = phutil_tag( 'img', - array( - 'src' => $file->getBestURI(), - 'class' => 'pholio-mock-image', - ), - ''); + array( + 'src' => $file->getBestURI(), + 'class' => 'pholio-mock-image', + 'id' => $main_image_id, + )); - return phutil_tag( + $mockview[] = phutil_tag( 'div', array( 'class' => 'pholio-mock-image-container', ), - $image_tag); + $main_image_tag); + + if (count($this->mock->getImages()) > 1) { + require_celerity_resource('javelin-behavior-pholio-mock-view'); + $config = array('mainID' => $main_image_id); + Javelin::initBehavior('pholio-mock-view', $config); + + $thumbnails = array(); + foreach ($this->mock->getImages() as $image) { + $thumbfile = $image->getFile(); + + $tag = javelin_tag( + 'img', + array( + 'src' => $thumbfile->getThumb160x120URI(), + 'sigil' => 'mock-thumbnail', + 'class' => 'pholio-mock-carousel-thumbnail', + 'meta' => array( + 'fullSizeURI' => $thumbfile->getBestURI(), + 'imageID' => $image->getID(), + ), + )); + $thumbnails[] = $tag; + } + + $mockview[] = phutil_tag( + 'div', + array( + 'class' => 'pholio-mock-carousel', + ), + $thumbnails); + } + + return $this->renderHTMLView($mockview); } } diff --git a/src/applications/search/view/PhabricatorSearchResultView.php b/src/applications/search/view/PhabricatorSearchResultView.php index b2a1aaafa9..821853d2aa 100644 --- a/src/applications/search/view/PhabricatorSearchResultView.php +++ b/src/applications/search/view/PhabricatorSearchResultView.php @@ -1,118 +1,119 @@ handle = $handle; return $this; } public function setQuery(PhabricatorSearchQuery $query) { $this->query = $query; return $this; } public function setObject($object) { $this->object = $object; return $this; } public function render() { $handle = $this->handle; if (!$handle->isComplete()) { return; } $type_name = nonempty($handle->getTypeName(), 'Document'); require_celerity_resource('phabricator-search-results-css'); $link = phutil_tag( 'a', array( 'href' => $handle->getURI(), ), PhabricatorEnv::getProductionURI($handle->getURI())); $img = $handle->getImageURI(); if ($img) { $img = phutil_tag( 'div', array( 'class' => 'result-image', 'style' => "background-image: url('{$img}');", ), ''); } switch ($handle->getType()) { case PhabricatorPHIDConstants::PHID_TYPE_CMIT: $object_name = $handle->getName(); if ($this->object) { - $data = $this->object->getCommitData(); - $summary = $data->getSummary(); - if (strlen($summary)) { + $data = $this->object->loadOneRelative( + new PhabricatorRepositoryCommitData(), + 'commitID'); + if ($data && strlen($data->getSummary())) { $object_name = $handle->getName().': '.$data->getSummary(); } } break; default: $object_name = $handle->getFullName(); break; } return '
'. $img. '
'. phutil_tag( 'a', array( 'class' => 'result-name', 'href' => $handle->getURI(), ), $this->emboldenQuery($object_name)). '
'.$type_name.' · '.$link.'
'. '
'. '
'. '
'; } private function emboldenQuery($str) { if (!$this->query) { return phutil_escape_html($str); } $query = $this->query->getQuery(); $quoted_regexp = '/"([^"]*)"/'; $matches = array(1 => array()); preg_match_all($quoted_regexp, $query, $matches); $quoted_queries = $matches[1]; $query = preg_replace($quoted_regexp, '', $query); $query = preg_split('/\s+[+|]?/', $query); $query = array_filter($query); $query = array_merge($query, $quoted_queries); $str = phutil_escape_html($str); foreach ($query as $word) { $word = phutil_escape_html($word); $word = preg_quote($word, '/'); $word = preg_replace('/\\\\\*$/', '\w*', $word); $str = preg_replace( '/(?:^|\b)('.$word.')(?:\b|$)/i', '\1', $str); } return phutil_safe_html($str); } } diff --git a/src/applications/settings/application/PhabricatorApplicationSettings.php b/src/applications/settings/application/PhabricatorApplicationSettings.php index 36abbb47c4..613ec7168a 100644 --- a/src/applications/settings/application/PhabricatorApplicationSettings.php +++ b/src/applications/settings/application/PhabricatorApplicationSettings.php @@ -1,50 +1,54 @@ array( '(?:panel/(?P[^/]+)/)?' => 'PhabricatorSettingsMainController', 'adjust/' => 'PhabricatorSettingsAdjustController', ), ); } public function getApplicationGroup() { return self::GROUP_UTILITIES; } public function buildMainMenuItems( PhabricatorUser $user, PhabricatorController $controller = null) { $items = array(); if ($user->isLoggedIn()) { $selected = ($controller instanceof PhabricatorSettingsMainController); $item = new PhabricatorMenuItemView(); $item->setName(pht('Settings')); $item->setIcon('settings'); $item->setSelected($selected); $item->setHref('/settings/'); $item->setSortOrder(0.90); $items[] = $item; } return $items; } } diff --git a/src/applications/subscriptions/application/PhabricatorApplicationSubscriptions.php b/src/applications/subscriptions/application/PhabricatorApplicationSubscriptions.php index 21543d4eb9..ad4b4eea15 100644 --- a/src/applications/subscriptions/application/PhabricatorApplicationSubscriptions.php +++ b/src/applications/subscriptions/application/PhabricatorApplicationSubscriptions.php @@ -1,25 +1,29 @@ array( '(?Padd|delete)/'. '(?P[^/]+)/' => 'PhabricatorSubscriptionsEditController', ), ); } } diff --git a/src/applications/transactions/application/PhabricatorApplicationTransactions.php b/src/applications/transactions/application/PhabricatorApplicationTransactions.php index b597b394dd..ac0b4e1bc9 100644 --- a/src/applications/transactions/application/PhabricatorApplicationTransactions.php +++ b/src/applications/transactions/application/PhabricatorApplicationTransactions.php @@ -1,21 +1,25 @@ array( 'edit/(?[^/]+)/' => 'PhabricatorApplicationTransactionCommentEditController', 'history/(?[^/]+)/' => 'PhabricatorApplicationTransactionCommentHistoryController', ), ); } } diff --git a/src/docs/configuration/configuration_guide.diviner b/src/docs/configuration/configuration_guide.diviner index e8a2e5765b..b5e2c5c69d 100644 --- a/src/docs/configuration/configuration_guide.diviner +++ b/src/docs/configuration/configuration_guide.diviner @@ -1,191 +1,194 @@ @title Configuration Guide @group config This document contains basic configuration instructions for Phabricator. = Prerequisites = This document assumes you've already installed all the components you need. If you haven't, see @{article:Installation Guide}. The next steps are: - Configure your webserver (Apache, nginx, or lighttpd). - Access Phabricator with your browser. - Follow the instructions to complete setup. = Webserver: Configuring Apache = NOTE: Follow these instructions to use Apache. To use nginx or lighttpd, scroll down to their sections. Get Apache running and verify it's serving a test page. Consult the Apache documentation for help. Make sure ##mod_php## and ##mod_rewrite## are enabled, and ##mod_ssl## if you intend to set up SSL. If you haven't already, set up a domain name to point to the host you're installing on. You can either install Phabricator on a subdomain (like phabricator.example.com) or an entire domain, but you can not install it in some subdirectory of an existing website. Navigate to whatever domain you're going to use and make sure Apache serves you something to verify that DNS is correctly configured. +NOTE: The domain must contain a dot ('.'), i.e. not be just a bare name like +'http://example/'. Some web browsers will not set cookies otherwise. + Now, either create a VirtualHost entry (to put Phabricator on a subdomain) or edit the Directory entry for the DocumentRoot. It should look something like this: name=httpd.conf # Change this to the domain which points to your host. ServerName phabricator.example.com # Change this to the path where you put 'phabricator' when you checked it # out from GitHub when following the Installation Guide. # # Make sure you include "/webroot" at the end! DocumentRoot /path/to/phabricator/webroot RewriteEngine on RewriteRule ^/rsrc/(.*) - [L,QSA] RewriteRule ^/favicon.ico - [L,QSA] RewriteRule ^(.*)$ /index.php?__path__=$1 [B,L,QSA] If Apache isn't currently configured to serve documents out of the directory where you put Phabricator, you may also need to add a section like this: Order allow,deny Allow from all After making your edits, restart Apache, then continue to "Setup" below. = Webserver: Configuring nginx = NOTE: Follow these instructions to use nginx. To use Apache or lighttpd, scroll to their sections. For nginx, use a configuration like this: name=nginx.conf server { server_name phabricator.example.com; root /path/to/phabricator/webroot; try_files $uri $uri/ /index.php; location / { index index.php; if ( !-f $request_filename ) { rewrite ^/(.*)$ /index.php?__path__=/$1 last; break; } } location /index.php { fastcgi_pass localhost:9000; fastcgi_index index.php; #required if PHP was built with --enable-force-cgi-redirect fastcgi_param REDIRECT_STATUS 200; #variables to make the $_SERVER populate in PHP fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; fastcgi_param REMOTE_ADDR $remote_addr; } } Restart nginx after making your edits, then continue to "Setup" below. = Webserver: Configuring lighttpd = NOTE: Follow these instructions to use lighttpd. To use Apache or niginx, scroll up to their sections. For lighttpd, add a section like this to your lighttpd.conf: $HTTP["host"] =~ "phabricator(\.example\.com)?" { server.document-root = "/path/to/phabricator/webroot" url.rewrite-once = ( "^(/rsrc/.*)$" => "$1", "^(/favicon.ico)$" => "$1", # This simulates QSA ("query string append") mode in apache "^(/[^?]*)\?(.*)" => "/index.php?__path__=$1&$2", "^(/.*)$" => "/index.php?__path__=$1", ) } You should also ensure the following modules are listed in your server.modules list: mod_fastcgi mod_rewrite Finally, you should run the following commands to enable php support: $ sudo apt-get install php5-cgi # for ubuntu; other distros should be similar $ sudo lighty-enable-mod fastcgi-php Restart lighttpd after making your edits, then continue below. = Setup = Now, navigate to whichever subdomain you set up. You should see instructions to continue setup. The rest of this document contains additional instructions for specific setup steps. When you see the login screen, continue with @{article:Configuring Accounts and Registration}. = Storage: Configuring MySQL = During setup, you'll need to configure MySQL. To do this, get MySQL running and verify you can connect to it. Consult the MySQL documentation for help. When MySQL works, you need to load the Phabricator schemata into it. To do this, run: phabricator/ $ ./bin/storage upgrade If your configuration uses an unprivileged user to connect to the database, you may have to override the default user so the schema changes can be applied with root or some other admin user: phabricator/ $ ./bin/storage upgrade --user --password You can avoid the prompt the script issues by passing the ##--force## flag (for example, if you are scripting the upgrade process). phabricator/ $ ./bin/storage upgrade --force NOTE: When you update Phabricator, run `storage upgrade` again to apply any new updates. = Next Steps = Continue by: - setting up your admin account and login/registration with @{article:Configuring Accounts and Registration}; or - understanding advanced configuration topics with @{article:Configuration User Guide: Advanced Configuration}; or - configuring where uploaded files and attachments will be stored with @{article:Configuring File Storage}; or - configuring Phabricator so it can send mail with @{article:Configuring Outbound Email}; or - configuring inbound mail with @{article:Configuring Inbound Email}; or - importing repositories with @{article:Diffusion User Guide}; or - learning about daemons with @{article:Managing Daemons with phd}; or - configuring backups with @{article:Configuring Backups}; or - contributing to Phabricator with @{article:Contributor Introduction}. diff --git a/src/infrastructure/celerity/CeleritySpriteGenerator.php b/src/infrastructure/celerity/CeleritySpriteGenerator.php index c6b2ac23d0..4f9f4f26b7 100644 --- a/src/infrastructure/celerity/CeleritySpriteGenerator.php +++ b/src/infrastructure/celerity/CeleritySpriteGenerator.php @@ -1,453 +1,496 @@ 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); $tcss = array(); $tcss[] = '.action-'.$icon.$suffix; if ($color == 'white') { $tcss[] = '.device-desktop .phabricator-action-view:hover '. '.action-'.$icon; if ($icon == 'new') { // Hover state for the "+" icons on homepage tiles. $tcss[] = '.phabricator-application-launch-create:hover '. '.phabricator-application-create-icon.action-new-grey'; } } $sprite->setTargetCSS(implode(', ', $tcss)); 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', true); $sheet->setScales($scales); foreach ($sprites as $sprite) { $sheet->addSprite($sprite); } return $sheet; } public function buildMenuSheet() { $sprites = array(); $sources = array( 'seen_read_all' => array( 'x' => 14, 'y' => 14, 'css' => '.alert-notifications .phabricator-main-menu-alert-icon', ), 'seen_have_unread' => array( 'x' => 14, 'y' => 14, 'css' => '.alert-notifications:hover .phabricator-main-menu-alert-icon', ), 'unseen_any' => array( 'x' => 14, 'y' => 14, 'css' => '.alert-notifications.alert-unread .phabricator-main-menu-alert-icon', ), 'arrow-right' => array( 'x' => 9, 'y' => 31, 'css' => '.phabricator-crumb-divider', ), 'eye' => array( 'x' => 24, 'y' => 20, 'css' => '.menu-icon-eye', ), 'app' => array( 'x' => 24, 'y' => 20, 'css' => '.menu-icon-app', ), 'logo' => array( 'x' => 139, 'y' => 25, 'css' => '.phabricator-main-menu-logo-image', ), 'conf-off' => array( 'x' => 14, 'y' => 14, 'css' => '.alert-notifications .phabricator-main-menu-message-icon', ), 'conf-hover' => array( 'x' => 14, 'y' => 14, 'css' => '.alert-notifications:hover .phabricator-main-menu-message-icon', ), 'conf-unseen' => array( 'x' => 14, 'y' => 14, 'css' => '.alert-notifications.message-unread '. '.phabricator-main-menu-message-icon', ), ); $scales = array( '1x' => 1, '2x' => 2, ); $template = new PhutilSprite(); foreach ($sources as $name => $spec) { $sprite = id(clone $template) ->setName($name) ->setSourceSize($spec['x'], $spec['y']) ->setTargetCSS($spec['css']); foreach ($scales as $scale_name => $scale) { $path = 'menu_'.$scale_name.'/'.$name.'.png'; $path = $this->getPath($path); $sprite->setSourceFile($path, $scale); } $sprites[] = $sprite; } $sheet = $this->buildSheet('menu', true); $sheet->setScales($scales); foreach ($sprites as $sprite) { $sheet->addSprite($sprite); } return $sheet; } + public function buildConpherenceSheet() { + $icons = $this->getDirectoryList('conpher_1x'); + $scales = array( + '1x' => 1, + '2x' => 2, + ); + $template = id(new PhutilSprite()) + ->setSourceSize(32, 32); + + $sprites = array(); + foreach ($icons as $icon) { + $color = preg_match('/_on/', $icon) ? 'on' : 'off'; + + $prefix = 'conpher_'; + + $sprite = id(clone $template) + ->setName($prefix.$icon); + + $tcss = array(); + $tcss[] = '.'.$prefix.$icon; + if ($color == 'on') { + $class = str_replace('_on', '_off', $prefix.$icon); + $tcss[] = '.device-desktop .'.$class.':hover '; + } + + $sprite->setTargetCSS(implode(', ', $tcss)); + + foreach ($scales as $scale_key => $scale) { + $path = $this->getPath($prefix.$scale_key.'/'.$icon.'.png'); + $sprite->setSourceFile($path, $scale); + } + $sprites[] = $sprite; + } + + $sheet = $this->buildSheet('conpher', true); + $sheet->setScales($scales); + foreach ($sprites as $sprite) { + $sheet->addSprite($sprite); + } + + return $sheet; + } + public function buildGradientSheet() { $gradients = $this->getDirectoryList('gradients'); $template = new PhutilSprite(); $unusual_heights = array( 'dark-menu-label' => 25, 'breadcrumbs' => 31, 'menu-hover' => 28, 'menu-label' => 24, 'menu-selected' => 28, ); // Reorder the sprites so less-specific rules generate earlier in the sheet. // Otherwise we end up with blue "a.black" buttons because the blue rules // have the same specificity but appear later. $gradients = array_fuse($gradients); $gradients = array_select_keys( $gradients, array( 'blue-dark', 'blue-light', )) + $gradients; $extra_css = array( 'black-dark' => ', button.black, a.black, a.black:visited', 'black-light' => ', button.black:active, a.black:active', 'blue-dark' => ', button, a.button, a.button:visited, input.inputsubmit', 'blue-light' => ', button:active, a.button:active', 'grey-dark' => ', button.grey, input.inputaux, a.grey, a.grey:visited, '. 'a.button.disabled, button[disabled], button.disabled', 'grey-light' => ', button.grey:active, a.grey:active, '. 'button.grey_active, a.dropdown-open', 'green-dark' => ', button.green, a.green, a.green:visited', 'green-light' => ', button.green:active, a.green:active', 'dark-menu-label' => ', .phabricator-dark-menu .phabricator-menu-item-type-label', 'menu-label' => ', .phabricator-side-menu .phabricator-menu-item-type-label', 'menu-hover' => ', .device-desktop .phabricator-side-menu '. 'a.phabricator-menu-item-type-link:hover, '. '.phabricator-filetree a.phabricator-filetree-item:hover', 'menu-selected' => ', .phabricator-side-menu .phabricator-menu-item-selected, '. '.device-desktop .phabricator-side-menu '. 'a.phabricator-menu-item-selected:hover, '. '.phabricator-nav-local a.phabricator-active-nav-focus', ); $sprites = array(); foreach ($gradients as $gradient) { $path = $this->getPath('gradients/'.$gradient.'.png'); $sprite = id(clone $template) ->setName('gradient-'.$gradient) ->setSourceFile($path) ->setTargetCSS('.gradient-'.$gradient.idx($extra_css, $gradient)); $sprite->setSourceSize(4, idx($unusual_heights, $gradient, 26)); $sprites[] = $sprite; } $sheet = $this->buildSheet( 'gradient', false, PhutilSpriteSheet::TYPE_REPEAT_X, ', button, a.button, a.button:visited, input.inputsubmit, '. '.phabricator-dark-menu .phabricator-menu-item-type-label, '. '.phabricator-side-menu .phabricator-menu-item-type-label, '. '.device-desktop .phabricator-side-menu '. 'a.phabricator-menu-item-type-link:hover, '. '.phabricator-side-menu .phabricator-menu-item-selected, '. '.device-desktop .phabricator-side-menu '. 'a.phabricator-menu-item-selected:hover, '. '.phabricator-filetree a.phabricator-filetree-item:hover, '. '.phabricator-filetree a.phabricator-active-nav-focus'); foreach ($sprites as $sprite) { $sheet->addSprite($sprite); } return $sheet; } public function buildAppsSheet() { return $this->buildAppsSheetVariant(1); } public function buildAppsLargeSheet() { return $this->buildAppsSheetVariant(2); } public function buildAppsXLargeSheet() { return $this->buildAppsSheetVariant(3); } private function buildAppsSheetVariant($variant) { if ($variant == 1) { $scales = array( '1x' => 1, '2x' => 2, ); $variant_name = 'apps'; $variant_short = ''; $size_x = 14; $size_y = 14; $colors = array( 'dark' => 'dark', ); } else if ($variant == 2) { $scales = array( '2x' => 1, '4x' => 2, ); $variant_name = 'apps-large'; $variant_short = '-large'; $size_x = 28; $size_y = 28; $colors = array( 'light' => 'lb', 'dark' => 'dark', 'blue' => 'blue', 'glow' => 'glow', ); } else { $scales = array( '4x' => 1, ); $variant_name = 'apps-xlarge'; $variant_short = '-xlarge'; $size_x = 56; $size_y = 56; $colors = array( 'dark' => 'dark', /* TODO: These are available but not currently used. 'blue' => 'blue', 'light' => 'lb', 'glow' => 'glow', */ ); } $apps = $this->getDirectoryList('apps_dark_1x'); $template = id(new PhutilSprite()) ->setSourceSize($size_x, $size_y); $sprites = array(); foreach ($apps as $app) { foreach ($colors as $color => $color_path) { $css = '.app-'.$app.'-'.$color.$variant_short; if ($color == 'blue' && $variant_name == 'apps-large') { $css .= ', .phabricator-crumb-view:hover .app-'.$app.'-dark-large'; } if ($color == 'glow' && $variant_name == 'apps-large') { $css .= ', .device-desktop .phabricator-dark-menu a:hover '. '.app-'.$app.'-light-large'; } $sprite = id(clone $template) ->setName('app-'.$app.'-'.$color.$variant_short) ->setTargetCSS($css); foreach ($scales as $scale_name => $scale) { $path = $this->getPath( 'apps_'.$color_path.'_'.$scale_name.'/'.$app.'.png'); $sprite->setSourceFile($path, $scale); } $sprites[] = $sprite; } } $sheet = $this->buildSheet($variant_name, count($scales) > 1); $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, $has_retina, $type = null, $extra_css = '') { $sheet = new PhutilSpriteSheet(); $at = '@'; switch ($type) { case PhutilSpriteSheet::TYPE_STANDARD: default: $type = PhutilSpriteSheet::TYPE_STANDARD; $repeat_rule = 'no-repeat'; break; case PhutilSpriteSheet::TYPE_REPEAT_X: $repeat_rule = 'repeat-x'; break; case PhutilSpriteSheet::TYPE_REPEAT_Y: $repeat_rule = 'repeat-y'; break; } $retina_rules = null; if ($has_retina) { $retina_rules = <<setSheetType($type); $sheet->setCSSHeader(<<setBaseURI($some_uri) * ->addLabel('Cats') * ->addFilter('meow', 'Meow') * ->addFilter('purr', 'Purr') * ->addLabel('Dogs') * ->addFilter('woof', 'Woof') * ->addFilter('bark', 'Bark'); * $valid_filter = $nav->selectFilter($user_selection, $default = 'meow'); * */ final class AphrontSideNavFilterView extends AphrontView { private $items = array(); private $baseURI; private $selectedFilter = false; private $flexible; private $active; private $menu; private $crumbs; private $classes = array(); private $menuID; public function setMenuID($menu_id) { $this->menuID = $menu_id; return $this; } public function getMenuID() { return $this->menuID; } public function __construct() { $this->menu = new PhabricatorMenuView(); } public function addClass($class) { $this->classes[] = $class; return $this; } public static function newFromMenu(PhabricatorMenuView $menu) { $object = new AphrontSideNavFilterView(); $object->setBaseURI(new PhutilURI('/')); $object->menu = $menu; return $object; } public function setCrumbs(PhabricatorCrumbsView $crumbs) { $this->crumbs = $crumbs; return $this; } public function getCrumbs() { return $this->crumbs; } public function setActive($active) { $this->active = $active; return $this; } public function setFlexible($flexible) { $this->flexible = $flexible; return $this; } public function getMenuView() { return $this->menu; } public function addMenuItem(PhabricatorMenuItemView $item) { $this->menu->addMenuItem($item); return $this; } public function getMenu() { return $this->menu; } - public function addFilter( + public function addFilter($key, $name, $uri = null) { + return $this->addThing( + $key, $name, $uri, PhabricatorMenuItemView::TYPE_LINK); + } + + public function addButton($key, $name, $uri = null) { + return $this->addThing( + $key, $name, $uri, PhabricatorMenuItemView::TYPE_BUTTON); + } + + private function addThing( $key, $name, - $uri = null) { + $uri = null, + $type) { $item = id(new PhabricatorMenuItemView()) - ->setName($name); + ->setName($name) + ->setType($type); if (strlen($key)) { $item->setKey($key); } if ($uri) { $item->setHref($uri); } else { $href = clone $this->baseURI; $href->setPath(rtrim($href->getPath().$key, '/').'/'); $href = (string)$href; $item->setHref($href); } return $this->addMenuItem($item); } public function addCustomBlock($block) { $this->menu->appendChild($block); return $this; } public function addLabel($name) { return $this->addMenuItem( id(new PhabricatorMenuItemView()) ->setType(PhabricatorMenuItemView::TYPE_LABEL) ->setName($name)); } public function setBaseURI(PhutilURI $uri) { $this->baseURI = $uri; return $this; } public function getBaseURI() { return $this->baseURI; } public function selectFilter($key, $default = null) { $this->selectedFilter = $default; if ($this->menu->getItem($key) && strlen($key)) { $this->selectedFilter = $key; } return $this->selectedFilter; } public function getSelectedFilter() { return $this->selectedFilter; } public function render() { if ($this->menu->getItems()) { if (!$this->baseURI) { throw new Exception("Call setBaseURI() before render()!"); } if ($this->selectedFilter === false) { throw new Exception("Call selectFilter() before render()!"); } } if ($this->selectedFilter !== null) { $selected_item = $this->menu->getItem($this->selectedFilter); if ($selected_item) { $selected_item->addClass('phabricator-menu-item-selected'); } } require_celerity_resource('phabricator-side-menu-view-css'); return $this->renderFlexNav(); } private function renderFlexNav() { $user = $this->user; require_celerity_resource('phabricator-nav-view-css'); $nav_classes = array(); $nav_classes[] = 'phabricator-nav'; $nav_id = null; $drag_id = null; $content_id = celerity_generate_unique_node_id(); $local_id = null; $background_id = null; $local_menu = null; $main_id = celerity_generate_unique_node_id(); if ($this->flexible) { $nav_classes[] = 'has-drag-nav'; $drag_id = celerity_generate_unique_node_id(); $flex_bar = phutil_tag( 'div', array( 'class' => 'phabricator-nav-drag', 'id' => $drag_id, ), ''); } else { $flex_bar = null; } $nav_menu = null; if ($this->menu->getItems()) { $local_id = celerity_generate_unique_node_id(); $background_id = celerity_generate_unique_node_id(); $nav_classes[] = 'has-local-nav'; $menu_background = phutil_tag( 'div', array( 'class' => 'phabricator-nav-column-background', 'id' => $background_id, ), ''); $local_menu = $menu_background.phutil_render_tag( 'div', array( 'class' => 'phabricator-nav-local phabricator-side-menu', 'id' => $local_id, ), self::renderSingleView($this->menu->setID($this->getMenuID())) ); } $crumbs = null; if ($this->crumbs) { $crumbs = $this->crumbs->render(); $nav_classes[] = 'has-crumbs'; } if ($this->flexible) { $nav_classes[] = 'has-drag-nav'; Javelin::initBehavior( 'phabricator-nav', array( 'mainID' => $main_id, 'localID' => $local_id, 'dragID' => $drag_id, 'contentID' => $content_id, 'backgroundID' => $background_id, )); if ($this->active) { Javelin::initBehavior( 'phabricator-active-nav', array( 'localID' => $local_id, )); } } $nav_classes = array_merge($nav_classes, $this->classes); return phutil_render_tag( 'div', array( 'class' => implode(' ', $nav_classes), 'id' => $main_id, ), $local_menu. $flex_bar. phutil_render_tag( 'div', array( 'class' => 'phabricator-nav-content', 'id' => $content_id, ), $crumbs.$this->renderChildren())); } } diff --git a/src/view/layout/PhabricatorMenuItemView.php b/src/view/layout/PhabricatorMenuItemView.php index 768ee2a709..ab5e21c410 100644 --- a/src/view/layout/PhabricatorMenuItemView.php +++ b/src/view/layout/PhabricatorMenuItemView.php @@ -1,131 +1,132 @@ property = $property; return $this; } public function getProperty() { return $this->property; } public function setSelected($selected) { $this->selected = $selected; return $this; } public function getSelected() { return $this->selected; } public function setIcon($icon) { $this->icon = $icon; return $this; } public function getIcon() { return $this->icon; } public function setKey($key) { $this->key = (string)$key; return $this; } public function getKey() { return $this->key; } public function setType($type) { $this->type = $type; return $this; } public function getType() { return $this->type; } public function setHref($href) { $this->href = $href; return $this; } public function getHref() { return $this->href; } public function setName($name) { $this->name = $name; return $this; } public function getName() { return $this->name; } public function setIsExternal($is_external) { $this->isExternal = $is_external; return $this; } public function getIsExternal() { return $this->isExternal; } public function setSortOrder($order) { $this->sortOrder = $order; return $this; } public function getSortOrder() { return $this->sortOrder; } protected function getTagName() { return $this->href ? 'a' : 'div'; } protected function getTagAttributes() { return array( 'class' => array( 'phabricator-menu-item-view', 'phabricator-menu-item-'.$this->type, ), 'href' => $this->href, ); } protected function getTagContent() { $name = null; if ($this->name) { $external = null; if ($this->isExternal) { $external = " \xE2\x86\x97"; } $name = phutil_tag( 'span', array( 'class' => 'phabricator-menu-item-name', ), $this->name.$external); } return $this->renderChildren().$name; } } diff --git a/src/view/layout/PhabricatorMenuView.php b/src/view/layout/PhabricatorMenuView.php index 334c5e3ab0..b5e7fc8a8d 100644 --- a/src/view/layout/PhabricatorMenuView.php +++ b/src/view/layout/PhabricatorMenuView.php @@ -1,75 +1,86 @@ setType(PhabricatorMenuItemView::TYPE_LABEL) ->setName($name); $this->addMenuItem($item); return $item; } public function newLink($name, $href) { $item = id(new PhabricatorMenuItemView()) ->setType(PhabricatorMenuItemView::TYPE_LINK) ->setName($name) ->setHref($href); $this->addMenuItem($item); return $item; } + public function newButton($name, $href) { + $item = id(new PhabricatorMenuItemView()) + ->setType(PhabricatorMenuItemView::TYPE_BUTTON) + ->setName($name) + ->setHref($href); + + $this->addMenuItem($item); + + return $item; + } + public function addMenuItem(PhabricatorMenuItemView $item) { $key = $item->getKey(); $this->items[] = $item; $this->appendChild($item); return $this; } public function getItem($key) { $key = (string)$key; // NOTE: We could optimize this, but need to update any map when items have // their keys change. Since that's moderately complex, wait for a profile // or use case. foreach ($this->items as $item) { if ($item->getKey() == $key) { return $item; } } return null; } public function getItems() { return $this->items; } protected function willRender() { $key_map = array(); foreach ($this->items as $item) { $key = $item->getKey(); if ($key !== null) { if (isset($key_map[$key])) { throw new Exception( "Menu contains duplicate items with key '{$key}'!"); } $key_map[$key] = $item; } } } protected function getTagAttributes() { return array( 'class' => 'phabricator-menu-view', ); } } diff --git a/src/view/page/menu/PhabricatorMainMenuView.php b/src/view/page/menu/PhabricatorMainMenuView.php index e56ab6bcee..45922530c9 100644 --- a/src/view/page/menu/PhabricatorMainMenuView.php +++ b/src/view/page/menu/PhabricatorMainMenuView.php @@ -1,422 +1,423 @@ applicationMenu = $application_menu; return $this; } public function getApplicationMenu() { return $this->applicationMenu; } public function setController(PhabricatorController $controller) { $this->controller = $controller; return $this; } public function getController() { return $this->controller; } public function setDefaultSearchScope($default_search_scope) { $this->defaultSearchScope = $default_search_scope; return $this; } public function getDefaultSearchScope() { return $this->defaultSearchScope; } public function render() { $user = $this->user; require_celerity_resource('phabricator-main-menu-view'); $header_id = celerity_generate_unique_node_id(); $menus = array(); $alerts = array(); if ($user->isLoggedIn()) { list($menu, $dropdown) = $this->renderNotificationMenu(); $alerts[] = $menu; $menus[] = $dropdown; } $phabricator_menu = $this->renderPhabricatorMenu(); if ($alerts) { $alerts = phutil_render_tag( 'div', array( 'class' => 'phabricator-main-menu-alerts', ), self::renderSingleView($alerts)); } $application_menu = $this->getApplicationMenu(); if ($application_menu) { $application_menu->addClass('phabricator-dark-menu'); $application_menu->addClass('phabricator-application-menu'); } return phutil_render_tag( 'div', array( 'class' => 'phabricator-main-menu', 'id' => $header_id, ), self::renderSingleView( array( $this->renderPhabricatorMenuButton($header_id), $application_menu ? $this->renderApplicationMenuButton($header_id) : null, $this->renderPhabricatorLogo(), $alerts, $phabricator_menu, $application_menu, ))). self::renderSingleView($menus); } private function renderSearch() { $user = $this->user; $result = null; $keyboard_config = array( 'helpURI' => '/help/keyboardshortcut/', ); if ($user->isLoggedIn()) { $search = new PhabricatorMainMenuSearchView(); $search->setUser($user); $search->setScope($this->getDefaultSearchScope()); $result = $search; $pref_shortcut = PhabricatorUserPreferences::PREFERENCE_SEARCH_SHORTCUT; if ($user->loadPreferences()->getPreference($pref_shortcut, true)) { $keyboard_config['searchID'] = $search->getID(); } } Javelin::initBehavior('phabricator-keyboard-shortcuts', $keyboard_config); if ($result) { $result = id(new PhabricatorMenuItemView()) ->addClass('phabricator-main-menu-search') ->appendChild($result); } return $result; } private function renderPhabricatorMenuButton($header_id) { return javelin_tag( 'a', array( 'class' => 'phabricator-main-menu-expand-button '. 'phabricator-expand-core-menu', 'sigil' => 'jx-toggle-class', 'meta' => array( 'map' => array( $header_id => 'phabricator-core-menu-expanded', ), ), ), phutil_tag( 'span', array( 'class' => 'phabricator-menu-button-icon sprite-menu menu-icon-eye', ), '')); } public function renderApplicationMenuButton($header_id) { return javelin_tag( 'a', array( 'class' => 'phabricator-main-menu-expand-button '. 'phabricator-expand-application-menu', 'sigil' => 'jx-toggle-class', 'meta' => array( 'map' => array( $header_id => 'phabricator-application-menu-expanded', ), ), ), phutil_tag( 'span', array( 'class' => 'phabricator-menu-button-icon sprite-menu menu-icon-app', ), '')); } private function renderPhabricatorMenu() { $user = $this->getUser(); $controller = $this->getController(); $applications = PhabricatorApplication::getAllInstalledApplications(); $applications = msort($applications, 'getName'); $core = array(); $more = array(); $actions = array(); require_celerity_resource('sprite-apps-large-css'); $group_core = PhabricatorApplication::GROUP_CORE; foreach ($applications as $application) { if ($application->shouldAppearInLaunchView()) { $icon = $application->getIconName().'-light-large'; $item = id(new PhabricatorMenuItemView()) ->setName($application->getName()) ->setHref($application->getBaseURI()) ->appendChild($this->renderMenuIcon($icon)); if ($application->getApplicationGroup() == $group_core) { $core[] = $item; } else { $more[] = $item; } } $app_actions = $application->buildMainMenuItems($user, $controller); foreach ($app_actions as $action) { $actions[] = $action; } } $view = new PhabricatorMenuView(); $view->addClass('phabricator-dark-menu'); $view->addClass('phabricator-core-menu'); $search = $this->renderSearch(); $view->appendChild($search); $view ->newLabel(pht('Home')) ->addClass('phabricator-core-item-device'); $view->addMenuItem( id(new PhabricatorMenuItemView()) ->addClass('phabricator-core-item-device') ->setName(pht('Phabricator Home')) ->setHref('/') ->appendChild($this->renderMenuIcon('logo-light-large'))); if ($controller && $controller->getCurrentApplication()) { $application = $controller->getCurrentApplication(); $icon = $application->getIconName().'-light-large'; $view->addMenuItem( id(new PhabricatorMenuItemView()) ->addClass('phabricator-core-item-device') ->setName(pht('%s Home', $application->getName())) ->appendChild($this->renderMenuIcon($icon)) ->setHref($controller->getApplicationURI())); } if ($core) { $view->addMenuItem( id(new PhabricatorMenuItemView()) ->addClass('phabricator-core-item-device') ->setType(PhabricatorMenuItemView::TYPE_LABEL) ->setName(pht('Core Applications'))); foreach ($core as $item) { $item->addClass('phabricator-core-item-device'); $view->addMenuItem($item); } } if ($actions) { $actions = msort($actions, 'getSortOrder'); $view->addMenuItem( id(new PhabricatorMenuItemView()) ->addClass('phabricator-core-item-device') ->setType(PhabricatorMenuItemView::TYPE_LABEL) ->setName(pht('Actions'))); foreach ($actions as $action) { $icon = $action->getIcon(); if ($icon) { if ($action->getSelected()) { $action->appendChild($this->renderMenuIcon($icon.'-blue-large')); } else { $action->appendChild($this->renderMenuIcon($icon.'-light-large')); } } $view->addMenuItem($action); } } if ($more) { $view->addMenuItem( id(new PhabricatorMenuItemView()) ->addClass('phabricator-core-item-device') ->setType(PhabricatorMenuItemView::TYPE_LABEL) ->setName(pht('More Applications'))); foreach ($more as $item) { $item->addClass('phabricator-core-item-device'); $view->addMenuItem($item); } } return $view; } private function renderPhabricatorLogo() { return phutil_tag( 'a', array( 'class' => 'phabricator-main-menu-logo', 'href' => '/', ), phutil_tag( 'span', array( 'class' => 'sprite-menu phabricator-main-menu-logo-image', ), '')); } private function renderNotificationMenu() { $user = $this->user; require_celerity_resource('phabricator-notification-css'); require_celerity_resource('phabricator-notification-menu-css'); require_celerity_resource('sprite-menu-css'); $container_classes = array( 'sprite-menu', 'alert-notifications', ); $conpherence = id(new PhabricatorApplicationConpherence())->isBeta(); $allow_beta = PhabricatorEnv::getEnvConfig('phabricator.show-beta-applications'); $message_tag = ''; if (!$conpherence || $allow_beta) { $message_id = celerity_generate_unique_node_id(); $message_count_id = celerity_generate_unique_node_id(); $unread_status = ConpherenceParticipationStatus::BEHIND; $unread = id(new ConpherenceParticipantQuery()) ->withParticipantPHIDs(array($user->getPHID())) ->withParticipationStatus($unread_status) ->execute(); $message_count_number = count($unread); if ($message_count_number > 999) { $message_count_number = "\xE2\x88\x9E"; } $message_count_tag = phutil_tag( 'span', array( 'id' => $message_count_id, 'class' => 'phabricator-main-menu-message-count' ), $message_count_number); $message_icon_tag = phutil_tag( 'span', array( 'class' => 'sprite-menu phabricator-main-menu-message-icon', ), ''); if ($message_count_number) { $container_classes[] = 'message-unread'; } $message_tag = phutil_tag( 'a', array( 'href' => '/conpherence/', 'class' => implode(' ', $container_classes), 'id' => $message_id, ), array( $message_icon_tag, $message_count_tag, )); } $count_id = celerity_generate_unique_node_id(); $dropdown_id = celerity_generate_unique_node_id(); $bubble_id = celerity_generate_unique_node_id(); $count_number = id(new PhabricatorFeedStoryNotification()) ->countUnread($user); if ($count_number > 999) { $count_number = "\xE2\x88\x9E"; } $count_tag = phutil_tag( 'span', array( 'id' => $count_id, 'class' => 'phabricator-main-menu-alert-count' ), $count_number); $icon_tag = phutil_tag( 'span', array( 'class' => 'sprite-menu phabricator-main-menu-alert-icon', ), ''); if ($count_number) { $container_classes[] = 'alert-unread'; } $bubble_tag = phutil_tag( 'a', array( 'href' => '/notification/', 'class' => implode(' ', $container_classes), 'id' => $bubble_id, ), array($icon_tag, $count_tag)); Javelin::initBehavior( 'aphlict-dropdown', array( 'bubbleID' => $bubble_id, 'countID' => $count_id, 'dropdownID' => $dropdown_id, + 'loadingText' => pht('Loading...'), )); $notification_dropdown = javelin_tag( 'div', array( 'id' => $dropdown_id, 'class' => 'phabricator-notification-menu', 'sigil' => 'phabricator-notification-menu', 'style' => 'display: none;', ), ''); return array( $bubble_tag.$message_tag, $notification_dropdown); } private function renderMenuIcon($name) { return phutil_tag( 'span', array( 'class' => 'phabricator-core-menu-icon '. 'sprite-apps-large app-'.$name, ), ''); } } diff --git a/webroot/rsrc/css/aphront/panel-view.css b/webroot/rsrc/css/aphront/panel-view.css index ce5d3944a3..fd6a3aaa91 100644 --- a/webroot/rsrc/css/aphront/panel-view.css +++ b/webroot/rsrc/css/aphront/panel-view.css @@ -1,126 +1,130 @@ /** * @provides aphront-panel-view-css */ .aphront-panel-view { background: #f3f3f3; border: 1px solid #c0c0c0; border-width: 1px 0 0; padding: 1em 2em; margin: 20px 20px 40px 20px; } .device-phone .aphront-panel-view { margin: 20px 10px 40px 10px; } .aphront-unpadded-panel-view { padding: 0; } .aphront-panel-view.aphront-panel-plain { padding: 0; border: none; background: transparent; } .aphront-panel-view .aphront-panel-header { margin: 0 0 1em 0; } .aphront-panel-view h1 { font-size: 16px; font-weight: bold; color: #555; padding: 4px 0 0 0; } .aphront-panel-plain h1 { padding: 0 0 4px 0; } .aphront-panel-view-caption { font-size: 11px; color: #666666; margin-top: -0.1em; margin-bottom: 0.75em; } .aphront-panel-view-buttons { float: right; } .aphront-panel-view p.aphront-panel-instructions { margin: .5em 2em .75em; font-size: 13px; } .device-desktop .aphront-panel-width-form { width: 720px; margin-right: auto; margin-left: auto; } .device-desktop .aphront-panel-width-wide { width: 1080px; margin-right: auto; margin-left: auto; } .aphront-panel-accent { background: #f1f1f1; border: 1px solid #ddd; border-radius: 3px; } .aphront-panel-accent .aphront-form-view { background: #f7f7f7; border: 1px solid #c4c4c0; border-radius: 3px; } .aphront-panel-preview { background: #fbfbfb; border-bottom: 1px solid #aaaaaa; padding: 15px 20px; } +.device-phone .aphront-panel-preview { + display: none; +} + .aphront-panel-preview-wide { width: 1080px; margin-left: auto; margin-right: auto; padding-left: 2em; padding-right: 2em; } .aphront-panel-preview-loading-text { color: #666666; } .aphront-panel-flush { margin: 0; } .aphront-panel-view-drag-and-drop { background: #99ff99; border-color: #669966; } .aphront-panel-view-drag-and-drop .aphront-form-view { background: #ccffcc; border-color: #669966; } .aphront-mini-panel-view { background: #f3f3f3; padding: 10px; margin: 5px 20px; border: 1px solid #e6e6e6; } .aphront-mini-panel-view p { font-size: 12px; color: #666666; } diff --git a/webroot/rsrc/css/aphront/phabricator-nav-view.css b/webroot/rsrc/css/aphront/phabricator-nav-view.css index a9338387fb..5c1da125a9 100644 --- a/webroot/rsrc/css/aphront/phabricator-nav-view.css +++ b/webroot/rsrc/css/aphront/phabricator-nav-view.css @@ -1,91 +1,85 @@ /** * @provides phabricator-nav-view-css */ .jx-drag-col { cursor: col-resize; } .phabricator-nav { /* Force top margins in page content not to collapse with the top margin of the navigation container by giving it padding. Then put it in the right position by undoing the padding with a margin. */ padding-top: 1px; margin-top: -1px; } .phabricator-nav-column-background { position: fixed; top: 0; left: 0; bottom: 0; width: 205px; background: #33383b; box-shadow: inset -3px 0 4px rgba(0, 0, 0, 0.05); background-image: url(/rsrc/image/menu_texture.png); } .phabricator-nav-column-background, .phabricator-nav-local, .phabricator-nav-drag { display: none; } .device-desktop .has-local-nav .phabricator-nav-column-background, .device-desktop .has-local-nav .phabricator-nav-local, .device-desktop .has-local-nav .phabricator-nav-drag { display: block; } .phabricator-nav-local { width: 205px; position: absolute; left: 0; white-space: nowrap; overflow-x: hidden; overflow-y: auto; } .phabricator-nav-drag { position: fixed; top: 0; bottom: 0; left: 205px; width: 7px; cursor: col-resize; background: #f5f5f5; border-style: solid; border-width: 0 1px 0 1px; border-color: #fff #999c9e #fff #999c9e; box-shadow: inset -1px 0px 1px rgba(0, 0, 0, 0.15); background-image: url(/rsrc/image/divot.png); background-position: center; background-repeat: no-repeat; } .device-desktop .phabricator-standard-page-body .has-drag-nav .phabricator-nav-content { margin-left: 212px; } .device-desktop .has-local-nav .phabricator-nav-content { margin-left: 205px; } .phabricator-side-menu-home .phabricator-nav-column-background, .phabricator-side-menu-home .phabricator-nav-local { width: 240px; } .device-desktop .phabricator-side-menu-home .phabricator-nav-content { margin-left: 240px; } - -/* Chrome annoyingly has a url display over the nav - if the nav is the tallest page (home) */ -.phabricator-menu-view { - margin-bottom: 40px; -} diff --git a/webroot/rsrc/css/aphront/transaction.css b/webroot/rsrc/css/aphront/transaction.css index 6eb4052f77..2c8c3618ab 100644 --- a/webroot/rsrc/css/aphront/transaction.css +++ b/webroot/rsrc/css/aphront/transaction.css @@ -1,43 +1,53 @@ /** * @provides phabricator-transaction-view-css */ .phabricator-transaction-view { background: 0px 2px no-repeat; margin: 1em 0 1.25em; min-height: 50px; padding: 2px 0px; } +.device-phone .phabricator-transaction-view { + margin: 10px 0; +} + .phabricator-transaction-detail { border-color: #dddddd; border-width: 1px 10px; border-style: solid; margin-left: 54px; } .device-phone .phabricator-transaction-detail { margin: 0; + min-height: 50px; + background: #fff; } .phabricator-transaction-header { background: #f3f3f3; padding: 4px 1em; } .phabricator-transaction-header a { font-weight: bold; } .phabricator-transaction-info { - color: #666666; - float: right; - font-size: 11px; + color: #777; + float: right; + font-size: 11px; +} + +.device-phone .phabricator-transaction-info { + display: none; } .phabricator-transaction-content { background: #fcfcfc; line-height: 1.4em; padding: .3em 1em; overflow: auto; } diff --git a/webroot/rsrc/css/application/base/main-menu-view.css b/webroot/rsrc/css/application/base/main-menu-view.css index 6ce50a0004..ad3f65c090 100644 --- a/webroot/rsrc/css/application/base/main-menu-view.css +++ b/webroot/rsrc/css/application/base/main-menu-view.css @@ -1,436 +1,440 @@ /** * @provides phabricator-main-menu-view */ /* - Main Menu ----------------------------------------------------------------- Main menu at the top of every page that has chrome. It reacts to resolution changes in order to behave reasonably on tablets and phones. */ .phabricator-main-menu { background: #2d3236; background-image: url(/rsrc/image/main_texture.png); background-repeat: repeat-x; position: relative; box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.25); min-height: 44px; } .device-desktop .phabricator-main-menu { height: 44px; } .phabricator-main-menu a:hover { text-decoration: none; } /* - Logo ---------------------------------------------------------------------- The "Phabricator" logo group in the main menu. On tablet and phone devices, this shows a "reveal" button to expand/collapse the rest of the menu. */ .device-desktop .phabricator-main-menu-group-logo { float: left; } .phabricator-main-menu-logo { display: inline-block; width: 139px; + height: 44px; + float: left; margin-right: 6px; padding-right: 6px; padding-left: 6px; } .phabricator-main-menu-logo:hover { background-color: #3a4247; } .phabricator-main-menu-logo-image { position: absolute; width: 139px; height: 25px; top: 9px; } .device .phabricator-main-menu-logo { display: none; } /* - Expand/Collapse Button ---------------------------------------------------- On phones, the menu switches to a vertical layout and uses a button to expand or collapse the items. */ .phabricator-main-menu-expand-button { position: absolute; top: 7px; display: block; width: 40px; height: 28px; background-color: #22292d; border-radius: 6px; border: 1px solid #111111; box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); } .phabricator-menu-button-icon { position: absolute; width: 24px; height: 20px; top: 5px; left: 8px; } .phabricator-expand-core-menu { left: 10px; } .phabricator-expand-application-menu { right: 10px; } .device-desktop .phabricator-main-menu-expand-button { display: none; } .device .phabricator-main-menu-expand-button { display: block; } .phabricator-core-menu-expanded .phabricator-expand-core-menu, .phabricator-application-menu-expanded .phabricator-expand-application-menu { background-color: #55595d; } /* - Search -------------------------------------------------------------------- The main search input in the menu bar. */ .device-desktop .phabricator-main-menu-search { width: 220px; } .phabricator-main-menu-search-container { padding: 10px 0; position: relative; height: 24px; } .phabricator-main-menu-search-target { position: absolute; top: 46px; } .device-desktop .phabricator-main-menu-search-target { width: 320px; margin-left: -150px; } .device .phabricator-main-menu-search-target { width: 100%; margin-left: -25px; } .device-desktop .phabricator-main-menu-search-container { margin: 0 8px 0 50px; } .device .phabricator-main-menu-search-container { + padding: 0; margin: 0 18px 0 60px; } .phabricator-main-menu-search input { outline: 0; margin: 0; width: 100%; right: 0; position: absolute; border: 1px solid #333333; border-radius: 12px; background: #555555; height: 12px; line-height: 12px; box-shadow: 0px 1px 1px rgba(128, 128, 128, 0.25); padding: 6px 32px 6px 10px; } +.device .phabricator-main-menu-search input { + height: 16px; + font-size: 15px; + border-radius: 15px; +} + .phabricator-main-menu-search input:focus { background: #c9c9c9; } .phabricator-main-menu-search input.jx-typeahead-placeholder { color: #999999; } .phabricator-main-menu-search button { position: absolute; color: transparent; background: transparent 5px 6px url(/rsrc/image/search.png) no-repeat; border: none; outline: none; box-shadow: none; text-shadow: none; min-width: 0; height: 20px; width: 20px; top: 11px; right: 6px; } +.device .phabricator-main-menu-search button { + top: 3px; +} + + .phabricator-main-menu-search-target div.jx-typeahead-results { border-radius: 4px; box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.35); border: 1px solid #33393d; } .phabricator-main-menu-search-target div.jx-typeahead-results a.jx-result { border: 0; } .phabricator-main-menu-search-target div.jx-typeahead-results a.focused, .phabricator-main-menu-search-target div.jx-typeahead-results a:hover { background: #3875d7; } .phabricator-main-search-typeahead-result { display: block; padding: 4px 4px 4px 38px; background-position: 4px 4px; background-size: 25px 25px; background-repeat: no-repeat; } .phabricator-main-search-typeahead-result .result-name { display: block; font-weight: bold; color: #444444; } .focused .phabricator-main-search-typeahead-result .result-name, a:hover .phabricator-main-search-typeahead-result .result-name { color: #eeeeee; } .phabricator-main-search-typeahead-result .result-type { color: #888888; } .focused .phabricator-main-search-typeahead-result .result-type, a:hover .phabricator-main-search-typeahead-result .result-type { color: #dddddd; } /* - Alert --------------------------------------------------------------------- Alert menus are like icon menus but don't obey collapse rules. */ .device .phabricator-main-menu-alerts { margin-left: 60px; } .phabricator-main-menu-alerts { display: inline-block; border-radius: 15px; + float: left; background: rgba(0,0,0,.2); height: 20px; padding: 3px 10px; margin-top: 9px; } .phabricator-main-menu-alert-icon, .phabricator-main-menu-message-icon { width: 14px; height: 14px; display: block; float: left; margin: 2px 0 0 0; } .alert-notifications .phabricator-main-menu-message-icon { margin: 3px 0 0 8px; } .phabricator-main-menu-alert-count, .phabricator-main-menu-message-count { font-weight: bold; line-height: 20px; color: #ffffff; text-align: center; display: none; float: left; margin-left: 3px; } .alert-unread .phabricator-main-menu-alert-count, .message-unread .phabricator-main-menu-message-count { display: block; } /* - Dark Menu ----------------------------------------------------------------- Styles shared between the "core" menu (left button on mobile) and "application" menu (right button on mobile). These styles give the menu a white-on-black appearance. */ .device .phabricator-dark-menu, .device .phabricator-dark-menu a.phabricator-menu-item-type-link { color: #fff; -} -.device .phabricator-dark-menu .phabricator-menu-item-view { - display: block; - padding: 4px 0; } .device .phabricator-dark-menu .phabricator-menu-item-type-label { text-transform: uppercase; - font-size: 11px; + font-size: 12px; background-color: #151719; padding: 0 0 0 12px; - height: 24px; -} - -.device .phabricator-dark-menu .phabricator-menu-item-type-spacer { - display: none; + height: 25px; + font-weight: bold; } .device .phabricator-dark-menu .phabricator-menu-item-type-label .phabricator-menu-item-name { display: block; padding: 6px 0 0; } .device .phabricator-dark-menu .phabricator-menu-item-type-link { border-width: 1px 0; border-style: solid; border-color: #34373b transparent #282c2d; background-image: url(/rsrc/image/texture/dark-menu.png); + padding: 4px 0; + display: block; } /* - Core Menu ----------------------------------------------------------------- Styles unique to the core menu (left button on mobile). */ .phabricator-core-menu-icon { position: absolute; display: block; width: 28px; height: 28px; } .phabricator-core-menu-profile-image { background-size: 28px 28px; } .device .phabricator-core-menu { display: none; } .device .phabricator-core-menu-expanded .phabricator-core-menu { display: block; padding-top: 44px; } -.device .phabricator-core-menu .phabricator-menu-item-type-link { +.device .phabricator-dark-menu .phabricator-menu-item-type-link { font-size: 15px; min-height: 30px; + line-height: 28px; } .device .phabricator-core-menu .phabricator-menu-item-type-link .phabricator-menu-item-name { margin-left: 40px; - line-height: 28px; } .device-desktop .phabricator-core-menu { position: absolute; right: 0; top: 0; vertical-align: top; } .device-desktop .phabricator-core-menu .phabricator-menu-item-name { display: none; } .device-desktop .phabricator-core-menu .phabricator-menu-item-view { display: block; float: left; position: relative; min-width: 38px; height: 44px; } .device-desktop .phabricator-core-menu .phabricator-core-item-device { display: none; } .device-desktop .phabricator-core-menu-icon { top: 9px; left: 6px; } .device .phabricator-core-menu-icon { left: 6px; } .device-desktop .phabricator-core-menu .phabricator-core-menu-item-profile { border-width: 0 1px; border-style: solid; border-color: #44494d; margin: 0 8px; } /* - Application Menu ---------------------------------------------------------- Styles unique to the application menu (right button on mobile). */ .device .phabricator-application-menu-expanded .phabricator-application-menu { display: block; padding-top: 44px; } .phabricator-application-menu { display: none; } .phabricator-application-menu .phabricator-menu-item-type-link .phabricator-menu-item-name { padding-left: 12px; } - -.device .phabricator-application-menu-expanded .phabricator-application-menu { - display: block; - padding-top: 44px; -} - diff --git a/webroot/rsrc/css/application/base/notification-menu.css b/webroot/rsrc/css/application/base/notification-menu.css index 3782456789..e3766ed4dd 100644 --- a/webroot/rsrc/css/application/base/notification-menu.css +++ b/webroot/rsrc/css/application/base/notification-menu.css @@ -1,66 +1,72 @@ /** * @provides phabricator-notification-menu-css */ .phabricator-notification-menu { background: #ffffff; font-size: 11px; word-wrap: break-word; overflow-y: auto; } +.phabricator-notification-menu-loading { + text-align: center; + padding: 10px 0; + color: #888888; +} + .device-desktop .phabricator-notification-menu { position: fixed; width: 360px; top: 42px; box-shadow: 0px 2px 6px rgba(0, 0, 0, 0.5); border: 2px solid #33393d; border-top-width: 0; border-radius: 3px; } .device .phabricator-notification-menu { border-bottom: 1px solid #222222; } .phabricator-notification { padding: 6px; cursor: pointer; } .device-desktop .phabricator-notification:hover { background: #f4f6f9; } .phabricator-notification + .phabricator-notification { border-top: 1px solid #e9e9e9; } .no-notifications { color: #999999; } .phabricator-notification-list { font-size: 11px; } .phabricator-notification-list .phabricator-notification-unread, .phabricator-notification-menu .phabricator-notification-unread { background: #aacfef; } .phabricator-notification-header { font-weight: bold; padding: 6px; font-size: 12px; border-bottom: 1px solid #e9e9e9; } .phabricator-notification-view-all { text-align: center; font-weight: bold; background: #f7f7f7; border-top: 1px solid #e9e9e9; padding: 6px; } diff --git a/webroot/rsrc/css/application/pholio/pholio.css b/webroot/rsrc/css/application/pholio/pholio.css index 38e81f19ed..5cf10e93dc 100644 --- a/webroot/rsrc/css/application/pholio/pholio.css +++ b/webroot/rsrc/css/application/pholio/pholio.css @@ -1,12 +1,23 @@ /** * @provides pholio-css */ .pholio-mock-image-container { background-color: #282828; text-align: center; } +.pholio-mock-carousel { + background-color: #282828; + text-align: center; +} + +.pholio-mock-carousel-thumbnail { + margin-right: 5px; + display: inline-block; + cursor: pointer; +} + .pholio-mock-image { - margin: 10px 0px; - display: inline-block; + margin: 10px 0px; + display: inline-block; } diff --git a/webroot/rsrc/css/layout/phabricator-side-menu-view.css b/webroot/rsrc/css/layout/phabricator-side-menu-view.css index d06a7e5609..2aa467d6ec 100644 --- a/webroot/rsrc/css/layout/phabricator-side-menu-view.css +++ b/webroot/rsrc/css/layout/phabricator-side-menu-view.css @@ -1,30 +1,49 @@ /** * @provides phabricator-side-menu-view-css */ .phabricator-side-menu .phabricator-menu-item-view { display: block; white-space: nowrap; text-decoration: none; font-size: 13px; } .phabricator-side-menu .phabricator-menu-item-type-link { padding: 6px 8px 6px 24px; color: #fff; text-shadow: rgba(0, 0, 0, 1) 0px -1px 1px; } .phabricator-side-menu .phabricator-menu-item-type-label { padding: 6px 8px 4px 12px; color: #fff; text-transform: uppercase; font-size: 12px; font-weight: bold; border-style: solid; background-color: #000; } +.phabricator-dark-menu .phabricator-menu-item-type-button, +.phabricator-side-menu .phabricator-menu-item-type-button { + width: 50%; + padding: 5px 8px; + display: block; + border-radius: 4px; + border: 2px solid #000; + margin: 10px auto; + color: #fff; + font-size: 14px; + text-shadow: 0px 1px 1px #000000; + font-weight: bold; + text-align: center; +} + +.phabricator-side-menu .phabricator-menu-item-type-button:hover { + background-image: url(/rsrc/image/texture/dark-menu-hover.png); +} + .device-desktop .phabricator-side-menu a.phabricator-menu-item-type-link:hover { text-decoration: none; } diff --git a/webroot/rsrc/css/sprite-conph.css b/webroot/rsrc/css/sprite-conph.css new file mode 100644 index 0000000000..d11ae477c5 --- /dev/null +++ b/webroot/rsrc/css/sprite-conph.css @@ -0,0 +1,75 @@ +/** + * @provides sprite-conpher-css + * @generated + */ + +.sprite-conpher { + background-image: url(/rsrc/image/sprite-conpher.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-conpher { + background-image: url(/rsrc/image/sprite-conpher-X2.png); + background-size: 132px 132px; + } +} + + +.conpher_calendar_off { + background-position: 0px 0px; +} + +.conpher_calendar_on, .device-desktop .conpher_calendar_off:hover { + background-position: -33px 0px; +} + +.conpher_conversation_off { + background-position: -66px 0px; +} + +.conpher_conversation_on, .device-desktop .conpher_conversation_off:hover { + background-position: -99px 0px; +} + +.conpher_files_off { + background-position: 0px -33px; +} + +.conpher_files_on, .device-desktop .conpher_files_off:hover { + background-position: -33px -33px; +} + +.conpher_list_off { + background-position: -66px -33px; +} + +.conpher_list_on, .device-desktop .conpher_list_off:hover { + background-position: -99px -33px; +} + +.conpher_more_off { + background-position: 0px -66px; +} + +.conpher_more_on, .device-desktop .conpher_more_off:hover { + background-position: -33px -66px; +} + +.conpher_people_off { + background-position: -66px -66px; +} + +.conpher_people_on, .device-desktop .conpher_people_off:hover { + background-position: 0px -99px; +} + +.conpher_settings_off { + background-position: -33px -99px; +} + +.conpher_settings_on, .device-desktop .conpher_settings_off:hover { + background-position: -66px -99px; +} diff --git a/webroot/rsrc/image/sprite-conph-X2.png b/webroot/rsrc/image/sprite-conph-X2.png new file mode 100644 index 0000000000..ef32a410db Binary files /dev/null and b/webroot/rsrc/image/sprite-conph-X2.png differ diff --git a/webroot/rsrc/image/sprite-conph.png b/webroot/rsrc/image/sprite-conph.png new file mode 100644 index 0000000000..490f12d2c5 Binary files /dev/null and b/webroot/rsrc/image/sprite-conph.png differ diff --git a/webroot/rsrc/js/application/aphlict/behavior-aphlict-dropdown.js b/webroot/rsrc/js/application/aphlict/behavior-aphlict-dropdown.js index f75fc3b53c..5fd59a0f5f 100644 --- a/webroot/rsrc/js/application/aphlict/behavior-aphlict-dropdown.js +++ b/webroot/rsrc/js/application/aphlict/behavior-aphlict-dropdown.js @@ -1,92 +1,111 @@ /** * @provides javelin-behavior-aphlict-dropdown * @requires javelin-behavior * javelin-request * javelin-stratcom * javelin-vector * javelin-dom * javelin-uri */ JX.behavior('aphlict-dropdown', function(config) { var dropdown = JX.$(config.dropdownID); var count = JX.$(config.countID); var bubble = JX.$(config.bubbleID); var visible = false; var request = null; + var dirty = true; function refresh() { + if (dirty) { + JX.DOM.setContent(dropdown, config.loadingText); + JX.DOM.alterClass( + dropdown, + 'phabricator-notification-menu-loading', + true); + } + if (request) { //already fetching return; } request = new JX.Request('/notification/panel/', function(response) { var display = (response.number > 999) ? "\u221E" : response.number; JX.DOM.setContent(count, display); if (response.number == 0) { JX.DOM.alterClass(bubble, 'alert-unread', false); } else { JX.DOM.alterClass(bubble, 'alert-unread', true); } + dirty = false; + JX.DOM.alterClass( + dropdown, + 'phabricator-notification-menu-loading', + false); JX.DOM.setContent(dropdown, JX.$H(response.content)); request = null; }); request.send(); } JX.Stratcom.listen( 'click', null, function(e) { if (!e.getNode('phabricator-notification-menu')) { // Click outside the dropdown; hide it. JX.DOM.hide(dropdown); visible = false; return; } if (e.getNode('tag:a')) { // User clicked a link, just follow the link. return; } // If the user clicked a notification (but missed a link) and it has a // primary URI, go there. var href = e.getNodeData('notification').href; if (href) { JX.$U(href).go(); e.kill(); } }); JX.DOM.listen( bubble, 'click', null, function(e) { if (!e.isNormalClick()) { return; } if (visible) { JX.DOM.hide(dropdown); } else { - refresh(); + if (dirty) { + refresh(); + } var p = JX.$V(bubble); p.y = null; p.x -= 6; p.setPos(dropdown); JX.DOM.show(dropdown); } visible = !visible; e.kill(); } ) - JX.Stratcom.listen('notification-panel-update', null, refresh); + JX.Stratcom.listen('notification-panel-update', null, function() { + dirty = true; + refresh(); + }); }); diff --git a/webroot/rsrc/js/application/core/behavior-form.js b/webroot/rsrc/js/application/core/behavior-form.js index 9e4942d533..310001cdb5 100644 --- a/webroot/rsrc/js/application/core/behavior-form.js +++ b/webroot/rsrc/js/application/core/behavior-form.js @@ -1,69 +1,95 @@ /** * @requires javelin-behavior javelin-stratcom javelin-dom * @provides javelin-behavior-aphront-form-disable-on-submit */ JX.behavior('aphront-form-disable-on-submit', function(config) { var restore = []; var root = null; var new_tab = false; JX.Stratcom.listen('click', 'tag:button', function(e) { var raw = e.getRawEvent(); new_tab = (raw.altKey || raw.ctrlKey || raw.metaKey || raw.shiftKey); }); + + JX.Stratcom.listen('keypress', ['tag:form', 'tag:textarea'], function(e) { + var raw = e.getRawEvent(); + if (e.getSpecialKey() != 'return' || !raw.ctrlKey) { + return; + } + + e.kill(); + + var form = e.getNode('tag:form'); + + // This allows 'workflow' and similar actions to take effect. + var r = JX.DOM.invoke(form, 'didSyntheticSubmit'); + if (r.getPrevented()) { + return; + } + + // If nothing handled the synthetic submit, submit normally. + form.submit(); + }); + + function will_submit(root) { + root._disabled = true; + var buttons = JX.DOM.scry(root, 'button'); + for (var ii = 0; ii < buttons.length; ii++) { + if (!buttons[ii].disabled) { + buttons[ii].disabled = 'disabled'; + JX.DOM.alterClass(buttons[ii], 'disabled', true); + restore.push(buttons[ii]); + } + } + } + JX.Stratcom.listen('submit', 'tag:form', function(e) { if (e.getNode('workflow')) { // Don't activate for forms with workflow, the workflow behavior will // handle it. return; } root = e.getNode('tag:form'); // If the form is a "download" form, don't disable it on submit because // we won't transition off the page. if (JX.Stratcom.hasSigil(root, 'download')) { return; } // Open the form to a new tab in Firefox explicitly (automatic in Chrome). // We render some buttons as links so users may be confused that the links // don't open to new tabs with Ctrl+click as normal links. root.target = (new_tab ? '_blank' : ''); if (new_tab) { return; } if (root._disabled) { e.kill(); } - root._disabled = true; - var buttons = JX.DOM.scry(root, 'button'); - for (var ii = 0; ii < buttons.length; ii++) { - if (!buttons[ii].disabled) { - buttons[ii].disabled = 'disabled'; - JX.DOM.alterClass(buttons[ii], 'disabled', true); - restore.push(buttons[ii]); - } - } + + will_submit(root); }); JX.Stratcom.listen('unload', null, function(e) { // Reenable everything on page unload so we don't bfcache back to a page // that has disabled forms. for (var ii = 0; ii < restore.length; ii++) { restore[ii].disabled = ''; JX.DOM.alterClass(restore[ii], 'disabled', false); root._disabled = false; } if (root) { delete root._disabled; } restore = []; root = null; }); }); diff --git a/webroot/rsrc/js/application/core/behavior-workflow.js b/webroot/rsrc/js/application/core/behavior-workflow.js index 82c0cfb0b8..c55c8e9317 100644 --- a/webroot/rsrc/js/application/core/behavior-workflow.js +++ b/webroot/rsrc/js/application/core/behavior-workflow.js @@ -1,43 +1,47 @@ /** * @provides javelin-behavior-workflow * @requires javelin-behavior * javelin-stratcom * javelin-workflow * javelin-dom */ JX.behavior('workflow', function() { + + // Listen for both real JX.Stratcom.listen( - 'submit', + ['submit', 'didSyntheticSubmit'], ['workflow', 'tag:form'], function(e) { if (JX.Stratcom.pass()) { return; } var target = e.getNode('workflow'); e.prevent(); JX.Workflow.newFromForm(target).start(); }); + JX.Stratcom.listen( 'click', ['workflow', 'tag:a'], function(e) { if (!e.isNormalClick()) { return; } var target = e.getNode('workflow'); if (!JX.DOM.isType(target, 'a')) { // This covers the case of an without workflow inside a
// with workflow. return; } if (JX.Stratcom.pass()) { return; } e.prevent(); JX.Workflow.newFromLink(target).start(); }); + }); diff --git a/webroot/rsrc/js/application/differential/DifferentialInlineCommentEditor.js b/webroot/rsrc/js/application/differential/DifferentialInlineCommentEditor.js index 6e544fe787..08339e1585 100644 --- a/webroot/rsrc/js/application/differential/DifferentialInlineCommentEditor.js +++ b/webroot/rsrc/js/application/differential/DifferentialInlineCommentEditor.js @@ -1,271 +1,275 @@ /** * @provides differential-inline-comment-editor * @requires javelin-dom * javelin-util * javelin-stratcom * javelin-install * javelin-request * javelin-workflow */ JX.install('DifferentialInlineCommentEditor', { construct : function(uri) { this._uri = uri; }, events : ['done'], members : { _uri : null, _undoText : null, _skipOverInlineCommentRows : function(node) { // TODO: Move this semantic information out of class names. while (node && node.className.indexOf('inline') !== -1) { node = node.nextSibling; } return node; }, _buildRequestData : function() { return { op : this.getOperation(), on_right : this.getOnRight(), id : this.getID(), number : this.getLineNumber(), is_new : this.getIsNew(), length : this.getLength(), changeset : this.getChangeset(), text : this.getText() || '' }; }, _draw : function(content, exact_row) { var row = this.getRow(); var table = this.getTable(); var target = exact_row ? row : this._skipOverInlineCommentRows(row); return copyRows(table, content, target); }, _removeUndoLink : function() { var rows = JX.DifferentialInlineCommentEditor._undoRows; if (rows) { for (var ii = 0; ii < rows.length; ii++) { JX.DOM.remove(rows[ii]); } } }, _undo : function() { this._removeUndoLink(); this.setText(this._undoText); this.start(); }, _registerUndoListener : function() { if (!JX.DifferentialInlineCommentEditor._activeEditor) { JX.Stratcom.listen( 'click', 'differential-inline-comment-undo', function(e) { JX.DifferentialInlineCommentEditor._activeEditor._undo(); e.kill(); }); } JX.DifferentialInlineCommentEditor._activeEditor = this; }, _setRowState : function(state) { var is_hidden = (state == 'hidden'); var is_loading = (state == 'loading'); var row = this.getRow(); JX.DOM.alterClass(row, 'differential-inline-hidden', is_hidden); JX.DOM.alterClass(row, 'differential-inline-loading', is_loading); }, _didContinueWorkflow : function(response) { var drawn = this._draw(JX.$N('div', JX.$H(response))); var op = this.getOperation(); if (op == 'edit') { this._setRowState('hidden'); } JX.DOM.find( drawn[0], 'textarea', 'differential-inline-comment-edit-textarea').focus(); var oncancel = JX.bind(this, function(e) { e.kill(); this._didCancelWorkflow(); if (op == 'edit') { this._setRowState('visible'); } JX.DOM.remove(drawn[0]); }); JX.DOM.listen(drawn[0], 'click', 'inline-edit-cancel', oncancel); var onsubmit = JX.bind(this, function(e) { e.kill(); JX.Workflow.newFromForm(e.getTarget()) .setHandler(JX.bind(this, function(response) { JX.DOM.remove(drawn[0]); if (op == 'edit') { this._setRowState('visible'); } this._didCompleteWorkflow(response); })) .start(); JX.DOM.alterClass(drawn[0], 'differential-inline-loading', true); }); - JX.DOM.listen(drawn[0], 'submit', 'inline-edit-form', onsubmit); + JX.DOM.listen( + drawn[0], + ['submit', 'didSyntheticSubmit'], + 'inline-edit-form', + onsubmit); }, _didCompleteWorkflow : function(response) { var op = this.getOperation(); // We don't get any markup back if the user deletes a comment, or saves // an empty comment (which effects a delete). if (response.markup) { this._draw(JX.$N('div', JX.$H(response.markup))); } // These operations remove the old row (edit adds a new row first). var remove_old = (op == 'edit' || op == 'delete'); if (remove_old) { JX.DOM.remove(this.getRow()); var other_rows = this.getOtherRows(); for(var i = 0; i < other_rows.length; ++i) { JX.DOM.remove(other_rows[i]); } } // Once the user saves something, get rid of the 'undo' option. A // particular case where we need this is saving a delete, when we might // otherwise leave around an 'undo' for an earlier edit to the same // comment. this._removeUndoLink(); JX.Stratcom.invoke('differential-inline-comment-update'); this.invoke('done'); }, _didCancelWorkflow : function() { this.invoke('done'); var op = this.getOperation(); if (op == 'delete') { // No undo for delete, we prompt the user explicitly. return; } try { var textarea = JX.DOM.find( document.body, // TODO: use getDialogRootNode() when available 'textarea', 'differential-inline-comment-edit-textarea'); } catch (ex) { // The close handler is called whenever the dialog closes, even if the // user closed it by completing the workflow with "Save". The // JX.Workflow API should probably be refined to allow programmatic // distinction of close caused by 'cancel' vs 'submit'. Testing for // presence of the textarea serves as a proxy for detecting a 'cancel'. return; } var text = textarea.value; // If the user hasn't edited the text (i.e., no change from original for // 'edit' or no text at all), don't offer them an undo. if (text == this.getOriginalText() || text == '') { return; } // Save the text so we can 'undo' back to it. this._undoText = text; var template = this.getOnRight() ? this.getTemplates().r : this.getTemplates().l; template = JX.$N('div', JX.$H(template)); // NOTE: Operation order matters here; we can't remove anything until // after we draw the new rows because _draw uses the old rows to figure // out where to place the comment. // We use 'exact_row' to put the "undo" text directly above the affected // comment. var exact_row = true; var rows = this._draw(template, exact_row); this._removeUndoLink(); JX.DifferentialInlineCommentEditor._undoRows = rows; }, start : function() { this._registerUndoListener(); var data = this._buildRequestData(); var op = this.getOperation(); if (op == 'delete') { this._setRowState('loading'); var oncomplete = JX.bind(this, this._didCompleteWorkflow); var onclose = JX.bind(this, function() { this._setRowState('visible'); this._didCancelWorkflow(); }); new JX.Workflow(this._uri, data) .setHandler(oncomplete) .setCloseHandler(onclose) .start(); } else { var handler = JX.bind(this, this._didContinueWorkflow); if (op == 'edit') { this._setRowState('loading'); } new JX.Request(this._uri, handler) .setData(data) .send(); } return this; } }, statics : { /** * Global refernece to the 'undo' rows currently rendered in the document. */ _undoRows : null, /** * Global listener for the 'undo' click associated with the currently * displayed 'undo' link. When an editor is start()ed, it becomes the active * editor. */ _activeEditor : null }, properties : { operation : null, row : null, otherRows: [], table : null, onRight : null, ID : null, lineNumber : null, changeset : null, length : null, isNew : null, text : null, templates : null, originalText : null } }); diff --git a/webroot/rsrc/js/application/pholio/behavior-pholio-mock-view.js b/webroot/rsrc/js/application/pholio/behavior-pholio-mock-view.js new file mode 100644 index 0000000000..c9953e33d6 --- /dev/null +++ b/webroot/rsrc/js/application/pholio/behavior-pholio-mock-view.js @@ -0,0 +1,17 @@ +/** + * @provides javelin-behavior-pholio-mock-view + * @requires javelin-behavior + * javelin-stratcom + */ +JX.behavior('pholio-mock-view', function(config) { + JX.Stratcom.listen( + 'click', // Listen for clicks... + 'mock-thumbnail', // ...on nodes with sigil "mock-thumbnail". + function(e) { + var data = e.getNodeData('mock-thumbnail'); + + var main = JX.$(config.mainID); + main.src = data.fullSizeURI; + }); +}); + diff --git a/webroot/rsrc/js/application/transactions/behavior-transaction-list.js b/webroot/rsrc/js/application/transactions/behavior-transaction-list.js index 0658ac2ebf..64195ad18e 100644 --- a/webroot/rsrc/js/application/transactions/behavior-transaction-list.js +++ b/webroot/rsrc/js/application/transactions/behavior-transaction-list.js @@ -1,95 +1,98 @@ /** * @provides javelin-behavior-phabricator-transaction-list * @requires javelin-behavior * javelin-stratcom * javelin-workflow * javelin-dom * javelin-fx */ JX.behavior('phabricator-transaction-list', function(config) { var list = JX.$(config.listID); var xaction_nodes = null; var next_anchor = config.nextAnchor; function get_xaction_nodes() { if (xaction_nodes === null) { xaction_nodes = {}; var xactions = JX.DOM.scry(list, 'div', 'transaction'); for (var ii = 0; ii < xactions.length; ii++) { xaction_nodes[JX.Stratcom.getData(xactions[ii]).phid] = xactions[ii]; } } return xaction_nodes; } function ontransactions(response) { var fade_in = []; var first_new = null; var nodes = get_xaction_nodes(); for (var phid in response.xactions) { var new_node = JX.$H(response.xactions[phid]).getFragment().firstChild; fade_in.push(new_node); if (nodes[phid]) { JX.DOM.replace(nodes[phid], new_node); } else { if (first_new === null) { first_new = new_node; } list.appendChild(new_node); // Add a spacer after new transactions. var spacer = JX.$H(response.spacer).getFragment().firstChild; list.appendChild(spacer); fade_in.push(spacer); next_anchor++; } nodes[phid] = new_node; } // Scroll to the first new transaction, if transactions were added. if (first_new) { JX.DOM.scrollTo(first_new); } // Make any new or updated transactions fade in. for (var ii = 0; ii < fade_in.length; ii++) { new JX.FX(fade_in[ii]).setDuration(500).start({opacity: [0, 1]}); } } JX.DOM.listen(list, 'click', 'transaction-edit', function(e) { if (!e.isNormalClick()) { return; } JX.Workflow.newFromLink(e.getTarget()) .setData({anchor: e.getNodeData('transaction').anchor}) .setHandler(ontransactions) .start(); e.kill(); }); - JX.Stratcom.listen('submit', 'transaction-append', function(e) { - var form = e.getTarget(); - - JX.Workflow.newFromForm(form, {anchor: next_anchor}) - .setHandler(function(response) { - ontransactions(response); - - var e = JX.DOM.invoke(form, 'willClear'); - if (!e.getPrevented()) { - form.reset(); - } - }) - .start(); - - e.kill(); - }); + JX.Stratcom.listen( + ['submit', 'didSyntheticSubmit'], + 'transaction-append', + function(e) { + var form = e.getTarget(); + + JX.Workflow.newFromForm(form, {anchor: next_anchor}) + .setHandler(function(response) { + ontransactions(response); + + var e = JX.DOM.invoke(form, 'willClear'); + if (!e.getPrevented()) { + form.reset(); + } + }) + .start(); + + e.kill(); + }); });