text:
.ball-pulse-sync > div, .ball-pulse > div, .ball-scale-random > div, .ball-scale > div {
    background-color: #fff;
    border-radius: 100%;
    margin: 2px;
    display: inline-block;
}

@-webkit-keyframes scale {
    0%,80% {
        -webkit-transform: scale(1);
        transform: scale(1);
        opacity: 1;
    }

    45% {
        -webkit-transform: scale(.1);
        transform: scale(.1);
        opacity: .7;
    }
}

@keyframes scale {
    0%,80% {
        -webkit-transform: scale(1);
        transform: scale(1);
        opacity: 1;
    }

    45% {
        -webkit-transform: scale(.1);
        transform: scale(.1);
        opacity: .7;
    }
}

.ball-pulse > div:nth-child(1) {
    -webkit-animation: scale .75s -.24s infinite cubic-bezier(.2,.68,.18,1.08);
    animation: scale .75s -.24s infinite cubic-bezier(.2,.68,.18,1.08);
}

.ball-pulse > div:nth-child(2) {
    -webkit-animation: scale .75s -.12s infinite cubic-bezier(.2,.68,.18,1.08);
    animation: scale .75s -.12s infinite cubic-bezier(.2,.68,.18,1.08);
}

.ball-pulse > div:nth-child(3) {
    -webkit-animation: scale .75s 0s infinite cubic-bezier(.2,.68,.18,1.08);
    animation: scale .75s 0s infinite cubic-bezier(.2,.68,.18,1.08);
}

.ball-pulse > div {
    width: 15px;
    height: 15px;
    -webkit-animation-fill-mode: both;
    animation-fill-mode: both;
}

@-webkit-keyframes ball-pulse-sync {
    33% {
        -webkit-transform: translateY(10px);
        transform: translateY(10px);
    }

    66% {
        -webkit-transform: translateY(-10px);
        transform: translateY(-10px);
    }

    100% {
        -webkit-transform: translateY(0);
        transform: translateY(0);
    }
}

@keyframes ball-pulse-sync {
    33% {
        -webkit-transform: translateY(10px);
        transform: translateY(10px);
    }

    66% {
        -webkit-transform: translateY(-10px);
        transform: translateY(-10px);
    }

    100% {
        -webkit-transform: translateY(0);
        transform: translateY(0);
    }
}

.ball-pulse-sync > div:nth-child(1) {
    -webkit-animation: ball-pulse-sync .6s -.14s infinite ease-in-out;
    animation: ball-pulse-sync .6s -.14s infinite ease-in-out;
}

.ball-pulse-sync > div:nth-child(2) {
    -webkit-animation: ball-pulse-sync .6s -70ms infinite ease-in-out;
    animation: ball-pulse-sync .6s -70ms infinite ease-in-out;
}

.ball-pulse-sync > div:nth-child(3) {
    -webkit-animation: ball-pulse-sync .6s 0s infinite ease-in-out;
    animation: ball-pulse-sync .6s 0s infinite ease-in-out;
}

.ball-pulse-sync > div {
    width: 15px;
    height: 15px;
    -webkit-animation-fill-mode: both;
    animation-fill-mode: both;
}

@-webkit-keyframes ball-scale {
    0% {
        -webkit-transform: scale(0);
        transform: scale(0);
    }

    100% {
        -webkit-transform: scale(1);
        transform: scale(1);
        opacity: 0;
    }
}

@keyframes ball-scale {
    0% {
        -webkit-transform: scale(0);
        transform: scale(0);
    }

    100% {
        -webkit-transform: scale(1);
        transform: scale(1);
        opacity: 0;
    }
}

.ball-scale > div {
    height: 60px;
    width: 60px;
    -webkit-animation: ball-scale 1s 0s ease-in-out infinite;
    animation: ball-scale 1s 0s ease-in-out infinite;
}

.ball-scale-random {
    width: 37px;
    height: 40px;
}

    .ball-scale-random > div {
        position: absolute;
        height: 30px;
        width: 30px;
        -webkit-animation: ball-scale 1s 0s ease-in-out infinite;
        animation: ball-scale 1s 0s ease-in-out infinite;
    }

.ball-rotate, .ball-rotate > div {
    position: relative;
}

    .ball-rotate > div, .ball-rotate > div:after, .ball-rotate > div:before {
        background-color: #fff;
        width: 15px;
        height: 15px;
        border-radius: 100%;
    }

.ball-scale-random > div:nth-child(1) {
    margin-left: -7px;
    -webkit-animation: ball-scale 1s .2s ease-in-out infinite;
    animation: ball-scale 1s .2s ease-in-out infinite;
}

.ball-scale-random > div:nth-child(3) {
    margin-left: -2px;
    margin-top: 9px;
    -webkit-animation: ball-scale 1s .5s ease-in-out infinite;
    animation: ball-scale 1s .5s ease-in-out infinite;
}

@-webkit-keyframes rotate {
    0% {
        -webkit-transform: rotate(0);
        transform: rotate(0);
    }

    50% {
        -webkit-transform: rotate(180deg);
        transform: rotate(180deg);
    }

    100% {
        -webkit-transform: rotate(360deg);
        transform: rotate(360deg);
    }
}

.ball-rotate > div {
    margin: 2px;
    -webkit-animation-fill-mode: both;
    animation-fill-mode: both;
}

    .ball-rotate > div:first-child {
        -webkit-animation: rotate 1s 0s cubic-bezier(.7,-.13,.22,.86) infinite;
        animation: rotate 1s 0s cubic-bezier(.7,-.13,.22,.86) infinite;
    }

    .ball-rotate > div:after, .ball-rotate > div:before {
        margin: 2px;
        content: "";
        position: absolute;
        opacity: .8;
    }

    .ball-rotate > div:before {
        top: 0;
        left: -28px;
    }

    .ball-rotate > div:after {
        top: 0;
        left: 25px;
    }

.ball-clip-rotate > div {
    border-radius: 100%;
    margin: 2px;
    border: 2px solid #fff;
    border-bottom-color: transparent;
    height: 26px;
    width: 26px;
    background: 0 0 !important;
    display: inline-block;
    -webkit-animation: rotate .75s 0s linear infinite;
    animation: rotate .75s 0s linear infinite;
}

@keyframes rotate {
    0% {
        -webkit-transform: rotate(0);
        transform: rotate(0);
    }

    50% {
        -webkit-transform: rotate(180deg);
        transform: rotate(180deg);
    }

    100% {
        -webkit-transform: rotate(360deg);
        transform: rotate(360deg);
    }
}

@keyframes scale {
    30% {
        -webkit-transform: scale(.3);
        transform: scale(.3);
    }

    100% {
        -webkit-transform: scale(1);
        transform: scale(1);
    }
}

.ball-clip-rotate-pulse {
    position: relative;
    -webkit-transform: translateY(-15px);
    transform: translateY(-15px);
}

    .ball-clip-rotate-pulse > div {
        -webkit-animation-fill-mode: both;
        animation-fill-mode: both;
        position: absolute;
        top: 0;
        left: 0;
        border-radius: 100%;
    }

        .ball-clip-rotate-pulse > div:first-child {
            background: #fff;
            height: 16px;
            width: 16px;
            top: 7px;
            left: -7px;
            -webkit-animation: scale 1s 0s cubic-bezier(.09,.57,.49,.9) infinite;
            animation: scale 1s 0s cubic-bezier(.09,.57,.49,.9) infinite;
        }

        .ball-clip-rotate-pulse > div:last-child {
            position: absolute;
            width: 30px;
            height: 30px;
            left: -16px;
            top: -2px;
            background: 0 0;
            border: 2px solid;
            border-color: #fff transparent;
            -webkit-animation: rotate 1s 0s cubic-bezier(.09,.57,.49,.9) infinite;
            animation: rotate 1s 0s cubic-bezier(.09,.57,.49,.9) infinite;
            -webkit-animation-duration: 1s;
            animation-duration: 1s;
        }

.ball-beat > div, .ball-scale-multiple > div {
    background-color: #fff;
    border-radius: 100%;
}

@keyframes rotate {
    0% {
        -webkit-transform: rotate(0) scale(1);
        transform: rotate(0) scale(1);
    }

    50% {
        -webkit-transform: rotate(180deg) scale(.6);
        transform: rotate(180deg) scale(.6);
    }

    100% {
        -webkit-transform: rotate(360deg) scale(1);
        transform: rotate(360deg) scale(1);
    }
}

.ball-clip-rotate-multiple {
    position: relative;
}

    .ball-clip-rotate-multiple > div {
        position: absolute;
        left: -20px;
        top: -20px;
        border: 2px solid #fff;
        border-bottom-color: transparent;
        border-top-color: transparent;
        border-radius: 100%;
        height: 35px;
        width: 35px;
        -webkit-animation: rotate 1s 0s ease-in-out infinite;
        animation: rotate 1s 0s ease-in-out infinite;
    }

        .ball-clip-rotate-multiple > div:last-child {
            display: inline-block;
            top: -10px;
            left: -10px;
            width: 15px;
            height: 15px;
            -webkit-animation-duration: .5s;
            animation-duration: .5s;
            border-color: #fff transparent;
            -webkit-animation-direction: reverse;
            animation-direction: reverse;
        }

@-webkit-keyframes ball-scale-ripple {
    0% {
        -webkit-transform: scale(.1);
        transform: scale(.1);
        opacity: 1;
    }

    70% {
        -webkit-transform: scale(1);
        transform: scale(1);
        opacity: .7;
    }

    100% {
        opacity: 0;
    }
}

@keyframes ball-scale-ripple {
    0% {
        -webkit-transform: scale(.1);
        transform: scale(.1);
        opacity: 1;
    }

    70% {
        -webkit-transform: scale(1);
        transform: scale(1);
        opacity: .7;
    }

    100% {
        opacity: 0;
    }
}

.ball-scale-ripple > div {
    height: 50px;
    width: 50px;
    border-radius: 100%;
    border: 2px solid #fff;
    -webkit-animation: ball-scale-ripple 1s 0s infinite cubic-bezier(.21,.53,.56,.8);
    animation: ball-scale-ripple 1s 0s infinite cubic-bezier(.21,.53,.56,.8);
}

@-webkit-keyframes ball-scale-ripple-multiple {
    0% {
        -webkit-transform: scale(.1);
        transform: scale(.1);
        opacity: 1;
    }

    70% {
        -webkit-transform: scale(1);
        transform: scale(1);
        opacity: .7;
    }

    100% {
        opacity: 0;
    }
}

@keyframes ball-scale-ripple-multiple {
    0% {
        -webkit-transform: scale(.1);
        transform: scale(.1);
        opacity: 1;
    }

    70% {
        -webkit-transform: scale(1);
        transform: scale(1);
        opacity: .7;
    }

    100% {
        opacity: 0;
    }
}

.ball-scale-ripple-multiple {
    position: relative;
    -webkit-transform: translateY(-25px);
    transform: translateY(-25px);
}

    .ball-scale-ripple-multiple > div:nth-child(0) {
        -webkit-animation-delay: -.8s;
        animation-delay: -.8s;
    }

    .ball-scale-ripple-multiple > div:nth-child(1) {
        -webkit-animation-delay: -.6s;
        animation-delay: -.6s;
    }

    .ball-scale-ripple-multiple > div:nth-child(2) {
        -webkit-animation-delay: -.4s;
        animation-delay: -.4s;
    }

    .ball-scale-ripple-multiple > div:nth-child(3) {
        -webkit-animation-delay: -.2s;
        animation-delay: -.2s;
    }

    .ball-scale-ripple-multiple > div {
        position: absolute;
        top: -2px;
        left: -26px;
        width: 50px;
        height: 50px;
        border-radius: 100%;
        border: 2px solid #fff;
        -webkit-animation: ball-scale-ripple-multiple 1.25s 0s infinite cubic-bezier(.21,.53,.56,.8);
        animation: ball-scale-ripple-multiple 1.25s 0s infinite cubic-bezier(.21,.53,.56,.8);
    }

@-webkit-keyframes ball-beat {
    50% {
        opacity: .2;
        -webkit-transform: scale(.75);
        transform: scale(.75);
    }

    100% {
        opacity: 1;
        -webkit-transform: scale(1);
        transform: scale(1);
    }
}

@keyframes ball-beat {
    50% {
        opacity: .2;
        -webkit-transform: scale(.75);
        transform: scale(.75);
    }

    100% {
        opacity: 1;
        -webkit-transform: scale(1);
        transform: scale(1);
    }
}

.ball-beat > div {
    width: 15px;
    height: 15px;
    margin: 2px;
    display: inline-block;
    -webkit-animation: ball-beat .7s 0s infinite linear;
    animation: ball-beat .7s 0s infinite linear;
}

    .ball-beat > div:nth-child(2n-1) {
        -webkit-animation-delay: -.35s !important;
        animation-delay: -.35s !important;
    }

