JJJ's Blog

  • WordPress
  • GitHub
  • Twitter/X
  • Berenstein/stain Bears

    Do you remember The Berenstain Bears?

    Do you, like millions of others, misremember them as the Berenstein Bears? I remember reading about this years ago, and now the web has caught up – people are freaking out about glitches in the Matrix, alternate realities, and other malarkey.

    Brace for impact…

    It’s always been “Berenstain”.

    I very vividly remember my 2nd grade teacher “correcting” my saying “stain” in front of the entire class. I used to read books to the class, repeatedly, every week. The Pokey Little Puppy, The Monster at the End of This Book, and a bunch of other favorites that my mom used to read to me.

    The Berenstain Bears was one of them.

    This phenomena was created by adults without appreciation for detail, who propagated one mispronunciation to impressionable young minds. It’s the same as everyone playing Monopoly incorrectly for decades.

    Human minds naturally trust ubiquity & do not reprocess solved problems.

    The lesson? People all around you accidentally influence your perceptions, in ways that have seemingly invisible yet long-lasting effects.

    Concepts like discrimination, racism, classism, ageism, and so on, are ideas handed down to us by the people that came before us.

    You can continue believing what your memories have convinced you over-time as real, or you can accept reality as it presents itself today, tomorrow, and everyday thereafter.

    There are no super heroes or villains. No aliens. No ghosts. No time travel. And definitely, without question, no Berenstein Bears. 🐻

    JJJ

    September 9, 2016
    Rants
  • Tone

    Tone is more important than the words you use, until all you have is words. On the web, we’ve skirted tone for a long while with emoticons. :)Β Thankfully, the wide adoption of Emoji is rescuing us from writing obscure combinations of syntactically invalid punctuation, and I think that’s a good thing.

    If you read as much as I do, then you already know words like “just” &Β “that” unintentionally discredit your ideas and pitches; you know body language &Β confidence will win people over more than a lexicon of jargon; you know how hard it is to put biases aside and trust the data.

    The data about written communication, is that we all suck at it.

    Everyone, across the board, at both reading &Β writing, sucks at it, including me. I spend a lot of time, most of my professional career, not just thinking about social software, but how to improve both the value and the return-on-investment of the ways people socialize online. I think the answer, for me, is etiquette.

    Different groups of people, teams, factions, etc… have an established rapport. They found communication styles & mechanisms that work well enough for them to have considered that problem solved-enough, so they can move onto solving bigger problems. When these patterns deviate outside of traditional or societal norms, is when it becomes increasingly difficult to break into those groups.

    On a large scale, I can’t break into the Japanese WordPress User Group because I don’t speak a lick of Japanese. On a smaller scale, I can’t help my village planning commission make decisions because I don’t know any of the ordinances. At home, I can’t tell what Paul the dog is really thinking because he only understandsΒ a few dozen words and I don’t speak dog very well.

    For teams of humans, working together to address intersecting needs, we’ve worked for thousands of years to lower the barrier of entry into these groups. Grunts turned into syllables, words, phrases, and sentences. We introduced syntactical structure to convey pauses, stops, and rests. But when the web exploded, we froze almost all written language because it’s now the web’s biggest dependency. We can’t delete “Q” from the English language entirely because wp_enqueue_scriptΒ wouldn’t work anymore.

    All of this is to say, that we need to learn how to do better with what we have today, because there won’t be much new for the rest of our lives when it comes to written communication. To do that, means a few different things…

    • Lurk. We all need to read, listen, &Β absorb. This includes understanding the general vibe of who is all involved, and deciding if it’s compatible with you.
    • Respect. Groups of people have established processes. No one can change these easily, especially someone new & full of enthusiasm to rock everyone’s worlds.
    • Decide. You need to choose where you think you fall in the pecking order, and make no mistake, there is a pecking order. Even flat organizations have a hidden social hierarchy.Β UnderstandingΒ Social Dominance Theory will help you, here.
    • Introduce. Once you have enough data from lurking, you can slowly start to apply what you’ve learned. Sometimes this means humor, sometimes strictly business, or other times it means only lurking and not getting involved at all.
    • Pace. Now that you understand the social dynamic, and have decided where you think you belong in the group, it’s time to try to keep the pace. Traditionally, this is called “fitting in” but it’s important to earning the trust of your new acquaintances.
    • Pass/fail. You’ll know pretty quickly whether any of your above efforts have resonated positively or negatively, and each interaction will echo through-out the group. Someone will mention you, one way or the other.
    • Stay/bail. The level of joy you receive from any group of people should be the underlying motivator for driving your decision to stay or leave. If it’s rewarding, healthy, andΒ fun, then stay. If it’s causing harm to yourself or others, my advice would be to consider anything else.

    “Us vs. Them” is a real feeling, because we are – all of us – are constantly at odds with each other. In our base programming, we are animals, sizing each other up, and fighting for scraps. Sure; we are mostly domesticated animals, but during times of distress or high-anxiety, you can watch people become animals & treat other people that way too, and triggers could literally be anything from allergies to relationship issues to PTSD and on…

    When it comes to WordPress’s leadership, or BuddyPress/bbPress, or really anything else, these same rules apply, but increasingly so because almost all of our communication is non-verbal. This means a million people may read your words and hear kindness in your written voice, but the one person you want to hear kindness may only hear rage, for reasons that may or may not have anything to do with anything you did or did not do. Phew!

    My proposed solution, is etiquette. More pleases, more thank-you’s, more awareness ofΒ who is involved in what, who is in charge of what, who has earned what, and who the who’s are and what they want to be when they grow up. This means a base-level respect for everyone, regardless of your history or lack-there-of. It means reading your words back to yourself and trying to convey a smile without usingΒ :)Β or πŸ˜€.

    Ultimately, it means being patient, and taking the time to craft your words so they will soundΒ like a well-intentioned contribution to your audience.

    For slowing down, I’ll recommend you try switching your keyboard layout. In 2010, I switched to Dvorak – when my 100wpm plummeted to 20, those 20 words needed to matter most. Twitter’s 140 character limit maybe helps with being succinct, but I don’t know that length is as important as word-choice and knowing your audience.

    Lastly, it helps to know yourself, and have a relatively clear idea of who the people around you think that you are, and how similar that is to who you think you are. If people think you’re always goofy, and you think you have something serious to offer, changing that perception is not going to be easy, and it may take a number of years to swing people around to accepting your style & approach for what it is.

    I think if everyone has a bit more patience with each other, and we all take the time to consider the ripples we leave in people’s lives, we can communicate with written words in ways that don’t sink ships or hurt feelings. <3

    JJJ

    August 23, 2016
    Rants, Opinion, Software
  • Today's Software is Terrible

    Are you a software developer? I am, and everyday I’m embarrassed by my profession.

    Every single day, I run across some website, app, video-game, program or plugin that is egregiously broken; embarrassingly broken; 5000-developers-with-six-figure-salaries-and-free-catered-lunches-and-still-can’t-get-it-right, broken.

    Apps on my phone, tablet, computer, tv, and car, crash constantly, sometimes resulting in actual data loss. We shovedΒ television behind a pay-wall in a cube that buffers and loads more than it presents anything. We broke copy & paste, because who would ever want to paste a password anywhere? Form fields do this shit where they want to autocomplete and autocorrect and autofill 3 different suggestions at once. We connected wrist-watches to the internet to draw doodles back and forth that don’t even send half the time. We hid mechanical engines behind electronics so complex there is noticeable lag driving performance cars. We connected entertainment systems to airplane diagnostic systems, so passengers can see how high up they are. We connect doors to the web toΒ unlock them remotely, but firmware updates brick themΒ and now you’re locked out of your house. We connect smoke detectors to the web and now the entire house &Β every connected device in it is beeping because you grilled a burger-patty, and the app on your phone to stop them isn’t responding.

    Today’s software is a perpetual nightmare machine of non-stop frustrations.

    Writing software is hard, mostly for reasons that don’t actually involve the software itself. I could go on about stakeholders, or how project managers are whatever. I could say that developers should be left alone to concentrate. I could say it’s nobody’s fault because it’s everybody’s fault. I could say all kinds of trite crap to poorly defend the people that populate the position I hold most dear, and currently the most fun job I think anyone could ever hope to perform.

    I could say lots of things, but they’d all be lies.

    The harsh truth is that many of you shouldn’t be writing software for production use, because you’re just not that good at it yet. You’re not experienced. You haven’t shipped anything. You don’t know how to recover from the damage you will inevitably cause.

    You break people’s shit – constantly,Β anonymously, and without repercussion. You aren’t meticulous in your life, you don’t care about etiquette, so you won’tΒ do your employer any better, and you certainly won’t care if anyΒ of your users complain on Twitter.

    Sure; mistakes happen. We all overlook stuff. That’s how you learn, right? By repeating and improving and discovering what you missed the previous times. And there is more to discoverΒ everyday, because there are more &Β more design patterns and philosophies and dependencies and processes and teams and stakeholders and deadlines and Carl called in sick and no one understands what he even does here anymore but it’s suddenly critical to today’s problems and why is this line of code 500 characters long and who messed up all this whitespace and why can’t we all agree not to use ternaries and why does this class inherit from 5 other classesΒ and on and on and on.

    Software is eating the world, but… garbage in, garbage out.Β So, what canΒ we do?

    1. Be meticulous. Someone will undoubtedly refer to you as OCD, or apply some other insulting derogatory bullshit label. Screw them; they suck at their job anyway.
    2. Pay attention, to everything. You are the Axel Foley of software development. Writing code and fixing bugs is target practice for your soul. Do it constantly, rearrange the pieces in your mind while you shower, and take everything in. This means watching, listening, learning, while writing less and solving more.
    3. Be vigilant. Everything around you is intricately balanced and ready to come crashing down at a misplaced semi-colon’s notice. I’m not joking. You can very easily cause millions of dollars in revenue losses by breaking just 1 dependency in a complex chain. Code is poetry, but it’s also contagious.
    4. Be respectful. Push your chair in. Hold the door for everyone. Smile at people, even when you’re grumpy. Someone has to maintain the terrible decisions you’ve made once you level-up &Β move-on, and that’s easier to do when you like the person who’s shadow you’re in.
    5. Contribute to open-source. This is where you earn your lumps; not behind closed doors, not in a sweet corporate environment, and not sitting at a desk sipping a mocha-lattΓ©. You need to jump up on stage, give your best performance, and embrace the tomatoes and boos, because you’re probably going to be terrible for your first few rounds.
    6. If it ain’t fun, it ain’t right. Once you stop feeling joy from the software you’re writing, it’s time to move onto something else. Sitting still and being complacent isn’t healthy, even if it feels pretty natural not to burn all those calories moving on to newer and more exciting endeavors.
    7. Make friends. Like, real ones. Ones that will come to your wedding from across the country. These are the people that will remind you how good you are when you need them to, and they’ll have your back when you’re not having fun anymore.
    8. Learn how to make soup. Not even kidding. Understanding how to make the best ofΒ what fewΒ ingredients you have is essential to writing good software. Embrace your constraints, and don’t be afraid of butter or salt because they’re universally delicious.
    9. Challenge authority constantly. Most people have no idea what they’re doing. They were asked or tasked with a problem, and either they follow the above methods or they pass the problem on to someone else. They’re in a holding pattern, until the next big thing happens to them, instead of making big things happen around them.
    10. Find mentors everywhere. Follow a person around that you want to be like, take bits of pieces of what works for them, and apply them to your life. Steal, plagiarize, and sample small enough traits until you’re an amalgamation of the hippest, funniest, most awesome people you’ve ever come across.

    Then, after all of that, sit down and write the best ‘effing software anyone has ever used. ❀️

    JJJ

    August 4, 2016
    Rants, Software
  • Good and Evil

    This past Friday, my car got hit by a motorcycle. There’s a story there, but this post isn’t about that. Rather, it’s about people’s perception of the rider.

    He must have been speeding.

    He must not have been paying attention.

    He must not know how to ride.

    None of this is actually true, though. He wasn’t speeding, he was paying attention (mostly) and is a veteran rider with about 25 years experience.

    Generally, I think for “most people”, it’s maximally convenient and efficientΒ to categorize things (and people, and ideas)Β in the most extremely polarizing way, and then work inwards towards an understanding or acceptance of that thing.

    I also think this is why I have hard time navigating the world; I think of everything as inside-out vs. outside-in. MyΒ starting line is in the middle, and myΒ Good-o-meter(TM) swings based on whether I found joy or pain in that thing.

    There are currently a few members of our local village governmentΒ that have reputations for not being very friendly, for having ideas &Β beliefs that go against the grain, and for being a bit confrontational. And that reputation has glorified them into villains, which is pretty silly if you stop and think about the individuals.

    There is no Good and there is no Evil. There is no right and there is no wrong. There is only circumstance and action, orΒ a lack of either or both.

    Everyone chooses how to act or feel based on their awareness of what’s appropriate, what’s possible, and what their level of maturity is in dealing with those situations.Β The circumstances for this motorcyclist are different than mine with my car are different than the eyewitnesses.

    It’s easy to feel like someone closing your issue on Github makes them a terribly stupid person who does not understand the importance of the issue you’ve raised. It’s easy to think your WordPress core ticket sitting around for 5 years means no one cares. It’s easy to say someone sucks because of something they’ve said or done you don’t agree with.

    It’s easy to assume that mass shooters are crazy, that they’ve snapped, or any other extreme set of rules that polarize the perpetrator. Who knows, and the why almost doesn’t even matter, because it doesn’t change the outcome, and not much will be done to prevent similar outcomes in the future. What ifΒ someone broke his heart, and he couldn’t cope? Do we suddenly try to prevent all future heartbreak?

    There will always be unpredictable terrible circumstances created by human-kind, and it requires collective bravery and awareness to reduce the consequences of those harmful decisions. (And full disclosure, it’s my experience in my own life that “most people” are neither aware nor brave, meaning my outlook on the pool of resources available to make positive change is, honestly, bleak.)

    It’s equally easy to say homosexuality is evil. Or beingΒ pro-life isΒ evil. Or white-dudes areΒ evil rapists. These are all obviously incorrect assessments;Β and…Β think of all the times you’ve identified something as bad (or felt wrongly profiled by someone) and imagine that there are millions of people that find genuine joy in that thing without you.

    Instead of starting with good or evil, please train yourself to start from the middle and let the circumstances steer your assessment about the variable value of a thing in your life. Actively avoid extremes, and politely remind others that people are people, and heroes & villains are figments of their imaginations.

    Be objective. Be sincere. Be better.

    JJJ

    June 15, 2016
    Rants, Life
  • Everything is a Variable

    Everything is a Variable

    I like to say, that the job of a software engineer is to define variables, and honestly I don’t think it’s really much more than this. Everything in life starts off simple, and can end up as complex as you choose for it to be.

    This process is traditionally called “architecting” and at one point in my career I was told I was a brilliant architect by someone I later came to admire quite a bit, Andrew Nacin. Whether or not that’s actually true, is irrelevant, because Andy said so and that’s all anyone should need to hear.

    For most engineers, their accidental measure of success is how complex of a problem can I solve. This isn’t just true for software, but for all artists, makers, and creators – it’s a form of validating oneself to say you’ve leveled up and accomplished something more challenging than the time before. It’s learning, and evolving, and shaping your mind by enjoying new experiences, and it’s addicting like everything else in this world.

    Ultimately, I think the thing that separates a good engineerΒ from a bad engineer, is the ability to take complex ideas &Β relationships, and make them as simple to understand &Β interact with as possible, for as wide of an audience as possible.

    In WordPress, this has traditionally meant introducing flexibility in the form of actions and filters, but for the future of WordPress development, this is about to change dramatically.

    If you’re not familiar, WordPress developers have been living in a bubble compared to the rest of the PHP world, and this bubble is about to pop in a huge way when the ability to use versions of PHP higher than 5.2 becomes commonplace.

    WordPress itself is a largely procedural codebase, meaning it’s relatively flat and simple. This was both by design, and by intention, because earlier versions of PHP had varying degrees of support for increasingly popularΒ programming concepts.Β Future versions of WordPress will inevitably grow increasingly complex, but I for one am planning on sticking my neck out to ensure this happens only with great intention.

    Once plugins and themes can (and will) start flexing more PHP muscle, the WordPress world has the potential to become a very scary place to work inside of, and it’s up to all of us to decide where to position the bar when it comes to code complexity and extensibility.

    I’ve come across three WordPress based projects recently thatΒ appeared conceptuallyΒ over-architected, re-solving problems in more complex ways than should have ever been required, considering the requirements and because APIs already existed to solve these problems in WordPress core.

    I’m omitting the details from this post (we’re working it out, and my intention isn’t to negatively criticize) because I hope get peopleΒ thinking deeply about what reusable code in WordPress has meant and should mean going forward. Here’s my take:

    • Code that others can quickly understand
    • Problems that others may need solving in their own projects
    • The ability to extend, unplug, replace, or override assumptions the code has made
    • Using existing code intended for it’s purpose, and sending upstream improvements if necessary to unblock your progress
    • It needs to be juice’able – shred it, direct it, blend it with any other code, and it will always act predictably

    In the way that art mimics life, these rules are generally what I apply to real-life scenarios. If I can own (or build) aΒ tool that solves many problems, and I can loan it out to someone that may need it, and that tool can be extended to suit many unique needs, it’s an obvious win. This might be a power drill, a table saw, a bucket, a car, a WordPress plugin, or just an idea I’ve had about some random life experience that’s worth sharing or blogging about.

    If I can have 1 friend that I enjoy everything with, I’ll marry them so I can continue to enjoy everything they have to offer the world. <3

    All of us are in different places, at different times, for different reasons, with different intentions and feelings and goals. We all have different experiences that lead us to unique conclusions about how to approach solving problems and addressing concerns and communicating our feelings. If you ask Mother Nature, this is not a bug, it’s a feature.

    EachΒ and every moment that passes results in new variables that require defining. What to eat, what to say, what not to say, how to say it, left or right, stop or go, yes or no.Β Engineers have trained their brains to quickly calculate the consequences of these rapid decisions, and we are difficult people to be around because we are 100 steps ahead and trying to think 101 steps backwards at the same time so what we do makes sense to the people around us.

    So when I say that everything is a variable, I mean that it’s your responsibility to define the importance of the variables in your life to create a better tomorrow for the people around you. Hack the world, by being patient, and kind, considerate, and lovely. Learn how to recognize when someone needs help defining their own variables in their lives, and teach them how to in a healthy and constructive way.

    $var;

     

    JJJ

    April 16, 2016
    Life
  • The end of IPv6

    The end of IPv6 will not be our fault, at least not directly.

    Indirectly, and in the next 25 years or so, bots will be so ubiquitous to the modern web, that bots will have bots with bots, and they will autonomously be setting up both physical & virtual servers to scale their requests in such a way that will eventually saturate even the IPv6 protocol.

    340,282,366,920,938,463,463,374,607,431,768,211,456

    This is the number of available addresses in the global IPv6 range. If I’m right, that’s gonna take a lot of bots.

    But consider that services like AkismetΒ claim to fight spam at more thanΒ 7.5 million requests per hour, and Gravatar claims to serve more thanΒ 8.6 billion imagesΒ per day,Β and that’s with me only cherry-picking 2 services that help power 25% of the web, amongst a sea of tens of thousands in the remaining 75%.

    As services like these start to become increasingly intelligent, their computational needs increase exponentially, and the number of independent services necessary to keep up with those needs will follow suit.

    Consider an application like Slack, where upon opening 1 application, it opens close to 20 individual sockets, each acting like a neurological meld between the client application on my Mac and the many servers they no-doubt are wrangling to keep up with the growing number of Slack networks I’m a part of.

    When you start to look at the raw numbers, the insane amount of traffic, the ludicrous amount of connections required to make the world wide web of computers interact with each other, IPv6 suddenly starts to look less big than it did originally.

    If we round up Gravatar’s numbers to 10 billion images per day, it will only take 100 days to hit 1 trillion (1,000,000,000,000) images. I have no idea how many physical servers (or public IP addresses) it takes to do this, but I bit it’s at least a few. If a few more services the size of (and equally as efficient as) Gravatar are invented, we start to double-up pretty quickly.

    And I have a hunch that no service will be as efficient as Gravatar is at doing what it does; anything of this scale will only grow in complexity and necessities.

    It may not happen in my lifetime, but make note that if you squint far enough into the not-too-distant future, even IPv6 won’t save the internet for very long.

    JJJ

    March 30, 2016
    Opinion
    IPv6
  • "The Average Person"

    I know you’ve talked about them. I know you’ve criticized them. You’ve both championed andΒ judged them in the same breath. Today, I’m going to talk about the average person.

    I’m an average person, and you are too. Don’t forget this.

    I’m average at more things than I’m good at, actually. I’m likely average at just about anything I’ve only ever done a handful of times that I didn’t find captivating enough to become above-average at. Go figure.

    In software development, we talk a lot about “the average person” as if they require some kind of hand-holding or help. The systems are inherently complex, and the software should ultimately eliminate that complexity for them.

    In real life, “the average person” is usually some kind of dumbass whoΒ acts irresponsibly. They don’t change the oil in their car because “the average person” doesn’t know what oil is or how it works or why it’s necessary. They aren’t financially responsible because “the average person” is living check-to-check without savings or investments. Whatever…

    In customer service, “the average person” is usually an inconsiderate jerkΒ that takes no responsibility for their own actions because the customer is always right, and all they do is complain about nothing. This one might actually be true. Just kidding. Maybe. I mean, I’m a customer, but I don’t think I’m an average one. Sigh.

    In every scenario I can imagine, everyone makes the average person out to be less-than, incompetent, or somehow beneath them, to convey that the person saying it is somehow above the average at this one thing, if not others to justify and support their perspective.

    I’m guilty of this. It’s easy to lump people together, classify them for one reason or another, and quickly convey to others the demographic you’re targeting. I think, though, that this simplifies a much larger issue, and is a slippery slope towards introducing a top-down culture where leaders accidentally (vs. intentionally) influence their constituents to think and speak poorly ofΒ those less experienced than they are.

    One place I do this constantly, and without joy, is driving a car. I love driving. I’m good at it. I’ve easily logged a over a million miles between 15 cars in my lifetime. Because of my passion and experience level, I have a difficult time having empathy for people that aren’t very good at driving but are out in public trying to do it anyways. My wife and I lament about how many times someone almost kills us on a daily basis, because “the average person” is talking, texting, not paying attention, or totally lacks any kind of spacial awareness to understand the consequences of their driving actions.

    It’s a bad way to be, I think.

    It’s toxic, and perpetually negative. It creates this reality distortion field between you and other people, that they’re not actually people trying to accomplish the same tasks you are but maybe not doing as good a job at is as you would do. I’m not saying it isn’t true, or that you aren’t actually better than that average Joe; rather, I’m saying that patting yourself on the back for having more experience or higher comprehension is poor form, selfish, and sets bad precedent and example for anyone that witnesses it.

    This is why more sophisticated strategists exist, that are able to boil groups of people down not into averages, but into almost literal boxes to which they fit comfortably in. It’s like stereotyping, but in a good way, I guess? People that have this ability are fascinating to me, because after years of working largely alone and remotely I think I’ve lost what little social comfort I earned in my teens and twenties and have in increasingly difficult time being comfortable around people that are above average at something I am average at. Phew…

    If you find yourself thinking about “the average person” please don’t forget that you’re probably average at a bunch of stuff, and someone probably thought of you in the context of being totally vanilla and without value when it comes to some dumb thing that you don’t even care about. Try to flip your verbiage around to bring out the best in whatever it is you’re trying to accomplish, and you’ll have more positive results.

    AndΒ thanks for tolerating my average writing skills! <3

    JJJ

    January 20, 2016
    Opinion
  • Mother Nature's Toolbox Must Be Heavy

    Running npm install for WordPress is a terrifying experience. It installs so many libraries and dependencies, it would take a lifetime to learn them all. If you’ve never had the pleasure, here’s what it looks like today:

    WordPress@4.5.0 /Users/johnjamesjacoby/Work/VVV/www/wordpress-develop
    β”œβ”€β”¬ autoprefixer@6.1.2
    β”‚ β”œβ”€β”€ browserslist@1.0.1
    β”‚ β”œβ”€β”€ caniuse-db@1.0.30000384
    β”‚ β”œβ”€β”€ num2fraction@1.2.2
    β”‚ β”œβ”€β”¬ postcss@5.0.14
    β”‚ β”‚ β”œβ”€β”€ js-base64@2.1.9
    β”‚ β”‚ β”œβ”€β”€ source-map@0.5.3
    β”‚ β”‚ └─┬ supports-color@3.1.2
    β”‚ β”‚   └── has-flag@1.0.0
    β”‚ └── postcss-value-parser@3.2.3
    β”œβ”€β”¬ grunt@0.4.5
    β”‚ β”œβ”€β”€ async@0.1.22
    β”‚ β”œβ”€β”€ coffee-script@1.3.3
    β”‚ β”œβ”€β”€ colors@0.6.2
    β”‚ β”œβ”€β”€ dateformat@1.0.2-1.2.3
    β”‚ β”œβ”€β”€ eventemitter2@0.4.14
    β”‚ β”œβ”€β”€ exit@0.1.2
    β”‚ β”œβ”€β”¬ findup-sync@0.1.3
    β”‚ β”‚ β”œβ”€β”¬ glob@3.2.11
    β”‚ β”‚ β”‚ └── minimatch@0.3.0
    β”‚ β”‚ └── lodash@2.4.2
    β”‚ β”œβ”€β”€ getobject@0.1.0
    β”‚ β”œβ”€β”¬ glob@3.1.21
    β”‚ β”‚ β”œβ”€β”€ graceful-fs@1.2.3
    β”‚ β”‚ └── inherits@1.0.2
    β”‚ β”œβ”€β”¬ grunt-legacy-log@0.1.3
    β”‚ β”‚ β”œβ”€β”¬ grunt-legacy-log-utils@0.1.1
    β”‚ β”‚ β”‚ β”œβ”€β”€ lodash@2.4.2
    β”‚ β”‚ β”‚ └── underscore.string@2.3.3
    β”‚ β”‚ β”œβ”€β”€ lodash@2.4.2
    β”‚ β”‚ └── underscore.string@2.3.3
    β”‚ β”œβ”€β”€ hooker@0.2.3
    β”‚ β”œβ”€β”€ iconv-lite@0.2.11
    β”‚ β”œβ”€β”¬ js-yaml@2.0.5
    β”‚ β”‚ └─┬ argparse@0.1.16
    β”‚ β”‚   β”œβ”€β”€ underscore@1.7.0
    β”‚ β”‚   └── underscore.string@2.4.0
    β”‚ β”œβ”€β”€ lodash@0.9.2
    β”‚ β”œβ”€β”¬ minimatch@0.2.14
    β”‚ β”‚ β”œβ”€β”€ lru-cache@2.7.3
    β”‚ β”‚ └── sigmund@1.0.1
    β”‚ β”œβ”€β”¬ nopt@1.0.10
    β”‚ β”‚ └── abbrev@1.0.7
    β”‚ β”œβ”€β”€ rimraf@2.2.8
    β”‚ β”œβ”€β”€ underscore.string@2.2.1
    β”‚ └── which@1.0.9
    β”œβ”€β”¬ grunt-browserify@4.0.1
    β”‚ β”œβ”€β”€ async@0.9.2
    β”‚ β”œβ”€β”¬ browserify@11.2.0
    β”‚ β”‚ β”œβ”€β”€ assert@1.3.0
    β”‚ β”‚ β”œβ”€β”¬ browser-pack@5.0.1
    β”‚ β”‚ β”‚ β”œβ”€β”¬ combine-source-map@0.6.1
    β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ convert-source-map@1.1.3
    β”‚ β”‚ β”‚ β”‚ β”œβ”€β”¬ inline-source-map@0.5.0
    β”‚ β”‚ β”‚ β”‚ β”‚ └── source-map@0.4.4
    β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ lodash.memoize@3.0.4
    β”‚ β”‚ β”‚ β”‚ └── source-map@0.4.4
    β”‚ β”‚ β”‚ └── umd@3.0.1
    β”‚ β”‚ β”œβ”€β”€ browser-resolve@1.11.0
    β”‚ β”‚ β”œβ”€β”¬ browserify-zlib@0.1.4
    β”‚ β”‚ β”‚ └── pako@0.2.8
    β”‚ β”‚ β”œβ”€β”¬ buffer@3.6.0
    β”‚ β”‚ β”‚ β”œβ”€β”€ base64-js@0.0.8
    β”‚ β”‚ β”‚ β”œβ”€β”€ ieee754@1.1.6
    β”‚ β”‚ β”‚ └── isarray@1.0.0
    β”‚ β”‚ β”œβ”€β”€ builtins@0.0.7
    β”‚ β”‚ β”œβ”€β”€ commondir@0.0.1
    β”‚ β”‚ β”œβ”€β”¬ concat-stream@1.4.10
    β”‚ β”‚ β”‚ β”œβ”€β”€ readable-stream@1.1.13
    β”‚ β”‚ β”‚ └── typedarray@0.0.6
    β”‚ β”‚ β”œβ”€β”¬ console-browserify@1.1.0
    β”‚ β”‚ β”‚ └── date-now@0.1.4
    β”‚ β”‚ β”œβ”€β”€ constants-browserify@0.0.1
    β”‚ β”‚ β”œβ”€β”¬ crypto-browserify@3.11.0
    β”‚ β”‚ β”‚ β”œβ”€β”¬ browserify-cipher@1.0.0
    β”‚ β”‚ β”‚ β”‚ β”œβ”€β”¬ browserify-aes@1.0.5
    β”‚ β”‚ β”‚ β”‚ β”‚ └── buffer-xor@1.0.3
    β”‚ β”‚ β”‚ β”‚ β”œβ”€β”¬ browserify-des@1.0.0
    β”‚ β”‚ β”‚ β”‚ β”‚ └─┬ des.js@1.0.0
    β”‚ β”‚ β”‚ β”‚ β”‚   └── minimalistic-assert@1.0.0
    β”‚ β”‚ β”‚ β”‚ └── evp_bytestokey@1.0.0
    β”‚ β”‚ β”‚ β”œβ”€β”¬ browserify-sign@4.0.0
    β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ bn.js@4.6.2
    β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ browserify-rsa@4.0.0
    β”‚ β”‚ β”‚ β”‚ β”œβ”€β”¬ elliptic@6.0.2
    β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ brorand@1.0.5
    β”‚ β”‚ β”‚ β”‚ β”‚ └── hash.js@1.0.3
    β”‚ β”‚ β”‚ β”‚ └─┬ parse-asn1@5.0.0
    β”‚ β”‚ β”‚ β”‚   └── asn1.js@4.3.0
    β”‚ β”‚ β”‚ β”œβ”€β”€ create-ecdh@4.0.0
    β”‚ β”‚ β”‚ β”œβ”€β”¬ create-hash@1.1.2
    β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ cipher-base@1.0.2
    β”‚ β”‚ β”‚ β”‚ └── ripemd160@1.0.1
    β”‚ β”‚ β”‚ β”œβ”€β”€ create-hmac@1.1.4
    β”‚ β”‚ β”‚ β”œβ”€β”¬ diffie-hellman@5.0.0
    β”‚ β”‚ β”‚ β”‚ └── miller-rabin@4.0.0
    β”‚ β”‚ β”‚ β”œβ”€β”€ pbkdf2@3.0.4
    β”‚ β”‚ β”‚ β”œβ”€β”€ public-encrypt@4.0.0
    β”‚ β”‚ β”‚ └── randombytes@2.0.1
    β”‚ β”‚ β”œβ”€β”€ defined@1.0.0
    β”‚ β”‚ β”œβ”€β”€ deps-sort@1.3.9
    β”‚ β”‚ β”œβ”€β”€ domain-browser@1.1.7
    β”‚ β”‚ β”œβ”€β”¬ duplexer2@0.0.2
    β”‚ β”‚ β”‚ └── readable-stream@1.1.13
    β”‚ β”‚ β”œβ”€β”€ events@1.0.2
    β”‚ β”‚ β”œβ”€β”¬ glob@4.5.3
    β”‚ β”‚ β”‚ └── minimatch@2.0.10
    β”‚ β”‚ β”œβ”€β”¬ has@1.0.1
    β”‚ β”‚ β”‚ └── function-bind@1.0.2
    β”‚ β”‚ β”œβ”€β”€ htmlescape@1.1.0
    β”‚ β”‚ β”œβ”€β”€ https-browserify@0.0.1
    β”‚ β”‚ β”œβ”€β”€ inherits@2.0.1
    β”‚ β”‚ β”œβ”€β”¬ insert-module-globals@6.6.3
    β”‚ β”‚ β”‚ β”œβ”€β”€ is-buffer@1.1.1
    β”‚ β”‚ β”‚ └─┬ lexical-scope@1.2.0
    β”‚ β”‚ β”‚   └── astw@2.0.0
    β”‚ β”‚ β”œβ”€β”€ isarray@0.0.1
    β”‚ β”‚ β”œβ”€β”¬ JSONStream@1.0.7
    β”‚ β”‚ β”‚ β”œβ”€β”€ jsonparse@1.2.0
    β”‚ β”‚ β”‚ └── through@2.3.8
    β”‚ β”‚ β”œβ”€β”¬ labeled-stream-splicer@1.0.2
    β”‚ β”‚ β”‚ └─┬ stream-splicer@1.3.2
    β”‚ β”‚ β”‚   └── readable-stream@1.1.13
    β”‚ β”‚ β”œβ”€β”¬ module-deps@3.9.1
    β”‚ β”‚ β”‚ β”œβ”€β”€ detective@4.3.1
    β”‚ β”‚ β”‚ β”œβ”€β”€ readable-stream@1.1.13
    β”‚ β”‚ β”‚ └─┬ stream-combiner2@1.0.2
    β”‚ β”‚ β”‚   └─┬ through2@0.5.1
    β”‚ β”‚ β”‚     β”œβ”€β”€ readable-stream@1.0.33
    β”‚ β”‚ β”‚     └── xtend@3.0.0
    β”‚ β”‚ β”œβ”€β”€ os-browserify@0.1.2
    β”‚ β”‚ β”œβ”€β”¬ parents@1.0.1
    β”‚ β”‚ β”‚ └── path-platform@0.11.15
    β”‚ β”‚ β”œβ”€β”€ path-browserify@0.0.0
    β”‚ β”‚ β”œβ”€β”€ process@0.11.2
    β”‚ β”‚ β”œβ”€β”€ punycode@1.4.0
    β”‚ β”‚ β”œβ”€β”€ querystring-es3@0.2.1
    β”‚ β”‚ β”œβ”€β”¬ read-only-stream@1.1.1
    β”‚ β”‚ β”‚ β”œβ”€β”€ readable-stream@1.1.13
    β”‚ β”‚ β”‚ └─┬ readable-wrap@1.0.0
    β”‚ β”‚ β”‚   └── readable-stream@1.1.13
    β”‚ β”‚ β”œβ”€β”¬ readable-stream@2.0.5
    β”‚ β”‚ β”‚ β”œβ”€β”€ core-util-is@1.0.2
    β”‚ β”‚ β”‚ β”œβ”€β”€ process-nextick-args@1.0.6
    β”‚ β”‚ β”‚ └── util-deprecate@1.0.2
    β”‚ β”‚ β”œβ”€β”¬ shasum@1.0.2
    β”‚ β”‚ β”‚ β”œβ”€β”¬ json-stable-stringify@0.0.1
    β”‚ β”‚ β”‚ β”‚ └── jsonify@0.0.0
    β”‚ β”‚ β”‚ └── sha.js@2.4.4
    β”‚ β”‚ β”œβ”€β”€ shell-quote@0.0.1
    β”‚ β”‚ β”œβ”€β”€ stream-browserify@2.0.1
    β”‚ β”‚ β”œβ”€β”¬ stream-http@1.7.1
    β”‚ β”‚ β”‚ β”œβ”€β”€ builtin-status-codes@1.0.0
    β”‚ β”‚ β”‚ β”œβ”€β”€ foreach@2.0.5
    β”‚ β”‚ β”‚ β”œβ”€β”€ indexof@0.0.1
    β”‚ β”‚ β”‚ └── object-keys@1.0.9
    β”‚ β”‚ β”œβ”€β”€ string_decoder@0.10.31
    β”‚ β”‚ β”œβ”€β”¬ subarg@1.0.0
    β”‚ β”‚ β”‚ └── minimist@1.2.0
    β”‚ β”‚ β”œβ”€β”¬ syntax-error@1.1.4
    β”‚ β”‚ β”‚ └── acorn@1.2.2
    β”‚ β”‚ β”œβ”€β”¬ through2@1.1.1
    β”‚ β”‚ β”‚ └── readable-stream@1.1.13
    β”‚ β”‚ β”œβ”€β”€ timers-browserify@1.4.2
    β”‚ β”‚ β”œβ”€β”€ tty-browserify@0.0.0
    β”‚ β”‚ β”œβ”€β”¬ url@0.10.3
    β”‚ β”‚ β”‚ β”œβ”€β”€ punycode@1.3.2
    β”‚ β”‚ β”‚ └── querystring@0.2.0
    β”‚ β”‚ β”œβ”€β”€ util@0.10.3
    β”‚ β”‚ β”œβ”€β”€ vm-browserify@0.0.4
    β”‚ β”‚ └── xtend@4.0.1
    β”‚ β”œβ”€β”¬ glob@5.0.15
    β”‚ β”‚ β”œβ”€β”¬ inflight@1.0.4
    β”‚ β”‚ β”‚ └── wrappy@1.0.1
    β”‚ β”‚ β”œβ”€β”¬ minimatch@3.0.0
    β”‚ β”‚ β”‚ └─┬ brace-expansion@1.1.2
    β”‚ β”‚ β”‚   β”œβ”€β”€ balanced-match@0.3.0
    β”‚ β”‚ β”‚   └── concat-map@0.0.1
    β”‚ β”‚ β”œβ”€β”€ once@1.3.3
    β”‚ β”‚ └── path-is-absolute@1.0.0
    β”‚ β”œβ”€β”€ lodash@3.10.1
    β”‚ β”œβ”€β”€ resolve@1.1.6
    β”‚ └─┬ watchify@3.6.1
    β”‚   β”œβ”€β”¬ anymatch@1.3.0
    β”‚   β”‚ β”œβ”€β”€ arrify@1.0.1
    β”‚   β”‚ └─┬ micromatch@2.3.7
    β”‚   β”‚   β”œβ”€β”¬ arr-diff@2.0.0
    β”‚   β”‚   β”‚ └── arr-flatten@1.0.1
    β”‚   β”‚   β”œβ”€β”€ array-unique@0.2.1
    β”‚   β”‚   β”œβ”€β”¬ braces@1.8.3
    β”‚   β”‚   β”‚ β”œβ”€β”¬ expand-range@1.8.1
    β”‚   β”‚   β”‚ β”‚ └─┬ fill-range@2.2.3
    β”‚   β”‚   β”‚ β”‚   β”œβ”€β”€ is-number@2.1.0
    β”‚   β”‚   β”‚ β”‚   β”œβ”€β”€ isobject@2.0.0
    β”‚   β”‚   β”‚ β”‚   β”œβ”€β”€ randomatic@1.1.5
    β”‚   β”‚   β”‚ β”‚   └── repeat-string@1.5.2
    β”‚   β”‚   β”‚ β”œβ”€β”€ preserve@0.2.0
    β”‚   β”‚   β”‚ └── repeat-element@1.1.2
    β”‚   β”‚   β”œβ”€β”€ expand-brackets@0.1.4
    β”‚   β”‚   β”œβ”€β”¬ extglob@0.3.1
    β”‚   β”‚   β”‚ β”œβ”€β”¬ ansi-green@0.1.1
    β”‚   β”‚   β”‚ β”‚ └── ansi-wrap@0.1.0
    β”‚   β”‚   β”‚ └── success-symbol@0.1.0
    β”‚   β”‚   β”œβ”€β”€ filename-regex@2.0.0
    β”‚   β”‚   β”œβ”€β”€ is-extglob@1.0.0
    β”‚   β”‚   β”œβ”€β”€ kind-of@3.0.2
    β”‚   β”‚   β”œβ”€β”€ normalize-path@2.0.1
    β”‚   β”‚   β”œβ”€β”¬ object.omit@2.0.0
    β”‚   β”‚   β”‚ β”œβ”€β”¬ for-own@0.1.3
    β”‚   β”‚   β”‚ β”‚ └── for-in@0.1.4
    β”‚   β”‚   β”‚ └── is-extendable@0.1.1
    β”‚   β”‚   β”œβ”€β”¬ parse-glob@3.0.4
    β”‚   β”‚   β”‚ β”œβ”€β”€ glob-base@0.3.0
    β”‚   β”‚   β”‚ └── is-dotfile@1.0.2
    β”‚   β”‚   └─┬ regex-cache@0.4.2
    β”‚   β”‚     β”œβ”€β”€ is-equal-shallow@0.1.3
    β”‚   β”‚     └── is-primitive@2.0.0
    β”‚   β”œβ”€β”¬ browserify@12.0.1
    β”‚   β”‚ β”œβ”€β”¬ browser-pack@6.0.1
    β”‚   β”‚ β”‚ └─┬ combine-source-map@0.7.1
    β”‚   β”‚ β”‚   β”œβ”€β”€ inline-source-map@0.6.1
    β”‚   β”‚ β”‚   └── source-map@0.4.2
    β”‚   β”‚ β”œβ”€β”€ concat-stream@1.5.1
    β”‚   β”‚ β”œβ”€β”€ constants-browserify@1.0.0
    β”‚   β”‚ β”œβ”€β”€ deps-sort@2.0.0
    β”‚   β”‚ β”œβ”€β”€ duplexer2@0.1.4
    β”‚   β”‚ β”œβ”€β”€ events@1.1.0
    β”‚   β”‚ β”œβ”€β”¬ glob@5.0.15
    β”‚   β”‚ β”‚ └── minimatch@3.0.0
    β”‚   β”‚ β”œβ”€β”€ insert-module-globals@7.0.1
    β”‚   β”‚ β”œβ”€β”¬ labeled-stream-splicer@2.0.0
    β”‚   β”‚ β”‚ └── stream-splicer@2.0.0
    β”‚   β”‚ β”œβ”€β”¬ module-deps@4.0.5
    β”‚   β”‚ β”‚ └── stream-combiner2@1.1.1
    β”‚   β”‚ β”œβ”€β”€ read-only-stream@2.0.0
    β”‚   β”‚ β”œβ”€β”€ shell-quote@1.4.3
    β”‚   β”‚ β”œβ”€β”€ stream-http@2.0.2
    β”‚   β”‚ └─┬ url@0.11.0
    β”‚   β”‚   └── punycode@1.3.2
    β”‚   β”œβ”€β”¬ chokidar@1.4.2
    β”‚   β”‚ β”œβ”€β”€ async-each@0.1.6
    β”‚   β”‚ β”œβ”€β”¬ fsevents@1.0.6
    β”‚   β”‚ β”‚ └─┬ node-pre-gyp@0.6.17
    β”‚   β”‚ β”‚   β”œβ”€β”¬ mkdirp@0.5.1
    β”‚   β”‚ β”‚   β”‚ └── minimist@0.0.8
    β”‚   β”‚ β”‚   β”œβ”€β”¬ nopt@3.0.6
    β”‚   β”‚ β”‚   β”‚ └── abbrev@1.0.7
    β”‚   β”‚ β”‚   β”œβ”€β”¬ npmlog@2.0.0
    β”‚   β”‚ β”‚   β”‚ β”œβ”€β”€ ansi@0.3.0
    β”‚   β”‚ β”‚   β”‚ β”œβ”€β”¬ are-we-there-yet@1.0.4
    β”‚   β”‚ β”‚   β”‚ β”‚ β”œβ”€β”€ delegates@0.1.0
    β”‚   β”‚ β”‚   β”‚ β”‚ └─┬ readable-stream@1.1.13
    β”‚   β”‚ β”‚   β”‚ β”‚   β”œβ”€β”€ core-util-is@1.0.2
    β”‚   β”‚ β”‚   β”‚ β”‚   β”œβ”€β”€ isarray@0.0.1
    β”‚   β”‚ β”‚   β”‚ β”‚   └── string_decoder@0.10.31
    β”‚   β”‚ β”‚   β”‚ └─┬ gauge@1.2.2
    β”‚   β”‚ β”‚   β”‚   β”œβ”€β”€ has-unicode@1.0.1
    β”‚   β”‚ β”‚   β”‚   β”œβ”€β”¬ lodash.pad@3.1.1
    β”‚   β”‚ β”‚   β”‚   β”‚ β”œβ”€β”€ lodash._basetostring@3.0.1
    β”‚   β”‚ β”‚   β”‚   β”‚ └─┬ lodash._createpadding@3.6.1
    β”‚   β”‚ β”‚   β”‚   β”‚   └── lodash.repeat@3.0.1
    β”‚   β”‚ β”‚   β”‚   β”œβ”€β”€ lodash.padleft@3.1.1
    β”‚   β”‚ β”‚   β”‚   └── lodash.padright@3.1.1
    β”‚   β”‚ β”‚   β”œβ”€β”¬ rc@1.1.5
    β”‚   β”‚ β”‚   β”‚ β”œβ”€β”€ ini@1.3.4
    β”‚   β”‚ β”‚   β”‚ β”œβ”€β”€ minimist@1.2.0
    β”‚   β”‚ β”‚   β”‚ └── strip-json-comments@1.0.4
    β”‚   β”‚ β”‚   β”œβ”€β”¬ request@2.67.0
    β”‚   β”‚ β”‚   β”‚ β”œβ”€β”€ aws-sign2@0.6.0
    β”‚   β”‚ β”‚   β”‚ β”œβ”€β”¬ bl@1.0.0
    β”‚   β”‚ β”‚   β”‚ β”‚ └─┬ readable-stream@2.0.4
    β”‚   β”‚ β”‚   β”‚ β”‚   β”œβ”€β”€ core-util-is@1.0.2
    β”‚   β”‚ β”‚   β”‚ β”‚   β”œβ”€β”€ inherits@2.0.1
    β”‚   β”‚ β”‚   β”‚ β”‚   β”œβ”€β”€ isarray@0.0.1
    β”‚   β”‚ β”‚   β”‚ β”‚   β”œβ”€β”€ string_decoder@0.10.31
    β”‚   β”‚ β”‚   β”‚ β”‚   └── util-deprecate@1.0.2
    β”‚   β”‚ β”‚   β”‚ β”œβ”€β”€ caseless@0.11.0
    β”‚   β”‚ β”‚   β”‚ β”œβ”€β”¬ combined-stream@1.0.5
    β”‚   β”‚ β”‚   β”‚ β”‚ └── delayed-stream@1.0.0
    β”‚   β”‚ β”‚   β”‚ β”œβ”€β”€ extend@3.0.0
    β”‚   β”‚ β”‚   β”‚ β”œβ”€β”€ forever-agent@0.6.1
    β”‚   β”‚ β”‚   β”‚ β”œβ”€β”€ form-data@1.0.0-rc3
    β”‚   β”‚ β”‚   β”‚ β”œβ”€β”¬ har-validator@2.0.3
    β”‚   β”‚ β”‚   β”‚ β”‚ β”œβ”€β”¬ chalk@1.1.1
    β”‚   β”‚ β”‚   β”‚ β”‚ β”‚ β”œβ”€β”€ ansi-styles@2.1.0
    β”‚   β”‚ β”‚   β”‚ β”‚ β”‚ β”œβ”€β”¬ has-ansi@2.0.0
    β”‚   β”‚ β”‚   β”‚ β”‚ β”‚ β”‚ └── ansi-regex@2.0.0
    β”‚   β”‚ β”‚   β”‚ β”‚ β”‚ β”œβ”€β”€ strip-ansi@3.0.0
    β”‚   β”‚ β”‚   β”‚ β”‚ β”‚ └── supports-color@2.0.0
    β”‚   β”‚ β”‚   β”‚ β”‚ β”œβ”€β”¬ commander@2.9.0
    β”‚   β”‚ β”‚   β”‚ β”‚ β”‚ └── graceful-readlink@1.0.1
    β”‚   β”‚ β”‚   β”‚ β”‚ β”œβ”€β”¬ is-my-json-valid@2.12.3
    β”‚   β”‚ β”‚   β”‚ β”‚ β”‚ β”œβ”€β”€ generate-function@2.0.0
    β”‚   β”‚ β”‚   β”‚ β”‚ β”‚ β”œβ”€β”¬ generate-object-property@1.2.0
    β”‚   β”‚ β”‚   β”‚ β”‚ β”‚ β”‚ └── is-property@1.0.2
    β”‚   β”‚ β”‚   β”‚ β”‚ β”‚ β”œβ”€β”€ jsonpointer@2.0.0
    β”‚   β”‚ β”‚   β”‚ β”‚ β”‚ └── xtend@4.0.1
    β”‚   β”‚ β”‚   β”‚ β”‚ └─┬ pinkie-promise@2.0.0
    β”‚   β”‚ β”‚   β”‚ β”‚   └── pinkie@2.0.1
    β”‚   β”‚ β”‚   β”‚ β”œβ”€β”¬ hawk@3.1.2
    β”‚   β”‚ β”‚   β”‚ β”‚ β”œβ”€β”€ boom@2.10.1
    β”‚   β”‚ β”‚   β”‚ β”‚ β”œβ”€β”€ cryptiles@2.0.5
    β”‚   β”‚ β”‚   β”‚ β”‚ β”œβ”€β”€ hoek@2.16.3
    β”‚   β”‚ β”‚   β”‚ β”‚ └── sntp@1.0.9
    β”‚   β”‚ β”‚   β”‚ β”œβ”€β”¬ http-signature@1.1.0
    β”‚   β”‚ β”‚   β”‚ β”‚ β”œβ”€β”€ assert-plus@0.1.5
    β”‚   β”‚ β”‚   β”‚ β”‚ β”œβ”€β”¬ jsprim@1.2.2
    β”‚   β”‚ β”‚   β”‚ β”‚ β”‚ β”œβ”€β”€ extsprintf@1.0.2
    β”‚   β”‚ β”‚   β”‚ β”‚ β”‚ β”œβ”€β”€ json-schema@0.2.2
    β”‚   β”‚ β”‚   β”‚ β”‚ β”‚ └── verror@1.3.6
    β”‚   β”‚ β”‚   β”‚ β”‚ └─┬ sshpk@1.7.0
    β”‚   β”‚ β”‚   β”‚ β”‚   β”œβ”€β”€ asn1@0.2.3
    β”‚   β”‚ β”‚   β”‚ β”‚   β”œβ”€β”€ assert-plus@0.2.0
    β”‚   β”‚ β”‚   β”‚ β”‚   β”œβ”€β”€ ecc-jsbn@0.1.1
    β”‚   β”‚ β”‚   β”‚ β”‚   β”œβ”€β”€ jodid25519@1.0.2
    β”‚   β”‚ β”‚   β”‚ β”‚   └── jsbn@0.1.0
    β”‚   β”‚ β”‚   β”‚ β”œβ”€β”€ is-typedarray@1.0.0
    β”‚   β”‚ β”‚   β”‚ β”œβ”€β”€ isstream@0.1.2
    β”‚   β”‚ β”‚   β”‚ β”œβ”€β”€ json-stringify-safe@5.0.1
    β”‚   β”‚ β”‚   β”‚ β”œβ”€β”€ node-uuid@1.4.7
    β”‚   β”‚ β”‚   β”‚ β”œβ”€β”€ oauth-sign@0.8.0
    β”‚   β”‚ β”‚   β”‚ β”œβ”€β”€ qs@5.2.0
    β”‚   β”‚ β”‚   β”‚ β”œβ”€β”€ stringstream@0.0.5
    β”‚   β”‚ β”‚   β”‚ └── tough-cookie@2.2.1
    β”‚   β”‚ β”‚   β”œβ”€β”¬ rimraf@2.4.4
    β”‚   β”‚ β”‚   β”‚ └─┬ glob@5.0.15
    β”‚   β”‚ β”‚   β”‚   β”œβ”€β”¬ inflight@1.0.4
    β”‚   β”‚ β”‚   β”‚   β”‚ └── wrappy@1.0.1
    β”‚   β”‚ β”‚   β”‚   β”œβ”€β”€ inherits@2.0.1
    β”‚   β”‚ β”‚   β”‚   β”œβ”€β”¬ minimatch@3.0.0
    β”‚   β”‚ β”‚   β”‚   β”‚ └─┬ brace-expansion@1.1.1
    β”‚   β”‚ β”‚   β”‚   β”‚   └── concat-map@0.0.1
    β”‚   β”‚ β”‚   β”‚   β”œβ”€β”¬ once@1.3.3
    β”‚   β”‚ β”‚   β”‚   β”‚ └── wrappy@1.0.1
    β”‚   β”‚ β”‚   β”‚   └── path-is-absolute@1.0.0
    β”‚   β”‚ β”‚   β”œβ”€β”€ semver@5.1.0
    β”‚   β”‚ β”‚   β”œβ”€β”¬ tar@2.2.1
    β”‚   β”‚ β”‚   β”‚ β”œβ”€β”€ block-stream@0.0.8
    β”‚   β”‚ β”‚   β”‚ β”œβ”€β”€ fstream@1.0.8
    β”‚   β”‚ β”‚   β”‚ └── inherits@2.0.1
    β”‚   β”‚ β”‚   └─┬ tar-pack@3.1.0
    β”‚   β”‚ β”‚     β”œβ”€β”€ debug@0.7.4
    β”‚   β”‚ β”‚     β”œβ”€β”¬ fstream-ignore@1.0.3
    β”‚   β”‚ β”‚     β”‚ └─┬ minimatch@3.0.0
    β”‚   β”‚ β”‚     β”‚   └─┬ brace-expansion@1.1.1
    β”‚   β”‚ β”‚     β”‚     └── concat-map@0.0.1
    β”‚   β”‚ β”‚     β”œβ”€β”€ graceful-fs@4.1.2
    β”‚   β”‚ β”‚     β”œβ”€β”¬ readable-stream@1.0.33
    β”‚   β”‚ β”‚     β”‚ β”œβ”€β”€ core-util-is@1.0.2
    β”‚   β”‚ β”‚     β”‚ β”œβ”€β”€ inherits@2.0.1
    β”‚   β”‚ β”‚     β”‚ β”œβ”€β”€ isarray@0.0.1
    β”‚   β”‚ β”‚     β”‚ └── string_decoder@0.10.31
    β”‚   β”‚ β”‚     └── rimraf@2.2.8
    β”‚   β”‚ β”œβ”€β”€ glob-parent@2.0.0
    β”‚   β”‚ β”œβ”€β”¬ is-binary-path@1.0.1
    β”‚   β”‚ β”‚ └── binary-extensions@1.4.0
    β”‚   β”‚ β”œβ”€β”€ is-glob@2.0.1
    β”‚   β”‚ └─┬ readdirp@2.0.0
    β”‚   β”‚   β”œβ”€β”€ graceful-fs@4.1.2
    β”‚   β”‚   └── minimatch@2.0.10
    β”‚   β”œβ”€β”¬ outpipe@1.1.1
    β”‚   β”‚ └─┬ shell-quote@1.4.3
    β”‚   β”‚   β”œβ”€β”€ array-filter@0.0.1
    β”‚   β”‚   β”œβ”€β”€ array-map@0.0.0
    β”‚   β”‚   └── array-reduce@0.0.0
    β”‚   └── through2@2.0.0
    β”œβ”€β”€ grunt-contrib-clean@0.6.0
    β”œβ”€β”¬ grunt-contrib-compress@0.14.0
    β”‚ β”œβ”€β”¬ archiver@0.16.0
    β”‚ β”‚ β”œβ”€β”€ async@1.4.2
    β”‚ β”‚ β”œβ”€β”€ buffer-crc32@0.2.5
    β”‚ β”‚ β”œβ”€β”¬ glob@5.0.15
    β”‚ β”‚ β”‚ └── minimatch@3.0.0
    β”‚ β”‚ β”œβ”€β”¬ lazystream@0.1.0
    β”‚ β”‚ β”‚ └── readable-stream@1.0.33
    β”‚ β”‚ β”œβ”€β”€ lodash@3.10.1
    β”‚ β”‚ β”œβ”€β”€ readable-stream@1.0.33
    β”‚ β”‚ β”œβ”€β”¬ tar-stream@1.2.2
    β”‚ β”‚ β”‚ β”œβ”€β”€ bl@1.0.0
    β”‚ β”‚ β”‚ └── end-of-stream@1.1.0
    β”‚ β”‚ └─┬ zip-stream@0.6.0
    β”‚ β”‚   β”œβ”€β”¬ compress-commons@0.3.0
    β”‚ β”‚   β”‚ β”œβ”€β”¬ crc32-stream@0.3.4
    β”‚ β”‚   β”‚ β”‚ └── readable-stream@1.0.33
    β”‚ β”‚   β”‚ β”œβ”€β”€ node-int64@0.4.0
    β”‚ β”‚   β”‚ └── readable-stream@1.0.33
    β”‚ β”‚   β”œβ”€β”€ lodash@3.10.1
    β”‚ β”‚   └── readable-stream@1.0.33
    β”‚ β”œβ”€β”¬ chalk@1.1.1
    β”‚ β”‚ β”œβ”€β”€ ansi-styles@2.1.0
    β”‚ β”‚ β”œβ”€β”€ escape-string-regexp@1.0.4
    β”‚ β”‚ β”œβ”€β”¬ has-ansi@2.0.0
    β”‚ β”‚ β”‚ └── ansi-regex@2.0.0
    β”‚ β”‚ β”œβ”€β”€ strip-ansi@3.0.0
    β”‚ β”‚ └── supports-color@2.0.0
    β”‚ └─┬ pretty-bytes@2.0.1
    β”‚   β”œβ”€β”€ get-stdin@4.0.1
    β”‚   β”œβ”€β”¬ meow@3.7.0
    β”‚   β”‚ β”œβ”€β”¬ camelcase-keys@2.0.0
    β”‚   β”‚ β”‚ └── camelcase@2.0.1
    β”‚   β”‚ β”œβ”€β”€ decamelize@1.1.2
    β”‚   β”‚ β”œβ”€β”¬ loud-rejection@1.2.0
    β”‚   β”‚ β”‚ └── signal-exit@2.1.2
    β”‚   β”‚ β”œβ”€β”€ map-obj@1.0.1
    β”‚   β”‚ β”œβ”€β”¬ normalize-package-data@2.3.5
    β”‚   β”‚ β”‚ β”œβ”€β”€ hosted-git-info@2.1.4
    β”‚   β”‚ β”‚ β”œβ”€β”¬ is-builtin-module@1.0.0
    β”‚   β”‚ β”‚ β”‚ └── builtin-modules@1.1.1
    β”‚   β”‚ β”‚ └─┬ validate-npm-package-license@3.0.1
    β”‚   β”‚ β”‚   β”œβ”€β”¬ spdx-correct@1.0.2
    β”‚   β”‚ β”‚   β”‚ └── spdx-license-ids@1.1.0
    β”‚   β”‚ β”‚   └─┬ spdx-expression-parse@1.0.2
    β”‚   β”‚ β”‚     └── spdx-exceptions@1.0.4
    β”‚   β”‚ β”œβ”€β”¬ read-pkg-up@1.0.1
    β”‚   β”‚ β”‚ β”œβ”€β”¬ find-up@1.1.0
    β”‚   β”‚ β”‚ β”‚ └── path-exists@2.1.0
    β”‚   β”‚ β”‚ └─┬ read-pkg@1.1.0
    β”‚   β”‚ β”‚   β”œβ”€β”¬ load-json-file@1.1.0
    β”‚   β”‚ β”‚   β”‚ β”œβ”€β”€ graceful-fs@4.1.2
    β”‚   β”‚ β”‚   β”‚ β”œβ”€β”¬ parse-json@2.2.0
    β”‚   β”‚ β”‚   β”‚ β”‚ └─┬ error-ex@1.3.0
    β”‚   β”‚ β”‚   β”‚ β”‚   └── is-arrayish@0.2.1
    β”‚   β”‚ β”‚   β”‚ └── pify@2.3.0
    β”‚   β”‚ β”‚   └─┬ path-type@1.1.0
    β”‚   β”‚ β”‚     └── graceful-fs@4.1.2
    β”‚   β”‚ β”œβ”€β”¬ redent@1.0.0
    β”‚   β”‚ β”‚ β”œβ”€β”¬ indent-string@2.1.0
    β”‚   β”‚ β”‚ β”‚ └─┬ repeating@2.0.0
    β”‚   β”‚ β”‚ β”‚   └── is-finite@1.0.1
    β”‚   β”‚ β”‚ └── strip-indent@1.0.1
    β”‚   β”‚ └── trim-newlines@1.0.0
    β”‚   └── number-is-nan@1.0.0
    β”œβ”€β”¬ grunt-contrib-concat@0.5.1
    β”‚ β”œβ”€β”¬ chalk@0.5.1
    β”‚ β”‚ β”œβ”€β”€ ansi-styles@1.1.0
    β”‚ β”‚ β”œβ”€β”¬ has-ansi@0.1.0
    β”‚ β”‚ β”‚ └── ansi-regex@0.2.1
    β”‚ β”‚ β”œβ”€β”€ strip-ansi@0.3.0
    β”‚ β”‚ └── supports-color@0.2.0
    β”‚ └─┬ source-map@0.3.0
    β”‚   └── amdefine@1.0.0
    β”œβ”€β”¬ grunt-contrib-copy@0.8.2
    β”‚ └── file-sync-cmp@0.1.1
    β”œβ”€β”¬ grunt-contrib-cssmin@0.14.0
    β”‚ β”œβ”€β”¬ clean-css@3.4.9
    β”‚ β”‚ β”œβ”€β”¬ commander@2.8.1
    β”‚ β”‚ β”‚ └── graceful-readlink@1.0.1
    β”‚ β”‚ └── source-map@0.4.4
    β”‚ └─┬ maxmin@1.1.0
    β”‚   β”œβ”€β”€ figures@1.4.0
    β”‚   β”œβ”€β”€ gzip-size@1.0.0
    β”‚   └── pretty-bytes@1.0.4
    β”œβ”€β”¬ grunt-contrib-imagemin@1.0.0
    β”‚ β”œβ”€β”€ async@0.9.2
    β”‚ β”œβ”€β”€ gulp-rename@1.2.2
    β”‚ β”œβ”€β”¬ imagemin@4.0.0
    β”‚ β”‚ β”œβ”€β”¬ buffer-to-vinyl@1.1.0
    β”‚ β”‚ β”‚ β”œβ”€β”€ file-type@3.4.0
    β”‚ β”‚ β”‚ β”œβ”€β”€ uuid@2.0.1
    β”‚ β”‚ β”‚ └─┬ vinyl@1.1.0
    β”‚ β”‚ β”‚   β”œβ”€β”€ clone@1.0.2
    β”‚ β”‚ β”‚   β”œβ”€β”€ clone-stats@0.0.1
    β”‚ β”‚ β”‚   └── replace-ext@0.0.1
    β”‚ β”‚ β”œβ”€β”¬ imagemin-gifsicle@4.2.0
    β”‚ β”‚ β”‚ β”œβ”€β”¬ gifsicle@3.0.3
    β”‚ β”‚ β”‚ β”‚ β”œβ”€β”¬ bin-build@2.2.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ archive-type@3.2.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”¬ decompress@3.0.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”¬ decompress-tar@3.1.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ is-tar@1.0.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ object-assign@2.1.1
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”¬ strip-dirs@1.1.1
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ is-natural-number@2.0.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── sum-up@1.0.2
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”¬ through2@0.6.5
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── readable-stream@1.0.33
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └─┬ vinyl@0.4.6
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚   └── clone@0.2.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”¬ decompress-tarbz2@3.1.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ is-bzip2@1.0.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ object-assign@2.1.1
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ seek-bzip@1.0.5
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”¬ through2@0.6.5
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── readable-stream@1.0.33
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └─┬ vinyl@0.4.6
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚   └── clone@0.2.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”¬ decompress-targz@3.1.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ is-gzip@1.0.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ object-assign@2.1.1
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”¬ through2@0.6.5
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── readable-stream@1.0.33
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └─┬ vinyl@0.4.6
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚   └── clone@0.2.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”¬ decompress-unzip@3.4.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ is-zip@1.0.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ stat-mode@0.2.1
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ through2@2.0.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └─┬ yauzl@2.4.1
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚   └─┬ fd-slicer@1.0.1
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚     └── pend@1.2.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”¬ stream-combiner2@1.1.1
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── duplexer2@0.1.4
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── vinyl-assign@1.2.1
    β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”¬ download@4.4.3
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”¬ caw@1.2.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”¬ get-proxy@1.0.1
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └─┬ rc@0.5.5
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚   β”œβ”€β”€ deep-extend@0.2.11
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚   β”œβ”€β”€ minimist@0.0.10
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚   └── strip-json-comments@0.1.3
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ is-obj@1.0.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── object-assign@3.0.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”¬ filenamify@1.2.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ filename-reserved-regex@1.0.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ strip-outer@1.0.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── trim-repeated@1.0.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”¬ got@5.3.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”¬ create-error-class@2.0.1
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── capture-stack-trace@1.0.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ is-plain-obj@1.1.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ is-redirect@1.0.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ lowercase-keys@1.0.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ node-status-codes@1.0.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ timed-out@2.0.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ unzip-response@1.0.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └─┬ url-parse-lax@1.0.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚   └── prepend-http@1.0.3
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”¬ gulp-decompress@1.2.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └─┬ gulp-util@3.0.7
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚   β”œβ”€β”€ array-differ@1.0.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚   β”œβ”€β”€ array-uniq@1.0.2
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚   β”œβ”€β”€ beeper@1.1.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚   β”œβ”€β”€ dateformat@1.0.12
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚   β”œβ”€β”¬ fancy-log@1.1.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚   β”‚ └── dateformat@1.0.12
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚   β”œβ”€β”¬ gulplog@1.0.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚   β”‚ └── glogg@1.0.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚   β”œβ”€β”¬ has-gulplog@0.1.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚   β”‚ └── sparkles@1.0.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚   β”œβ”€β”€ lodash._reescape@3.0.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚   β”œβ”€β”€ lodash._reevaluate@3.0.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚   β”œβ”€β”€ lodash._reinterpolate@3.0.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚   β”œβ”€β”¬ lodash.template@3.6.2
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚   β”‚ β”œβ”€β”€ lodash._basecopy@3.0.1
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚   β”‚ β”œβ”€β”€ lodash._basevalues@3.0.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚   β”‚ β”œβ”€β”€ lodash._isiterateecall@3.0.9
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚   β”‚ β”œβ”€β”€ lodash.escape@3.0.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚   β”‚ β”œβ”€β”¬ lodash.keys@3.1.2
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚   β”‚ β”‚ β”œβ”€β”€ lodash._getnative@3.9.1
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚   β”‚ β”‚ β”œβ”€β”€ lodash.isarguments@3.0.4
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚   β”‚ β”‚ └── lodash.isarray@3.0.4
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚   β”‚ β”œβ”€β”€ lodash.restparam@3.6.1
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚   β”‚ └── lodash.templatesettings@3.1.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚   β”œβ”€β”€ multipipe@0.1.2
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚   β”œβ”€β”€ object-assign@3.0.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚   β”œβ”€β”€ through2@2.0.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚   └── vinyl@0.5.3
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ is-url@1.2.1
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”¬ read-all-stream@3.0.1
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └─┬ pinkie-promise@1.0.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚   └── pinkie@1.0.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”¬ stream-combiner2@1.1.1
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── duplexer2@0.1.4
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └─┬ ware@1.3.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚   └─┬ wrap-fn@0.1.4
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚     └── co@3.1.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”¬ exec-series@1.0.2
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── async-each-series@1.1.0
    β”‚ β”‚ β”‚ β”‚ β”‚ └─┬ url-regex@3.1.0
    β”‚ β”‚ β”‚ β”‚ β”‚   └── ip-regex@1.0.3
    β”‚ β”‚ β”‚ β”‚ β”œβ”€β”¬ bin-wrapper@3.0.2
    β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”¬ bin-check@2.0.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── executable@1.1.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”¬ bin-version-check@2.1.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”¬ bin-version@1.0.4
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └─┬ find-versions@1.2.1
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚   └── semver-regex@1.0.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ semver@4.3.6
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── semver-truncate@1.1.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ lazy-req@1.1.0
    β”‚ β”‚ β”‚ β”‚ β”‚ └── os-filter-obj@1.0.3
    β”‚ β”‚ β”‚ β”‚ └─┬ logalot@2.1.0
    β”‚ β”‚ β”‚ β”‚   └─┬ squeak@1.3.0
    β”‚ β”‚ β”‚ β”‚     β”œβ”€β”€ console-stream@0.1.1
    β”‚ β”‚ β”‚ β”‚     └─┬ lpad-align@1.1.0
    β”‚ β”‚ β”‚ β”‚       β”œβ”€β”€ longest@1.0.1
    β”‚ β”‚ β”‚ β”‚       └── lpad@2.0.1
    β”‚ β”‚ β”‚ β”œβ”€β”€ is-gif@1.0.0
    β”‚ β”‚ β”‚ └─┬ through2@0.6.5
    β”‚ β”‚ β”‚   └── readable-stream@1.0.33
    β”‚ β”‚ β”œβ”€β”¬ imagemin-jpegtran@4.3.2
    β”‚ β”‚ β”‚ β”œβ”€β”€ is-jpg@1.0.0
    β”‚ β”‚ β”‚ β”œβ”€β”€ jpegtran-bin@3.0.6
    β”‚ β”‚ β”‚ └── through2@2.0.0
    β”‚ β”‚ β”œβ”€β”¬ imagemin-optipng@4.3.0
    β”‚ β”‚ β”‚ β”œβ”€β”¬ exec-buffer@2.0.1
    β”‚ β”‚ β”‚ β”‚ └── tempfile@1.1.1
    β”‚ β”‚ β”‚ β”œβ”€β”€ is-png@1.0.0
    β”‚ β”‚ β”‚ β”œβ”€β”€ optipng-bin@3.0.4
    β”‚ β”‚ β”‚ └─┬ through2@0.6.5
    β”‚ β”‚ β”‚   └── readable-stream@1.0.33
    β”‚ β”‚ β”œβ”€β”¬ imagemin-svgo@4.2.0
    β”‚ β”‚ β”‚ β”œβ”€β”€ is-svg@1.1.1
    β”‚ β”‚ β”‚ β”œβ”€β”¬ svgo@0.6.1
    β”‚ β”‚ β”‚ β”‚ β”œβ”€β”¬ coa@1.0.1
    β”‚ β”‚ β”‚ β”‚ β”‚ └── q@1.4.1
    β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ colors@1.1.2
    β”‚ β”‚ β”‚ β”‚ β”œβ”€β”¬ csso@1.4.4
    β”‚ β”‚ β”‚ β”‚ β”‚ └── clap@1.0.10
    β”‚ β”‚ β”‚ β”‚ β”œβ”€β”¬ js-yaml@3.4.6
    β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”¬ argparse@1.0.3
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ lodash@3.10.1
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── sprintf-js@1.0.3
    β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ esprima@2.7.1
    β”‚ β”‚ β”‚ β”‚ β”‚ └── inherit@2.2.2
    β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ sax@1.1.4
    β”‚ β”‚ β”‚ β”‚ └── whet.extend@0.9.9
    β”‚ β”‚ β”‚ └── through2@2.0.0
    β”‚ β”‚ β”œβ”€β”€ optional@0.1.3
    β”‚ β”‚ β”œβ”€β”¬ stream-combiner2@1.1.1
    β”‚ β”‚ β”‚ └── duplexer2@0.1.4
    β”‚ β”‚ └─┬ vinyl-fs@2.2.1
    β”‚ β”‚   β”œβ”€β”¬ duplexify@3.4.2
    β”‚ β”‚   β”‚ └── end-of-stream@1.0.0
    β”‚ β”‚   β”œβ”€β”¬ glob-stream@5.3.1
    β”‚ β”‚   β”‚ β”œβ”€β”¬ glob@5.0.15
    β”‚ β”‚   β”‚ β”‚ └── minimatch@3.0.0
    β”‚ β”‚   β”‚ β”œβ”€β”¬ ordered-read-streams@0.3.0
    β”‚ β”‚   β”‚ β”‚ └── is-stream@1.0.1
    β”‚ β”‚   β”‚ β”œβ”€β”¬ through2@0.6.5
    β”‚ β”‚   β”‚ β”‚ └── readable-stream@1.0.33
    β”‚ β”‚   β”‚ β”œβ”€β”¬ to-absolute-glob@0.1.1
    β”‚ β”‚   β”‚ β”‚ └── extend-shallow@2.0.1
    β”‚ β”‚   β”‚ └── unique-stream@2.2.0
    β”‚ β”‚   β”œβ”€β”€ graceful-fs@4.1.2
    β”‚ β”‚   β”œβ”€β”¬ gulp-sourcemaps@1.6.0
    β”‚ β”‚   β”‚ β”œβ”€β”€ graceful-fs@4.1.2
    β”‚ β”‚   β”‚ └── through2@2.0.0
    β”‚ β”‚   β”œβ”€β”€ is-valid-glob@0.3.0
    β”‚ β”‚   β”œβ”€β”€ merge-stream@1.0.0
    β”‚ β”‚   β”œβ”€β”¬ strip-bom@2.0.0
    β”‚ β”‚   β”‚ └── is-utf8@0.2.1
    β”‚ β”‚   β”œβ”€β”¬ strip-bom-stream@1.0.0
    β”‚ β”‚   β”‚ └── first-chunk-stream@1.0.0
    β”‚ β”‚   β”œβ”€β”€ through2@2.0.0
    β”‚ β”‚   └─┬ through2-filter@2.0.0
    β”‚ β”‚     └── through2@2.0.0
    β”‚ └── pretty-bytes@1.0.4
    β”œβ”€β”¬ grunt-contrib-jshint@0.11.3
    β”‚ └─┬ jshint@2.8.0
    β”‚   β”œβ”€β”¬ cli@0.6.6
    β”‚   β”‚ └─┬ glob@3.2.11
    β”‚   β”‚   └── minimatch@0.3.0
    β”‚   β”œβ”€β”¬ htmlparser2@3.8.3
    β”‚   β”‚ β”œβ”€β”€ domelementtype@1.3.0
    β”‚   β”‚ β”œβ”€β”€ domhandler@2.3.0
    β”‚   β”‚ β”œβ”€β”¬ domutils@1.5.1
    β”‚   β”‚ β”‚ └─┬ dom-serializer@0.1.0
    β”‚   β”‚ β”‚   β”œβ”€β”€ domelementtype@1.1.3
    β”‚   β”‚ β”‚   └── entities@1.1.1
    β”‚   β”‚ β”œβ”€β”€ entities@1.0.0
    β”‚   β”‚ └── readable-stream@1.1.13
    β”‚   β”œβ”€β”€ lodash@3.7.0
    β”‚   β”œβ”€β”€ minimatch@2.0.10
    β”‚   β”œβ”€β”€ shelljs@0.3.0
    β”‚   └── strip-json-comments@1.0.4
    β”œβ”€β”¬ grunt-contrib-qunit@0.7.0
    β”‚ └─┬ grunt-lib-phantomjs@0.6.0
    β”‚   β”œβ”€β”¬ phantomjs@1.9.19
    β”‚   β”‚ β”œβ”€β”€ adm-zip@0.4.4
    β”‚   β”‚ β”œβ”€β”¬ fs-extra@0.23.1
    β”‚   β”‚ β”‚ β”œβ”€β”€ graceful-fs@4.1.2
    β”‚   β”‚ β”‚ └── jsonfile@2.2.3
    β”‚   β”‚ β”œβ”€β”€ kew@0.4.0
    β”‚   β”‚ β”œβ”€β”¬ md5@2.0.0
    β”‚   β”‚ β”‚ β”œβ”€β”€ charenc@0.0.1
    β”‚   β”‚ β”‚ β”œβ”€β”€ crypt@0.0.1
    β”‚   β”‚ β”‚ └── is-buffer@1.0.2
    β”‚   β”‚ β”œβ”€β”¬ npmconf@2.1.1
    β”‚   β”‚ β”‚ β”œβ”€β”€ nopt@3.0.6
    β”‚   β”‚ β”‚ └── semver@4.3.6
    β”‚   β”‚ β”œβ”€β”€ progress@1.1.8
    β”‚   β”‚ β”œβ”€β”¬ request@2.42.0
    β”‚   β”‚ β”‚ β”œβ”€β”€ aws-sign2@0.5.0
    β”‚   β”‚ β”‚ β”œβ”€β”¬ bl@0.9.4
    β”‚   β”‚ β”‚ β”‚ └── readable-stream@1.0.33
    β”‚   β”‚ β”‚ β”œβ”€β”€ caseless@0.6.0
    β”‚   β”‚ β”‚ β”œβ”€β”€ hawk@1.1.1
    β”‚   β”‚ β”‚ β”œβ”€β”€ mime-types@1.0.2
    β”‚   β”‚ β”‚ β”œβ”€β”€ oauth-sign@0.4.0
    β”‚   β”‚ β”‚ └── qs@1.2.2
    β”‚   β”‚ └─┬ request-progress@0.3.1
    β”‚   β”‚   └── throttleit@0.0.2
    β”‚   β”œβ”€β”€ semver@1.0.14
    β”‚   └─┬ temporary@0.0.8
    β”‚     └── package@1.0.1
    β”œβ”€β”¬ grunt-contrib-uglify@0.10.1
    β”‚ β”œβ”€β”¬ chalk@1.0.0
    β”‚ β”‚ β”œβ”€β”¬ has-ansi@1.0.3
    β”‚ β”‚ β”‚ └── ansi-regex@1.1.1
    β”‚ β”‚ β”œβ”€β”€ strip-ansi@2.0.1
    β”‚ β”‚ └── supports-color@1.3.1
    β”‚ β”œβ”€β”€ lodash@3.2.0
    β”‚ β”œβ”€β”¬ maxmin@1.0.1
    β”‚ β”‚ └── pretty-bytes@1.0.4
    β”‚ β”œβ”€β”¬ uglify-js@2.5.0
    β”‚ β”‚ β”œβ”€β”€ async@0.2.10
    β”‚ β”‚ β”œβ”€β”€ uglify-to-browserify@1.0.2
    β”‚ β”‚ └─┬ yargs@3.5.4
    β”‚ β”‚   β”œβ”€β”€ camelcase@1.2.1
    β”‚ β”‚   β”œβ”€β”€ window-size@0.1.0
    β”‚ β”‚   └── wordwrap@0.0.2
    β”‚ └── uri-path@1.0.0
    β”œβ”€β”¬ grunt-contrib-watch@0.6.1
    β”‚ β”œβ”€β”€ async@0.2.10
    β”‚ β”œβ”€β”¬ gaze@0.5.2
    β”‚ β”‚ └─┬ globule@0.1.0
    β”‚ β”‚   └── lodash@1.0.2
    β”‚ β”œβ”€β”€ lodash@2.4.2
    β”‚ └─┬ tiny-lr-fork@0.0.5
    β”‚   β”œβ”€β”€ debug@0.7.4
    β”‚   β”œβ”€β”€ faye-websocket@0.4.4
    β”‚   β”œβ”€β”¬ noptify@0.0.3
    β”‚   β”‚ └── nopt@2.0.0
    β”‚   └── qs@0.5.6
    β”œβ”€β”€ grunt-includes@0.5.2
    β”œβ”€β”¬ grunt-jsvalidate@0.2.2
    β”‚ └── esprima@1.0.4
    β”œβ”€β”€ grunt-legacy-util@0.2.0
    β”œβ”€β”¬ grunt-patch-wordpress@0.3.0
    β”‚ β”œβ”€β”¬ inquirer@0.2.5
    β”‚ β”‚ β”œβ”€β”€ async@0.2.10
    β”‚ β”‚ β”œβ”€β”¬ cli-color@0.2.3
    β”‚ β”‚ β”‚ β”œβ”€β”€ es5-ext@0.9.2
    β”‚ β”‚ β”‚ └─┬ memoizee@0.2.6
    β”‚ β”‚ β”‚   β”œβ”€β”€ event-emitter@0.2.2
    β”‚ β”‚ β”‚   └── next-tick@0.1.0
    β”‚ β”‚ β”œβ”€β”€ lodash@1.2.1
    β”‚ β”‚ └── mute-stream@0.0.3
    β”‚ β”œβ”€β”¬ request@2.27.0
    β”‚ β”‚ β”œβ”€β”€ aws-sign@0.3.0
    β”‚ β”‚ β”œβ”€β”€ cookie-jar@0.3.0
    β”‚ β”‚ β”œβ”€β”€ forever-agent@0.5.2
    β”‚ β”‚ β”œβ”€β”¬ form-data@0.1.4
    β”‚ β”‚ β”‚ β”œβ”€β”€ async@0.9.2
    β”‚ β”‚ β”‚ └─┬ combined-stream@0.0.7
    β”‚ β”‚ β”‚   └── delayed-stream@0.0.5
    β”‚ β”‚ β”œβ”€β”¬ hawk@1.0.0
    β”‚ β”‚ β”‚ β”œβ”€β”€ boom@0.4.2
    β”‚ β”‚ β”‚ β”œβ”€β”€ cryptiles@0.2.2
    β”‚ β”‚ β”‚ β”œβ”€β”€ hoek@0.9.1
    β”‚ β”‚ β”‚ └── sntp@0.2.4
    β”‚ β”‚ β”œβ”€β”¬ http-signature@0.10.1
    β”‚ β”‚ β”‚ β”œβ”€β”€ asn1@0.1.11
    β”‚ β”‚ β”‚ β”œβ”€β”€ assert-plus@0.1.5
    β”‚ β”‚ β”‚ └── ctype@0.5.3
    β”‚ β”‚ β”œβ”€β”€ json-stringify-safe@5.0.1
    β”‚ β”‚ β”œβ”€β”€ mime@1.2.11
    β”‚ β”‚ β”œβ”€β”€ node-uuid@1.4.7
    β”‚ β”‚ β”œβ”€β”€ oauth-sign@0.3.0
    β”‚ β”‚ β”œβ”€β”€ qs@0.6.6
    β”‚ β”‚ └── tunnel-agent@0.3.0
    β”‚ β”œβ”€β”€ underscore@1.5.2
    β”‚ └── underscore.string@2.3.3
    β”œβ”€β”¬ grunt-postcss@0.7.1
    β”‚ β”œβ”€β”€ diff@2.2.1
    β”‚ └── es6-promise@3.0.2
    β”œβ”€β”¬ grunt-rtlcss@1.6.0
    β”‚ └─┬ rtlcss@1.7.2
    β”‚   β”œβ”€β”¬ findup@0.1.5
    β”‚   β”‚ └── commander@2.1.0
    β”‚   β”œβ”€β”¬ mkdirp@0.5.0
    β”‚   β”‚ └── minimist@0.0.8
    β”‚   └── strip-json-comments@1.0.4
    β”œβ”€β”¬ grunt-sass@1.1.0
    β”‚ β”œβ”€β”¬ each-async@1.1.1
    β”‚ β”‚ β”œβ”€β”€ onetime@1.1.0
    β”‚ β”‚ └── set-immediate-shim@1.0.1
    β”‚ β”œβ”€β”¬ node-sass@3.4.2
    β”‚ β”‚ β”œβ”€β”€ async-foreach@0.1.3
    β”‚ β”‚ β”œβ”€β”¬ cross-spawn@2.1.4
    β”‚ β”‚ β”‚ β”œβ”€β”¬ cross-spawn-async@2.1.6
    β”‚ β”‚ β”‚ β”‚ β”œβ”€β”¬ lru-cache@4.0.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ pseudomap@1.0.2
    β”‚ β”‚ β”‚ β”‚ β”‚ └── yallist@2.0.0
    β”‚ β”‚ β”‚ β”‚ └─┬ which@1.2.1
    β”‚ β”‚ β”‚ β”‚   └─┬ is-absolute@0.1.7
    β”‚ β”‚ β”‚ β”‚     └── is-relative@0.1.3
    β”‚ β”‚ β”‚ └─┬ spawn-sync@1.0.15
    β”‚ β”‚ β”‚   └── os-shim@0.1.3
    β”‚ β”‚ β”œβ”€β”¬ glob@5.0.15
    β”‚ β”‚ β”‚ └── minimatch@3.0.0
    β”‚ β”‚ β”œβ”€β”¬ mkdirp@0.5.1
    β”‚ β”‚ β”‚ └── minimist@0.0.8
    β”‚ β”‚ β”œβ”€β”€ nan@2.1.0
    β”‚ β”‚ β”œβ”€β”¬ node-gyp@3.2.1
    β”‚ β”‚ β”‚ β”œβ”€β”¬ fstream@1.0.8
    β”‚ β”‚ β”‚ β”‚ └── graceful-fs@4.1.2
    β”‚ β”‚ β”‚ β”œβ”€β”€ graceful-fs@4.1.2
    β”‚ β”‚ β”‚ β”œβ”€β”€ minimatch@1.0.0
    β”‚ β”‚ β”‚ β”œβ”€β”€ nopt@3.0.6
    β”‚ β”‚ β”‚ β”œβ”€β”¬ npmlog@1.2.1
    β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ ansi@0.3.0
    β”‚ β”‚ β”‚ β”‚ β”œβ”€β”¬ are-we-there-yet@1.0.5
    β”‚ β”‚ β”‚ β”‚ β”‚ └── delegates@0.1.0
    β”‚ β”‚ β”‚ β”‚ └─┬ gauge@1.2.2
    β”‚ β”‚ β”‚ β”‚   β”œβ”€β”€ has-unicode@1.0.1
    β”‚ β”‚ β”‚ β”‚   β”œβ”€β”¬ lodash.pad@3.1.1
    β”‚ β”‚ β”‚ β”‚   β”‚ β”œβ”€β”€ lodash._basetostring@3.0.1
    β”‚ β”‚ β”‚ β”‚   β”‚ └─┬ lodash._createpadding@3.6.1
    β”‚ β”‚ β”‚ β”‚   β”‚   └── lodash.repeat@3.0.1
    β”‚ β”‚ β”‚ β”‚   β”œβ”€β”€ lodash.padleft@3.1.1
    β”‚ β”‚ β”‚ β”‚   └── lodash.padright@3.1.1
    β”‚ β”‚ β”‚ β”œβ”€β”¬ osenv@0.1.3
    β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ os-homedir@1.0.1
    β”‚ β”‚ β”‚ β”‚ └── os-tmpdir@1.0.1
    β”‚ β”‚ β”‚ β”œβ”€β”¬ path-array@1.0.0
    β”‚ β”‚ β”‚ β”‚ └── array-index@0.1.1
    β”‚ β”‚ β”‚ β”œβ”€β”€ semver@5.1.0
    β”‚ β”‚ β”‚ └─┬ tar@2.2.1
    β”‚ β”‚ β”‚   └── block-stream@0.0.8
    β”‚ β”‚ β”œβ”€β”¬ npmconf@2.1.2
    β”‚ β”‚ β”‚ β”œβ”€β”¬ config-chain@1.1.9
    β”‚ β”‚ β”‚ β”‚ └── proto-list@1.2.4
    β”‚ β”‚ β”‚ β”œβ”€β”€ ini@1.3.4
    β”‚ β”‚ β”‚ β”œβ”€β”€ nopt@3.0.6
    β”‚ β”‚ β”‚ β”œβ”€β”€ semver@4.3.6
    β”‚ β”‚ β”‚ └── uid-number@0.0.5
    β”‚ β”‚ β”œβ”€β”¬ request@2.67.0
    β”‚ β”‚ β”‚ β”œβ”€β”€ aws-sign2@0.6.0
    β”‚ β”‚ β”‚ β”œβ”€β”€ caseless@0.11.0
    β”‚ β”‚ β”‚ β”œβ”€β”¬ combined-stream@1.0.5
    β”‚ β”‚ β”‚ β”‚ └── delayed-stream@1.0.0
    β”‚ β”‚ β”‚ β”œβ”€β”€ extend@3.0.0
    β”‚ β”‚ β”‚ β”œβ”€β”€ forever-agent@0.6.1
    β”‚ β”‚ β”‚ β”œβ”€β”¬ form-data@1.0.0-rc3
    β”‚ β”‚ β”‚ β”‚ └── async@1.5.1
    β”‚ β”‚ β”‚ β”œβ”€β”¬ har-validator@2.0.3
    β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ commander@2.9.0
    β”‚ β”‚ β”‚ β”‚ β”œβ”€β”¬ is-my-json-valid@2.12.3
    β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ generate-function@2.0.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”¬ generate-object-property@1.2.0
    β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── is-property@1.0.2
    β”‚ β”‚ β”‚ β”‚ β”‚ └── jsonpointer@2.0.0
    β”‚ β”‚ β”‚ β”‚ └─┬ pinkie-promise@2.0.0
    β”‚ β”‚ β”‚ β”‚   └── pinkie@2.0.1
    β”‚ β”‚ β”‚ β”œβ”€β”¬ hawk@3.1.2
    β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ boom@2.10.1
    β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ cryptiles@2.0.5
    β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ hoek@2.16.3
    β”‚ β”‚ β”‚ β”‚ └── sntp@1.0.9
    β”‚ β”‚ β”‚ β”œβ”€β”¬ http-signature@1.1.0
    β”‚ β”‚ β”‚ β”‚ β”œβ”€β”¬ jsprim@1.2.2
    β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ extsprintf@1.0.2
    β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ json-schema@0.2.2
    β”‚ β”‚ β”‚ β”‚ β”‚ └── verror@1.3.6
    β”‚ β”‚ β”‚ β”‚ └─┬ sshpk@1.7.2
    β”‚ β”‚ β”‚ β”‚   β”œβ”€β”€ asn1@0.2.3
    β”‚ β”‚ β”‚ β”‚   β”œβ”€β”€ assert-plus@0.2.0
    β”‚ β”‚ β”‚ β”‚   β”œβ”€β”€ dashdash@1.11.0
    β”‚ β”‚ β”‚ β”‚   β”œβ”€β”€ ecc-jsbn@0.1.1
    β”‚ β”‚ β”‚ β”‚   β”œβ”€β”€ jodid25519@1.0.2
    β”‚ β”‚ β”‚ β”‚   β”œβ”€β”€ jsbn@0.1.0
    β”‚ β”‚ β”‚ β”‚   └── tweetnacl@0.13.3
    β”‚ β”‚ β”‚ β”œβ”€β”€ is-typedarray@1.0.0
    β”‚ β”‚ β”‚ β”œβ”€β”€ isstream@0.1.2
    β”‚ β”‚ β”‚ β”œβ”€β”¬ mime-types@2.1.9
    β”‚ β”‚ β”‚ β”‚ └── mime-db@1.21.0
    β”‚ β”‚ β”‚ β”œβ”€β”€ oauth-sign@0.8.0
    β”‚ β”‚ β”‚ β”œβ”€β”€ qs@5.2.0
    β”‚ β”‚ β”‚ β”œβ”€β”€ stringstream@0.0.5
    β”‚ β”‚ β”‚ β”œβ”€β”€ tough-cookie@2.2.1
    β”‚ β”‚ β”‚ └── tunnel-agent@0.4.2
    β”‚ β”‚ └─┬ sass-graph@2.0.1
    β”‚ β”‚   β”œβ”€β”¬ glob@5.0.15
    β”‚ β”‚   β”‚ └── minimatch@3.0.0
    β”‚ β”‚   β”œβ”€β”€ lodash@3.10.1
    β”‚ β”‚   └─┬ yargs@3.31.0
    β”‚ β”‚     β”œβ”€β”¬ cliui@3.1.0
    β”‚ β”‚     β”‚ └── wrap-ansi@1.0.0
    β”‚ β”‚     β”œβ”€β”¬ os-locale@1.4.0
    β”‚ β”‚     β”‚ └─┬ lcid@1.0.0
    β”‚ β”‚     β”‚   └── invert-kv@1.0.0
    β”‚ β”‚     β”œβ”€β”¬ string-width@1.0.1
    β”‚ β”‚     β”‚ β”œβ”€β”€ code-point-at@1.0.0
    β”‚ β”‚     β”‚ └── is-fullwidth-code-point@1.0.0
    β”‚ β”‚     β”œβ”€β”€ window-size@0.1.4
    β”‚ β”‚     └── y18n@3.2.0
    β”‚ └── object-assign@4.0.1
    └─┬ matchdep@1.0.0
      β”œβ”€β”¬ findup-sync@0.3.0
      β”‚ └─┬ glob@5.0.15
      β”‚   └── minimatch@3.0.0
      β”œβ”€β”¬ globule@0.2.0
      β”‚ β”œβ”€β”¬ glob@3.2.11
      β”‚ β”‚ └── minimatch@0.3.0
      β”‚ β”œβ”€β”€ lodash@2.4.2
      β”‚ └── minimatch@0.2.14
      └── stack-trace@0.0.9
    

    And this is just for WordPress core; it doesn’t include the tools we use for BuddyPress or bbPress.

    I don’t like this. I don’t like not knowing what these tools do or why they’re necessary. It feels like having one-thousand hammers instead of drill-bits and screwdrivers and power-tools. It’s not immediately obvious what the return on learning each or any of these unique tools is.

    And when a tool becomes obsolete or out-of-date, the rabbit hole is full of eels:

    npm WARN deprecated lodash@0.9.2: lodash@<2.0.0 is no longer maintained. Upgrade to lodash@^3.0.0
    npm WARN deprecated npmconf@2.1.1: this package has been reintegrated into npm and is now out of date with respect to npm
    npm WARN deprecated lodash@1.0.2: lodash@<2.0.0 is no longer maintained. Upgrade to lodash@^3.0.0
    npm WARN deprecated lodash@1.2.1: lodash@<2.0.0 is no longer maintained. Upgrade to lodash@^3.0.0
    npm WARN deprecated npmconf@2.1.2: this package has been reintegrated into npm and is now out of date with respect to npm
    npm WARN deprecated lodash@2.4.2: lodash@<3.0.0 is no longer maintained. Upgrade to lodash@^3.0.0.
    n
    

    These relatively helpful messages may be outside of your control. They might be directly your fault. They might be globally installed modules or locally installed ones. Upgrading might be good for WordPress but break everything else you work on without warning.

    Here’s usually what happens:

    • Something in the mystery toolbox breaks and complains about it
    • Try to upgrade the broken tool according to the feedback message(s)
    • The tool is still broken
    • Delete the entire `node_modules` directory and `npm install` again
    • Fixed!

    Now, I understand what’s going on here is a miracle of modern software engineering. An enormous amount of automation is going on here, and the fact it actually works most of the time I’ll consider another closely coupled miracle. It still feels like there must be a better way, even though I can’t claim the fame of knowing right now what that might actually be.

    I get that this is all awesome. I get that this process, and having & using these tools, is better than smashing things with rocks and hoping for the best. I get that a ton of work has gone into making this as seamless and wrinkle-free as possible.

    I accept it, and work with it, and try not to think about it, but the trend of installing and trusting hundreds of tiny unknown libraries feels a little too organic and alive for a man-made computing machine. Like millions of nerve-endings and neurons and vessels and muscles working in unison to blink your eyes and sip on some coffee, the line between being a software developer or a software doctor is an increasingly jagged one.

    If we aren’t careful, we’ll end up as lost amongst our own creations as we are inside of mother nature’s.

    JJJ

    January 7, 2016
    Rants, Opinion, Software, WordPress
  • Conflaticons

    Today Twitter rebranded “Stars” & “Favorites” to “Hearts” & “Likes”

    https://twitter.com/twitter/status/661558661131558915

    It’s so obviously a horribly conflated notion that I struggle toΒ believe a team of thousands of people came to this as the logical conclusion to what was undoubtedly hundreds of hours of meetings & deliberation that will someday result in a tell-all novella titled: “Stars vs. Hearts: The Untold Story.”

    Consider the absurdity of the following screenshot:

    Screen Shot 2015-11-03 at 1.08.44 PM

    In order to “Like” something on Twitter, we click/tap a symbol that meansΒ “Love” with a “Like” label. Huh? When did Twitter start exclusively hiring Vulcans without aΒ range of expressive emotions used to convey theΒ likability of something beyond 1 single available incorrectly represented data point?

    Hearts mean love. Any other reaction requires not-a-heart.

    Partially in their defense, we’ve struggled with this in BuddyPress sinceΒ we made the decision early on to use stars as a “Favoriting” system in the activity streams; and that decision plagues us a bit with each subsequent release. I don’t think anyoneΒ on the core leadership team loves (ha!) what we have, but we can’t agree on what exactly would improve it, so it stays what it is.

    And, I get it… It’s cutesy and light-hearted (ha again!) and it’s intended to be fun and playful. But meh.

    Now, what Slack has done with their reactions stuff is pretty great. You react to something with an emoji, and it’s entirely likely to be clever, timely, and contagious. Your niche group decides on-the-fly what emoji means to whom and why, and then either forget about it and move on, or it becomes lore to the group and an inside joke to small subgroups. I think it’s the best solution to enabling drive-by interactions, and one that BuddyPress probably could (see: should) adopt relatively easily.

    What Twitter accidentally invented today is the very first conflaticon; a glyph that has historicallyΒ meant one thing for generations but is now re-presented world-wide to mean something kinda-similar but actually kinda-very-different.

    Maybe it’s intentional, though? What if Twitter is getting sick of storing trillions of records in databases everywhere, and secretly wants to reduce their volume to improve performance and eliminate maintenance burden? Take something that’s become far more popular than you anticipated, make it a little confusing while also inverting the meaning to be a bit socially awkward, and now you’ve saved the company dozens of dollars on a long enough timeline.

    Whatever the reasoning, I neither like nor love this change, and wouldn’t be surprised if it’s a catalyst for a deeper discussion intoΒ how valuable reaction-types are.

    Subsequently, I’m thankful WordPress never fleshed out Comment Types. What we actually need is register_reaction_type() where a “Comment” is just one type of reaction to something, a “Trackback” is another, a “bbPress Topic” might be a reaction to a blog post, and so on. I envision a world where how we react to the internet-connected world around us isn’t baked into the software, but instead is representative of who we are at that time and place in our own lives. Maybe someday…

    JJJ

    November 3, 2015
    Rants
    Twitter
  • Reputation

    Yesterday, I tweeted about the recent Volkswagen debacle:

    https://twitter.com/JJJ/status/646492412098031616

    It got me thinking about the WordPress community, who the major players are, and where I might fit into it all on any given day.

    I’ll start with Automattic and work my way acrossΒ from there. Full disclosure, if you didn’t know, I worked at Automattic for a few years, so some of my observations are based on internal influences from a company half the size with a different CEO, and 4 of Matt Mullenweg’s hairstyles ago.

    Automattic, is a powerhouse. They have enormous momentum that’s intimidating to compete with even when you’re trying to carve your own niche. Interested in e-commerce? Woo. Hosting? WordPress.com. The cloud? Jetpack. Backups? VaultPress. Together they’ve solved a number of small problems in huge ways, and are uniquely qualified to do so with Matt at the helm and millions in the bank.

    If you’ve read The Year Without PantsΒ then you got a decent (if bland) idea of how the sausage is made, but my not being a part of Scott’s retelling is a metaphor for my experience at Automattic. I didn’t really bond with the team like I’d hoped, and it was the second time I had attempted to replace Andy Peatling (the first being leading the BuddyPress project) and by this time I had already felt like my reputation was in a downward trajectory.

    Ironically, my experienceΒ at 10up was prettyΒ similar. A position opened up and I was asked to follow the enormous footsteps of two beloved engineers. I failed to gel with a companyΒ made entirely ofΒ friendsΒ from the WordPress community, I never found my stride, and I still had wandering thoughts of BuddyPress & bbPress on my mind. 10up is an agency’s agency. They move fast, workΒ hard, and aren’t afraid to kindly cut the anchor and sail on if something is dragging behind. Needless to say, I couldn’t hang.

    The folks at WebDevStudios are doing awesome stuff with BuddyPress, but inside the WordPress community I’ve heard people say some surprisingly negative things about them. Code quality being bad, they’re unprofessional, etc… I don’t see it, I haven’t seen it yet, but if it’s true, these criticisms aren’t unique to WDS. I’ve seen worse code and experienced less professionalism from otherΒ hugely successful businesses. If those are WDS’s only problems, theyΒ are the company to bet on. They’ve doubled in size since last year, and aren’t showing any signs of slowing down.

    My friends at HumanMade have a reputation for contributing huge amounts of time & effort to pushing WordPress as a platform farther than even the folks at Automattic have been able to pull off. I think this is accurate; they’re a talented bunch of engineers that love WordPress but aren’t consumed by it, which pays off by allowing them to influence it’s direction gently and with outside perspectives.

    CrowdFavorite is, well, a favorite of mine. They’re an agency that’s known for going after and catching the whales, and being coy (in a good way) with the stories of how they caught them. From my perspective, they’re the agency that goes their own way and likes to challenge the WordPress status-quo, which is to say I like them a lot.

    Pippin Williamson and his team have a reputation for their enormous momentum and huge earning potential if they maintain their current pace. Output, output, and more output. It’s intimidating, and inspirational, and having known Pippin a long time, I’m both happy for him and proud of what he’s accomplishing.

    There are a bunch of other businesses, agencies, and independent WordPress developers out there, so it’s difficult to cite examples without injecting my own biases or forgetting some really influential people. Envato, Alley, Voce, Range, Reaktiv, WPEngine, Pagely, XWP, and on and on…

    And me?Β Some days I feel like my ideas are far-fetched & silly, or the entire WordPress core team is against me, orΒ they feel like I’m working against them even though I’m trying to work a few steps ahead without being a distraction. The rest of myΒ days are spent working on my own little corner of the internet trying to mop up what’s left of the mess of my own career, since I’m back where I started 5 years ago with some added experience & perspective, and maybe a chip on either of my shoulders about it all if I’m being totally honest.

    It reminds me a bit of an article about Jonathan Blow in The Atlantic in 2012, who earned a funny reputation in the video gameΒ industry, and once he had the zeroes in his bank account to prove his voice had value, his voice suddenly did have value. The same voice, but being backed by currency gave it breadth and range.

    In many ways, his opinions of his industry are not dissimilar to mine with WordPress (though when given the opportunity I try maybe to be a bit less brash to the peopleΒ pouring their hearts into their passions with their own foibles and comeuppances.)

    There are a lot of similarities between the independent game scene and what’s going on with WordPress right now. There are huge, major players taking on and solving massive problems at a scale that no 1 individual can compete with anymore, but that also means there’s opportunity for someone to identify one specific sharp snaggy corner and file it away so no one hurts themselves on it again. I hope Flox achieves that with it’s offerings; I hope we manage to produce something widely popular so I can afford to relax for a while; I hope to earn a better reputation than I feel like I have with my colleagues and friends through cool & valuable output.

    Reputations areΒ usually accurate, and surprisingly fickle. One personΒ or company can devoteΒ their entire focus to something and lose it instantly, while another can have questionable ethicsΒ andΒ still manage relative success.Β My point, I guess, is that reputations are earned one way or the other.

    It’s scary, and rewarding, but it’s easy to get caught up in the distraction, politics, and bureaucracy of it all, and accidentally live up to people’s perceptions of who they think you are instead of who you know you are and what you’re capable of achieving.

    Focus less on reputation, and more on ethical output, and you’ll be just fine.

    JJJ

    September 23, 2015
    Opinion, Software
Previous Page
1 2 3 4 … 6
Next Page

Proudly Powered by WordPress