@-webkit-keyframes ball-scale-multiple {
    0% {
        -webkit-transform: scale(0);
        transform: scale(0);
        opacity: 0;
    }

    5% {
        opacity: 1;
    }

    100% {
        -webkit-transform: scale(1);
        transform: scale(1);
        opacity: 0;
    }
}

@keyframes ball-scale-multiple {
    0% {
        -webkit-transform: scale(0);
        transform: scale(0);
        opacity: 0;
    }

    5% {
        opacity: 1;
    }

    100% {
        -webkit-transform: scale(1);
        transform: scale(1);
        opacity: 0;
    }
}

.ball-scale-multiple {
    position: relative;
    -webkit-transform: translateY(-30px);
    transform: translateY(-30px);
}

    .ball-scale-multiple > div:nth-child(2) {
        -webkit-animation-delay: -.4s;
        animation-delay: -.4s;
    }

    .ball-scale-multiple > div:nth-child(3) {
        -webkit-animation-delay: -.2s;
        animation-delay: -.2s;
    }

    .ball-scale-multiple > div {
        position: absolute;
        left: -30px;
        top: 0;
        opacity: 0;
        margin: 0;
        width: 60px;
        height: 60px;
        -webkit-animation: ball-scale-multiple 1s 0s linear infinite;
        animation: ball-scale-multiple 1s 0s linear infinite;
    }

.ball-triangle-path > div:nth-child(1), .ball-triangle-path > div:nth-child(2) {
    -webkit-animation-duration: 2s;
    -webkit-animation-timing-function: ease-in-out;
    -webkit-animation-iteration-count: infinite;
}

@-webkit-keyframes ball-triangle-path-1 {
    33% {
        -webkit-transform: translate(25px,-50px);
        transform: translate(25px,-50px);
    }

    66% {
        -webkit-transform: translate(50px,0);
        transform: translate(50px,0);
    }

    100% {
        -webkit-transform: translate(0,0);
        transform: translate(0,0);
    }
}

@keyframes ball-triangle-path-1 {
    33% {
        -webkit-transform: translate(25px,-50px);
        transform: translate(25px,-50px);
    }

    66% {
        -webkit-transform: translate(50px,0);
        transform: translate(50px,0);
    }

    100% {
        -webkit-transform: translate(0,0);
        transform: translate(0,0);
    }
}

@-webkit-keyframes ball-triangle-path-2 {
    33% {
        -webkit-transform: translate(25px,50px);
        transform: translate(25px,50px);
    }

    66% {
        -webkit-transform: translate(-25px,50px);
        transform: translate(-25px,50px);
    }

    100% {
        -webkit-transform: translate(0,0);
        transform: translate(0,0);
    }
}

@keyframes ball-triangle-path-2 {
    33% {
        -webkit-transform: translate(25px,50px);
        transform: translate(25px,50px);
    }

    66% {
        -webkit-transform: translate(-25px,50px);
        transform: translate(-25px,50px);
    }

    100% {
        -webkit-transform: translate(0,0);
        transform: translate(0,0);
    }
}

@-webkit-keyframes ball-triangle-path-3 {
    33% {
        -webkit-transform: translate(-50px,0);
        transform: translate(-50px,0);
    }

    66% {
        -webkit-transform: translate(-25px,-50px);
        transform: translate(-25px,-50px);
    }

    100% {
        -webkit-transform: translate(0,0);
        transform: translate(0,0);
    }
}

@keyframes ball-triangle-path-3 {
    33% {
        -webkit-transform: translate(-50px,0);
        transform: translate(-50px,0);
    }

    66% {
        -webkit-transform: translate(-25px,-50px);
        transform: translate(-25px,-50px);
    }

    100% {
        -webkit-transform: translate(0,0);
        transform: translate(0,0);
    }
}

.ball-triangle-path {
    position: relative;
    -webkit-transform: translate(-29.99px,-37.51px);
    transform: translate(-29.99px,-37.51px);
}

    .ball-triangle-path > div:nth-child(1) {
        -webkit-animation-name: ball-triangle-path-1;
        animation-name: ball-triangle-path-1;
        -webkit-animation-delay: 0;
        animation-delay: 0;
        animation-duration: 2s;
        animation-timing-function: ease-in-out;
        animation-iteration-count: infinite;
    }

    .ball-triangle-path > div:nth-child(2) {
        -webkit-animation-name: ball-triangle-path-2;
        animation-name: ball-triangle-path-2;
        -webkit-animation-delay: 0;
        animation-delay: 0;
        animation-duration: 2s;
        animation-timing-function: ease-in-out;
        animation-iteration-count: infinite;
    }

    .ball-triangle-path > div:nth-child(3) {
        -webkit-animation-name: ball-triangle-path-3;
        animation-name: ball-triangle-path-3;
        -webkit-animation-delay: 0;
        animation-delay: 0;
        -webkit-animation-duration: 2s;
        animation-duration: 2s;
        -webkit-animation-timing-function: ease-in-out;
        animation-timing-function: ease-in-out;
        -webkit-animation-iteration-count: infinite;
        animation-iteration-count: infinite;
    }

    .ball-triangle-path > div {
        -webkit-animation-fill-mode: both;
        animation-fill-mode: both;
        position: absolute;
        width: 10px;
        height: 10px;
        border-radius: 100%;
        border: 1px solid #fff;
    }

.ball-grid-beat > div, .ball-pulse-rise > div {
    -webkit-animation-fill-mode: both;
    -webkit-animation-iteration-count: infinite;
}

.ball-grid-beat > div, .ball-grid-pulse > div, .ball-pulse-rise > div {
    height: 15px;
    border-radius: 100%;
    display: inline-block;
    background-color: #fff;
    margin: 2px;
}

.ball-triangle-path > div:nth-of-type(1) {
    top: 50px;
}

.ball-triangle-path > div:nth-of-type(2) {
    left: 25px;
}

.ball-triangle-path > div:nth-of-type(3) {
    top: 50px;
    left: 50px;
}

@-webkit-keyframes ball-pulse-rise-even {
    0% {
        -webkit-transform: scale(1.1);
        transform: scale(1.1);
    }

    25% {
        -webkit-transform: translateY(-30px);
        transform: translateY(-30px);
    }

    50% {
        -webkit-transform: scale(.4);
        transform: scale(.4);
    }

    75% {
        -webkit-transform: translateY(30px);
        transform: translateY(30px);
    }

    100% {
        -webkit-transform: translateY(0);
        transform: translateY(0);
        -webkit-transform: scale(1);
        transform: scale(1);
    }
}

@keyframes ball-pulse-rise-even {
    0% {
        -webkit-transform: scale(1.1);
        transform: scale(1.1);
    }

    25% {
        -webkit-transform: translateY(-30px);
        transform: translateY(-30px);
    }

    50% {
        -webkit-transform: scale(.4);
        transform: scale(.4);
    }

    75% {
        -webkit-transform: translateY(30px);
        transform: translateY(30px);
    }

    100% {
        -webkit-transform: translateY(0);
        transform: translateY(0);
        -webkit-transform: scale(1);
        transform: scale(1);
    }
}

@-webkit-keyframes ball-pulse-rise-odd {
    0% {
        -webkit-transform: scale(.4);
        transform: scale(.4);
    }

    25% {
        -webkit-transform: translateY(30px);
        transform: translateY(30px);
    }

    50% {
        -webkit-transform: scale(1.1);
        transform: scale(1.1);
    }

    75% {
        -webkit-transform: translateY(-30px);
        transform: translateY(-30px);
    }

    100% {
        -webkit-transform: translateY(0);
        transform: translateY(0);
        -webkit-transform: scale(.75);
        transform: scale(.75);
    }
}

@keyframes ball-pulse-rise-odd {
    0% {
        -webkit-transform: scale(.4);
        transform: scale(.4);
    }

    25% {
        -webkit-transform: translateY(30px);
        transform: translateY(30px);
    }

    50% {
        -webkit-transform: scale(1.1);
        transform: scale(1.1);
    }

    75% {
        -webkit-transform: translateY(-30px);
        transform: translateY(-30px);
    }

    100% {
        -webkit-transform: translateY(0);
        transform: translateY(0);
        -webkit-transform: scale(.75);
        transform: scale(.75);
    }
}

.ball-pulse-rise > div {
    width: 15px;
    animation-fill-mode: both;
    -webkit-animation-duration: 1s;
    animation-duration: 1s;
    -webkit-animation-timing-function: cubic-bezier(.15,.46,.9,.6);
    animation-timing-function: cubic-bezier(.15,.46,.9,.6);
    animation-iteration-count: infinite;
    -webkit-animation-delay: 0;
    animation-delay: 0;
}

    .ball-pulse-rise > div:nth-child(2n) {
        -webkit-animation-name: ball-pulse-rise-even;
        animation-name: ball-pulse-rise-even;
    }

    .ball-pulse-rise > div:nth-child(2n-1) {
        -webkit-animation-name: ball-pulse-rise-odd;
        animation-name: ball-pulse-rise-odd;
    }

@-webkit-keyframes ball-grid-beat {
    50% {
        opacity: .7;
    }

    100% {
        opacity: 1;
    }
}

@keyframes ball-grid-beat {
    50% {
        opacity: .7;
    }

    100% {
        opacity: 1;
    }
}

.ball-grid-beat {
    width: 57px;
}

    .ball-grid-beat > div:nth-child(1) {
        -webkit-animation-delay: .49s;
        animation-delay: .49s;
        -webkit-animation-duration: .93s;
        animation-duration: .93s;
    }

    .ball-grid-beat > div:nth-child(2) {
        -webkit-animation-delay: .4s;
        animation-delay: .4s;
        -webkit-animation-duration: 1.02s;
        animation-duration: 1.02s;
    }

    .ball-grid-beat > div:nth-child(3) {
        -webkit-animation-delay: .63s;
        animation-delay: .63s;
        -webkit-animation-duration: 1.07s;
        animation-duration: 1.07s;
    }

    .ball-grid-beat > div:nth-child(4) {
        -webkit-animation-delay: -40ms;
        animation-delay: -40ms;
        -webkit-animation-duration: .75s;
        animation-duration: .75s;
    }

    .ball-grid-beat > div:nth-child(5) {
        -webkit-animation-delay: .21s;
        animation-delay: .21s;
        -webkit-animation-duration: 1.41s;
        animation-duration: 1.41s;
    }

    .ball-grid-beat > div:nth-child(6) {
        -webkit-animation-delay: -80ms;
        animation-delay: -80ms;
        -webkit-animation-duration: .66s;
        animation-duration: .66s;
    }

    .ball-grid-beat > div:nth-child(7) {
        -webkit-animation-delay: 0s;
        animation-delay: 0s;
        -webkit-animation-duration: 1.36s;
        animation-duration: 1.36s;
    }

    .ball-grid-beat > div:nth-child(8) {
        -webkit-animation-delay: .78s;
        animation-delay: .78s;
        -webkit-animation-duration: 1.17s;
        animation-duration: 1.17s;
    }

    .ball-grid-beat > div:nth-child(9) {
        -webkit-animation-delay: .2s;
        animation-delay: .2s;
        -webkit-animation-duration: 1.49s;
        animation-duration: 1.49s;
    }

    .ball-grid-beat > div {
        width: 15px;
        animation-fill-mode: both;
        float: left;
        -webkit-animation-name: ball-grid-beat;
        animation-name: ball-grid-beat;
        animation-iteration-count: infinite;
        -webkit-animation-delay: 0;
        animation-delay: 0;
    }

@-webkit-keyframes ball-grid-pulse {
    0% {
        -webkit-transform: scale(1);
        transform: scale(1);
    }

    50% {
        -webkit-transform: scale(.5);
        transform: scale(.5);
        opacity: .7;
    }

    100% {
        -webkit-transform: scale(1);
        transform: scale(1);
        opacity: 1;
    }
}

@keyframes ball-grid-pulse {
    0% {
        -webkit-transform: scale(1);
        transform: scale(1);
    }

    50% {
        -webkit-transform: scale(.5);
        transform: scale(.5);
        opacity: .7;
    }

    100% {
        -webkit-transform: scale(1);
        transform: scale(1);
        opacity: 1;
    }
}

.ball-grid-pulse {
    width: 57px;
}

    .ball-grid-pulse > div:nth-child(1) {
        -webkit-animation-delay: .19s;
        animation-delay: .19s;
        -webkit-animation-duration: .98s;
        animation-duration: .98s;
    }

    .ball-grid-pulse > div:nth-child(2) {
        -webkit-animation-delay: .48s;
        animation-delay: .48s;
        -webkit-animation-duration: 1.58s;
        animation-duration: 1.58s;
    }

    .ball-grid-pulse > div:nth-child(3) {
        -webkit-animation-delay: .58s;
        animation-delay: .58s;
        -webkit-animation-duration: 1.13s;
        animation-duration: 1.13s;
    }

    .ball-grid-pulse > div:nth-child(4) {
        -webkit-animation-delay: .63s;
        animation-delay: .63s;
        -webkit-animation-duration: .98s;
        animation-duration: .98s;
    }

    .ball-grid-pulse > div:nth-child(5) {
        -webkit-animation-delay: 60ms;
        animation-delay: 60ms;
        -webkit-animation-duration: .64s;
        animation-duration: .64s;
    }

    .ball-grid-pulse > div:nth-child(6) {
        -webkit-animation-delay: .38s;
        animation-delay: .38s;
        -webkit-animation-duration: .85s;
        animation-duration: .85s;
    }

    .ball-grid-pulse > div:nth-child(7) {
        -webkit-animation-delay: -60ms;
        animation-delay: -60ms;
        -webkit-animation-duration: 1.53s;
        animation-duration: 1.53s;
    }

    .ball-grid-pulse > div:nth-child(8) {
        -webkit-animation-delay: .57s;
        animation-delay: .57s;
        -webkit-animation-duration: .76s;
        animation-duration: .76s;
    }

    .ball-grid-pulse > div:nth-child(9) {
        -webkit-animation-delay: .73s;
        animation-delay: .73s;
        -webkit-animation-duration: .98s;
        animation-duration: .98s;
    }

    .ball-grid-pulse > div {
        width: 15px;
        -webkit-animation-fill-mode: both;
        animation-fill-mode: both;
        float: left;
        -webkit-animation-name: ball-grid-pulse;
        animation-name: ball-grid-pulse;
        -webkit-animation-iteration-count: infinite;
        animation-iteration-count: infinite;
        -webkit-animation-delay: 0;
        animation-delay: 0;
    }

@-webkit-keyframes ball-spin-fade-loader {
    50% {
        opacity: .3;
        -webkit-transform: scale(.4);
        transform: scale(.4);
    }

    100% {
        opacity: 1;
        -webkit-transform: scale(1);
        transform: scale(1);
    }
}

@keyframes ball-spin-fade-loader {
    50% {
        opacity: .3;
        -webkit-transform: scale(.4);
        transform: scale(.4);
    }

    100% {
        opacity: 1;
        -webkit-transform: scale(1);
        transform: scale(1);
    }
}

.ball-spin-fade-loader {
    position: relative;
    top: -10px;
    left: -10px;
}

    .ball-spin-fade-loader > div:nth-child(1) {
        top: 25px;
        left: 0;
        -webkit-animation: ball-spin-fade-loader 1s -.96s infinite linear;
        animation: ball-spin-fade-loader 1s -.96s infinite linear;
    }

    .ball-spin-fade-loader > div:nth-child(2) {
        top: 17.05px;
        left: 17.05px;
        -webkit-animation: ball-spin-fade-loader 1s -.84s infinite linear;
        animation: ball-spin-fade-loader 1s -.84s infinite linear;
    }

    .ball-spin-fade-loader > div:nth-child(3) {
        top: 0;
        left: 25px;
        -webkit-animation: ball-spin-fade-loader 1s -.72s infinite linear;
        animation: ball-spin-fade-loader 1s -.72s infinite linear;
    }

    .ball-spin-fade-loader > div:nth-child(4) {
        top: -17.05px;
        left: 17.05px;
        -webkit-animation: ball-spin-fade-loader 1s -.6s infinite linear;
        animation: ball-spin-fade-loader 1s -.6s infinite linear;
    }

    .ball-spin-fade-loader > div:nth-child(5) {
        top: -25px;
        left: 0;
        -webkit-animation: ball-spin-fade-loader 1s -.48s infinite linear;
        animation: ball-spin-fade-loader 1s -.48s infinite linear;
    }

    .ball-spin-fade-loader > div:nth-child(6) {
        top: -17.05px;
        left: -17.05px;
        -webkit-animation: ball-spin-fade-loader 1s -.36s infinite linear;
        animation: ball-spin-fade-loader 1s -.36s infinite linear;
    }

    .ball-spin-fade-loader > div:nth-child(7) {
        top: 0;
        left: -25px;
        -webkit-animation: ball-spin-fade-loader 1s -.24s infinite linear;
        animation: ball-spin-fade-loader 1s -.24s infinite linear;
    }

    .ball-spin-fade-loader > div:nth-child(8) {
        top: 17.05px;
        left: -17.05px;
        -webkit-animation: ball-spin-fade-loader 1s -.12s infinite linear;
        animation: ball-spin-fade-loader 1s -.12s infinite linear;
    }

    .ball-spin-fade-loader > div, .ball-spin-loader > div {
        -webkit-animation-fill-mode: both;
        position: absolute;
        width: 15px;
        height: 15px;
        border-radius: 100%;
    }

    .ball-spin-fade-loader > div {
        background-color: #fff;
        margin: 2px;
        animation-fill-mode: both;
    }

@-webkit-keyframes ball-spin-loader {
    75% {
        opacity: .2;
    }

    100% {
        opacity: 1;
    }
}

@keyframes ball-spin-loader {
    75% {
        opacity: .2;
    }

    100% {
        opacity: 1;
    }
}

.ball-spin-loader {
    position: relative;
}

    .ball-spin-loader > span:nth-child(1) {
        top: 45px;
        left: 0;
        -webkit-animation: ball-spin-loader 2s .9s infinite linear;
        animation: ball-spin-loader 2s .9s infinite linear;
    }

    .ball-spin-loader > span:nth-child(2) {
        top: 30.68px;
        left: 30.68px;
        -webkit-animation: ball-spin-loader 2s 1.8s infinite linear;
        animation: ball-spin-loader 2s 1.8s infinite linear;
    }

    .ball-spin-loader > span:nth-child(3) {
        top: 0;
        left: 45px;
        -webkit-animation: ball-spin-loader 2s 2.7s infinite linear;
        animation: ball-spin-loader 2s 2.7s infinite linear;
    }

    .ball-spin-loader > span:nth-child(4) {
        top: -30.68px;
        left: 30.68px;
        -webkit-animation: ball-spin-loader 2s 3.6s infinite linear;
        animation: ball-spin-loader 2s 3.6s infinite linear;
    }

    .ball-spin-loader > span:nth-child(5) {
        top: -45px;
        left: 0;
        -webkit-animation: ball-spin-loader 2s 4.5s infinite linear;
        animation: ball-spin-loader 2s 4.5s infinite linear;
    }

    .ball-spin-loader > span:nth-child(6) {
        top: -30.68px;
        left: -30.68px;
        -webkit-animation: ball-spin-loader 2s 5.4s infinite linear;
        animation: ball-spin-loader 2s 5.4s infinite linear;
    }

    .ball-spin-loader > span:nth-child(7) {
        top: 0;
        left: -45px;
        -webkit-animation: ball-spin-loader 2s 6.3s infinite linear;
        animation: ball-spin-loader 2s 6.3s infinite linear;
    }

    .ball-spin-loader > span:nth-child(8) {
        top: 30.68px;
        left: -30.68px;
        -webkit-animation: ball-spin-loader 2s 7.2s infinite linear;
        animation: ball-spin-loader 2s 7.2s infinite linear;
    }

    .ball-spin-loader > div {
        animation-fill-mode: both;
        background: green;
    }

.ball-zig-zag-deflect > div, .ball-zig-zag > div {
    background-color: #fff;
    width: 15px;
    height: 15px;
    border-radius: 100%;
    margin: 2px 2px 2px 15px;
    top: 4px;
    left: -7px;
}

@-webkit-keyframes ball-zig {
    33% {
        -webkit-transform: translate(-15px,-30px);
        transform: translate(-15px,-30px);
    }

    66% {
        -webkit-transform: translate(15px,-30px);
        transform: translate(15px,-30px);
    }

    100% {
        -webkit-transform: translate(0,0);
        transform: translate(0,0);
    }
}

@keyframes ball-zig {
    33% {
        -webkit-transform: translate(-15px,-30px);
        transform: translate(-15px,-30px);
    }

    66% {
        -webkit-transform: translate(15px,-30px);
        transform: translate(15px,-30px);
    }

    100% {
        -webkit-transform: translate(0,0);
        transform: translate(0,0);
    }
}

@-webkit-keyframes ball-zag {
    33% {
        -webkit-transform: translate(15px,30px);
        transform: translate(15px,30px);
    }

    66% {
        -webkit-transform: translate(-15px,30px);
        transform: translate(-15px,30px);
    }

    100% {
        -webkit-transform: translate(0,0);
        transform: translate(0,0);
    }
}

@keyframes ball-zag {
    33% {
        -webkit-transform: translate(15px,30px);
        transform: translate(15px,30px);
    }

    66% {
        -webkit-transform: translate(-15px,30px);
        transform: translate(-15px,30px);
    }

    100% {
        -webkit-transform: translate(0,0);
        transform: translate(0,0);
    }
}

.ball-zig-zag {
    position: relative;
    -webkit-transform: translate(-15px,-15px);
    transform: translate(-15px,-15px);
}

    .ball-zig-zag > div {
        -webkit-animation-fill-mode: both;
        animation-fill-mode: both;
        position: absolute;
    }

        .ball-zig-zag > div:first-child {
            -webkit-animation: ball-zig .7s 0s infinite linear;
            animation: ball-zig .7s 0s infinite linear;
        }

        .ball-zig-zag > div:last-child {
            -webkit-animation: ball-zag .7s 0s infinite linear;
            animation: ball-zag .7s 0s infinite linear;
        }

@-webkit-keyframes ball-zig-deflect {
    17%,84% {
        -webkit-transform: translate(-15px,-30px);
        transform: translate(-15px,-30px);
    }

    34%,67% {
        -webkit-transform: translate(15px,-30px);
        transform: translate(15px,-30px);
    }

    100%,50% {
        -webkit-transform: translate(0,0);
        transform: translate(0,0);
    }
}

@keyframes ball-zig-deflect {
    17%,84% {
        -webkit-transform: translate(-15px,-30px);
        transform: translate(-15px,-30px);
    }

    34%,67% {
        -webkit-transform: translate(15px,-30px);
        transform: translate(15px,-30px);
    }

    100%,50% {
        -webkit-transform: translate(0,0);
        transform: translate(0,0);
    }
}

@-webkit-keyframes ball-zag-deflect {
    17%,84% {
        -webkit-transform: translate(15px,30px);
        transform: translate(15px,30px);
    }

    34%,67% {
        -webkit-transform: translate(-15px,30px);
        transform: translate(-15px,30px);
    }

    100%,50% {
        -webkit-transform: translate(0,0);
        transform: translate(0,0);
    }
}

@keyframes ball-zag-deflect {
    17%,84% {
        -webkit-transform: translate(15px,30px);
        transform: translate(15px,30px);
    }

    34%,67% {
        -webkit-transform: translate(-15px,30px);
        transform: translate(-15px,30px);
    }

    100%,50% {
        -webkit-transform: translate(0,0);
        transform: translate(0,0);
    }
}

.ball-zig-zag-deflect {
    position: relative;
    -webkit-transform: translate(-15px,-15px);
    transform: translate(-15px,-15px);
}

    .ball-zig-zag-deflect > div {
        -webkit-animation-fill-mode: both;
        animation-fill-mode: both;
        position: absolute;
    }

.line-scale-party > div, .line-scale-pulse-out-rapid > div, .line-scale-pulse-out > div, .line-scale > div {
    width: 4px;
    height: 35px;
    display: inline-block;
}

.line-scale-party > div, .line-scale-pulse-out-rapid > div, .line-scale-pulse-out > div, .line-scale > div, .line-spin-fade-loader > div {
    border-radius: 2px;
    margin: 2px;
    background-color: #fff;
}

.ball-zig-zag-deflect > div:first-child {
    -webkit-animation: ball-zig-deflect 1.5s 0s infinite linear;
    animation: ball-zig-deflect 1.5s 0s infinite linear;
}

.ball-zig-zag-deflect > div:last-child {
    -webkit-animation: ball-zag-deflect 1.5s 0s infinite linear;
    animation: ball-zag-deflect 1.5s 0s infinite linear;
}

@-webkit-keyframes line-scale {
    0%,100% {
        -webkit-transform: scaley(1);
        transform: scaley(1);
    }

    50% {
        -webkit-transform: scaley(.4);
        transform: scaley(.4);
    }
}

@keyframes line-scale {
    0%,100% {
        -webkit-transform: scaley(1);
        transform: scaley(1);
    }

    50% {
        -webkit-transform: scaley(.4);
        transform: scaley(.4);
    }
}

.line-scale > div:nth-child(1) {
    -webkit-animation: line-scale 1s -.4s infinite cubic-bezier(.2,.68,.18,1.08);
    animation: line-scale 1s -.4s infinite cubic-bezier(.2,.68,.18,1.08);
}

.line-scale > div:nth-child(2) {
    -webkit-animation: line-scale 1s -.3s infinite cubic-bezier(.2,.68,.18,1.08);
    animation: line-scale 1s -.3s infinite cubic-bezier(.2,.68,.18,1.08);
}

.line-scale > div:nth-child(3) {
    -webkit-animation: line-scale 1s -.2s infinite cubic-bezier(.2,.68,.18,1.08);
    animation: line-scale 1s -.2s infinite cubic-bezier(.2,.68,.18,1.08);
}

.line-scale > div:nth-child(4) {
    -webkit-animation: line-scale 1s -.1s infinite cubic-bezier(.2,.68,.18,1.08);
    animation: line-scale 1s -.1s infinite cubic-bezier(.2,.68,.18,1.08);
}

.line-scale > div:nth-child(5) {
    -webkit-animation: line-scale 1s 0s infinite cubic-bezier(.2,.68,.18,1.08);
    animation: line-scale 1s 0s infinite cubic-bezier(.2,.68,.18,1.08);
}

.line-scale > div {
    -webkit-animation-fill-mode: both;
    animation-fill-mode: both;
}

@-webkit-keyframes line-scale-party {
    0%,100% {
        -webkit-transform: scale(1);
        transform: scale(1);
    }

    50% {
        -webkit-transform: scale(.5);
        transform: scale(.5);
    }
}

@keyframes line-scale-party {
    0%,100% {
        -webkit-transform: scale(1);
        transform: scale(1);
    }

    50% {
        -webkit-transform: scale(.5);
        transform: scale(.5);
    }
}

.line-scale-party > div:nth-child(1) {
    -webkit-animation-delay: .55s;
    animation-delay: .55s;
    -webkit-animation-duration: 1.23s;
    animation-duration: 1.23s;
}

.line-scale-party > div:nth-child(2) {
    -webkit-animation-delay: .55s;
    animation-delay: .55s;
    -webkit-animation-duration: .55s;
    animation-duration: .55s;
}

.line-scale-party > div:nth-child(3) {
    -webkit-animation-delay: 90ms;
    animation-delay: 90ms;
    -webkit-animation-duration: .39s;
    animation-duration: .39s;
}

.line-scale-party > div:nth-child(4) {
    -webkit-animation-delay: .5s;
    animation-delay: .5s;
    -webkit-animation-duration: .59s;
    animation-duration: .59s;
}

.line-scale-party > div {
    -webkit-animation-fill-mode: both;
    animation-fill-mode: both;
    -webkit-animation-name: line-scale-party;
    animation-name: line-scale-party;
    -webkit-animation-iteration-count: infinite;
    animation-iteration-count: infinite;
    -webkit-animation-delay: 0;
    animation-delay: 0;
}

@-webkit-keyframes line-scale-pulse-out {
    0%,100% {
        -webkit-transform: scaley(1);
        transform: scaley(1);
    }

    50% {
        -webkit-transform: scaley(.4);
        transform: scaley(.4);
    }
}

@keyframes line-scale-pulse-out {
    0%,100% {
        -webkit-transform: scaley(1);
        transform: scaley(1);
    }

    50% {
        -webkit-transform: scaley(.4);
        transform: scaley(.4);
    }
}

.line-scale-pulse-out > div {
    -webkit-animation: line-scale-pulse-out .9s -.6s infinite cubic-bezier(.85,.25,.37,.85);
    animation: line-scale-pulse-out .9s -.6s infinite cubic-bezier(.85,.25,.37,.85);
}

    .line-scale-pulse-out > div:nth-child(2), .line-scale-pulse-out > div:nth-child(4) {
        -webkit-animation-delay: -.4s !important;
        animation-delay: -.4s !important;
    }

    .line-scale-pulse-out > div:nth-child(1), .line-scale-pulse-out > div:nth-child(5) {
        -webkit-animation-delay: -.2s !important;
        animation-delay: -.2s !important;
    }

@-webkit-keyframes line-scale-pulse-out-rapid {
    0%,90% {
        -webkit-transform: scaley(1);
        transform: scaley(1);
    }

    80% {
        -webkit-transform: scaley(.3);
        transform: scaley(.3);
    }
}

@keyframes line-scale-pulse-out-rapid {
    0%,90% {
        -webkit-transform: scaley(1);
        transform: scaley(1);
    }

    80% {
        -webkit-transform: scaley(.3);
        transform: scaley(.3);
    }
}

.line-scale-pulse-out-rapid > div {
    vertical-align: middle;
    -webkit-animation: line-scale-pulse-out-rapid .9s -.5s infinite cubic-bezier(.11,.49,.38,.78);
    animation: line-scale-pulse-out-rapid .9s -.5s infinite cubic-bezier(.11,.49,.38,.78);
}

    .line-scale-pulse-out-rapid > div:nth-child(2), .line-scale-pulse-out-rapid > div:nth-child(4) {
        -webkit-animation-delay: -.25s !important;
        animation-delay: -.25s !important;
    }

    .line-scale-pulse-out-rapid > div:nth-child(1), .line-scale-pulse-out-rapid > div:nth-child(5) {
        -webkit-animation-delay: 0s !important;
        animation-delay: 0s !important;
    }

@-webkit-keyframes line-spin-fade-loader {
    50% {
        opacity: .3;
    }

    100% {
        opacity: 1;
    }
}

@keyframes line-spin-fade-loader {
    50% {
        opacity: .3;
    }

    100% {
        opacity: 1;
    }
}

.line-spin-fade-loader {
    position: relative;
    top: -10px;
    left: -4px;
}

    .line-spin-fade-loader > div:nth-child(1) {
        top: 20px;
        left: 0;
        -webkit-animation: line-spin-fade-loader 1.2s -.84s infinite ease-in-out;
        animation: line-spin-fade-loader 1.2s -.84s infinite ease-in-out;
    }

    .line-spin-fade-loader > div:nth-child(2) {
        top: 13.64px;
        left: 13.64px;
        -webkit-transform: rotate(-45deg);
        transform: rotate(-45deg);
        -webkit-animation: line-spin-fade-loader 1.2s -.72s infinite ease-in-out;
        animation: line-spin-fade-loader 1.2s -.72s infinite ease-in-out;
    }

    .line-spin-fade-loader > div:nth-child(3) {
        top: 0;
        left: 20px;
        -webkit-transform: rotate(90deg);
        transform: rotate(90deg);
        -webkit-animation: line-spin-fade-loader 1.2s -.6s infinite ease-in-out;
        animation: line-spin-fade-loader 1.2s -.6s infinite ease-in-out;
    }

    .line-spin-fade-loader > div:nth-child(4) {
        top: -13.64px;
        left: 13.64px;
        -webkit-transform: rotate(45deg);
        transform: rotate(45deg);
        -webkit-animation: line-spin-fade-loader 1.2s -.48s infinite ease-in-out;
        animation: line-spin-fade-loader 1.2s -.48s infinite ease-in-out;
    }

    .line-spin-fade-loader > div:nth-child(5) {
        top: -20px;
        left: 0;
        -webkit-animation: line-spin-fade-loader 1.2s -.36s infinite ease-in-out;
        animation: line-spin-fade-loader 1.2s -.36s infinite ease-in-out;
    }

    .line-spin-fade-loader > div:nth-child(6) {
        top: -13.64px;
        left: -13.64px;
        -webkit-transform: rotate(-45deg);
        transform: rotate(-45deg);
        -webkit-animation: line-spin-fade-loader 1.2s -.24s infinite ease-in-out;
        animation: line-spin-fade-loader 1.2s -.24s infinite ease-in-out;
    }

    .line-spin-fade-loader > div:nth-child(7) {
        top: 0;
        left: -20px;
        -webkit-transform: rotate(90deg);
        transform: rotate(90deg);
        -webkit-animation: line-spin-fade-loader 1.2s -.12s infinite ease-in-out;
        animation: line-spin-fade-loader 1.2s -.12s infinite ease-in-out;
    }

    .line-spin-fade-loader > div:nth-child(8) {
        top: 13.64px;
        left: -13.64px;
        -webkit-transform: rotate(45deg);
        transform: rotate(45deg);
        -webkit-animation: line-spin-fade-loader 1.2s 0s infinite ease-in-out;
        animation: line-spin-fade-loader 1.2s 0s infinite ease-in-out;
    }

    .line-spin-fade-loader > div {
        -webkit-animation-fill-mode: both;
        animation-fill-mode: both;
        position: absolute;
        width: 5px;
        height: 15px;
    }

@-webkit-keyframes triangle-skew-spin {
    25% {
        -webkit-transform: perspective(100px) rotateX(180deg) rotateY(0);
        transform: perspective(100px) rotateX(180deg) rotateY(0);
    }

    50% {
        -webkit-transform: perspective(100px) rotateX(180deg) rotateY(180deg);
        transform: perspective(100px) rotateX(180deg) rotateY(180deg);
    }

    75% {
        -webkit-transform: perspective(100px) rotateX(0) rotateY(180deg);
        transform: perspective(100px) rotateX(0) rotateY(180deg);
    }

    100% {
        -webkit-transform: perspective(100px) rotateX(0) rotateY(0);
        transform: perspective(100px) rotateX(0) rotateY(0);
    }
}

@keyframes triangle-skew-spin {
    25% {
        -webkit-transform: perspective(100px) rotateX(180deg) rotateY(0);
        transform: perspective(100px) rotateX(180deg) rotateY(0);
    }

    50% {
        -webkit-transform: perspective(100px) rotateX(180deg) rotateY(180deg);
        transform: perspective(100px) rotateX(180deg) rotateY(180deg);
    }

    75% {
        -webkit-transform: perspective(100px) rotateX(0) rotateY(180deg);
        transform: perspective(100px) rotateX(0) rotateY(180deg);
    }

    100% {
        -webkit-transform: perspective(100px) rotateX(0) rotateY(0);
        transform: perspective(100px) rotateX(0) rotateY(0);
    }
}

.triangle-skew-spin > div {
    width: 0;
    height: 0;
    border-left: 20px solid transparent;
    border-right: 20px solid transparent;
    border-bottom: 20px solid #fff;
    -webkit-animation: triangle-skew-spin 3s 0s cubic-bezier(.09,.57,.49,.9) infinite;
    animation: triangle-skew-spin 3s 0s cubic-bezier(.09,.57,.49,.9) infinite;
}

@-webkit-keyframes square-spin {
    25% {
        -webkit-transform: perspective(100px) rotateX(180deg) rotateY(0);
        transform: perspective(100px) rotateX(180deg) rotateY(0);
    }

    50% {
        -webkit-transform: perspective(100px) rotateX(180deg) rotateY(180deg);
        transform: perspective(100px) rotateX(180deg) rotateY(180deg);
    }

    75% {
        -webkit-transform: perspective(100px) rotateX(0) rotateY(180deg);
        transform: perspective(100px) rotateX(0) rotateY(180deg);
    }

    100% {
        -webkit-transform: perspective(100px) rotateX(0) rotateY(0);
        transform: perspective(100px) rotateX(0) rotateY(0);
    }
}

@keyframes square-spin {
    25% {
        -webkit-transform: perspective(100px) rotateX(180deg) rotateY(0);
        transform: perspective(100px) rotateX(180deg) rotateY(0);
    }

    50% {
        -webkit-transform: perspective(100px) rotateX(180deg) rotateY(180deg);
        transform: perspective(100px) rotateX(180deg) rotateY(180deg);
    }

    75% {
        -webkit-transform: perspective(100px) rotateX(0) rotateY(180deg);
        transform: perspective(100px) rotateX(0) rotateY(180deg);
    }

    100% {
        -webkit-transform: perspective(100px) rotateX(0) rotateY(0);
        transform: perspective(100px) rotateX(0) rotateY(0);
    }
}

.square-spin > div {
    width: 50px;
    height: 50px;
    background: #fff;
    -webkit-animation: square-spin 3s 0s cubic-bezier(.09,.57,.49,.9) infinite;
    animation: square-spin 3s 0s cubic-bezier(.09,.57,.49,.9) infinite;
}

.pacman > div:first-of-type, .pacman > div:nth-child(2) {
    width: 0;
    height: 0;
    border-right: 25px solid transparent;
    border-top: 25px solid #fff;
    border-left: 25px solid #fff;
    border-bottom: 25px solid #fff;
    border-radius: 25px;
    position: relative;
    left: -30px;
}

@-webkit-keyframes rotate_pacman_half_up {
    0%,100% {
        -webkit-transform: rotate(270deg);
        transform: rotate(270deg);
    }

    50% {
        -webkit-transform: rotate(360deg);
        transform: rotate(360deg);
    }
}

@keyframes rotate_pacman_half_up {
    0%,100% {
        -webkit-transform: rotate(270deg);
        transform: rotate(270deg);
    }

    50% {
        -webkit-transform: rotate(360deg);
        transform: rotate(360deg);
    }
}

@-webkit-keyframes rotate_pacman_half_down {
    0%,100% {
        -webkit-transform: rotate(90deg);
        transform: rotate(90deg);
    }

    50% {
        -webkit-transform: rotate(0);
        transform: rotate(0);
    }
}

@keyframes rotate_pacman_half_down {
    0%,100% {
        -webkit-transform: rotate(90deg);
        transform: rotate(90deg);
    }

    50% {
        -webkit-transform: rotate(0);
        transform: rotate(0);
    }
}

@-webkit-keyframes pacman-balls {
    75% {
        opacity: .7;
    }

    100% {
        -webkit-transform: translate(-100px,-6.25px);
        transform: translate(-100px,-6.25px);
    }
}

@keyframes pacman-balls {
    75% {
        opacity: .7;
    }

    100% {
        -webkit-transform: translate(-100px,-6.25px);
        transform: translate(-100px,-6.25px);
    }
}

.pacman {
    position: relative;
}

    .pacman > div:nth-child(3) {
        -webkit-animation: pacman-balls 1s -.66s infinite linear;
        animation: pacman-balls 1s -.66s infinite linear;
    }

    .pacman > div:nth-child(4) {
        -webkit-animation: pacman-balls 1s -.33s infinite linear;
        animation: pacman-balls 1s -.33s infinite linear;
    }

    .pacman > div:nth-child(5) {
        -webkit-animation: pacman-balls 1s 0s infinite linear;
        animation: pacman-balls 1s 0s infinite linear;
    }

    .pacman > div:first-of-type {
        -webkit-animation: rotate_pacman_half_up .5s 0s infinite;
        animation: rotate_pacman_half_up .5s 0s infinite;
    }

    .pacman > div:nth-child(2) {
        -webkit-animation: rotate_pacman_half_down .5s 0s infinite;
        animation: rotate_pacman_half_down .5s 0s infinite;
        margin-top: -50px;
    }

    .pacman > div:nth-child(3), .pacman > div:nth-child(4), .pacman > div:nth-child(5), .pacman > div:nth-child(6) {
        background-color: #fff;
        border-radius: 100%;
        margin: 2px;
        width: 10px;
        height: 10px;
        position: absolute;
        -webkit-transform: translate(0,-6.25px);
        transform: translate(0,-6.25px);
        top: 25px;
        left: 70px;
    }

@-webkit-keyframes cube-transition {
    25% {
        -webkit-transform: translateX(50px) scale(.5) rotate(-90deg);
        transform: translateX(50px) scale(.5) rotate(-90deg);
    }

    50% {
        -webkit-transform: translate(50px,50px) rotate(-180deg);
        transform: translate(50px,50px) rotate(-180deg);
    }

    75% {
        -webkit-transform: translateY(50px) scale(.5) rotate(-270deg);
        transform: translateY(50px) scale(.5) rotate(-270deg);
    }

    100% {
        -webkit-transform: rotate(-360deg);
        transform: rotate(-360deg);
    }
}

@keyframes cube-transition {
    25% {
        -webkit-transform: translateX(50px) scale(.5) rotate(-90deg);
        transform: translateX(50px) scale(.5) rotate(-90deg);
    }

    50% {
        -webkit-transform: translate(50px,50px) rotate(-180deg);
        transform: translate(50px,50px) rotate(-180deg);
    }

    75% {
        -webkit-transform: translateY(50px) scale(.5) rotate(-270deg);
        transform: translateY(50px) scale(.5) rotate(-270deg);
    }

    100% {
        -webkit-transform: rotate(-360deg);
        transform: rotate(-360deg);
    }
}

.cube-transition {
    position: relative;
    -webkit-transform: translate(-25px,-25px);
    transform: translate(-25px,-25px);
}

    .cube-transition > div {
        width: 10px;
        height: 10px;
        position: absolute;
        top: -5px;
        left: -5px;
        background-color: #fff;
        -webkit-animation: cube-transition 1.6s 0s infinite ease-in-out;
        animation: cube-transition 1.6s 0s infinite ease-in-out;
    }

        .cube-transition > div:last-child {
            -webkit-animation-delay: -.8s;
            animation-delay: -.8s;
        }

@-webkit-keyframes spin-rotate {
    0% {
        -webkit-transform: rotate(0);
        transform: rotate(0);
    }

    50% {
        -webkit-transform: rotate(180deg);
        transform: rotate(180deg);
    }

    100% {
        -webkit-transform: rotate(360deg);
        transform: rotate(360deg);
    }
}

@keyframes spin-rotate {
    0% {
        -webkit-transform: rotate(0);
        transform: rotate(0);
    }

    50% {
        -webkit-transform: rotate(180deg);
        transform: rotate(180deg);
    }

    100% {
        -webkit-transform: rotate(360deg);
        transform: rotate(360deg);
    }
}

.semi-circle-spin {
    position: relative;
    width: 35px;
    height: 35px;
    overflow: hidden;
}

    .semi-circle-spin > div {
        position: absolute;
        border-width: 0;
        border-radius: 100%;
        -webkit-animation: spin-rotate .6s 0s infinite linear;
        animation: spin-rotate .6s 0s infinite linear;
        background-image: -webkit-linear-gradient(transparent 0,transparent 70%,#fff 30%,#fff 100%);
        background-image: linear-gradient(transparent 0,transparent 70%,#fff 30%,#fff 100%);
        width: 100%;
        height: 100%;
    }

.loader {
    position: absolute;
    top: 0;
    width: 100%;
    height: 100%;
    background: rgba(0,0,0,0.3);
    z-index: 10000;
    display:none;
}

.loader > div{
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    width: 100px;
    height: 100px;
    color: #fff;
    margin: auto;
}


text:
<head>
	<meta charset="utf-8">
	<!-- (1) Optimize for mobile versions: http://goo.gl/EOpFl -->
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<!-- (1) force latest IE rendering engine: bit.ly/1c8EiC9 -->
	<meta http-equiv="X-UA-Compatible" content="IE=edge">

	<title>{% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %}</title>
	<meta name="description" content="{{ site.description }} {{ page.title }}" />
	<meta name="keywords" content="cnedwan 博客 xsu edwan ed  ED 聊聊代码聊聊生活 炒股 兴趣 自行车 骑车 旅行 感悟 {{page.title}} {{ page.tags }}" />
	<meta name="HandheldFriendly" content="True" />
	<meta name="MobileOptimized" content="320" />
	<meta name="apple-mobile-web-app-capable" content="yes">
	<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
	<meta name="baidu-site-verification" content="5ksRcFeBzN" />

	<link rel="canonical" href="{{ page.url | replace:'index.html','' | prepend: site.baseurl | prepend: site.url }}">

	<link rel="shortcut icon" href="{{ "/assets/images/favicon.png" | prepend: site.baseurl }}">
	<!--  <link rel="stylesheet" href="{{asset "js/styles/obsidian.css"}}"> -->
	<link rel="stylesheet" href="http://brick.a.ssl.fastly.net/Linux+Libertine:400,400i,700,700i/Open+Sans:400,400i,700,700i">
	<link href="//maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css" rel="stylesheet">

	<link rel="stylesheet" type="text/css" media="screen" href="{{ "/css/main.css"  | prepend: site.baseurl  }}" />
	<link rel="stylesheet" type="text/css" media="print" href="{{ "/css/print.css"  | prepend: site.baseurl  }}" />

	<script>
		var _hmt = _hmt || [];
		(function() {
			var hm = document.createElement("script");
			hm.src = "//hm.baidu.com/hm.js?6a0519989f1e39d89ac01c264e6feb18";
			var s = document.getElementsByTagName("script")[0];
			s.parentNode.insertBefore(hm, s);
		})();
	</script>
</head>

redpajama_set_name: RedPajamaGithub


text:
<!DOCTYPE html>

	<meta charset="utf-8">
	<title>Phaser Source: animation/AnimationManager.js</title>

	<link type="text/css" rel="stylesheet" href="styles/sunlight.default.css">

	<link type="text/css" rel="stylesheet" href="styles/site.cerulean.css">

			Phaser

					Namespaces

							Phaser

					Classes

							Animation

							AnimationManager

							AnimationParser

							ArrayList

							BitmapData

							BitmapText

							Button

							Cache

							Camera

							Canvas

							Circle

							Color

							Device

							Easing

							Back

							Bounce

							Circular

							Cubic

							Elastic

							Exponential

							Linear

							Quadratic

							Quartic

							Quintic

							Sinusoidal

							Ellipse

							Events

							Filter

							Frame

							FrameData

							Game

							GameObjectCreator

							GameObjectFactory

							Gamepad

							GamepadButton

							Graphics

							Group

							Image

							Input

							InputHandler

							Key

							Keyboard

							Line

							LinkedList

							Loader

							LoaderParser

							Math

							Mouse

							MSPointer

							Net

							Particle

							Particles

							Emitter

							Physics

							Arcade

							Body

							Ninja

							AABB

							Body

							Circle

							Tile

							P2

							Body

							BodyDebug

							CollisionGroup

							ContactMaterial

							DistanceConstraint

							FixtureList

							GearConstraint

							InversePointProxy

							LockConstraint

							Material

							PointProxy

							PrismaticConstraint

							RevoluteConstraint

							Spring

							Plugin

							PluginManager

							Point

							Pointer

							Polygon

							QuadTree

							RandomDataGenerator

							Rectangle

							RenderTexture

							RequestAnimationFrame

							RetroFont

							ScaleManager

							Signal

							SignalBinding

							SinglePad

							Sound

							SoundManager

							Sprite

							SpriteBatch

							Stage

							State

							StateManager

							Text

							Tile

							Tilemap

							TilemapLayer

							TilemapParser

							Tileset

							TileSprite

							Time

							Timer

							TimerEvent

							Touch

							Tween

							TweenManager

							Utils

							Debug

							World

Source: animation/AnimationManager.js

/**
* The Animation Manager is used to add, play and update Phaser Animations.
* Any Game Object such as Phaser.Sprite that supports animation contains a single AnimationManager instance.
*
* @class Phaser.AnimationManager
* @constructor
* @param {Phaser.Sprite} sprite - A reference to the Game Object that owns this AnimationManager.
*/
Phaser.AnimationManager = function (sprite) {

    /**
    * @property {Phaser.Sprite} sprite - A reference to the parent Sprite that owns this AnimationManager.
    */
    this.sprite = sprite;

    /**
    * @property {Phaser.Game} game - A reference to the currently running Game.
    */
    this.game = sprite.game;

    /**
    * @property {Phaser.Frame} currentFrame - The currently displayed Frame of animation, if any.
    * @default
    */
    this.currentFrame = null;

    /**
    * @property {Phaser.Animation} currentAnim - The currently displayed animation, if any.
    * @default
    */
    this.currentAnim = null;

    /**
    * @property {boolean} updateIfVisible - Should the animation data continue to update even if the Sprite.visible is set to false.
    * @default
    */
    this.updateIfVisible = true;

    /**
    * @property {boolean} isLoaded - Set to true once animation data has been loaded.
    * @default
    */
    this.isLoaded = false;

    /**
    * @property {Phaser.FrameData} _frameData - A temp. var for holding the currently playing Animations FrameData.
    * @private
    * @default
    */
    this._frameData = null;

    /**
    * @property {object} _anims - An internal object that stores all of the Animation instances.
    * @private
    */
    this._anims = {};

    /**
    * @property {object} _outputFrames - An internal object to help avoid gc.
    * @private
    */
    this._outputFrames = [];

};

Phaser.AnimationManager.prototype = {

    /**
    * Loads FrameData into the internal temporary vars and resets the frame index to zero.
    * This is called automatically when a new Sprite is created.
    *
    * @method Phaser.AnimationManager#loadFrameData
    * @private
    * @param {Phaser.FrameData} frameData - The FrameData set to load.
    */
    loadFrameData: function (frameData) {

        this._frameData = frameData;
        this.frame = 0;
        this.isLoaded = true;

    },

    /**
    * Adds a new animation under the given key. Optionally set the frames, frame rate and loop.
    * Animations added in this way are played back with the play function.
    *
    * @method Phaser.AnimationManager#add
    * @param {string} name - The unique (within this Sprite) name for the animation, i.e. "run", "fire", "walk".
    * @param {Array} [frames=null] - An array of numbers/strings that correspond to the frames to add to this animation and in which order. e.g. [1, 2, 3] or ['run0', 'run1', run2]). If null then all frames will be used.
    * @param {number} [frameRate=60] - The speed at which the animation should play. The speed is given in frames per second.
    * @param {boolean} [loop=false] - Whether or not the animation is looped or just plays once.
    * @param {boolean} [useNumericIndex=true] - Are the given frames using numeric indexes (default) or strings?
    * @return {Phaser.Animation} The Animation object that was created.
    */
    add: function (name, frames, frameRate, loop, useNumericIndex) {

        if (this._frameData === null)
        {
            console.warn('No FrameData available for Phaser.Animation ' + name);
            return;
        }

        frames = frames || [];
        frameRate = frameRate || 60;

        if (typeof loop === 'undefined') { loop = false; }

        //  If they didn't set the useNumericIndex then let's at least try and guess it
        if (typeof useNumericIndex === 'undefined')
        {
            if (frames && typeof frames[0] === 'number')
            {
                useNumericIndex = true;
            }
            else
            {
                useNumericIndex = false;
            }
        }

        //  Create the signals the AnimationManager will emit
        if (this.sprite.events.onAnimationStart === null)
        {
            this.sprite.events.onAnimationStart = new Phaser.Signal();
            this.sprite.events.onAnimationComplete = new Phaser.Signal();
            this.sprite.events.onAnimationLoop = new Phaser.Signal();
        }

        this._outputFrames.length = 0;

        this._frameData.getFrameIndexes(frames, useNumericIndex, this._outputFrames);

        this._anims[name] = new Phaser.Animation(this.game, this.sprite, name, this._frameData, this._outputFrames, frameRate, loop);
        this.currentAnim = this._anims[name];
        this.currentFrame = this.currentAnim.currentFrame;
        this.sprite.setTexture(PIXI.TextureCache[this.currentFrame.uuid]);

        if (this.sprite.__tilePattern)
        {
            this.__tilePattern = false;
            this.tilingTexture = false;
        }

        return this._anims[name];

    },

    /**
    * Check whether the frames in the given array are valid and exist.
    *
    * @method Phaser.AnimationManager#validateFrames
    * @param {Array} frames - An array of frames to be validated.
    * @param {boolean} [useNumericIndex=true] - Validate the frames based on their numeric index (true) or string index (false)
    * @return {boolean} True if all given Frames are valid, otherwise false.
    */
    validateFrames: function (frames, useNumericIndex) {

        if (typeof useNumericIndex == 'undefined') { useNumericIndex = true; }

        for (var i = 0; i < frames.length; i++)
        {
            if (useNumericIndex === true)
            {
                if (frames[i] > this._frameData.total)
                {
                    return false;
                }
            }
            else
            {
                if (this._frameData.checkFrameName(frames[i]) === false)
                {
                    return false;
                }
            }
        }

        return true;

    },

    /**
    * Play an animation based on the given key. The animation should previously have been added via sprite.animations.add()
    * If the requested animation is already playing this request will be ignored. If you need to reset an already running animation do so directly on the Animation object itself.
    *
    * @method Phaser.AnimationManager#play
    * @param {string} name - The name of the animation to be played, e.g. "fire", "walk", "jump".
    * @param {number} [frameRate=null] - The framerate to play the animation at. The speed is given in frames per second. If not provided the previously set frameRate of the Animation is used.
    * @param {boolean} [loop=false] - Should the animation be looped after playback. If not provided the previously set loop value of the Animation is used.
    * @param {boolean} [killOnComplete=false] - If set to true when the animation completes (only happens if loop=false) the parent Sprite will be killed.
    * @return {Phaser.Animation} A reference to playing Animation instance.
    */
    play: function (name, frameRate, loop, killOnComplete) {

        if (this._anims[name])
        {
            if (this.currentAnim === this._anims[name])
            {
                if (this.currentAnim.isPlaying === false)
                {
                    this.currentAnim.paused = false;
                    return this.currentAnim.play(frameRate, loop, killOnComplete);
                }
            }
            else
            {
                if (this.currentAnim && this.currentAnim.isPlaying)
                {
                    this.currentAnim.stop();
                }

                this.currentAnim = this._anims[name];
                this.currentAnim.paused = false;
                return this.currentAnim.play(frameRate, loop, killOnComplete);
            }
        }

    },

    /**
    * Stop playback of an animation. If a name is given that specific animation is stopped, otherwise the current animation is stopped.
    * The currentAnim property of the AnimationManager is automatically set to the animation given.
    *
    * @method Phaser.AnimationManager#stop
    * @param {string} [name=null] - The name of the animation to be stopped, e.g. "fire". If none is given the currently running animation is stopped.
    * @param {boolean} [resetFrame=false] - When the animation is stopped should the currentFrame be set to the first frame of the animation (true) or paused on the last frame displayed (false)
    */
    stop: function (name, resetFrame) {

        if (typeof resetFrame == 'undefined') { resetFrame = false; }

        if (typeof name == 'string')
        {
            if (this._anims[name])
            {
                this.currentAnim = this._anims[name];
                this.currentAnim.stop(resetFrame);
            }
        }
        else
        {
            if (this.currentAnim)
            {
                this.currentAnim.stop(resetFrame);
            }
        }

    },

    /**
    * The main update function is called by the Sprites update loop. It's responsible for updating animation frames and firing related events.
    *
    * @method Phaser.AnimationManager#update
    * @protected
    * @return {boolean} True if a new animation frame has been set, otherwise false.
    */
    update: function () {

        if (this.updateIfVisible && !this.sprite.visible)
        {
            return false;
        }

        if (this.currentAnim && this.currentAnim.update() === true)
        {
            this.currentFrame = this.currentAnim.currentFrame;
            return true;
        }

        return false;

    },

    /**
    * Returns an animation that was previously added by name.
    *
    * @method Phaser.AnimationManager#getAnimation
    * @param {string} name - The name of the animation to be returned, e.g. "fire".
    * @return {Phaser.Animation} The Animation instance, if found, otherwise null.
    */
    getAnimation: function (name) {

        if (typeof name === 'string')
        {
            if (this._anims[name])
            {
                return this._anims[name];
            }
        }

        return null;

    },

    /**
    * Refreshes the current frame data back to the parent Sprite and also resets the texture data.
    *
    * @method Phaser.AnimationManager#refreshFrame
    */
    refreshFrame: function () {

        this.sprite.setTexture(PIXI.TextureCache[this.currentFrame.uuid]);

        if (this.sprite.__tilePattern)
        {
            this.__tilePattern = false;
            this.tilingTexture = false;
        }

    },

    /**
    * Destroys all references this AnimationManager contains.
    * Iterates through the list of animations stored in this manager and calls destroy on each of them.
    *
    * @method Phaser.AnimationManager#destroy
    */
    destroy: function () {

        var anim = null;

        for (var anim in this._anims)
        {
            if (this._anims.hasOwnProperty(anim))
            {
                this._anims[anim].destroy();
            }
        }

        this._anims = {};
        this._frameData = null;
        this._frameIndex = 0;
        this.currentAnim = null;
        this.currentFrame = null;

    }

};

Phaser.AnimationManager.prototype.constructor = Phaser.AnimationManager;

/**
* @name Phaser.AnimationManager#frameData
* @property {Phaser.FrameData} frameData - The current animations FrameData.
* @readonly
*/
Object.defineProperty(Phaser.AnimationManager.prototype, 'frameData', {

    get: function () {
        return this._frameData;
    }

});

/**
* @name Phaser.AnimationManager#frameTotal
* @property {number} frameTotal - The total number of frames in the currently loaded FrameData, or -1 if no FrameData is loaded.
* @readonly
*/
Object.defineProperty(Phaser.AnimationManager.prototype, 'frameTotal', {

    get: function () {

        if (this._frameData)
        {
            return this._frameData.total;
        }
        else
        {
            return -1;
        }
    }

});

/**
* @name Phaser.AnimationManager#paused
* @property {boolean} paused - Gets and sets the paused state of the current animation.
*/
Object.defineProperty(Phaser.AnimationManager.prototype, 'paused', {

    get: function () {

        return this.currentAnim.isPaused;

    },

    set: function (value) {

        this.currentAnim.paused = value;

    }

});

/**
* @name Phaser.AnimationManager#frame
* @property {number} frame - Gets or sets the current frame index and updates the Texture Cache for display.
*/
Object.defineProperty(Phaser.AnimationManager.prototype, 'frame', {

    get: function () {

        if (this.currentFrame)
        {
            return this._frameIndex;
        }

    },

    set: function (value) {

        if (typeof value === 'number' && this._frameData && this._frameData.getFrame(value) !== null)
        {
            this.currentFrame = this._frameData.getFrame(value);

            if (this.currentFrame)
            {
                this._frameIndex = value;
                this.sprite.setTexture(PIXI.TextureCache[this.currentFrame.uuid]);

                if (this.sprite.__tilePattern)
                {
                    this.__tilePattern = false;
                    this.tilingTexture = false;
                }
            }
        }

    }

});

/**
* @name Phaser.AnimationManager#frameName
* @property {string} frameName - Gets or sets the current frame name and updates the Texture Cache for display.
*/
Object.defineProperty(Phaser.AnimationManager.prototype, 'frameName', {

    get: function () {

        if (this.currentFrame)
        {
            return this.currentFrame.name;
        }

    },

    set: function (value) {

        if (typeof value === 'string' && this._frameData && this._frameData.getFrameByName(value) !== null)
        {
            this.currentFrame = this._frameData.getFrameByName(value);

            if (this.currentFrame)
            {
                this._frameIndex = this.currentFrame.index;
                this.sprite.setTexture(PIXI.TextureCache[this.currentFrame.uuid]);

                if (this.sprite.__tilePattern)
                {
                    this.__tilePattern = false;
                    this.tilingTexture = false;
                }
            }
        }
        else
        {
            console.warn('Cannot set frameName: ' + value);
        }
    }

});

		Phaser Copyright © 2012-2014 Photon Storm Ltd.

		Documentation generated by JSDoc 3.3.0-dev
		on Tue May 20 2014 10:05:49 GMT+0100 (BST) using the DocStrap template.


text:
<!DOCTYPE html>

	<meta charset="utf-8">

	<title>JMSGUser Class Reference</title>

	<link rel="stylesheet" href="../css/style.css">
	<meta name="viewport" content="initial-scale=1, maximum-scale=1.4">
	<meta name="generator" content="appledoc 2.2.1 (build 1334)">

				JMessage-iOS-SDK

				HXHG

Index

Hierarchy

							On This Page

							<select id="jump-to">
	<option value="top">Jump To…</option>

	<option value="overview">Overview</option>

	<option value="tasks">Tasks</option>

	<optgroup label="Properties">

		<option value="//api/name/uid">uid</option>

		<option value="//api/name/username">username</option>

		<option value="//api/name/nickname">nickname</option>

		<option value="//api/name/avatar">avatar</option>

		<option value="//api/name/gender">gender</option>

		<option value="//api/name/birthday">birthday</option>

		<option value="//api/name/noteName">noteName</option>

		<option value="//api/name/noteText">noteText</option>

		<option value="//api/name/appKey">appKey</option>

		<option value="//api/name/extras">extras</option>

		<option value="//api/name/isNoDisturb">isNoDisturb</option>

		<option value="//api/name/isInBlacklist">isInBlacklist</option>

		<option value="//api/name/isFriend">isFriend</option>

	</optgroup>

	<optgroup label="Class Methods">

		<option value="//api/name/registerWithUsername:password:completionHandler:">+ registerWithUsername:password:completionHandler:</option>

		<option value="//api/name/registerWithUsername:password:userInfo:completionHandler:">+ registerWithUsername:password:userInfo:completionHandler:</option>

		<option value="//api/name/loginWithUsername:password:completionHandler:">+ loginWithUsername:password:completionHandler:</option>

		<option value="//api/name/loginWithUsername:password:devicesInfo:completionHandler:">+ loginWithUsername:password:devicesInfo:completionHandler:</option>

		<option value="//api/name/logout:">+ logout:</option>

		<option value="//api/name/userInfoArrayWithUsernameArray:completionHandler:">+ userInfoArrayWithUsernameArray:completionHandler:</option>

		<option value="//api/name/userInfoArrayWithUsernameArray:appKey:completionHandler:">+ userInfoArrayWithUsernameArray:appKey:completionHandler:</option>

		<option value="//api/name/userWithUid:">+ userWithUid:</option>

		<option value="//api/name/myInfo">+ myInfo</option>

		<option value="//api/name/updateMyInfoWithParameter:userFieldType:completionHandler:">+ updateMyInfoWithParameter:userFieldType:completionHandler:</option>

		<option value="//api/name/updateMyInfoWithUserInfo:completionHandler:">+ updateMyInfoWithUserInfo:completionHandler:</option>

		<option value="//api/name/updateMyAvatarWithData:avatarFormat:completionHandler:">+ updateMyAvatarWithData:avatarFormat:completionHandler:</option>

		<option value="//api/name/updateMyPasswordWithNewPassword:oldPassword:completionHandler:">+ updateMyPasswordWithNewPassword:oldPassword:completionHandler:</option>

		<option value="//api/name/addUsersToBlacklist:completionHandler:">+ addUsersToBlacklist:completionHandler:</option>

		<option value="//api/name/delUsersFromBlacklist:completionHandler:">+ delUsersFromBlacklist:completionHandler:</option>

		<option value="//api/name/addUsersToBlacklist:appKey:completionHandler:">+ addUsersToBlacklist:appKey:completionHandler:</option>

		<option value="//api/name/delUsersFromBlacklist:appKey:completionHandler:">+ delUsersFromBlacklist:appKey:completionHandler:</option>

	</optgroup>

	<optgroup label="Instance Methods">

		<option value="//api/name/setIsNoDisturb:handler:">- setIsNoDisturb:handler:</option>

		<option value="//api/name/updateNoteName:completionHandler:">- updateNoteName:completionHandler:</option>

		<option value="//api/name/updateNoteText:completionHandler:">- updateNoteText:completionHandler:</option>

		<option value="//api/name/thumbAvatarData:">- thumbAvatarData:</option>

		<option value="//api/name/thumbAvatarLocalPath">- thumbAvatarLocalPath</option>

		<option value="//api/name/largeAvatarData:">- largeAvatarData:</option>

		<option value="//api/name/largeAvatarLocalPath">- largeAvatarLocalPath</option>

		<option value="//api/name/displayName">- displayName</option>

	</optgroup>

</select>

JMSGUser Class Reference

	Inherits from
	NSObject

	Conforms to
	NSCopying

	Declared in
	JMSGUser.h

Overview

用户

Class Methods 类方法

+ registerWithUsername:password:completionHandler:

新用户注册

+ (void)registerWithUsername:(NSString *)username password:(NSString *)password completionHandler:(JMSGCompletionHandler JMSG_NULLABLE)handler

Parameters

						username

用户名. 长度 4~128 位.
支持的字符: 字母,数字,下划线,英文减号,英文点,@邮件符号. 首字母只允许是字母或者数字.

						password

用户密码. 长度 4~128 位.

						handler

结果回调. 返回正常时 resultObject 为 nil.

Declared In

JMSGUser.h

+ registerWithUsername:password:userInfo:completionHandler:

新用户注册(支持携带用户信息字段)

+ (void)registerWithUsername:(NSString *)username password:(NSString *)password userInfo:(JMSGUserInfo *JMSG_NULLABLE)userInfo completionHandler:(JMSGCompletionHandler JMSG_NULLABLE)handler

Parameters

						username

用户名. 长度 4~128 位.
支持的字符: 字母,数字,下划线,英文减号,英文点,@邮件符号. 首字母只允许是字母或者数字.

						password

用户密码. 长度 4~128 位.

						userInfo

用户信息类,注册时携带用户信息字段,除用户头像字段

						handler

结果回调. 返回正常时 resultObject 为 nil.

Discussion

注意: 注册时不支持上传头像,其他信息全部支持

Declared In

JMSGUser.h

+ loginWithUsername:password:completionHandler:

用户登录

+ (void)loginWithUsername:(NSString *)username password:(NSString *)password completionHandler:(JMSGCompletionHandler JMSG_NULLABLE)handler

Parameters

						username

登录用户名. 规则与注册接口相同.

						password

登录密码. 规则与注册接口相同.

						handler

结果回调

resultObject 简单封装的user对象

error 错误信息

注意:上层不要直接使用 resultObject 对象做操作, 因为 resultOjbect 只是一个简单封装的user对象.

Declared In

JMSGUser.h

+ loginWithUsername:password:devicesInfo:completionHandler:

用户登录,返回登录设备信息

+ (void)loginWithUsername:(NSString *)username password:(NSString *)password devicesInfo:(nullable void ( ^ ) ( NSArray<__kindofJMSGDeviceInfo*> *devices ))devicesInfo completionHandler:(JMSGCompletionHandler JMSG_NULLABLE)handler

Parameters

						username

登录用户名. 规则与注册接口相同.

						password

登录密码. 规则与注册接口相同.

						devicesInfo

登录设备回调,返回数据为 NSArrayJMSGDeviceInfo

						handler

结果回调

resultObject 简单封装的user对象,上层不要直接使用 resultObject 对象做操作, 因为它只是一个简单封装的user对象

error 错误信息

Discussion

回调中 devices 返回的是设备信息,具体属性请查看 JMSGDeviceInfo 类

Declared In

JMSGUser.h

+ logout:

当前用户退出登录

+ (void)logout:(JMSGCompletionHandler JMSG_NULLABLE)handler

Parameters

						handler

结果回调。正常返回时 resultObject 也是 nil。

Declared In

JMSGUser.h

+ userInfoArrayWithUsernameArray:completionHandler:

批量获取用户信息

+ (void)userInfoArrayWithUsernameArray:(NSArray JMSG_GENERIC ( __kindof NSString *) *)usernameArray completionHandler:(JMSGCompletionHandler)handler

Parameters

						usernameArray

用户名列表。NSArray 里的数据类型为 NSString

						handler

结果回调。正常返回时 resultObject 的类型为 NSArray,数组里的数据类型为 JMSGUser

Discussion

这是一个批量接口。

Declared In

JMSGUser.h

+ userInfoArrayWithUsernameArray:appKey:completionHandler:

批量获取跨应用的用户信息

+ (void)userInfoArrayWithUsernameArray:(NSArray JMSG_GENERIC ( __kindof NSString *) *)usernameArray appKey:(NSString *JMSG_NULLABLE)userAppKey completionHandler:(JMSGCompletionHandler)handler

Declared In

JMSGUser.h

+ userWithUid:

获取用户信息

+ (JMSGUser *JMSG_NULLABLE)userWithUid:(SInt64)uid

Parameters

						uid

用户的 uid

Return Value

该 uid 用户信息

Discussion

注意:返回值有可能为空,仅仅是本地查询

Declared In

JMSGUser.h

+ myInfo

获取用户本身个人信息接口

+ (JMSGUser *)myInfo

Return Value

当前登陆账号个人信息

Discussion

注意:返回值有可能为空

Declared In

JMSGUser.h

+ updateMyInfoWithParameter:userFieldType:completionHandler:

更新用户信息接口

+ (void)updateMyInfoWithParameter:(id)parameter userFieldType:(JMSGUserField)type completionHandler:(JMSGCompletionHandler JMSG_NULLABLE)handler

Parameters

						parameter

新的属性值
Birthday&&Gender 是NSNumber类型, Avatar NSData类型, extras是 NSDictionary 类型, 其他 NSString

						type

更新属性类型

						handler

更新用户信息回调接口函数

Discussion

注意:建议使用 [+(void)updateMyInfoWithUserInfo:completionHandler:] 接口修改信息

Declared In

JMSGUser.h

+ updateMyInfoWithUserInfo:completionHandler:

更新用户信息(支持将字段统一上传)

+ (void)updateMyInfoWithUserInfo:(JMSGUserInfo *)userInfo completionHandler:(JMSGCompletionHandler)handler

Parameters

						userInfo

用户信息对象,类型是 JMSGUserInfo

						handler

更新用户信息回调接口函数

Discussion

参数 userInfo 是 JMSGUserInfo 类,JMSGUserInfo 仅可用于修改用户信息

Declared In

JMSGUser.h

+ updateMyAvatarWithData:avatarFormat:completionHandler:

更新头像(支持传图片格式)

+ (void)updateMyAvatarWithData:(NSData *)avatarData avatarFormat:(NSString *)avatarFormat completionHandler:(JMSGCompletionHandler)handler

Parameters

						avatarData

头像数据

						avatarFormat

头像格式,可以为空,不包括"."

						handler

回调

Discussion

头像格式参数直接填格式名称,不要带点。正确:@“png",错误:@”.png"

Declared In

JMSGUser.h

+ updateMyPasswordWithNewPassword:oldPassword:completionHandler:

更新密码接口

+ (void)updateMyPasswordWithNewPassword:(NSString *)newPassword oldPassword:(NSString *)oldPassword completionHandler:(JMSGCompletionHandler JMSG_NULLABLE)handler

Parameters

						newPassword

用户新的密码

						oldPassword

用户旧的密码

						handler

更新密码回调接口函数

Declared In

JMSGUser.h

+ addUsersToBlacklist:completionHandler:

添加黑名单

+ (void)addUsersToBlacklist:(NSArray JMSG_GENERIC ( __kindof NSString *) *)usernameArray completionHandler:(JMSGCompletionHandler)handler

Parameters

						usernameArray

作用对象的username数组

						handler

结果回调。回调参数: error 为 nil, 表示设置成功

Discussion

可以一次添加多个用户

Declared In

JMSGUser.h

+ delUsersFromBlacklist:completionHandler:

删除黑名单

+ (void)delUsersFromBlacklist:(NSArray JMSG_GENERIC ( __kindof NSString *) *)usernameArray completionHandler:(JMSGCompletionHandler)handler

Parameters

						usernameArray

作用对象的username数组

						handler

结果回调。回调参数:error 为 nil, 表示设置成功

Discussion

可以一次删除多个黑名单用户

Declared In

JMSGUser.h

+ addUsersToBlacklist:appKey:completionHandler:

跨应用添加黑名单

+ (void)addUsersToBlacklist:(NSArray JMSG_GENERIC ( __kindof NSString *) *)usernameArray appKey:(NSString *)userAppKey completionHandler:(JMSGCompletionHandler)handler

Parameters

						usernameArray

作用对象的username数组

						userAppKey

应用的appKey

						handler

结果回调。回调参数:error 为 nil, 表示设置成功

Discussion

可以一次添加多个用户

Declared In

JMSGUser.h

+ delUsersFromBlacklist:appKey:completionHandler:

跨应用删除黑名单

+ (void)delUsersFromBlacklist:(NSArray JMSG_GENERIC ( __kindof NSString *) *)usernameArray appKey:(NSString *)userAppKey completionHandler:(JMSGCompletionHandler)handler

Parameters

						usernameArray

作用对象的username数组

						userAppKey

应用的appKey

						handler

结果回调。回调参数:error 为 nil, 表示设置成功

Discussion

可以一次删除多个黑名单用户

Declared In

JMSGUser.h

Basic Fields 基本属性

  uid

用户uid

@property (nonatomic, assign, readonly) SInt64 uid

Declared In

JMSGUser.h

  username

用户名

@property (nonatomic, copy, readonly) NSString *username

Discussion

这是用户帐号,注册后不可变更。App 级别唯一。这是所有用户相关 API 的用户标识。

Declared In

JMSGUser.h

  nickname

用户昵称

@property (nonatomic, copy, readonly) NSString *nickname

Discussion

用户自定义的昵称,可任意定义。

Declared In

JMSGUser.h

  avatar

用户头像(媒体文件ID)

@property (nonatomic, copy, readonly) NSString *avatar

Discussion

此文件ID仅用于内部更新,不支持外部URL。

Declared In

JMSGUser.h

  gender

性别

@property (nonatomic, assign, readonly) JMSGUserGender gender

Discussion

这是一个 enum 类型,支持 3 个选项:未知,男,女

Declared In

JMSGUser.h

  birthday

生日

@property (nonatomic, copy, readonly) NSString *birthday

Declared In

JMSGUser.h

  noteName

备注名

@property (nonatomic, copy, readonly) NSString *noteName

Declared In

JMSGUser.h

  noteText

备注信息

@property (nonatomic, copy, readonly) NSString *noteText

Declared In

JMSGUser.h

  appKey

此用户所在的 appKey

@property (nonatomic, copy, readonly) NSString *appKey

Discussion

为主应用时, 此字段为空

Declared In

JMSGUser.h

  extras

用户扩展字段

@property (nonatomic, strong, readonly) NSDictionary *extras

Declared In

JMSGUser.h

  isNoDisturb

该用户是否已被设置为免打扰

@property (nonatomic, assign, readonly) BOOL isNoDisturb

Discussion

YES:是 , NO: 否

Declared In

JMSGUser.h

  isInBlacklist

该用户是否已被加入黑名单

@property (nonatomic, assign, readonly) BOOL isInBlacklist

Discussion

YES:是 , NO: 否

Declared In

JMSGUser.h

  isFriend

是否是好友关系

@property (nonatomic, assign, readonly) BOOL isFriend

Discussion

如果已经添加了好友,isFriend = YES ,否则为NO;

Declared In

JMSGUser.h

– setIsNoDisturb:handler:

设置用户免打扰(支持跨应用设置)

- (void)setIsNoDisturb:(BOOL)isNoDisturb handler:(JMSGCompletionHandler)handler

Parameters

						isNoDisturb

是否全局免打扰 YES:是 NO: 否

						handler

结果回调。回调参数: error 为 nil, 表示设置成功

Discussion

针对单个用户设置免打扰,这个接口支持跨应用设置免打扰

Declared In

JMSGUser.h

– updateNoteName:completionHandler:

修改好友备注名

- (void)updateNoteName:(NSString *)noteName completionHandler:(JMSGCompletionHandler)handler

Parameters

						noteName

备注名

Discussion

注意:这是建立在是好友关系的前提下,修改好友的备注名

Declared In

JMSGUser.h

– updateNoteText:completionHandler:

修改好友备注信息

- (void)updateNoteText:(NSString *)noteText completionHandler:(JMSGCompletionHandler)handler

Parameters

						noteText

备注信息

Discussion

注意:这是建立在是好友关系的前提下,修改好友的备注信息

Declared In

JMSGUser.h

– thumbAvatarData:

获取头像缩略图文件数据

- (void)thumbAvatarData:(JMSGAsyncDataHandler)handler

Parameters

						handler

结果回调。回调参数:

data 头像数据;

objectId 用户username;

error 不为nil表示出错;

如果 error 为 ni, data 也为 nil, 表示没有头像数据.

Discussion

需要展示缩略图时使用。
如果本地已经有文件,则会返回本地,否则会从服务器上下载。

Declared In

JMSGUser.h

– thumbAvatarLocalPath

获取头像缩略文件的本地路径

- (NSString *JMSG_NULLABLE)thumbAvatarLocalPath

Return Value

返回本地路,返回值只有在下载完成之后才有意义

Declared In

JMSGUser.h

– largeAvatarData:

获取头像大图文件数据

- (void)largeAvatarData:(JMSGAsyncDataHandler)handler

Parameters

						handler

结果回调。回调参数:

data 头像数据;

objectId 用户username;

error 不为nil表示出错;

如果 error 为 ni, data 也为 nil, 表示没有头像数据.

Discussion

需要展示大图图时使用
如果本地已经有文件,则会返回本地,否则会从服务器上下载。

Declared In

JMSGUser.h

– largeAvatarLocalPath

获取头像大图文件的本地路径

- (NSString *JMSG_NULLABLE)largeAvatarLocalPath

Return Value

返回本地路,返回值只有在下载完成之后才有意义

Declared In

JMSGUser.h

– displayName

用户展示名

- (NSString *)displayName

Discussion

展示优先级:备注名(noteName) -> 昵称(nickname) -> 用户名(username)

Declared In

JMSGUser.h

Copyright © 2019 HXHG. All rights reserved. Updated: 2019-01-08

Generated by appledoc 2.2.1 (build 1334).


text:
<?php

namespace Magento\Catalog\Model\Product\Attribute;

class TypesListTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @var TypesList
     */
    protected $model;

    /**
     * @var \PHPUnit_Framework_MockObject_MockObject
     */
    protected $inputTypeFactoryMock;

    /**
     * @var \PHPUnit_Framework_MockObject_MockObject
     */
    protected $attributeTypeBuilderMock;

    protected function setUp()
    {
        $this->inputTypeFactoryMock = $this->getMock(
            'Magento\Catalog\Model\Product\Attribute\Source\InputtypeFactory',
            ['create', '__wakeup'],
            [],
            '',
            false);
        $this->attributeTypeBuilderMock =
            $this->getMock(
                'Magento\Catalog\Api\Data\ProductAttributeTypeDataBuilder',
                [
                    'populateWithArray',
                    'create',
                    '__wakeup'
                ],
                [],
                '',
                false);

        $this->model = new TypesList($this->inputTypeFactoryMock, $this->attributeTypeBuilderMock);
    }

    public function testGetItems()
    {
        $inputTypeMock = $this->getMock('Magento\Catalog\Model\Product\Attribute\Source\Inputtype', [], [], '', false);
        $this->inputTypeFactoryMock->expects($this->once())->method('create')->willReturn($inputTypeMock);
        $inputTypeMock->expects($this->once())->method('toOptionArray')->willReturn(['option' => ['value']]);
        $this->attributeTypeBuilderMock->expects($this->once())
            ->method('populateWithArray')
            ->with(['value'])
            ->willReturnSelf();
        $this->attributeTypeBuilderMock->expects($this->once())->method('create')->willReturnSelf();
        $this->assertEquals([$this->attributeTypeBuilderMock], $this->model->getItems());
    }
}


text:
vimified
========

> Frankly, my dear, you're gonna be vimified one day!

Kick-ass Vim configuration framework, built on top of *awesome* [Vundle](https://github.com/gmarik/vundle).

![ctrlp view](http://f.cl.ly/items/3a0X3F3x3r0K1n1u1Y2r/vimified.png)

How to install
--------------

### For lazy people

Copy/Paste this line in your CLI:

    curl -L https://raw.github.com/zaiste/vimified/master/install.sh | sh

### For those who actually care about what is done

Grab the project:

    cd
    git clone git://github.com/zaiste/vimified.git
    ln -sfn vimified ~/.vim
    ln -sfn vimified/vimrc ~/.vimrc
    cd vimified

Create required directories

    mkdir bundle
    mkdir -p tmp/backup tmp/swap tmp/undo

Set up Vundle

    git clone https://github.com/gmarik/vundle.git bundle/vundle

Set up your local configuration via `local.vimrc` file and choose package you
want to use:

    echo "let g:vimified_packages = ['general', 'coding', 'clojure', 'color']" > local.vimrc

Install plugins:

    vim +BundleInstall +qall

Enjoy!

Configuration
-------------

You can overwrite default configuration and key bindings by using one of following files:

`~/.vim/before.vimrc` will be loaded before everything else.

`~/.vim/after.vimrc` will be loaded after all configuration options are set. This is best place to change vimified default behaviour (keybindings) and/or color scheme.

Packages
--------

Inside your local configuration file `$HOME/.vim/local.vimrc` set `g:vimified_packages` variable with packages you want to use.

For example, if you are only interested in Ruby/Rails related stuff, put something like the following line inside `$HOME/.vim/local.vimrc`:

    let g:vimified_packages = ['general', 'coding', 'ruby', 'color']

Avaible packages:

 * general
 * fancy
 * os
 * coding
 * ruby
 * html
 * css
 * js
 * clojure
 * haskell
 * color

### General

#### [ack.vim](http://github.com/mileszs/ack.vim)

Vim plugin for the Perl module / CLI script 'ack'.

**Command**: `,a`

#### [hammer](https://github.com/matthias-guenther/hammer.vim)

vim, your markup language of choice, and your browser of choice.

**Command**: `,p`

#### [vim-align](https://github.com/tsaleh/vim-align)

Clone of the Align.vba file, since I think VBA files are a freaking abomination.

#### [vim-endwise](https://github.com/tpope/vim-endwise)

endwise.vim: wisely add "end" in ruby, endfunction/endif/more in vim script, etc

#### [vim-repeat](https://github.com/tpope/vim-repeat)

repeat.vim: enable repeating supported plugin maps with "."

#### [vim-speeddating](https://github.com/tpope/vim-speeddating)

speeddating.vim: use CTRL-A/CTRL-X to increment dates, times, and more

#### [vim-surround](https://github.com/tpope/vim-surround)

surround.vim: quoting/parenthesizing made simple

#### [vim-unimpaired](https://github.com/tpope/vim-unimpaired)

unimpaired.vim: pairs of handy bracket mappings

#### [vim-yankstack](https://github.com/maxbrunsfeld/vim-yankstack)

lightweight implementation of emacs' kill ring for vim

#### [vim-eunuch](https://github.com/tpope/vim-eunuch)

eunuch.vim: helpers for UNIX

#### [nerdtree](https://github.com/scrooloose/nerdtree)

A tree explorer plugin for vim.

**Command:** `ctrl-u`

#### [vim-textobj-user](https://github.com/kana/vim-textobj-user)

Vim plugin: Support for user-defined text objects

#### [YankRink.vim](https://github.com/vim-scripts/YankRing.vim)

Maintains a history of previous yanks, changes and deletes.

#### [vim-ident-object](https://github.com/michaeljsmith/vim-indent-object)

Vim plugin that defines a new text object representing lines of code at the same indent level. Useful for python/vim scripts, etc.

#### [vim-matchit](https://github.com/Spaceghost/vim-matchit)

The matchit.vim script allows you to configure % to match more than just single characters.

#### [ctrlp](https://github.com/kien/ctrlp.vim)

Fuzzy file, buffer, mru and tag finder.

**Command:** `ctrl-p`

![ctrlp view](http://f.cl.ly/items/393i0b0N2C1H1e0Q2K3k/ctrlp.png)

#### [vim-scripts/scratch.vim](https://github.com/vim-scripts/scratch.vim)

Plugin to create and use a scratch Vim buffer.

#### [troydm/easybuffer.vim](https://github.com/troydm/easybuffer.vim)

easybuffer.vim - vim plugin to quickly switch between buffers

### Fancy

#### [powerline](https://github.com/Lokaltog/vim-powerline)

The ultimate vim statusline utility.

### OS

#### [tmux.vim](https://github.com/zaiste/tmux.vim)

Tmux vim syntax.

#### [vimux](https://github.com/benmills/vimux)

vim plugin to interact with tmux.

### Coding

#### [tagbar](https://github.com/majutsushi/tagbar)

Vim plugin that displays tags in a window, ordered by class etc.

**Command:** `,t`

#### [gitv](https://github.com/gregsexton/gitv)

gitk for Vim.

#### [nerdcommenter](https://github.com/scrooloose/nerdcommenter)

Vim plugin for intensely orgasmic commenting.

**Command:** `,#`

#### [splice.vim](https://github.com/sjl/splice.vim)

A Vim plugin for managing three-way merges.

#### [vim-fugitive](https://github.com/tpope/vim-fugitive)

fugitive.vim: a Git wrapper so awesome, it should be illegal

#### [syntastic](https://github.com/scrooloose/syntastic)

Syntax checking hacks for vim

### Ruby

#### [vim-ruby](https://github.com/vim-ruby/vim-ruby)

Vim/Ruby Configuration Files.

#### [vim-rails](https://github.com/tpope/vim-rails)

rails.vim: Ruby on Rails power tools

#### [vim-textobj-rubyblock](https://github.com/nelstrom/vim-textobj-rubyblock)

A custom text object for selecting ruby blocks.

#### [vim-ruby-refactoring](https://github.com/ecomba/vim-ruby-refactoring)

Refactoring tool for Ruby in vim!

**Commands**:

  - [RAddParameter](http://justinram.wordpress.com/2010/12/30/vim-ruby-refactoring-add-parameter-2/) : `,rap`
  - [RInlineTemp](http://justinram.wordpress.com/2010/12/30/vim-ruby-refactoring-inline-temp/) : `,rit`
  - [RExtractMethod](http://justinram.wordpress.com/2010/12/31/vim-ruby-refactoring-extract-method/) : `,rem`
  - [RRenameLocalVariable](http://justinram.wordpress.com/2010/12/31/vim-ruby-refactoring-rename-local-variable/) : `,rrlv`
  - [RRenameInstanceVariable](http://justinram.wordpress.com/2010/12/31/vim-ruby-refactoring-rename-instance-variable/) : `,rriv`

### HTML

#### [vim-haml](https://github.com/tpope/vim-haml)

Vim runtime files for Haml, Sass, and SCSS.

#### [mustache.vim](https://github.com/juvenn/mustache.vim)

Vim syntax file for mustache and handlebars(?)

#### [vim-markdown](https://github.com/tpope/vim-markdown)

Vim Markdown runtime files.

#### [vim-jade](https://github.com/digitaltoad/vim-jade)

Vim Jade template engine syntax highlighting and indention.

#### [vim-slim](https://github.com/slim-template/vim-slim)

A clone of the slim vim plugin from stonean.

### CSS

#### [vim-stylus](https://github.com/wavded/vim-stylus)

Syntax Highlighting for Stylus.

### JS

#### [vim-coffee-script](https://github.com/kchmck/vim-coffee-script)

CoffeeScript support for vim.

#### [jacinto.vim](https://github.com/alfredodeza/jacinto.vim)

Format and validate JSON files.

    :Jacinto validate

or

    :Jacinto syntax

### Clojure

#### [vimclojure](https://github.com/zaiste/VimClojure)

A filetype, syntax and indent plugin for Clojure.

### Haskell

[vim-syntax-haskell-cabal](https://github.com/Twinside/vim-syntax-haskell-cabal)

Syntax file for Haskell's cabal syntax file

#### [haskellmode-vim](https://github.com/lukerandall/haskellmode-vim)

An unpacked copy of the haskellmode vimball. Ping me if it needs updating.

####

### Color

#### [badwolf](https://github.com/sjl/badwolf)

A Vim color scheme.

####
[vim-colors-solarized](https://github.com/altercation/vim-colors-solarized)

precision colorscheme for the vim text editor

#### [molokai](https://github.com/tomasr/molokai)

Molokai color scheme for Vim.

#### [Atom](https://github.com/zaiste/Atom)

Vim color scheme designed to be very readable in both light and dark
environments.

#### [vim-hybrid](https://github.com/w0ng/vim-hybrid)

A dark colourscheme combining Jellybeans, Solarized and Tomorrow Night.

## Call for Help

If you have ideas on how to make this Vim configration framework better, don't hesitate to fork and send pull requests. Thanks!

### Major Contributors

 * [Adrien Giboire](https://github.com/AdrienGiboire)
 * [sharnik](https://github.com/sharnik)

### Inspired by

 * [dotvim](https://github.com/astrails/dotvim)
 * [Steve Losh's dotfiles](https://github.com/sjl/dotfiles)
 * [skwp's dotfiles](https://github.com/skwp/dotfiles)

### Cooked by [Zaiste!](http://zaiste.net)