text:
const cheerio = require('cheerio');
const co = require('co');
const expect = require('chai')
  .use(require('chai-as-promised'))
  .use(require('sinon-chai'))
  .expect;
const fs = require('fs');
const generate = require('../lib');
const path = require('path');
const sinon = require('sinon');

var exists = path => new Promise((resolve, reject) => {
  fs.stat(path, (error) => {
    if (!error) resolve(true);
    else if (error.code === 'ENOENT') resolve(false);
    else reject(error);
  });
});

describe('build', () => {
  it('create dist/main.css', () => {
    var filename = path.resolve(__dirname, '../dist/main.css');
    return expect(exists(filename)).to.eventually.be.true;
  });
});
describe('install', () => {
  it('create node_modules/canvas.js', () => {
    var filename = path.resolve(__dirname, '../node_modules/canvas.js');
    return expect(exists(filename)).to.eventually.be.true;
  });
});
describe('generate', () => {
  describe('chart', () => {
    // bar
    it('bar', () => co(function * () {
      var chart = yield generate('bar', {}, {
        labels: ['a', 'b', 'c'],
        series: [[1, 2, 3]]
      });
      var $ = cheerio.load(chart);
      expect($('svg.ct-chart-bar').length).to.equal(1);
    }));
    it('line', () => co(function * () {
      var chart = yield generate('line', {}, {
        labels: ['a', 'b', 'c'],
        series: [[1, 2, 3]]
      });
      var $ = cheerio.load(chart);
      expect($('svg.ct-chart-line').length).to.equal(1);
    }));
    it('pie', () => co(function * () {
      var chart = yield generate('pie', {}, {
        series: [1, 2, 3]
      });
      var $ = cheerio.load(chart);
      expect($('svg.ct-chart-pie').length).to.equal(1);
    }));
    it('throw on unsupported type', () =>
      expect(generate('spider', {}, {})).to.eventually.be.rejectedWith(TypeError, /Unsupported chart type/)
    );
  });
    describe('options', () => {
        it('object', () => co(function * () {
            var chart = yield generate('bar', {}, {
                labels: ['a', 'b', 'c'],
                series: [[1, 2, 3]]
            });
            var $ = cheerio.load(chart);
            expect($('svg.ct-chart-bar').length).to.equal(1);
        }));
        it('function called with Chartist object', () => co(function * () {
            const options = sinon.stub().returns({});
            var chart = yield generate('bar', options, {
                labels: ['a', 'b', 'c'],
                series: [[1, 2, 3]]
            });
            expect(options).to.be.calledOnce
                .and.calledWith(sinon.match.has('AutoScaleAxis'));
        }));
        it('function must return object', () => {
            const options = (Chartist) => null;
            var chart = generate('bar', options, {
                labels: ['a', 'b', 'c'],
                series: [[1, 2, 3]]
            });
            return expect(chart).to.eventually.be.rejectedWith(TypeError);
        });
    });
  describe('axisTitle', () => {
    it('x axis', () => co(function * () {
      var title = 'X Axis (units)';
      var chart = yield generate('bar', {
        axisX: { title }
      }, {
        labels: ['a', 'b', 'c'],
        series: [[1, 2, 3]]
      });
      var $ = cheerio.load(chart);
      expect($('text.ct-axis-title').length).to.equal(1);
    }));
    it('y axis', () => co(function * () {
      var title = 'Y Axis (units)';
      var chart = yield generate('bar', {
        axisY: { title }
      }, {
        labels: ['a', 'b', 'c'],
        series: [[1, 2, 3]]
      });
      var $ = cheerio.load(chart);
      expect($('text.ct-axis-title').length).to.equal(1);
    }));
  });
  describe('legend', () => {
    it('enabled by default', () => co(function * () {
      var name = 'Y Axis (units)';
      var options = {};
      var chart = yield generate('bar', options, {
        labels: ['a', 'b', 'c'],
        series: [{ name, value: [1, 2, 3] }]
      });
      var $ = cheerio.load(chart);
      expect($('.ct-legend .ct-variable').length).to.equal(1);
    }));
    it('can be disabled', () => co(function * () {
      var name = 'Y Axis (units)';
      var options = { legend: false };
      var chart = yield generate('bar', options, {
        labels: ['a', 'b', 'c'],
        series: [{ name, value: [1, 2, 3] }]
      });
      var $ = cheerio.load(chart);
      expect($('.ct-legend').length).to.equal(0);
    }));
    it('variable excluded if nameless', () => co(function * () {
      var name = 'Y Axis (units)';
      var chart = yield generate('bar', {}, {
        labels: ['a', 'b', 'c'],
        series: [
          { name, value: [1, 2, 3] },
          [1, 2, 3],
          { name, value: [1, 2, 3] }
        ]
      });
      var $ = cheerio.load(chart);
      expect($('.ct-legend .ct-variable').length).to.equal(2);
    }));
  });
});

describe('rendered output', () => co(function * () {
  try {
    var options = {
      width: 400,
      height: 200,
      axisX: {
        // position: 'start',
        title: 'X Axis (units)',
        offset: 40
      },
      axisY: {
        // position: 'end',
        title: 'Y Axis (units)',
        offset: 50
      }
    };
    var data = {
      labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Friday'],
      series: [
        {name: 'Test', value: [50, 20, 40, 20, 10]},
        [4,1,2,6,7],
        {name: 'Test 3', value: [20, 60, 10, 80, 40]}
      ]
    };

    console.time('bar');
    var bar = yield generate('bar', options, data);
    console.timeEnd('bar');

    console.time('line');
    var line = yield generate('line', options, data);
    console.timeEnd('line');

    console.time('pie');
    var pieOptions = {width: 200, height: 200};
    var pieData = {series: [{name: 'Test 1', value: 50}, 10, {name: 'Test 3', value: 20}]};
    var pie = yield generate('pie', pieOptions, pieData);
    console.timeEnd('pie');

    // Load external deps
    var css = fs.readFileSync(path.resolve(__dirname, '../dist/main.css'), 'utf8');
    var style = `<style>${css} .ct-chart { display: inline-block; margin: 2em; text-align: center; }</style>`;
    console.log(`${style}${bar}${line}${pie}`);
  }
  catch (error) { console.error(error.stack); }
}));


text:
.ct-double-octave:after,
.ct-major-eleventh:after,
.ct-major-second:after,
.ct-major-seventh:after,
.ct-major-sixth:after,
.ct-major-tenth:after,
.ct-major-third:after,
.ct-major-twelfth:after,
.ct-minor-second:after,
.ct-minor-seventh:after,
.ct-minor-sixth:after,
.ct-minor-third:after,
.ct-octave:after,
.ct-perfect-fifth:after,
.ct-perfect-fourth:after,
.ct-square:after {
  content: "";
  clear: both;
}
.ct-label {
  fill: rgba(0, 0, 0, 0.4);
  color: rgba(0, 0, 0, 0.4);
  font-size: .75rem;
  line-height: 1;
}
.ct-grid-background,
.ct-line {
  fill: none;
}
.ct-chart-bar .ct-label,
.ct-chart-line .ct-label {
  display: block;
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  display: flex;
}
.ct-chart-donut .ct-label,
.ct-chart-pie .ct-label {
  dominant-baseline: central;
}
.ct-label.ct-horizontal.ct-start {
  -webkit-box-align: flex-end;
  -webkit-align-items: flex-end;
  -ms-flex-align: flex-end;
  align-items: flex-end;
  -webkit-box-pack: flex-start;
  -webkit-justify-content: flex-start;
  -ms-flex-pack: flex-start;
  justify-content: flex-start;
  text-align: left;
  text-anchor: start;
}
.ct-label.ct-horizontal.ct-end {
  -webkit-box-align: flex-start;
  -webkit-align-items: flex-start;
  -ms-flex-align: flex-start;
  align-items: flex-start;
  -webkit-box-pack: flex-start;
  -webkit-justify-content: flex-start;
  -ms-flex-pack: flex-start;
  justify-content: flex-start;
  text-align: left;
  text-anchor: start;
}
.ct-label.ct-vertical.ct-start {
  -webkit-box-align: flex-end;
  -webkit-align-items: flex-end;
  -ms-flex-align: flex-end;
  align-items: flex-end;
  -webkit-box-pack: flex-end;
  -webkit-justify-content: flex-end;
  -ms-flex-pack: flex-end;
  justify-content: flex-end;
  text-align: right;
  text-anchor: end;
}
.ct-label.ct-vertical.ct-end {
  -webkit-box-align: flex-end;
  -webkit-align-items: flex-end;
  -ms-flex-align: flex-end;
  align-items: flex-end;
  -webkit-box-pack: flex-start;
  -webkit-justify-content: flex-start;
  -ms-flex-pack: flex-start;
  justify-content: flex-start;
  text-align: left;
  text-anchor: start;
}
.ct-chart-bar .ct-label.ct-horizontal.ct-start {
  -webkit-box-align: flex-end;
  -webkit-align-items: flex-end;
  -ms-flex-align: flex-end;
  align-items: flex-end;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
  -ms-flex-pack: center;
  justify-content: center;
  text-align: center;
  text-anchor: start;
}
.ct-chart-bar .ct-label.ct-horizontal.ct-end {
  -webkit-box-align: flex-start;
  -webkit-align-items: flex-start;
  -ms-flex-align: flex-start;
  align-items: flex-start;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
  -ms-flex-pack: center;
  justify-content: center;
  text-align: center;
  text-anchor: start;
}
.ct-chart-bar.ct-horizontal-bars .ct-label.ct-horizontal.ct-start {
  -webkit-box-align: flex-end;
  -webkit-align-items: flex-end;
  -ms-flex-align: flex-end;
  align-items: flex-end;
  -webkit-box-pack: flex-start;
  -webkit-justify-content: flex-start;
  -ms-flex-pack: flex-start;
  justify-content: flex-start;
  text-align: left;
  text-anchor: start;
}
.ct-chart-bar.ct-horizontal-bars .ct-label.ct-horizontal.ct-end {
  -webkit-box-align: flex-start;
  -webkit-align-items: flex-start;
  -ms-flex-align: flex-start;
  align-items: flex-start;
  -webkit-box-pack: flex-start;
  -webkit-justify-content: flex-start;
  -ms-flex-pack: flex-start;
  justify-content: flex-start;
  text-align: left;
  text-anchor: start;
}
.ct-chart-bar.ct-horizontal-bars .ct-label.ct-vertical.ct-start {
  -webkit-box-align: center;
  -webkit-align-items: center;
  -ms-flex-align: center;
  align-items: center;
  -webkit-box-pack: flex-end;
  -webkit-justify-content: flex-end;
  -ms-flex-pack: flex-end;
  justify-content: flex-end;
  text-align: right;
  text-anchor: end;
}
.ct-chart-bar.ct-horizontal-bars .ct-label.ct-vertical.ct-end {
  -webkit-box-align: center;
  -webkit-align-items: center;
  -ms-flex-align: center;
  align-items: center;
  -webkit-box-pack: flex-start;
  -webkit-justify-content: flex-start;
  -ms-flex-pack: flex-start;
  justify-content: flex-start;
  text-align: left;
  text-anchor: end;
}
.ct-grid {
  stroke: rgba(0, 0, 0, 0.2);
  stroke-width: 1px;
  stroke-dasharray: 2px;
}
.ct-point {
  stroke-width: 10px;
  stroke-linecap: round;
}
.ct-line {
  stroke-width: 4px;
}
.ct-area {
  stroke: none;
  fill-opacity: 0.1;
}
.ct-bar {
  fill: none;
  stroke-width: 10px;
}
.ct-slice-donut {
  fill: none;
  stroke-width: 60px;
}
.ct-series-a .ct-bar,
.ct-series-a .ct-line,
.ct-series-a .ct-point,
.ct-series-a .ct-slice-donut {
  stroke: #d70206;
}
.ct-series-a .ct-area,
.ct-series-a .ct-slice-donut-solid,
.ct-series-a .ct-slice-pie {
  fill: #d70206;
}
.ct-series-b .ct-bar,
.ct-series-b .ct-line,
.ct-series-b .ct-point,
.ct-series-b .ct-slice-donut {
  stroke: #f05b4f;
}
.ct-series-b .ct-area,
.ct-series-b .ct-slice-donut-solid,
.ct-series-b .ct-slice-pie {
  fill: #f05b4f;
}
.ct-series-c .ct-bar,
.ct-series-c .ct-line,
.ct-series-c .ct-point,
.ct-series-c .ct-slice-donut {
  stroke: #f4c63d;
}
.ct-series-c .ct-area,
.ct-series-c .ct-slice-donut-solid,
.ct-series-c .ct-slice-pie {
  fill: #f4c63d;
}
.ct-series-d .ct-bar,
.ct-series-d .ct-line,
.ct-series-d .ct-point,
.ct-series-d .ct-slice-donut {
  stroke: #d17905;
}
.ct-series-d .ct-area,
.ct-series-d .ct-slice-donut-solid,
.ct-series-d .ct-slice-pie {
  fill: #d17905;
}
.ct-series-e .ct-bar,
.ct-series-e .ct-line,
.ct-series-e .ct-point,
.ct-series-e .ct-slice-donut {
  stroke: #453d3f;
}
.ct-series-e .ct-area,
.ct-series-e .ct-slice-donut-solid,
.ct-series-e .ct-slice-pie {
  fill: #453d3f;
}
.ct-series-f .ct-bar,
.ct-series-f .ct-line,
.ct-series-f .ct-point,
.ct-series-f .ct-slice-donut {
  stroke: #59922b;
}
.ct-series-f .ct-area,
.ct-series-f .ct-slice-donut-solid,
.ct-series-f .ct-slice-pie {
  fill: #59922b;
}
.ct-series-g .ct-bar,
.ct-series-g .ct-line,
.ct-series-g .ct-point,
.ct-series-g .ct-slice-donut {
  stroke: #0544d3;
}
.ct-series-g .ct-area,
.ct-series-g .ct-slice-donut-solid,
.ct-series-g .ct-slice-pie {
  fill: #0544d3;
}
.ct-series-h .ct-bar,
.ct-series-h .ct-line,
.ct-series-h .ct-point,
.ct-series-h .ct-slice-donut {
  stroke: #6b0392;
}
.ct-series-h .ct-area,
.ct-series-h .ct-slice-donut-solid,
.ct-series-h .ct-slice-pie {
  fill: #6b0392;
}
.ct-series-i .ct-bar,
.ct-series-i .ct-line,
.ct-series-i .ct-point,
.ct-series-i .ct-slice-donut {
  stroke: #f05b4f;
}
.ct-series-i .ct-area,
.ct-series-i .ct-slice-donut-solid,
.ct-series-i .ct-slice-pie {
  fill: #f05b4f;
}
.ct-series-j .ct-bar,
.ct-series-j .ct-line,
.ct-series-j .ct-point,
.ct-series-j .ct-slice-donut {
  stroke: #dda458;
}
.ct-series-j .ct-area,
.ct-series-j .ct-slice-donut-solid,
.ct-series-j .ct-slice-pie {
  fill: #dda458;
}
.ct-series-k .ct-bar,
.ct-series-k .ct-line,
.ct-series-k .ct-point,
.ct-series-k .ct-slice-donut {
  stroke: #eacf7d;
}
.ct-series-k .ct-area,
.ct-series-k .ct-slice-donut-solid,
.ct-series-k .ct-slice-pie {
  fill: #eacf7d;
}
.ct-series-l .ct-bar,
.ct-series-l .ct-line,
.ct-series-l .ct-point,
.ct-series-l .ct-slice-donut {
  stroke: #86797d;
}
.ct-series-l .ct-area,
.ct-series-l .ct-slice-donut-solid,
.ct-series-l .ct-slice-pie {
  fill: #86797d;
}
.ct-series-m .ct-bar,
.ct-series-m .ct-line,
.ct-series-m .ct-point,
.ct-series-m .ct-slice-donut {
  stroke: #b2c326;
}
.ct-series-m .ct-area,
.ct-series-m .ct-slice-donut-solid,
.ct-series-m .ct-slice-pie {
  fill: #b2c326;
}
.ct-series-n .ct-bar,
.ct-series-n .ct-line,
.ct-series-n .ct-point,
.ct-series-n .ct-slice-donut {
  stroke: #6188e2;
}
.ct-series-n .ct-area,
.ct-series-n .ct-slice-donut-solid,
.ct-series-n .ct-slice-pie {
  fill: #6188e2;
}
.ct-series-o .ct-bar,
.ct-series-o .ct-line,
.ct-series-o .ct-point,
.ct-series-o .ct-slice-donut {
  stroke: #a748ca;
}
.ct-series-o .ct-area,
.ct-series-o .ct-slice-donut-solid,
.ct-series-o .ct-slice-pie {
  fill: #a748ca;
}
.ct-square {
  display: block;
  position: relative;
  width: 100%;
}
.ct-square:before {
  display: block;
  float: left;
  content: "";
  width: 0;
  height: 0;
  padding-bottom: 100%;
}
.ct-square:after {
  display: table;
}
.ct-square > svg {
  display: block;
  position: absolute;
  top: 0;
  left: 0;
}
.ct-minor-second {
  display: block;
  position: relative;
  width: 100%;
}
.ct-minor-second:before {
  display: block;
  float: left;
  content: "";
  width: 0;
  height: 0;
  padding-bottom: 93.75%;
}
.ct-minor-second:after {
  display: table;
}
.ct-minor-second > svg {
  display: block;
  position: absolute;
  top: 0;
  left: 0;
}
.ct-major-second {
  display: block;
  position: relative;
  width: 100%;
}
.ct-major-second:before {
  display: block;
  float: left;
  content: "";
  width: 0;
  height: 0;
  padding-bottom: 88.88888889%;
}
.ct-major-second:after {
  display: table;
}
.ct-major-second > svg {
  display: block;
  position: absolute;
  top: 0;
  left: 0;
}
.ct-minor-third {
  display: block;
  position: relative;
  width: 100%;
}
.ct-minor-third:before {
  display: block;
  float: left;
  content: "";
  width: 0;
  height: 0;
  padding-bottom: 83.33333333%;
}
.ct-minor-third:after {
  display: table;
}
.ct-minor-third > svg {
  display: block;
  position: absolute;
  top: 0;
  left: 0;
}
.ct-major-third {
  display: block;
  position: relative;
  width: 100%;
}
.ct-major-third:before {
  display: block;
  float: left;
  content: "";
  width: 0;
  height: 0;
  padding-bottom: 80%;
}
.ct-major-third:after {
  display: table;
}
.ct-major-third > svg {
  display: block;
  position: absolute;
  top: 0;
  left: 0;
}
.ct-perfect-fourth {
  display: block;
  position: relative;
  width: 100%;
}
.ct-perfect-fourth:before {
  display: block;
  float: left;
  content: "";
  width: 0;
  height: 0;
  padding-bottom: 75%;
}
.ct-perfect-fourth:after {
  display: table;
}
.ct-perfect-fourth > svg {
  display: block;
  position: absolute;
  top: 0;
  left: 0;
}
.ct-perfect-fifth {
  display: block;
  position: relative;
  width: 100%;
}
.ct-perfect-fifth:before {
  display: block;
  float: left;
  content: "";
  width: 0;
  height: 0;
  padding-bottom: 66.66666667%;
}
.ct-perfect-fifth:after {
  display: table;
}
.ct-perfect-fifth > svg {
  display: block;
  position: absolute;
  top: 0;
  left: 0;
}
.ct-minor-sixth {
  display: block;
  position: relative;
  width: 100%;
}
.ct-minor-sixth:before {
  display: block;
  float: left;
  content: "";
  width: 0;
  height: 0;
  padding-bottom: 62.5%;
}
.ct-minor-sixth:after {
  display: table;
}
.ct-minor-sixth > svg {
  display: block;
  position: absolute;
  top: 0;
  left: 0;
}
.ct-golden-section {
  display: block;
  position: relative;
  width: 100%;
}
.ct-golden-section:before {
  display: block;
  float: left;
  content: "";
  width: 0;
  height: 0;
  padding-bottom: 61.80469716%;
}
.ct-golden-section:after {
  content: "";
  display: table;
  clear: both;
}
.ct-golden-section > svg {
  display: block;
  position: absolute;
  top: 0;
  left: 0;
}
.ct-major-sixth {
  display: block;
  position: relative;
  width: 100%;
}
.ct-major-sixth:before {
  display: block;
  float: left;
  content: "";
  width: 0;
  height: 0;
  padding-bottom: 60%;
}
.ct-major-sixth:after {
  display: table;
}
.ct-major-sixth > svg {
  display: block;
  position: absolute;
  top: 0;
  left: 0;
}
.ct-minor-seventh {
  display: block;
  position: relative;
  width: 100%;
}
.ct-minor-seventh:before {
  display: block;
  float: left;
  content: "";
  width: 0;
  height: 0;
  padding-bottom: 56.25%;
}
.ct-minor-seventh:after {
  display: table;
}
.ct-minor-seventh > svg {
  display: block;
  position: absolute;
  top: 0;
  left: 0;
}
.ct-major-seventh {
  display: block;
  position: relative;
  width: 100%;
}
.ct-major-seventh:before {
  display: block;
  float: left;
  content: "";
  width: 0;
  height: 0;
  padding-bottom: 53.33333333%;
}
.ct-major-seventh:after {
  display: table;
}
.ct-major-seventh > svg {
  display: block;
  position: absolute;
  top: 0;
  left: 0;
}
.ct-octave {
  display: block;
  position: relative;
  width: 100%;
}
.ct-octave:before {
  display: block;
  float: left;
  content: "";
  width: 0;
  height: 0;
  padding-bottom: 50%;
}
.ct-octave:after {
  display: table;
}
.ct-octave > svg {
  display: block;
  position: absolute;
  top: 0;
  left: 0;
}
.ct-major-tenth {
  display: block;
  position: relative;
  width: 100%;
}
.ct-major-tenth:before {
  display: block;
  float: left;
  content: "";
  width: 0;
  height: 0;
  padding-bottom: 40%;
}
.ct-major-tenth:after {
  display: table;
}
.ct-major-tenth > svg {
  display: block;
  position: absolute;
  top: 0;
  left: 0;
}
.ct-major-eleventh {
  display: block;
  position: relative;
  width: 100%;
}
.ct-major-eleventh:before {
  display: block;
  float: left;
  content: "";
  width: 0;
  height: 0;
  padding-bottom: 37.5%;
}
.ct-major-eleventh:after {
  display: table;
}
.ct-major-eleventh > svg {
  display: block;
  position: absolute;
  top: 0;
  left: 0;
}
.ct-major-twelfth {
  display: block;
  position: relative;
  width: 100%;
}
.ct-major-twelfth:before {
  display: block;
  float: left;
  content: "";
  width: 0;
  height: 0;
  padding-bottom: 33.33333333%;
}
.ct-major-twelfth:after {
  display: table;
}
.ct-major-twelfth > svg {
  display: block;
  position: absolute;
  top: 0;
  left: 0;
}
.ct-double-octave {
  display: block;
  position: relative;
  width: 100%;
}
.ct-double-octave:before {
  display: block;
  float: left;
  content: "";
  width: 0;
  height: 0;
  padding-bottom: 25%;
}
.ct-double-octave:after {
  display: table;
}
.ct-double-octave > svg {
  display: block;
  position: absolute;
  top: 0;
  left: 0;
}
.ct-legend {
  margin-top: 1em;
}
.ct-legend .ct-variable {
  display: inline-block;
  margin: 0 0.1em;
}
.ct-legend .ct-variable .ct-swatch {
  display: inline-block;
  vertical-align: baseline;
  margin-right: 0.3em;
  width: 0.5em;
  height: 0.5em;
  border: 1px solid white;
  border-radius: 0.14em;
}
.ct-series-a .ct-bar,
.ct-series-a .ct-line,
.ct-series-a .ct-point,
.ct-series-a .ct-slice-donut,
.ct-series-a .ct-swatch {
  background-color: skyblue;
  stroke: skyblue;
}
.ct-series-a .ct-area,
.ct-series-a .ct-slice-pie {
  fill: skyblue;
}
.ct-series-b .ct-bar,
.ct-series-b .ct-line,
.ct-series-b .ct-point,
.ct-series-b .ct-slice-donut,
.ct-series-b .ct-swatch {
  background-color: limegreen;
  stroke: limegreen;
}
.ct-series-b .ct-area,
.ct-series-b .ct-slice-pie {
  fill: limegreen;
}
.ct-series-c .ct-bar,
.ct-series-c .ct-line,
.ct-series-c .ct-point,
.ct-series-c .ct-slice-donut,
.ct-series-c .ct-swatch {
  background-color: indianred;
  stroke: indianred;
}
.ct-series-c .ct-area,
.ct-series-c .ct-slice-pie {
  fill: indianred;
}
.ct-series-d .ct-bar,
.ct-series-d .ct-line,
.ct-series-d .ct-point,
.ct-series-d .ct-slice-donut,
.ct-series-d .ct-swatch {
  background-color: gold;
  stroke: gold;
}
.ct-series-d .ct-area,
.ct-series-d .ct-slice-pie {
  fill: gold;
}
.ct-series-e .ct-bar,
.ct-series-e .ct-line,
.ct-series-e .ct-point,
.ct-series-e .ct-slice-donut,
.ct-series-e .ct-swatch {
  background-color: orange;
  stroke: orange;
}
.ct-series-e .ct-area,
.ct-series-e .ct-slice-pie {
  fill: orange;
}
.ct-series-f .ct-bar,
.ct-series-f .ct-line,
.ct-series-f .ct-point,
.ct-series-f .ct-slice-donut,
.ct-series-f .ct-swatch {
  background-color: indianred;
  stroke: indianred;
}
.ct-series-f .ct-area,
.ct-series-f .ct-slice-pie {
  fill: indianred;
}
.ct-series-g .ct-bar,
.ct-series-g .ct-line,
.ct-series-g .ct-point,
.ct-series-g .ct-slice-donut,
.ct-series-g .ct-swatch {
  background-color: indianred;
  stroke: indianred;
}
.ct-series-g .ct-area,
.ct-series-g .ct-slice-pie {
  fill: indianred;
}
.ct-series-h .ct-bar,
.ct-series-h .ct-line,
.ct-series-h .ct-point,
.ct-series-h .ct-slice-donut,
.ct-series-h .ct-swatch {
  background-color: indianred;
  stroke: indianred;
}
.ct-series-h .ct-area,
.ct-series-h .ct-slice-pie {
  fill: indianred;
}
.ct-series-i .ct-bar,
.ct-series-i .ct-line,
.ct-series-i .ct-point,
.ct-series-i .ct-slice-donut,
.ct-series-i .ct-swatch {
  background-color: indianred;
  stroke: indianred;
}
.ct-series-i .ct-area,
.ct-series-i .ct-slice-pie {
  fill: indianred;
}
.ct-series-j .ct-bar,
.ct-series-j .ct-line,
.ct-series-j .ct-point,
.ct-series-j .ct-slice-donut,
.ct-series-j .ct-swatch {
  background-color: indianred;
  stroke: indianred;
}
.ct-series-j .ct-area,
.ct-series-j .ct-slice-pie {
  fill: indianred;
}
.ct-series-k .ct-bar,
.ct-series-k .ct-line,
.ct-series-k .ct-point,
.ct-series-k .ct-slice-donut,
.ct-series-k .ct-swatch {
  background-color: indianred;
  stroke: indianred;
}
.ct-series-k .ct-area,
.ct-series-k .ct-slice-pie {
  fill: indianred;
}
.ct-series-l .ct-bar,
.ct-series-l .ct-line,
.ct-series-l .ct-point,
.ct-series-l .ct-slice-donut,
.ct-series-l .ct-swatch {
  background-color: indianred;
  stroke: indianred;
}
.ct-series-l .ct-area,
.ct-series-l .ct-slice-pie {
  fill: indianred;
}
.ct-series-m .ct-bar,
.ct-series-m .ct-line,
.ct-series-m .ct-point,
.ct-series-m .ct-slice-donut,
.ct-series-m .ct-swatch {
  background-color: indianred;
  stroke: indianred;
}
.ct-series-m .ct-area,
.ct-series-m .ct-slice-pie {
  fill: indianred;
}
.ct-series-n .ct-bar,
.ct-series-n .ct-line,
.ct-series-n .ct-point,
.ct-series-n .ct-slice-donut,
.ct-series-n .ct-swatch {
  background-color: indianred;
  stroke: indianred;
}
.ct-series-n .ct-area,
.ct-series-n .ct-slice-pie {
  fill: indianred;
}
.ct-series-o .ct-bar,
.ct-series-o .ct-line,
.ct-series-o .ct-point,
.ct-series-o .ct-slice-donut,
.ct-series-o .ct-swatch {
  background-color: indianred;
  stroke: indianred;
}
.ct-series-o .ct-area,
.ct-series-o .ct-slice-pie {
  fill: indianred;
}

repo_name: panosoft/node-chartist

repo_language: JavaScript

mime_type: text/csv


text:
# Awesome Earth Engine [![Awesome](https://awesome.re/badge.svg)](https://awesome.re)

> A curated list of Google Earth Engine resources. Please visit the [Awesome-GEE](https://github.com/giswqs/Awesome-GEE) GitHub repo if you want to contribute to this project.

## Table of Contents

- [Earth Engine official websites](#earth-engine-official-websites)
- [Get Started](#get-started)
- [Get Help](#get-help)
- [JavaScript API](#javascript-api)
- [Python API](#python-api)
- [R](#r)
- [QGIS](#qgis)
- [GitHub Developers](#github-developers)
- [Twitter](#twitter)
- [Apps](#apps)
- [Free Courses](#free-courses)
- [Presentations](#presentations)
- [Videos](#videos)
- [Projects](#projects)
- [Websites](#websites)
- [Datasets](#datasets)
- [Papers](#papers)
- [Contributing](#contributing)
- [License](#license)

## Earth Engine official websites

- [Official homepage](https://earthengine.google.com/)
- [JavaScript Code Editor](https://code.earthengine.google.com/)
- [API Documentation](https://developers.google.com/earth-engine/)
- [Data Catalog](https://developers.google.com/earth-engine/datasets/)
- [Timelapse](https://earthengine.google.com/timelapse/)
- [Earth Engine Apps](https://www.earthengine.app/)
- [Blog](https://medium.com/google-earth)
- [Sign up](https://earthengine.google.com/signup/)
- [Developer Forum](https://developers.google.com/earth-engine)
- [Issue Tracker](https://issuetracker.google.com/issues?q=componentid:184426&p=1)
- [Earth Engine API on GitHub](https://github.com/google/earthengine-api)
- [Google Earth Engine Community Tutorials](https://github.com/google/earthengine-community)
- [Google Earth Engine Community Developer Resources](https://developers.google.com/earth-engine/tutorials/community/developer-resources)

## Get Started

1. [Sign up](https://earthengine.google.com/signup/) for an Earth Engine account.
2. Read the Earth Engine API documentation - [Get Started with Earth Engine](https://developers.google.com/earth-engine/getstarted).
3. Read another Earth Engine API documentation - [Client vs. Server](https://developers.google.com/earth-engine/client_server). Make sure you have a good understanding of client-side objects vs server-side objects.
4. Try out the [JavaScript API](https://code.earthengine.google.com/) or Python API (e.g., [geemap](https://github.com/giswqs/geemap)).
5. Read [Coding Best Practices](https://developers.google.com/earth-engine/best_practices).

## Get Help

- [Earth Engine Developer Forum](https://groups.google.com/forum/#!forum/google-earth-engine-developers)
- [GIS Stack Exchange](https://gis.stackexchange.com/questions/tagged/google-earth-engine)
- [Report a bug](https://issuetracker.google.com/issues?q=componentid:184406&type:bug)
- [Dataset requests](https://issuetracker.google.com/issues?q=componentid:184426%2B%20status:open)
- [Feature requests](https://issuetracker.google.com/issues?q=componentid:184406%20type:feature_request%20status:open)
- [Slack channel for geemap and Earth Engine](https://gishub.org/geemap-slack)

## JavaScript API

### Playground

- [JavaScript Code Editor](https://code.earthengine.google.com/) - The official Google Earth Engine JavaScript Code Editor.

### Repositories

- [jdbcode/Snazzy-EE-TS-GIF](https://github.com/jdbcode/Snazzy-EE-TS-GIF) - Apps for creating Landsat time series animations.
- [fitoprincipe/geetools-code-editor](https://github.com/fitoprincipe/geetools-code-editor) - A set of tools to use in Google Earth Engine JavaScript Code Editor.
- [Fernerkundung/EarthEngine_scripts](https://github.com/Fernerkundung/EarthEngine_scripts) - Scripts and snippets for Google Earth Engine.
- [Google Earth Engine Toolbox (GEET)](https://github.com/sacridini/GEET) - Library to write small EE apps or big/complex apps with a lot less code.
- [LandTrendr](https://code.earthengine.google.com/?accept_repo=users/emaprlab/public) - Spectral-temporal segmentation algorithm.
- [zecojls/tagee](https://github.com/zecojls/tagee) - Terrain Analysis in Google Earth Engine (TAGEE).
- [ee-palettes](https://github.com/gee-community/ee-palettes) - A module for generating color palettes in Earth Engine to be applied to mapped data.
- [gee-ccdc-tools](https://gee-ccdc-tools.readthedocs.io/en/latest) - A suite of tools designed for continuous land change monitoring in Google Earth Engine.
- [Continuous Degradation Detection (CODED)](https://coded.readthedocs.io/en/latest/) - A system for monitoring forest degradation and deforestation.
- [LT-GEE](https://emapr.github.io/LT-GEE) - Google Earth Engine implementation of the LandTrendr spectral-temporal segmentation algorithm.
- [spectral](https://github.com/awesome-spectral-indices/spectral) - Awesome Spectral Indices for the Google Earth Engine JavaScript API (Code Editor).
- [msslib](https://github.com/gee-community/msslib) - An Earth Engine JavaScript library for working with Landsat MSS image data.
- [geeSharp](https://github.com/aazuspan/geeSharp) - Pan-sharpening in the Earth Engine Code Editor.
- [snazzy](https://github.com/aazuspan/snazzy) - Custom basemap styles in the Earth Engine Code Editor.
- [ee-polyfill](https://github.com/aazuspan/ee-polyfill) - Modern Javascript methods (ES6+) for the Earth Engine Code Editor.
- [gee-blend](https://github.com/jessjaco/gee-blend) - Various blending functions for Google Earth Engine.
- [OpenEarthEngineLibrary](https://www.open-geocomputing.org/OpenEarthEngineLibrary/) - Collection of code goodies for Google Earth Engine (GEE).

### Tutorials

- [Introduction to Google Earth Engine](https://www.google.com/earth/outreach/learn/introduction-to-google-earth-engine/)
- [Introduction to JavaScript for Earth Engine](https://developers.google.com/earth-engine/tutorial_js_01)
- [Introduction to the Earth Engine JavaScript API](https://developers.google.com/earth-engine/tutorial_api_01)
- [Global Forest Change Analysis](https://developers.google.com/earth-engine/tutorial_forest_01)
- [Global Surface Water Change Analysis](https://developers.google.com/earth-engine/tutorial_global_surface_water_01)
- [Beginner's Cookbook](https://developers.google.com/earth-engine/tutorials/community/beginners-cookbook)
- [Combining FeatureCollections](https://developers.google.com/earth-engine/tutorials/community/combining-feature-collections)
- [Customizing Base Map Styles](https://developers.google.com/earth-engine/tutorials/community/customizing-base-map-styles)
- [Forest Cover and Loss Estimation](https://developers.google.com/earth-engine/tutorials/community/forest-cover-loss-estimation)
- [Getting Started with Drawing Tools](https://developers.google.com/earth-engine/tutorials/community/drawing-tools)
- [Identifying Annual First Day of No Snow Cover](https://developers.google.com/earth-engine/tutorials/community/identifying-first-day-no-snow)
- [Interactive Region Reduction App](https://developers.google.com/earth-engine/tutorials/community/drawing-tools-region-reduction)
- [Land Surface Temperature in Uganda](https://developers.google.com/earth-engine/tutorials/community/ph-ug-temp)
- [Landsat ETM+ to OLI Harmonization](https://developers.google.com/earth-engine/tutorials/community/landsat-etm-to-oli-harmonization)
- [MODIS NDVI Times Series Animation](https://developers.google.com/earth-engine/tutorials/community/modis-ndvi-time-series-animation)
- [Non-parametric trend analysis](https://developers.google.com/earth-engine/tutorials/community/nonparametric-trends)
- [GEE 开发 on 知乎 by 无形的风](https://zhuanlan.zhihu.com/c_123993183)
- [Calculating Area in Google Earth Engine](https://spatialthoughts.com/2020/06/19/calculating-area-gee/)
- [Extracting Time Series using Google Earth Engine](https://spatialthoughts.com/2020/04/13/extracting-time-series-ee/)
- [Histogram Matching in Google Earth Engine](https://spatialthoughts.com/2020/07/14/histogram-matching-gee/)
- [Getting Git Right on Google Earth Engine](https://medium.com/@samapriyaroy/getting-git-right-on-google-earth-engine-e853f6551889)
- [AmericaView - Google Earth Engine (GEE) tutorials](https://americaview.org/program-areas/education/google-earth-engine-tutorials/)
- [Earth Lab - Introduction to the Google Earth Engine code editor](https://www.earthdatascience.org/tutorials/intro-google-earth-engine-ide/)
- [Coding Club - Intro to the Google Earth Engine](https://ourcodingclub.github.io/tutorials/earth-engine/)
- [Global Snow Observatory - Google Earth Engine Tutorials](https://sites.google.com/site/globalsnowobservatory/home/Presentations-and-Tutorials)
- [GEARS - Getting started with Google Earth Engine](https://www.geospatialecology.com/intro_rs_lab1/)
- [An Introduction to Remote Sensing for Ecologists Using Google Earth Engine](https://ecology.colostate.edu/google-earth-engine/)
- [An introduction to Google Earth Engine](https://www.paulamoraga.com/tutorial-gee/)

### Books

- [Cloud-Based Remote Sensing with Google Earth Engine](https://www.eefabook.org/)

## Python API

### Installation

- [Earth Engine Python API installation](https://developers.google.com/earth-engine/python_install)

### Packages

- [earthengine-api](https://pypi.org/project/earthengine-api/) - The official Google Earth Engine Python API.
- [geemap](https://github.com/giswqs/geemap) - A Python package for interactive mapping with Google Earth Engine, ipyleaflet, and ipywidgets.
- [geeadd](https://github.com/samapriya/gee_asset_manager_addon) - Google Earth Engine Batch Asset Manager with Addons.
- [geeup](https://github.com/samapriya/geeup) - Simple CLI for Google Earth Engine Uploads.
- [cartoee](https://github.com/KMarkert/cartoee) - Publication quality maps using Earth Engine and Cartopy.
- [gee_tools](https://github.com/gee-community/gee_tools) - A set of tools for working with Google Earth Engine Python API.
- [landsat-extract-gee](https://github.com/loicdtx/landsat-extract-gee) - Get Landsat surface reflectance time-series from google earth engine.
- [Ndvi2Gif](https://github.com/Digdgeo/Ndvi2Gif) - Creating seasonal NDVI compositions GIFs.
- [eemont](https://github.com/davemlz/eemont) - A Python package that extends the Google Earth Engine Python API with pre-processing and processing tools.
- [hydra-floods](https://github.com/Servir-Mekong/hydra-floods) - An open source Python application for downloading, processing, and delivering surface water maps derived from remote sensing data.
- [restee](https://github.com/KMarkert/restee) - A package that aims to make plugging Earth Engine computations into downstream Python processing easier.
- [wxee](https://github.com/aazuspan/wxee) - A Python interface between Earth Engine and xarray for processing weather and climate data.
- [taskee](https://github.com/aazuspan/taskee) - Monitor your Earth Engine tasks and get notifications on your phone or computer.
- [geedim](https://github.com/dugalh/geedim) - Search, composite, and download Earth Engine imagery, without size limits.

### Repositories

- [earthengine-py-notebooks](https://github.com/giswqs/earthengine-py-notebooks) - A collection of 360+ Jupyter notebook examples for using Google Earth Engine with interactive mapping.
- [earthengine-py-examples](https://github.com/giswqs/earthengine-py-examples) - A collection of 300+ examples for using Earth Engine and the geemap Python package.
- [ee-tensorflow-notebooks](https://github.com/gee-community/ee-tensorflow-notebooks) - Repository to place example notebooks for Deep Learning applications with TensorFlow and Earth Engine.
- [CoastSat](https://github.com/kvos/CoastSat) - Global shoreline mapping tool from satellite imagery.
- [Google-Earth-Engine-Python-Examples](https://github.com/renelikestacos/Google-Earth-Engine-Python-Examples)
- [csaybar/EEwPython](https://github.com/csaybar/EEwPython)

### Tutorials

- [geemap and Earth Engine Python API tutorials](https://github.com/giswqs/geemap/tree/master/examples)
- [A Quick Introduction to Google Earth Engine](https://towardsdatascience.com/a-quick-introduction-to-google-earth-engine-c6a608c5febe)
- [Google Earth Engine (GEE) and Image Analysis](https://climada-python.readthedocs.io/en/stable/tutorial/climada_util_earth_engine.html)
- [Earth Engine Python API Colab Setup](https://colab.sandbox.google.com/github/google/earthengine-api/blob/master/python/examples/ipynb/ee-api-colab-setup.ipynb)
- [Earth Engine TensorFlow demonstration notebook](https://colab.sandbox.google.com/github/google/earthengine-api/blob/master/python/examples/ipynb/TF_demo1_keras.ipynb)
- [Earth Lab - Calculating the area of polygons in Google Earth Engine](https://www.earthdatascience.org/tutorials/basic-polygon-operations-google-earth-engine/)
- [Semantic Segmentation of GEE High Resolution Imagery](https://gist.github.com/mortcanty/ac4c48e3d10e89676b7fe9b3a6f1ba3a)

### Books

- [Geospatial Data Science with Earth Engine and Geemap](https://book.geemap.org/)

## R

### Packages

- [rgee](https://github.com/r-spatial/rgee) - An R package for using Google Earth Engine.
- [earthEngineGrabR](https://github.com/JesJehle/earthEngineGrabR) - Simplify the acquisition of remote sensing data.

### Repositories

- [rgee-examples](https://csaybar.github.io/rgee-examples/) - A collection of 250+ examples for using Google Earth Engine with R.

### Tutorials

- [rgee tutorial #1: Creating global land surface temperature maps](https://csaybar.github.io/blog/2020/06/10/rgee_01_worldmap/)
- [rgee tutorial #2: Satellite image processing](https://csaybar.github.io/blog/2020/06/15/rgee_02_io/)

## QGIS

### Packages

- Earth Engine QGIS Plugin ([Website](https://gee-community.github.io/qgis-earthengine-plugin/), [GitHub](https://github.com/gee-community/qgis-earthengine-plugin)) - Integrates Google Earth Engine and QGIS using Python API.

### Repositories

- [qgis-earthengine-examples](https://github.com/giswqs/qgis-earthengine-examples) - A collection of 300+ Python examples for using Google Earth Engine in QGIS.

### Tutorials

- [Creating Maps with Google Earth Engine](https://spatialthoughts.com/2020/04/04/ndvi-time-series-gee-qgis/)

## GitHub Developers

### Community

- [earthengine-api](https://github.com/google/earthengine-api)
- [Google Earth Engine Community](https://github.com/gee-community)
- [Google Earth Engine Community Tutorials](https://github.com/google/earthengine-community)

### Individuals

- [Cesar Aybar](https://github.com/csaybar)
- [Justin Braaten](https://github.com/jdbcode)
- [Tirthankar "TC" Chakraborty](https://github.com/TC25)
- [Diego Garcia Diaz](https://twitter.com/mopayyo)
- [Gennadii Donchyts](https://github.com/gena)
- [Ujaval Gandhi](https://github.com/spatialthoughts)
- [Philipp Gärtner](https://github.com/philippgaertner)
- [Eduardo Lacerda](https://github.com/sacridini)
- [Kel Markert](https://github.com/KMarkert)
- [Mort Canty](https://gist.github.com/mortcanty)
- [Keiko Nomura](https://github.com/nkeikon)
- [Rodrigo E. Principe](https://github.com/fitoprincipe)
- [Samapriya Roy](https://github.com/samapriya)
- [Sabrina Szeto](https://github.com/sabrinaszeto)
- [Qiusheng Wu](https://github.com/giswqs)

## Twitter

### Bots

- [Earth Engine Bot](https://twitter.com/EarthEngineBot)
- [Geospatial Python](https://twitter.com/geospatial_py)
- [Synthetic Aperture Random](https://twitter.com/ApertureRandom)

### Google affiliated

- [Google Earth](https://twitter.com/googleearth)
- [Google Earth Outreach](https://twitter.com/googleearth)
- [Tyler Erickson](https://twitter.com/tylerickson)
- [Rebecca Moore](https://twitter.com/rebeccatmoore)
- [Kurt Schwehr](https://twitter.com/kurtschwehr)

### Individuals

- [Cesar Aybar](https://twitter.com/csaybar)
- [Justin Braaten](https://twitter.com/jstnbraaten)
- [Tirthankar "TC" Chakraborty](https://twitter.com/Chalkemort)
- [Morgan Crowley](https://twitter.com/morganahcrowley)
- [Diego Garcia Diaz](https://github.com/Digdgeo)
- [Gennadii Donchyts](https://twitter.com/gena_d)
- [Ujaval Gandhi](https://twitter.com/spatialthoughts)
- [Philipp Gärtner](https://twitter.com/gartn001)
- [Belize GEO](https://twitter.com/BZgeo)
- [Mort Canty](https://twitter.com/mort_canty)
- [Kel Markert](https://twitter.com/KelMarkert)
- [Keiko Nomura](https://twitter.com/Keiko_geo)
- [Samapriya Roy](https://twitter.com/samapriyaroy)
- [Sabrina Szeto](https://twitter.com/SabrinaSzeto)
- [Dave Thau](https://twitter.com/davethau)
- [Qiusheng Wu](https://twitter.com/giswqs)
- [Iain H Woodhouse](https://twitter.com/fortiain)

## Apps

- [Earth Engine Apps](https://www.earthengine.app/) - Google
- [An image gallery of almost all publicly available Google Earth Engine Apps](https://philippgaertner.github.io/2020/03/ee-apps/) - Philipp Gärtner
- [A searchable list of all publicly available Google Earth Engine Apps](https://datawrapper.dwcdn.net/4cHkZ/1/)
- [Earth Engine App Filter](https://philippgaertner-ee-appshot-streamlit-filte-streamlit-app-j29b7u.streamlit.app/) by Philipp Gärtner

## Free Courses

- [End-to-End Google Earth Engine](https://courses.spatialthoughts.com/end-to-end-gee.html) - by [Ujaval Gandhi](https://twitter.com/spatialthoughts)
- [Spatial Data Management with Earth Engine](https://www.youtube.com/playlist?list=PLAxJ4-o7ZoPdz9LHIJIxHlZe3t-MRCn61) - by [Qiusheng Wu](https://twitter.com/giswqs)
- [Professor Iain Woodhouse’s guide to GEE resources and courses](https://www.earthblox.io/blog/google-earth-engine-training-2022)

## Presentations

### geemap

- [Using the geemap Python package for interactive mapping with Earth Engine](https://www.researchgate.net/publication/341326008_Using_the_geemap_Python_package_for_interactive_mapping_with_Earth_Engine) - Earth Engine Virtual Meetup on May 8, 2020
- [Cloud computing and interactive mapping with Earth Engine and open-source GIS](https://www.researchgate.net/publication/341722639_Cloud_computing_and_interactive_mapping_with_Earth_Engine_and_open-source_GIS) - GeoInsider webinar on May 28, 2020
- [Mapping Wetland Inundation Dynamics using Google Earth Engine](https://www.researchgate.net/publication/342064888_Mapping_Wetland_Inundation_Dynamics_using_Google_Earth_Engine) - Machine learning and data fusion workshop on June 10, 2020

### General

- [SERVIR Global - Introduction to Google Earth Engine](https://servirglobal.net/Portals/0/Documents/Articles/ChangeDetectionTraining/Module2_Intro_Google_Earth_Engine_presentation.pdf)

## Videos

### Google

- [Geo For Good 2019 on YouTube](https://www.youtube.com/playlist?list=PLLW-qoCMKQsxxXRmzxEJQhUrdX0kekHhV)
- [Earth Engine Video Tutorials](https://developers.google.com/earth-engine/tutorials#video-tutorials)

### General

- Getting Started with Earth Engine with Sabrina Szeto ([video](https://t.co/AQfGXvGksp?amp=1) - [slides](https://t.co/PM4Rqc604X?amp=1))
- Earth Engine Virtual Meetup on May 6, 2020 ([video](https://t.co/6WdQd7m9ZS?amp=1))

### geemap

- [geemap tutorials on YouTube](https://www.youtube.com/playlist?list=PLAxJ4-o7ZoPccOFv1dCwvGI6TYnirRTg3)
- [geemap tutorials on 哔哩哔哩](https://space.bilibili.com/527404442/channel/detail?cid=132674)
- [geemap tutorials on 西瓜视频](https://www.ixigua.com/home/676923482842317/)
- GeoInsider webinar - Cloud computing and interactive mapping with Earth Engine and open-source GIS ([video](https://www.bilibili.com/video/BV1Ep4y1X7tJ) - [slides](https://gishub.org/geoinsider))
- GeoInsider webinar 2 - Using Google Earth Engine for large-scale geospatial analysis: A case study of automated surface water mapping ([video](https://www.bilibili.com/video/BV15z411v7XE) | [slides](https://docs.google.com/presentation/d/1gkT93KCHNdQmL662FdjMjv1QD8fU2DMl0rIxxFSPEFE))

## Projects

- [Google Earth Engine](https://www.researchgate.net/project/Google-Earth-Engine-4) on Research Gate

## Websites

- [Global Surface Water Explorer](http://global-surface-water.appspot.com/)
- [Global Forest Cover Change](http://earthenginepartners.appspot.com/science-2013-global-forest)
- [Global Forest Watch](https://www.globalforestwatch.org/)
- [Map Of Life](http://species.mol.org/species/map/Perdix_dauurica)
- [Climate Engine](https://clim-engine.appspot.com/climateEngine)
- [Surface Water Mapping Tool](http://surface-water-servir.adpc.net/)
- [Surface water changes (1985-2016)](https://aqua-monitor.appspot.com/)
- [Decision Support Tools](https://servir.adpc.net/tools)
- [Earth Map](https://earthmap.org)
- [CoastSat shoreline change database](http://coastsat.wrl.unsw.edu.au/)

## Datasets

### Community Datasets

- [awesome-gee-community-datasets](https://github.com/samapriya/awesome-gee-community-datasets)

### Landsat

- [Landsat 8 Surface Reflectance](https://developers.google.com/earth-engine/datasets/catalog/LANDSAT_LC08_C01_T1_SR)
- [Landsat 8 TOA Reflectance](https://developers.google.com/earth-engine/datasets/catalog/LANDSAT_LC08_C01_T1_TOA)

### Sentinel

- [Sentinel-1 SAR GRD](https://developers.google.com/earth-engine/datasets/catalog/COPERNICUS_S1_GRD)
- [Sentinel-2 MSI](https://developers.google.com/earth-engine/datasets/catalog/COPERNICUS_S2_SR)

### NAIP

- [NAIP: National Agriculture Imagery Program](https://developers.google.com/earth-engine/datasets/catalog/USDA_NAIP_DOQQ)

### Land Cover

- [NLCD: USGS National Land Cover Database](https://developers.google.com/earth-engine/datasets/catalog/USGS_NLCD)

## Papers

### Highlights

- Aybar, C., Wu, Q., Bautista, L., Yali, R., & Barja, A. (2020). rgee: An R package for interacting with Google Earth Engine. _The Journal of Open Source Software_. 5(51), 2272. https://doi.org/10.21105/joss.02272
- Gorelick, N., Hancher, M., Dixon, M., Ilyushchenko, S., Thau, D., Moore, R., 2017. Google Earth Engine: Planetary-scale geospatial analysis for everyone. _Remote Sens. Environ_. 202, 18–27. <https://doi.org/10.1016/j.rse.2017.06.031>
- Wu, Q. (2020). geemap: A Python package for interactive mapping with Google Earth Engine. _The Journal of Open Source Software_. 5(51), 2305. https://doi.org/10.21105/joss.02305

### Journal Special Issues

- _Journal of Remote Sensing_, Remote Sensing for Environmental and Societal Changes Using Google Earth Engine ([Call for Papers](https://spj.sciencemag.org/journal-of-remote-sensing-special-issues/gee/))
- _IEEE Journal of Selected Topics in Applied Earth Observations and Remote Sensing_, Cloud Computing in Google Earth Engine for Remote Sensing ([Call for Papers](https://www.grss-ieee.org/wp-content/uploads/2019/12/Call_for_Paper_GEE.pdf))
- _Remote Sensing_, Google Earth Engine and Cloud Computing Platforms: Methods and Applications in Big Geo Data Science ([Call for Papers](https://www.mdpi.com/journal/remotesensing/special_issues/GEE_Methods_Applications), [Published Papers](https://www.mdpi.com/journal/remotesensing/special_issues/GEE_Methods_Applications))
- _Remote Sensning_, Google Earth Engine Applications ([Call for Papers](https://www.mdpi.com/journal/remotesensing/special_issues/GEE), [Published Papers](https://www.mdpi.com/journal/remotesensing/special_issues/GEE))
- _Remote Sensing of Environment_, Remote Sensing of Land Change Science with Google Earth Engine ([Call for Papers](https://www.journals.elsevier.com/remote-sensing-of-environment/call-for-papers/-special-issue-remote-sensing-of-land-change-science-with-go), [Published Papers](https://www.sciencedirect.com/journal/remote-sensing-of-environment/special-issue/104TX08KZZW))

### Review

- Amani, M., Ghorbanian, A., Ahmadi, A., Kakooei, M., ..., Wu, Q., & Brisco, B. (2020). Google Earth Engine Cloud Computing Platform for Remote Sensing Big Data Applications: A Comprehensive Review. _IEEE Journal of Selected Topics in Applied Earth Observations and Remote Sensing_. <https://doi.org/10.1109/JSTARS.2020.3021052>
- Boothroyd, R., Williams, R., Hoey, T., Barrett, B., & Prasojo, O. (2020). Applications of Google Earth Engine in fluvial geomorphology for detecting river channel change. _WIREs Water_. <https://doi.org/10.1002/wat2.1496>
- Kumar, L., Mutanga, O., 2018. Google Earth Engine Applications Since Inception: Usage, Trends, and Potential. _Remote Sensing_ 10, 1509. <https://doi.org/10.3390/rs10101509>
- Tamiminia, H., Salehi, B., Mahdianpari, M., Quackenbush, L., Adeli, S., Brisco, B., 2020. Google Earth Engine for geo-big data applications: A meta-analysis and systematic review. _ISPRS J. Photogramm. Remote Sens._ 164, 152–170. <https://doi.org/10.1016/j.isprsjprs.2020.04.001>
- Wang, L., Diao, C., Xian, G., Yin, D., Lu, Y., Zou, S., & Erickson, T. A. (2020). A summary of the special issue on remote sensing of land change science with Google earth engine. _Remote Sensing of Environment_. <https://doi.org/10.1016/j.rse.2020.112002>
- Yang, L., Driscol, J., Sarigai, S., Wu, Q., Chen, H., & Lippitt, C. D. (2022). Google Earth Engine and Artificial Intelligence (AI): A Comprehensive Review. _Remote Sensing_, 14(14), 3253. <https://doi.org/10.3390/rs14143253>
- Yang, L., Driscol, J., Sarigai, S., Wu, Q., Lippitt, C. D., & Morgan, M. (2022). Towards Synoptic Water Monitoring Systems: A Review of AI Methods for Automating Water Body Detection and Water Quality Monitoring Using Remote Sensing. _Sensors_, 22(6), 2416. <https://doi.org/10.3390/s22062416>

### Hydrology

- Donchyts, G., Baart, F., Winsemius, H., Gorelick, N., Kwadijk, J., van de Giesen, N., 2016. Earth’s surface water change over the past 30 years. _Nat. Clim. Chang_. 6, 810. <https://doi.org/10.1038/nclimate3111>
- Pekel, J.-F., Cottam, A., Gorelick, N., Belward, A.S., 2016. High-resolution mapping of global surface water and its long-term changes. _Nature_ 540, 418–422. <https://doi.org/10.1038/nature20584>
- Wu, Q., Lane, C.R., Li, X., Zhao, K., Zhou, Y., Clinton, N., DeVries, B., Golden, H.E., Lang, M.W., 2019. Integrating LiDAR data and multi-temporal aerial imagery to map wetland inundation dynamics using Google Earth Engine. _Remote Sens. Environ_. 228, 1–13. <https://doi.org/10.1016/j.rse.2019.04.015>
- Yamazaki, D., Trigg, M.A., 2016. Hydrology: The dynamics of Earth’s surface water. _Nature_. <https://doi.org/10.1038/nature21100>

### Urban

- Li, X., Zhou, Y., Zhu, Z., Cao, W., 2020. A national dataset of 30 m annual urban extent dynamics (1985–2015) in the conterminous United States. _Earth System Science Data_ 12, 357. <https://doi.org/10.5194/essd-12-357-2020>
- Liu, X., Hu, G., Chen, Y., Li, X., Xu, X., Li, S., Pei, F., Wang, S., 2018. High-resolution multi-temporal mapping of global urban land using Landsat images based on the Google Earth Engine Platform. _Remote Sens. Environ_. 209, 227–239. <https://doi.org/10.1016/j.rse.2018.02.055>
- Liu, X., Huang, Y., Xu, X., Li, X., Li, X., Ciais, P., Lin, P., Gong, K., Ziegler, A.D., Chen, A., Gong, P., Chen, J., Hu, G., Chen, Y., Wang, S., Wu, Q., Huang, K., Estes, L., Zeng, Z., 2020. High-spatiotemporal-resolution mapping of global urban change from 1985 to 2015. _Nature Sustainability_ 1–7. <https://doi.org/10.1038/s41893-020-0521-x>
- Patel, N.N., Angiuli, E., Gamba, P., Gaughan, A., Lisini, G., Stevens, F.R., Tatem, A.J., Trianni, G., 2015. Multitemporal settlement and population mapping from Landsat using Google Earth Engine. _Int. J. Appl. Earth Obs. Geoinf_. 35, 199–208. <https://doi.org/10.1016/j.jag.2014.09.005>
- Weiss, D.J., Nelson, A., Gibson, H.S., Temperley, W., Peedell, S., Lieber, A., Hancher, M., Poyart, E., Belchior, S., Fullman, N., Mappin, B., Dalrymple, U., Rozier, J., Lucas, T.C.D., Howes, R.E., Tusting, L.S., Kang, S.Y., Cameron, E., Bisanzio, D., Battle, K.E., Bhatt, S., Gething, P.W., 2018. A global map of travel time to cities to assess inequalities in accessibility in 2015. _Nature_ 553, 333–336. <https://doi.org/10.1038/nature25181>

### Vegetation

- Li, X., Zhou, Y., Meng, L., Asrar, G.R., Lu, C., Wu, Q., 2019. A dataset of 30 m annual vegetation phenology indicators (1985–2015) in urban areas of the conterminous United States. _Earth System Science Data_. 11(2), 881-894. <https://doi.org/10.5194/essd-11-881-2019>
- Robinson, N.P., Allred, B.W., Jones, M.O., Moreno, A., Kimball, J.S., Naugle, D.E., Erickson, T.A., Richardson, A.D., 2017. A Dynamic Landsat Derived Normalized Difference Vegetation Index (NDVI) Product for the Conterminous United States. _Remote Sensing_ 9, 863. <https://doi.org/10.3390/rs9080863>
- Xie, Z., Phinn, S.R., Game, E.T., Pannell, D.J., Hobbs, R.J., Briggs, P.R., McDonald-Madden, E., 2019. Using Landsat observations (1988–2017) and Google Earth Engine to detect vegetation cover changes in rangelands - A first step towards identifying degraded lands for conservation. _Remote Sens. Environ_. 232, 111317. <https://doi.org/10.1016/j.rse.2019.111317>

### Agriculture

- Dong, J., Xiao, X., Menarguez, M.A., Zhang, G., Qin, Y., Thau, D., Biradar, C., Moore, B., 3rd, 2016. Mapping paddy rice planting area in northeastern Asia with Landsat 8 images, phenology-based algorithm and Google Earth Engine. _Remote Sens. Environ_. 185, 142–154. <https://doi.org/10.1016/j.rse.2016.02.016>
- Xiong, J., Thenkabail, P.S., Gumma, M.K., Teluguntla, P., Poehnelt, J., Congalton, R.G., Yadav, K., Thau, D., 2017. Automated cropland mapping of continental Africa using Google Earth Engine cloud computing. _ISPRS J. Photogramm. Remote Sens_. 126, 225–244. <https://doi.org/10.1016/j.isprsjprs.2017.01.019>
- Xiong, J., Thenkabail, P.S., Tilton, J.C., Gumma, M.K., Teluguntla, P., Oliphant, A., Congalton, R.G., Yadav, K., Gorelick, N., 2017. Nominal 30-m Cropland Extent Map of Continental Africa by Integrating Pixel-Based and Object-Based Algorithms Using Sentinel-2 and Landsat-8 Data on Google Earth Engine. _Remote Sensing_ 9, 1065. <https://doi.org/10.3390/rs9101065>

### Wetlands

- Amani, M., Mahdavi, S., Afshar, M., Brisco, B., Huang, W., Mohammad Javad Mirzadeh, S., White, L., Banks, S., Montgomery, J., Hopkinson, C., 2019. Canadian Wetland Inventory using Google Earth Engine: The First Map and Preliminary Results. _Remote Sensing_ 11, 842. <https://doi.org/10.3390/rs11070842>
- Chen, B., Xiao, X., Li, X., Pan, L., Doughty, R., Ma, J., Dong, J., Qin, Y., Zhao, B., Wu, Z., Sun, R., Lan, G., Xie, G., Clinton, N., Giri, C., 2017. A mangrove forest map of China in 2015: Analysis of time series Landsat 7/8 and Sentinel-1A imagery in Google Earth Engine cloud computing platform. _ISPRS J. Photogramm. Remote Sens_. 131, 104–120. <https://doi.org/10.1016/j.isprsjprs.2017.07.011>
- Hird, J.N., DeLancey, E.R., McDermid, G.J., Kariyeva, J., 2017. Google Earth Engine, Open-Access Satellite Data, and Machine Learning in Support of Large-Area Probabilistic Wetland Mapping. _Remote Sensing_ 9, 1315. <https://doi.org/10.3390/rs9121315>
- Mahdianpari, M., Brisco, B., Granger, J. E., Mohammadimanesh, F., Salehi, B., Banks, S., ... & Weng, Q. (2020). The Second Generation Canadian Wetland Inventory Map at 10 Meters Resolution Using Google Earth Engine. _Canadian Journal of Remote Sensing_, 46(3), 360-375. <https://doi.org/10.1080/07038992.2020.1802584>
- Mahdianpari, M., Salehi, B., Mohammadimanesh, F., Homayouni, S., Gill, E., 2018. The First Wetland Inventory Map of Newfoundland at a Spatial Resolution of 10 m Using Sentinel-1 and Sentinel-2 Data on the Google Earth Engine Cloud Computing Platform. _Remote Sensing_ 11, 43. <https://doi.org/10.3390/rs11010043>
- Wang, X., Xiao, X., Zou, Z., Chen, B., Ma, J., Dong, J., Doughty, R.B., Zhong, Q., Qin, Y., Dai, S., Li, X., Zhao, B., Li, B., 2020. Tracking annual changes of coastal tidal flats in China during 1986–2016 through analyses of Landsat images with Google Earth Engine. _Remote Sens. Environ_. 238, 110987. <https://doi.org/10.1016/j.rse.2018.11.030>
- Wu, Q., Lane, C.R., Li, X., Zhao, K., Zhou, Y., Clinton, N., DeVries, B., Golden, H.E., Lang, M.W., 2019. Integrating LiDAR data and multi-temporal aerial imagery to map wetland inundation dynamics using Google Earth Engine. _Remote Sens. Environ_. 228, 1–13. <https://doi.org/10.1016/j.rse.2019.04.015>
- Yancho, J. M. M., Jones, T. G., Gandhi, S. R., Ferster, C., Lin, A., & Glass, L. (2020). The Google Earth Engine Mangrove Mapping Methodology (GEEMMM). _Remote Sensing_, 12(22), 3758. <https://doi.org/10.3390/rs12223758>

### Land Cover

- Brown, C. F., Brumby, S. P., Guzder-Williams, B., Birch, T., Hyde, S. B., Mazzariello, J., ... & Tait, A. M. (2022). Dynamic World, Near real-time global 10 m land use land cover mapping. _Scientific Data_, 9(1), 1-17. <https://doi.org/10.1038/s41597-022-01307-4>
- Carrasco, L., O’Neil, A.W., Morton, R.D., Rowland, C.S., 2019. Evaluating Combinations of Temporally Aggregated Sentinel-1, Sentinel-2 and Landsat 8 for Land Cover Mapping with Google Earth Engine. _Remote Sensing_ 11, 288. <https://doi.org/10.3390/rs11030288>
- Hansen, M.C., Potapov, P.V., Moore, R., Hancher, M., Turubanova, S.A., Tyukavina, A., Thau, D., Stehman, S.V., Goetz, S.J., Loveland, T.R., Kommareddy, A., Egorov, A., Chini, L., Justice, C.O., Townshend, J.R.G., 2013. High-resolution global maps of 21st-century forest cover change. _Science_ 342, 850–853. <https://doi.org/10.1126/science.1244693>
- Huang, H., Chen, Y., Clinton, N., Wang, J., Wang, X., Liu, C., Gong, P., Yang, J., Bai, Y., Zheng, Y., Zhu, Z., 2017. Mapping major land cover dynamics in Beijing using all Landsat images in Google Earth Engine. _Remote Sens. Environ_. 202, 166–176. <https://doi.org/10.1016/j.rse.2017.02.021>
- Liu, H., Gong, P., Wang, J., Clinton, N., Bai, Y., Liang, S., 2020. Annual Dynamics of Global Land Cover and its Long-term Changes from 1982 to 2015. _Earth Syst. Sci. Data_. 12, 1217–1243. <https://doi.org/10.5194/essd-12-1217-2020>

### Disaster Management

- DeVries, B., Huang, C., Armston, J., Huang, W., Jones, J.W., Lang, M.W., 2020. Rapid and robust monitoring of flood events using Sentinel-1 and Landsat data on the Google Earth Engine. _Remote Sens. Environ_. 240, 111664. <https://doi.org/10.1016/j.rse.2020.111664>
- Liu, C.-C., Shieh, M.-C., Ke, M.-S., Wang, K.-H., 2018. Flood Prevention and Emergency Response System Powered by Google Earth Engine. _Remote Sensing_ 10, 1283. <https://doi.org/10.3390/rs10081283>
- Tellman, B., Sullivan, J.A., Kuhn, C., Kettner, A.J., Doyle, C.S., Brakenridge, G.R., Erickson, T.A., Slayback, D.A., 2021. Satellite imaging reveals increased proportion of population exposed to floods. _Nature_ 596, 80–86. <https://doi.org/10.1038/s41586-021-03695-w>

### Coastal

- Vos, K., Splinter, K.D., Harley, M.D., Simmons, J.A., Turner, I.L., 2019. CoastSat: A Google Earth Engine-enabled Python toolkit to extract shorelines from publicly available satellite imagery _Environmental Modelling and Software_. 122, 104528. <https://doi.org/10.1016/j.envsoft.2019.104528>

## Contributing

Contributions welcome! Read the [contribution guidelines](contributing.md) first.

## License

[![CC0](https://mirrors.creativecommons.org/presskit/buttons/88x31/svg/cc-zero.svg)](https://creativecommons.org/publicdomain/zero/1.0)

To the extent possible under law, Qiusheng Wu has waived all copyright and related or neighboring rights to this work.

repo_name: opengeos/Awesome-GEE

mime_type: text/plain


text:
# Contributor Covenant Code of Conduct

## Our Pledge

In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, gender identity and expression, level of experience,
nationality, personal appearance, race, religion, or sexual identity and
orientation.

## Our Standards

Examples of behavior that contributes to creating a positive environment
include:

* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members

Examples of unacceptable behavior by participants include:

* The use of sexualized language or imagery and unwelcome sexual attention or
advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
  address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
  professional setting

## Our Responsibilities

Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.

Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.

## Scope

This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at giswqs@gmail.com. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.

Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at [http://contributor-covenant.org/version/1/4][version]

[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/


text:
# Contribution Guidelines

Please note that this project is released with a
[Contributor Code of Conduct](code-of-conduct.md). By participating in this
project you agree to abide by its terms.

---

Ensure your pull request adheres to the following guidelines:

- Make sure you take care of this
- And this as well
- And don't forget to check this

Thank you for your suggestions!

## Updating your PR

A lot of times, making a PR adhere to the standards above can be difficult.
If the maintainers notice anything that we'd like changed, we'll ask you to
edit your PR before we merge it. There's no need to open a new PR, just edit
the existing one. If you're not sure how to do that,
[here is a guide](https://github.com/RichardLitt/knowledge/blob/master/github/amending-a-commit-guide.md)
on the different ways you can update your PR so that we can merge it.


text:
html, input, textarea, keygen, select, option, button {
  font-family: sans-serif;
}

#gb {
  padding-left: 80px; /* make room for mac traffic lights */
  -webkit-app-region: drag; /*make titlebar draggable */
}

#gbwa, /* google apps */
#gbwa + div, /* google notifications */
#gb .gb_yc.gb_Td /* burger menu and logo */
{
  display: none;
}

#gb .gb_zc.gb_2d {
  /* no space next to profile picture */
  padding-left: 0;
}

#gb .gb_Bd.gb_8d {
  /* always use compact header */
  padding: 4px;
}

.Xro3Db-nUpftc.ymbhmd {
  /* move create/edit dialogs down a bit */
  top: 38px;
}

repo_name: fgnass/google-calendar-app


text:
/**
 * Monkey-patch the Notification constructor to remove the icon.
 * Without this patch the Calendar icon would be shown twice (as app icon and
 * as contentIcon) which looks pretty weird.
 */
function patch(win) {
  var _N = win.Notification;
  var N = (win.Notification = function(title, opts) {
    console.log(title, opts);
    opts.icon = null;
    return new _N(title, opts);
  });
  N.prototype = _N.prototype;
  N.permission = _N.permission;
  N.requestPermission = _N.requestPermission;
}

// Monkey-patch the main window as well as all iframes
patch(window);
Array.prototype.slice
  .call(document.querySelectorAll('iframe'))
  .forEach(function(f) {
    if (~f.src.indexOf(window.location.origin)) patch(f.contentWindow);
  });


text:
const { app, BrowserWindow, Menu, shell } = require('electron');
const fs = require('fs');

// The main window
let win = null;

// Quit when all windows are closed.
app.on('window-all-closed', () => {
  app.quit();
});

app.on('ready', () => {
  win = new BrowserWindow({
    width: 1024,
    height: 768,
    titleBarStyle: 'hidden-inset'
  });
  const wc = win.webContents;

  function sendEscape(keyCode) {
    return () => {
      wc.sendInputEvent({ type: 'char', keyCode: 'Esc' });
      wc.sendInputEvent({ type: 'char', keyCode });
    };
  }

  function click(selector) {
    return () => {
      wc.executeJavaScript(`document.querySelector('${selector}').click()`);
    };
  }

  var template = [
    {
      label: 'Google Calendar',
      submenu: [
        { label: 'Settings', accelerator: 'Command+,', click: sendEscape('s') },
        {
          label: 'Quit',
          accelerator: 'Command+Q',
          click: () => {
            app.quit();
          }
        },
        {
          label: 'Developer Tools',
          accelerator: 'Command+Alt+J',
          click: () => {
            win.openDevTools();
          }
        }
      ]
    },
    {
      label: 'Edit',
      submenu: [
        {
          label: 'New Event',
          accelerator: 'Command+N',
          click: sendEscape('c')
        },
        { label: 'Find', accelerator: 'Command+F', click: sendEscape('/') },
        {
          label: 'Goto to Today',
          accelerator: 'Command+T',
          click: sendEscape('t')
        },
        { type: 'separator' },
        { label: 'Undo', accelerator: 'Command+Z', selector: 'undo:' },
        { label: 'Redo', accelerator: 'Shift+Command+Z', selector: 'redo:' },
        { type: 'separator' },
        { label: 'Cut', accelerator: 'Command+X', selector: 'cut:' },
        { label: 'Copy', accelerator: 'Command+C', selector: 'copy:' },
        { label: 'Paste', accelerator: 'Command+V', selector: 'paste:' },
        {
          label: 'Select All',
          accelerator: 'Command+A',
          selector: 'selectAll:'
        }
      ]
    },
    {
      label: 'View',
      submenu: [
        { label: 'Day View', accelerator: 'Command+1', click: sendEscape('1') },
        {
          label: 'Week View',
          accelerator: 'Command+2',
          click: sendEscape('2')
        },
        {
          label: 'Month View',
          accelerator: 'Command+3',
          click: sendEscape('3')
        },
        {
          label: 'Custom View',
          accelerator: 'Command+4',
          click: sendEscape('4')
        },
        {
          label: 'Schedule View',
          accelerator: 'Command+5',
          click: sendEscape('5')
        },
        {
          label: 'Year View',
          accelerator: 'Command+6',
          click: sendEscape('6')
        },
        { type: 'separator' },
        {
          label: 'Toggle Sidebar',
          accelerator: 'Command+.',
          click: click('.gb_ec')
        }
      ]
    }
  ];

  Menu.setApplicationMenu(Menu.buildFromTemplate(template));

  wc.on('new-window', (ev, url, name) => {
    ev.preventDefault();
    if (url == 'about:blank') {
      // Create a hidden window (for Hangouts)
      ev.newGuest = new BrowserWindow({ show: false });
    } else {
      // Open URLs in the default browser
      shell.openExternal(url);
    }
  });

  win.loadURL('https://www.google.com/calendar');

  // Inject custom CSS and JavaScript code on dom-ready
  wc.on('dom-ready', () => {
    wc.insertCSS(fs.readFileSync(__dirname + '/inject.css', 'utf8'));
    wc.executeJavaScript(fs.readFileSync(__dirname + '/inject.js', 'utf8'));
  });

  win.on('closed', () => {
    win = null;
  });
});


text:
# Google Calendar packaged as electron app

Thin wrapper around the Google Calendar web interface built with
[electron](http://electron.atom.io/).

![Screenshot](./screenshot.png)

## Download

Pre-built binary release for MacOS: [Google-Calendar-v.1.0.0-Mac.zip](https://github.com/fgnass/google-calendar-app/releases/download/v1.0.0/Google-Calendar-v.1.0.0-Mac.zip)

## Build from source

```
npm install
npm run pack-osx
cp -r Google\ Calendar-darwin-x64/Google\ Calendar.app /Applications
```

# Disclaimer

This project is not affiliated with, associated to, nor endorsed by Google
in any way. Google and the Google Calendar Logo are registered
trademarks of Google Inc.

The code in this repository has been released to the public domain
under the [UNLICENSE](./UNLICENSE).


text:
Kino/Datamosh
=============

*Datamosh* is a post-processing effect that simulates [video compression
artifacts][Wikipedia], specifically one called [datamoshing][KnowYourMeme].

![Gif][Gif1]
![Gif][Gif2]

*Datamosh* is part of the *Kino* effect suite. See the [GitHub repositories]
[Kino] for other effects included in the suite.

System Requirements
-------------------

- Unity 5.4 or later versions

*Datamosh* requires [motion vectors][MotionVectors] that is newly introduced in
Unity 5.4. Motion vector rendering is only supported on the platforms that has
RGHalf texture format support. This requirement must be met in most of the
desktop/console platforms, but rarely supported in the mobile platforms.

[Wikipedia]: https://en.wikipedia.org/wiki/Compression_artifact
[KnowYourMeme]: http://knowyourmeme.com/memes/datamoshing
[Gif1]: https://66.media.tumblr.com/6bf2ae7d3af6d38a61f1c57ca86556aa/tumblr_o8azn6iSbB1qio469o1_400.gif
[Gif2]: https://67.media.tumblr.com/60652235832a915be25bb32979c13f09/tumblr_o8azn6iSbB1qio469o2_400.gif
[Kino]: https://github.com/search?q=kino+user%3Akeijiro&type=Repositories
[MotionVectors]: http://docs.unity3d.com/540/Documentation/ScriptReference/DepthTextureMode.MotionVectors.html

repo_name: keijiro/KinoDatamosh

repo_language: C#


text:
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!13 &1
InputManager:
  m_ObjectHideFlags: 0
  serializedVersion: 2
  m_Axes:
  - serializedVersion: 3
    m_Name: Horizontal
    descriptiveName:
    descriptiveNegativeName:
    negativeButton: left
    positiveButton: right
    altNegativeButton: a
    altPositiveButton: d
    gravity: 3
    dead: 0.001
    sensitivity: 3
    snap: 1
    invert: 0
    type: 0
    axis: 0
    joyNum: 0
  - serializedVersion: 3
    m_Name: Vertical
    descriptiveName:
    descriptiveNegativeName:
    negativeButton: down
    positiveButton: up
    altNegativeButton: s
    altPositiveButton: w
    gravity: 3
    dead: 0.001
    sensitivity: 3
    snap: 1
    invert: 0
    type: 0
    axis: 0
    joyNum: 0
  - serializedVersion: 3
    m_Name: Fire1
    descriptiveName:
    descriptiveNegativeName:
    negativeButton:
    positiveButton: left ctrl
    altNegativeButton:
    altPositiveButton: mouse 0
    gravity: 1000
    dead: 0.001
    sensitivity: 1000
    snap: 0
    invert: 0
    type: 0
    axis: 0
    joyNum: 0
  - serializedVersion: 3
    m_Name: Fire2
    descriptiveName:
    descriptiveNegativeName:
    negativeButton:
    positiveButton: left alt
    altNegativeButton:
    altPositiveButton: mouse 1
    gravity: 1000
    dead: 0.001
    sensitivity: 1000
    snap: 0
    invert: 0
    type: 0
    axis: 0
    joyNum: 0
  - serializedVersion: 3
    m_Name: Fire3
    descriptiveName:
    descriptiveNegativeName:
    negativeButton:
    positiveButton: left shift
    altNegativeButton:
    altPositiveButton: mouse 2
    gravity: 1000
    dead: 0.001
    sensitivity: 1000
    snap: 0
    invert: 0
    type: 0
    axis: 0
    joyNum: 0
  - serializedVersion: 3
    m_Name: Jump
    descriptiveName:
    descriptiveNegativeName:
    negativeButton:
    positiveButton: space
    altNegativeButton:
    altPositiveButton:
    gravity: 1000
    dead: 0.001
    sensitivity: 1000
    snap: 0
    invert: 0
    type: 0
    axis: 0
    joyNum: 0
  - serializedVersion: 3
    m_Name: Mouse X
    descriptiveName:
    descriptiveNegativeName:
    negativeButton:
    positiveButton:
    altNegativeButton:
    altPositiveButton:
    gravity: 0
    dead: 0
    sensitivity: 0.1
    snap: 0
    invert: 0
    type: 1
    axis: 0
    joyNum: 0
  - serializedVersion: 3
    m_Name: Mouse Y
    descriptiveName:
    descriptiveNegativeName:
    negativeButton:
    positiveButton:
    altNegativeButton:
    altPositiveButton:
    gravity: 0
    dead: 0
    sensitivity: 0.1
    snap: 0
    invert: 0
    type: 1
    axis: 1
    joyNum: 0
  - serializedVersion: 3
    m_Name: Mouse ScrollWheel
    descriptiveName:
    descriptiveNegativeName:
    negativeButton:
    positiveButton:
    altNegativeButton:
    altPositiveButton:
    gravity: 0
    dead: 0
    sensitivity: 0.1
    snap: 0
    invert: 0
    type: 1
    axis: 2
    joyNum: 0
  - serializedVersion: 3
    m_Name: Horizontal
    descriptiveName:
    descriptiveNegativeName:
    negativeButton:
    positiveButton:
    altNegativeButton:
    altPositiveButton:
    gravity: 0
    dead: 0.19
    sensitivity: 1
    snap: 0
    invert: 0
    type: 2
    axis: 0
    joyNum: 0
  - serializedVersion: 3
    m_Name: Vertical
    descriptiveName:
    descriptiveNegativeName:
    negativeButton:
    positiveButton:
    altNegativeButton:
    altPositiveButton:
    gravity: 0
    dead: 0.19
    sensitivity: 1
    snap: 0
    invert: 1
    type: 2
    axis: 1
    joyNum: 0
  - serializedVersion: 3
    m_Name: Fire1
    descriptiveName:
    descriptiveNegativeName:
    negativeButton:
    positiveButton: joystick button 0
    altNegativeButton:
    altPositiveButton:
    gravity: 1000
    dead: 0.001
    sensitivity: 1000
    snap: 0
    invert: 0
    type: 0
    axis: 0
    joyNum: 0
  - serializedVersion: 3
    m_Name: Fire2
    descriptiveName:
    descriptiveNegativeName:
    negativeButton:
    positiveButton: joystick button 1
    altNegativeButton:
    altPositiveButton:
    gravity: 1000
    dead: 0.001
    sensitivity: 1000
    snap: 0
    invert: 0
    type: 0
    axis: 0
    joyNum: 0
  - serializedVersion: 3
    m_Name: Fire3
    descriptiveName:
    descriptiveNegativeName:
    negativeButton:
    positiveButton: joystick button 2
    altNegativeButton:
    altPositiveButton:
    gravity: 1000
    dead: 0.001
    sensitivity: 1000
    snap: 0
    invert: 0
    type: 0
    axis: 0
    joyNum: 0
  - serializedVersion: 3
    m_Name: Jump
    descriptiveName:
    descriptiveNegativeName:
    negativeButton:
    positiveButton: joystick button 3
    altNegativeButton:
    altPositiveButton:
    gravity: 1000
    dead: 0.001
    sensitivity: 1000
    snap: 0
    invert: 0
    type: 0
    axis: 0
    joyNum: 0
  - serializedVersion: 3
    m_Name: Submit
    descriptiveName:
    descriptiveNegativeName:
    negativeButton:
    positiveButton: return
    altNegativeButton:
    altPositiveButton: joystick button 0
    gravity: 1000
    dead: 0.001
    sensitivity: 1000
    snap: 0
    invert: 0
    type: 0
    axis: 0
    joyNum: 0
  - serializedVersion: 3
    m_Name: Submit
    descriptiveName:
    descriptiveNegativeName:
    negativeButton:
    positiveButton: enter
    altNegativeButton:
    altPositiveButton: space
    gravity: 1000
    dead: 0.001
    sensitivity: 1000
    snap: 0
    invert: 0
    type: 0
    axis: 0
    joyNum: 0
  - serializedVersion: 3
    m_Name: Cancel
    descriptiveName:
    descriptiveNegativeName:
    negativeButton:
    positiveButton: escape
    altNegativeButton:
    altPositiveButton: joystick button 1
    gravity: 1000
    dead: 0.001
    sensitivity: 1000
    snap: 0
    invert: 0
    type: 0
    axis: 0
    joyNum: 0


text:
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!78 &1
TagManager:
  serializedVersion: 2
  tags: []
  layers:
  - Default
  - TransparentFX
  - Ignore Raycast
  -
  - Water
  - UI
  -
  -
  -
  -
  -
  -
  -
  -
  -
  -
  -
  -
  -
  -
  -
  -
  -
  -
  -
  -
  -
  -
  -
  -
  -
  -
  m_SortingLayers:
  - name: Default
    uniqueID: 0
    locked: 0


text:
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!236 &1
ClusterInputManager:
  m_ObjectHideFlags: 0
  m_Inputs: []


text:
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1045 &1
EditorBuildSettings:
  m_ObjectHideFlags: 0
  serializedVersion: 2
  m_Scenes: []


text:
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!5 &1
TimeManager:
  m_ObjectHideFlags: 0
  Fixed Timestep: 0.016666668
  Maximum Allowed Timestep: 1
  m_TimeScale: 1


text:
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!129 &1
PlayerSettings:
  m_ObjectHideFlags: 0
  serializedVersion: 8
  AndroidProfiler: 0
  defaultScreenOrientation: 4
  targetDevice: 2
  useOnDemandResources: 0
  accelerometerFrequency: 60
  companyName: DefaultCompany
  productName: KinoDatamosh
  defaultCursor: {fileID: 0}
  cursorHotspot: {x: 0, y: 0}
  m_SplashScreenStyle: 0
  m_ShowUnitySplashScreen: 1
  m_VirtualRealitySplashScreen: {fileID: 0}
  defaultScreenWidth: 1024
  defaultScreenHeight: 768
  defaultScreenWidthWeb: 960
  defaultScreenHeightWeb: 600
  m_RenderingPath: 1
  m_MobileRenderingPath: 1
  m_ActiveColorSpace: 1
  m_MTRendering: 1
  m_MobileMTRendering: 0
  m_StackTraceTypes: 010000000100000001000000010000000100000001000000
  iosShowActivityIndicatorOnLoading: -1
  androidShowActivityIndicatorOnLoading: -1
  iosAppInBackgroundBehavior: 0
  displayResolutionDialog: 1
  iosAllowHTTPDownload: 1
  allowedAutorotateToPortrait: 1
  allowedAutorotateToPortraitUpsideDown: 1
  allowedAutorotateToLandscapeRight: 1
  allowedAutorotateToLandscapeLeft: 1
  useOSAutorotation: 1
  use32BitDisplayBuffer: 1
  disableDepthAndStencilBuffers: 0
  defaultIsFullScreen: 1
  defaultIsNativeResolution: 1
  runInBackground: 0
  captureSingleScreen: 0
  Override IPod Music: 0
  Prepare IOS For Recording: 0
  submitAnalytics: 1
  usePlayerLog: 1
  bakeCollisionMeshes: 0
  forceSingleInstance: 0
  resizableWindow: 0
  useMacAppStoreValidation: 0
  gpuSkinning: 0
  graphicsJobs: 0
  xboxPIXTextureCapture: 0
  xboxEnableAvatar: 0
  xboxEnableKinect: 0
  xboxEnableKinectAutoTracking: 0
  xboxEnableFitness: 0
  visibleInBackground: 0
  allowFullscreenSwitch: 1
  macFullscreenMode: 2
  d3d9FullscreenMode: 1
  d3d11FullscreenMode: 1
  xboxSpeechDB: 0
  xboxEnableHeadOrientation: 0
  xboxEnableGuest: 0
  xboxEnablePIXSampling: 0
  n3dsDisableStereoscopicView: 0
  n3dsEnableSharedListOpt: 1
  n3dsEnableVSync: 0
  uiUse16BitDepthBuffer: 0
  ignoreAlphaClear: 0
  xboxOneResolution: 0
  ps3SplashScreen: {fileID: 0}
  videoMemoryForVertexBuffers: 0
  psp2PowerMode: 0
  psp2AcquireBGM: 1
  wiiUTVResolution: 0
  wiiUGamePadMSAA: 1
  wiiUSupportsNunchuk: 0
  wiiUSupportsClassicController: 0
  wiiUSupportsBalanceBoard: 0
  wiiUSupportsMotionPlus: 0
  wiiUSupportsProController: 0
  wiiUAllowScreenCapture: 1
  wiiUControllerCount: 0
  m_SupportedAspectRatios:
    4:3: 1
    5:4: 1
    16:10: 1
    16:9: 1
    Others: 1
  bundleIdentifier: com.Company.ProductName
  bundleVersion: 1.0
  preloadedAssets: []
  metroEnableIndependentInputSource: 0
  xboxOneDisableKinectGpuReservation: 0
  singlePassStereoRendering: 0
  protectGraphicsMemory: 0
  productGUID: 9bf10dc06c5d240b3bb709fe6a9b95ea
  AndroidBundleVersionCode: 1
  AndroidMinSdkVersion: 9
  AndroidPreferredInstallLocation: 1
  aotOptions:
  apiCompatibilityLevel: 2
  stripEngineCode: 1
  iPhoneStrippingLevel: 0
  iPhoneScriptCallOptimization: 0
  iPhoneBuildNumber: 0
  ForceInternetPermission: 0
  ForceSDCardPermission: 0
  CreateWallpaper: 0
  APKExpansionFiles: 0
  preloadShaders: 0
  StripUnusedMeshComponents: 0
  VertexChannelCompressionMask:
    serializedVersion: 2
    m_Bits: 238
  iPhoneSdkVersion: 988
  iPhoneTargetOSVersion: 22
  tvOSSdkVersion: 0
  tvOSTargetOSVersion: 900
  uIPrerenderedIcon: 0
  uIRequiresPersistentWiFi: 0
  uIRequiresFullScreen: 1
  uIStatusBarHidden: 1
  uIExitOnSuspend: 0
  uIStatusBarStyle: 0
  iPhoneSplashScreen: {fileID: 0}
  iPhoneHighResSplashScreen: {fileID: 0}
  iPhoneTallHighResSplashScreen: {fileID: 0}
  iPhone47inSplashScreen: {fileID: 0}
  iPhone55inPortraitSplashScreen: {fileID: 0}
  iPhone55inLandscapeSplashScreen: {fileID: 0}
  iPadPortraitSplashScreen: {fileID: 0}
  iPadHighResPortraitSplashScreen: {fileID: 0}
  iPadLandscapeSplashScreen: {fileID: 0}
  iPadHighResLandscapeSplashScreen: {fileID: 0}
  appleTVSplashScreen: {fileID: 0}
  tvOSSmallIconLayers: []
  tvOSLargeIconLayers: []
  tvOSTopShelfImageLayers: []
  iOSLaunchScreenType: 0
  iOSLaunchScreenPortrait: {fileID: 0}
  iOSLaunchScreenLandscape: {fileID: 0}
  iOSLaunchScreenBackgroundColor:
    serializedVersion: 2
    rgba: 0
  iOSLaunchScreenFillPct: 100
  iOSLaunchScreenSize: 100
  iOSLaunchScreenCustomXibPath:
  iOSLaunchScreeniPadType: 0
  iOSLaunchScreeniPadImage: {fileID: 0}
  iOSLaunchScreeniPadBackgroundColor:
    serializedVersion: 2
    rgba: 0
  iOSLaunchScreeniPadFillPct: 100
  iOSLaunchScreeniPadSize: 100
  iOSLaunchScreeniPadCustomXibPath:
  iOSDeviceRequirements: []
  iOSURLSchemes: []
  AndroidTargetDevice: 0
  AndroidSplashScreenScale: 0
  androidSplashScreen: {fileID: 0}
  AndroidKeystoreName:
  AndroidKeyaliasName:
  AndroidTVCompatibility: 1
  AndroidIsGame: 1
  androidEnableBanner: 1
  m_AndroidBanners:
  - width: 320
    height: 180
    banner: {fileID: 0}
  androidGamepadSupportLevel: 0
  resolutionDialogBanner: {fileID: 0}
  m_BuildTargetIcons:
  - m_BuildTarget:
    m_Icons:
    - serializedVersion: 2
      m_Icon: {fileID: 0}
      m_Width: 128
      m_Height: 128
  m_BuildTargetBatching: []
  m_BuildTargetGraphicsAPIs: []
  webPlayerTemplate: APPLICATION:Default
  m_TemplateCustomTags: {}
  wiiUTitleID: 0005000011000000
  wiiUGroupID: 00010000
  wiiUCommonSaveSize: 4096
  wiiUAccountSaveSize: 2048
  wiiUOlvAccessKey: 0
  wiiUTinCode: 0
  wiiUJoinGameId: 0
  wiiUJoinGameModeMask: 0000000000000000
  wiiUCommonBossSize: 0
  wiiUAccountBossSize: 0
  wiiUAddOnUniqueIDs: []
  wiiUMainThreadStackSize: 3072
  wiiULoaderThreadStackSize: 1024
  wiiUSystemHeapSize: 128
  wiiUTVStartupScreen: {fileID: 0}
  wiiUGamePadStartupScreen: {fileID: 0}
  wiiUProfilerLibPath:
  actionOnDotNetUnhandledException: 1
  enableInternalProfiler: 0
  logObjCUncaughtExceptions: 1
  enableCrashReportAPI: 0
  locationUsageDescription:
  XboxTitleId:
  XboxImageXexPath:
  XboxSpaPath:
  XboxGenerateSpa: 0
  XboxDeployKinectResources: 0
  XboxSplashScreen: {fileID: 0}
  xboxEnableSpeech: 0
  xboxAdditionalTitleMemorySize: 0
  xboxDeployKinectHeadOrientation: 0
  xboxDeployKinectHeadPosition: 0
  ps3TitleConfigPath:
  ps3DLCConfigPath:
  ps3ThumbnailPath:
  ps3BackgroundPath:
  ps3SoundPath:
  ps3NPAgeRating: 12
  ps3TrophyCommId:
  ps3NpCommunicationPassphrase:
  ps3TrophyPackagePath:
  ps3BootCheckMaxSaveGameSizeKB: 128
  ps3TrophyCommSig:
  ps3SaveGameSlots: 1
  ps3TrialMode: 0
  ps3VideoMemoryForAudio: 0
  ps3EnableVerboseMemoryStats: 0
  ps3UseSPUForUmbra: 0
  ps3EnableMoveSupport: 1
  ps3DisableDolbyEncoding: 0
  ps4NPAgeRating: 12
  ps4NPTitleSecret:
  ps4NPTrophyPackPath:
  ps4ParentalLevel: 1
  ps4ContentID: ED1633-NPXX51362_00-0000000000000000
  ps4Category: 0
  ps4MasterVersion: 01.00
  ps4AppVersion: 01.00
  ps4AppType: 0
  ps4ParamSfxPath:
  ps4VideoOutPixelFormat: 0
  ps4VideoOutResolution: 4
  ps4PronunciationXMLPath:
  ps4PronunciationSIGPath:
  ps4BackgroundImagePath:
  ps4StartupImagePath:
  ps4SaveDataImagePath:
  ps4SdkOverride:
  ps4BGMPath:
  ps4ShareFilePath:
  ps4ShareOverlayImagePath:
  ps4PrivacyGuardImagePath:
  ps4NPtitleDatPath:
  ps4RemotePlayKeyAssignment: -1
  ps4RemotePlayKeyMappingDir:
  ps4EnterButtonAssignment: 1
  ps4ApplicationParam1: 0
  ps4ApplicationParam2: 0
  ps4ApplicationParam3: 0
  ps4ApplicationParam4: 0
  ps4DownloadDataSize: 0
  ps4GarlicHeapSize: 2048
  ps4Passcode: PN2qmWqBlQ9wQj99nsQzldVI5ZuGXbEW
  ps4UseDebugIl2cppLibs: 0
  ps4pnSessions: 1
  ps4pnPresence: 1
  ps4pnFriends: 1
  ps4pnGameCustomData: 1
  playerPrefsSupport: 0
  ps4ReprojectionSupport: 0
  ps4UseAudio3dBackend: 0
  ps4SocialScreenEnabled: 0
  ps4Audio3dVirtualSpeakerCount: 14
  ps4attribCpuUsage: 0
  ps4PatchPkgPath:
  ps4PatchLatestPkgPath:
  ps4PatchChangeinfoPath:
  ps4attribUserManagement: 0
  ps4attribMoveSupport: 0
  ps4attrib3DSupport: 0
  ps4attribShareSupport: 0
  ps4disableAutoHideSplash: 0
  ps4IncludedModules: []
  monoEnv:
  psp2Splashimage: {fileID: 0}
  psp2NPTrophyPackPath:
  psp2NPSupportGBMorGJP: 0
  psp2NPAgeRating: 12
  psp2NPTitleDatPath:
  psp2NPCommsID:
  psp2NPCommunicationsID:
  psp2NPCommsPassphrase:
  psp2NPCommsSig:
  psp2ParamSfxPath:
  psp2ManualPath:
  psp2LiveAreaGatePath:
  psp2LiveAreaBackroundPath:
  psp2LiveAreaPath:
  psp2LiveAreaTrialPath:
  psp2PatchChangeInfoPath:
  psp2PatchOriginalPackage:
  psp2PackagePassword: RK5RhRXdCdG5nG5azdNMK66MuCV6GXi5
  psp2KeystoneFile:
  psp2MemoryExpansionMode: 0
  psp2DRMType: 0
  psp2StorageType: 0
  psp2MediaCapacity: 0
  psp2DLCConfigPath:
  psp2ThumbnailPath:
  psp2BackgroundPath:
  psp2SoundPath:
  psp2TrophyCommId:
  psp2TrophyPackagePath:
  psp2PackagedResourcesPath:
  psp2SaveDataQuota: 10240
  psp2ParentalLevel: 1
  psp2ShortTitle: Not Set
  psp2ContentID: IV0000-ABCD12345_00-0123456789ABCDEF
  psp2Category: 0
  psp2MasterVersion: 01.00
  psp2AppVersion: 01.00
  psp2TVBootMode: 0
  psp2EnterButtonAssignment: 2
  psp2TVDisableEmu: 0
  psp2AllowTwitterDialog: 1
  psp2Upgradable: 0
  psp2HealthWarning: 0
  psp2UseLibLocation: 0
  psp2InfoBarOnStartup: 0
  psp2InfoBarColor: 0
  psp2UseDebugIl2cppLibs: 0
  psmSplashimage: {fileID: 0}
  spritePackerPolicy:
  scriptingDefineSymbols: {}
  metroPackageName: KinoDatamosh
  metroPackageVersion:
  metroCertificatePath:
  metroCertificatePassword:
  metroCertificateSubject:
  metroCertificateIssuer:
  metroCertificateNotAfter: 0000000000000000
  metroApplicationDescription: KinoDatamosh
  wsaImages: {}
  metroTileShortName:
  metroCommandLineArgsFile:
  metroTileShowName: 0
  metroMediumTileShowName: 0
  metroLargeTileShowName: 0
  metroWideTileShowName: 0
  metroDefaultTileSize: 1
  metroTileForegroundText: 1
  metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0}
  metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628,
    a: 1}
  metroSplashScreenUseBackgroundColor: 0
  platformCapabilities: {}
  metroFTAName:
  metroFTAFileTypes: []
  metroProtocolName:
  metroCompilationOverrides: 1
  tizenProductDescription:
  tizenProductURL:
  tizenSigningProfileName:
  tizenGPSPermissions: 0
  tizenMicrophonePermissions: 0
  n3dsUseExtSaveData: 0
  n3dsCompressStaticMem: 1
  n3dsExtSaveDataNumber: 0x12345
  n3dsStackSize: 131072
  n3dsTargetPlatform: 2
  n3dsRegion: 7
  n3dsMediaSize: 0
  n3dsLogoStyle: 3
  n3dsTitle: GameName
  n3dsProductCode:
  n3dsApplicationId: 0xFF3FF
  stvDeviceAddress:
  stvProductDescription:
  stvProductAuthor:
  stvProductAuthorEmail:
  stvProductLink:
  stvProductCategory: 0
  XboxOneProductId:
  XboxOneUpdateKey:
  XboxOneSandboxId:
  XboxOneContentId:
  XboxOneTitleId:
  XboxOneSCId:
  XboxOneGameOsOverridePath:
  XboxOnePackagingOverridePath:
  XboxOneAppManifestOverridePath:
  XboxOnePackageEncryption: 0
  XboxOnePackageUpdateGranularity: 2
  XboxOneDescription:
  XboxOneIsContentPackage: 0
  XboxOneEnableGPUVariability: 0
  XboxOneSockets: {}
  XboxOneSplashScreen: {fileID: 0}
  XboxOneAllowedProductIds: []
  XboxOnePersistentLocalStorageSize: 0
  intPropertyNames:
  - Standalone::ScriptingBackend
  - WebGL::ScriptingBackend
  - WebGL::audioCompressionFormat
  - WebGL::exceptionSupport
  - WebGL::memorySize
  - WebPlayer::ScriptingBackend
  - iOS::Architecture
  - iOS::EnableIncrementalBuildSupportForIl2cpp
  - iOS::ScriptingBackend
  Standalone::ScriptingBackend: 0
  WebGL::ScriptingBackend: 1
  WebGL::audioCompressionFormat: 4
  WebGL::exceptionSupport: 1
  WebGL::memorySize: 256
  WebPlayer::ScriptingBackend: 0
  iOS::Architecture: 2
  iOS::EnableIncrementalBuildSupportForIl2cpp: 1
  iOS::ScriptingBackend: 1
  boolPropertyNames:
  - Android::VR::enable
  - Metro::VR::enable
  - N3DS::VR::enable
  - PS3::VR::enable
  - PS4::VR::enable
  - PSM::VR::enable
  - PSP2::VR::enable
  - SamsungTV::VR::enable
  - Standalone::VR::enable
  - Tizen::VR::enable
  - WebGL::VR::enable
  - WebGL::analyzeBuildSize
  - WebGL::dataCaching
  - WebGL::useEmbeddedResources
  - WebPlayer::VR::enable
  - WiiU::VR::enable
  - Xbox360::VR::enable
  - XboxOne::VR::enable
  - XboxOne::enus
  - iOS::VR::enable
  - tvOS::VR::enable
  Android::VR::enable: 0
  Metro::VR::enable: 0
  N3DS::VR::enable: 0
  PS3::VR::enable: 0
  PS4::VR::enable: 0
  PSM::VR::enable: 0
  PSP2::VR::enable: 0
  SamsungTV::VR::enable: 0
  Standalone::VR::enable: 0
  Tizen::VR::enable: 0
  WebGL::VR::enable: 0
  WebGL::analyzeBuildSize: 0
  WebGL::dataCaching: 0
  WebGL::useEmbeddedResources: 0
  WebPlayer::VR::enable: 0
  WiiU::VR::enable: 0
  Xbox360::VR::enable: 0
  XboxOne::VR::enable: 0
  XboxOne::enus: 1
  iOS::VR::enable: 0
  tvOS::VR::enable: 0
  stringPropertyNames:
  - Analytics_ServiceEnabled::Analytics_ServiceEnabled
  - Build_ServiceEnabled::Build_ServiceEnabled
  - Collab_ServiceEnabled::Collab_ServiceEnabled
  - ErrorHub_ServiceEnabled::ErrorHub_ServiceEnabled
  - Game_Performance_ServiceEnabled::Game_Performance_ServiceEnabled
  - Hub_ServiceEnabled::Hub_ServiceEnabled
  - Purchasing_ServiceEnabled::Purchasing_ServiceEnabled
  - UNet_ServiceEnabled::UNet_ServiceEnabled
  - Unity_Ads_ServiceEnabled::Unity_Ads_ServiceEnabled
  - WebGL::emscriptenArgs
  - WebGL::template
  - additionalIl2CppArgs::additionalIl2CppArgs
  Analytics_ServiceEnabled::Analytics_ServiceEnabled: False
  Build_ServiceEnabled::Build_ServiceEnabled: False
  Collab_ServiceEnabled::Collab_ServiceEnabled: False
  ErrorHub_ServiceEnabled::ErrorHub_ServiceEnabled: False
  Game_Performance_ServiceEnabled::Game_Performance_ServiceEnabled: False
  Hub_ServiceEnabled::Hub_ServiceEnabled: False
  Purchasing_ServiceEnabled::Purchasing_ServiceEnabled: False
  UNet_ServiceEnabled::UNet_ServiceEnabled: False
  Unity_Ads_ServiceEnabled::Unity_Ads_ServiceEnabled: False
  WebGL::emscriptenArgs:
  WebGL::template: APPLICATION:Default
  additionalIl2CppArgs::additionalIl2CppArgs:
  vectorPropertyNames:
  - Android::VR::enabledDevices
  - Metro::VR::enabledDevices
  - N3DS::VR::enabledDevices
  - PS3::VR::enabledDevices
  - PS4::VR::enabledDevices
  - PSM::VR::enabledDevices
  - PSP2::VR::enabledDevices
  - SamsungTV::VR::enabledDevices
  - Standalone::VR::enabledDevices
  - Tizen::VR::enabledDevices
  - WebGL::VR::enabledDevices
  - WebPlayer::VR::enabledDevices
  - WiiU::VR::enabledDevices
  - Xbox360::VR::enabledDevices
  - XboxOne::VR::enabledDevices
  - iOS::VR::enabledDevices
  - tvOS::VR::enabledDevices
  Android::VR::enabledDevices:
  - Oculus
  Metro::VR::enabledDevices: []
  N3DS::VR::enabledDevices: []
  PS3::VR::enabledDevices: []
  PS4::VR::enabledDevices:
  - PlayStationVR
  PSM::VR::enabledDevices: []
  PSP2::VR::enabledDevices: []
  SamsungTV::VR::enabledDevices: []
  Standalone::VR::enabledDevices:
  - Oculus
  Tizen::VR::enabledDevices: []
  WebGL::VR::enabledDevices: []
  WebPlayer::VR::enabledDevices: []
  WiiU::VR::enabledDevices: []
  Xbox360::VR::enabledDevices: []
  XboxOne::VR::enabledDevices: []
  iOS::VR::enabledDevices: []
  tvOS::VR::enabledDevices: []
  cloudProjectId:
  projectName:
  organizationId:
  cloudEnabled: 0


text:
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!310 &1
UnityConnectSettings:
  m_ObjectHideFlags: 0
  m_Enabled: 0
  m_TestMode: 0
  m_TestEventUrl:
  m_TestConfigUrl:
  CrashReportingSettings:
    m_EventUrl: https://perf-events.cloud.unity3d.com/api/events/crashes
    m_Enabled: 0
  UnityPurchasingSettings:
    m_Enabled: 0
    m_TestMode: 0
  UnityAnalyticsSettings:
    m_Enabled: 0
    m_InitializeOnStartup: 1
    m_TestMode: 0
    m_TestEventUrl:
    m_TestConfigUrl:


text:
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!149 &1
NetworkManager:
  m_ObjectHideFlags: 0
  m_DebugLevel: 0
  m_Sendrate: 15
  m_AssetToPrefab: {}


text:
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!19 &1
Physics2DSettings:
  m_ObjectHideFlags: 0
  serializedVersion: 2
  m_Gravity: {x: 0, y: -9.81}
  m_DefaultMaterial: {fileID: 0}
  m_VelocityIterations: 8
  m_PositionIterations: 3
  m_VelocityThreshold: 1
  m_MaxLinearCorrection: 0.2
  m_MaxAngularCorrection: 8
  m_MaxTranslationSpeed: 100
  m_MaxRotationSpeed: 360
  m_MinPenetrationForPenalty: 0.01
  m_BaumgarteScale: 0.2
  m_BaumgarteTimeOfImpactScale: 0.75
  m_TimeToSleep: 0.5
  m_LinearSleepTolerance: 0.01
  m_AngularSleepTolerance: 2
  m_QueriesHitTriggers: 1
  m_QueriesStartInColliders: 1
  m_ChangeStopsCallbacks: 0
  m_AlwaysShowColliders: 0
  m_ShowColliderSleep: 1
  m_ShowColliderContacts: 0
  m_ContactArrowScale: 0.2
  m_ColliderAwakeColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.7529412}
  m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432}
  m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745}
  m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff


text:
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!30 &1
GraphicsSettings:
  m_ObjectHideFlags: 0
  serializedVersion: 7
  m_Deferred:
    m_Mode: 1
    m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0}
  m_DeferredReflections:
    m_Mode: 1
    m_Shader: {fileID: 74, guid: 0000000000000000f000000000000000, type: 0}
  m_ScreenSpaceShadows:
    m_Mode: 1
    m_Shader: {fileID: 64, guid: 0000000000000000f000000000000000, type: 0}
  m_LegacyDeferred:
    m_Mode: 1
    m_Shader: {fileID: 63, guid: 0000000000000000f000000000000000, type: 0}
  m_DepthNormals:
    m_Mode: 1
    m_Shader: {fileID: 62, guid: 0000000000000000f000000000000000, type: 0}
  m_MotionVectors:
    m_Mode: 1
    m_Shader: {fileID: 75, guid: 0000000000000000f000000000000000, type: 0}
  m_LightHalo:
    m_Mode: 1
    m_Shader: {fileID: 105, guid: 0000000000000000f000000000000000, type: 0}
  m_LensFlare:
    m_Mode: 1
    m_Shader: {fileID: 102, guid: 0000000000000000f000000000000000, type: 0}
  m_AlwaysIncludedShaders:
  - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0}
  - {fileID: 15104, guid: 0000000000000000f000000000000000, type: 0}
  - {fileID: 15105, guid: 0000000000000000f000000000000000, type: 0}
  - {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0}
  - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0}
  - {fileID: 10782, guid: 0000000000000000f000000000000000, type: 0}
  m_PreloadedShaders: []
  m_ShaderSettings_Tier1:
    useCascadedShadowMaps: 1
    useSinglePassStereoRendering: 0
    standardShaderQuality: 2
    useReflectionProbeBoxProjection: 1
    useReflectionProbeBlending: 1
  m_ShaderSettings_Tier2:
    useCascadedShadowMaps: 1
    useSinglePassStereoRendering: 0
    standardShaderQuality: 2
    useReflectionProbeBoxProjection: 1
    useReflectionProbeBlending: 1
  m_ShaderSettings_Tier3:
    useCascadedShadowMaps: 1
    useSinglePassStereoRendering: 0
    standardShaderQuality: 2
    useReflectionProbeBoxProjection: 1
    useReflectionProbeBlending: 1
  m_BuildTargetShaderSettings: []
  m_LightmapStripping: 0
  m_FogStripping: 0
  m_LightmapKeepPlain: 1
  m_LightmapKeepDirCombined: 1
  m_LightmapKeepDirSeparate: 1
  m_LightmapKeepDynamicPlain: 1
  m_LightmapKeepDynamicDirCombined: 1
  m_LightmapKeepDynamicDirSeparate: 1
  m_FogKeepLinear: 1
  m_FogKeepExp: 1
  m_FogKeepExp2: 1


text:
m_EditorVersion: 5.4.0b20
m_StandardAssetsVersion: 0


text:
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!55 &1
PhysicsManager:
  m_ObjectHideFlags: 0
  serializedVersion: 2
  m_Gravity: {x: 0, y: -9.81, z: 0}
  m_DefaultMaterial: {fileID: 13400000, guid: 49cb04b59209140ab87cba7e56b178e1, type: 2}
  m_BounceThreshold: 2
  m_SleepThreshold: 0.005
  m_DefaultContactOffset: 0.01
  m_SolverIterationCount: 6
  m_SolverVelocityIterations: 1
  m_QueriesHitTriggers: 1
  m_EnableAdaptiveForce: 0
  m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff


text:
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!292 &1
UnityAdsSettings:
  m_ObjectHideFlags: 0
  m_Enabled: 0
  m_InitializeOnStartup: 1
  m_TestMode: 0
  m_EnabledPlatforms: 4294967295
  m_IosGameId:
  m_AndroidGameId:


text:
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!11 &1
AudioManager:
  m_ObjectHideFlags: 0
  m_Volume: 1
  Rolloff Scale: 1
  Doppler Factor: 1
  Default Speaker Mode: 2
  m_SampleRate: 0
  m_DSPBufferSize: 0
  m_VirtualVoiceCount: 512
  m_RealVoiceCount: 32
  m_SpatializerPlugin:
  m_DisableAudio: 0
  m_VirtualizeEffects: 1


text:
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!47 &1
QualitySettings:
  m_ObjectHideFlags: 0
  serializedVersion: 5
  m_CurrentQuality: 0
  m_QualitySettings:
  - serializedVersion: 2
    name: Good
    pixelLightCount: 2
    shadows: 2
    shadowResolution: 1
    shadowProjection: 1
    shadowCascades: 2
    shadowDistance: 10
    shadowNearPlaneOffset: 2
    shadowCascade2Split: 0.33333334
    shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
    blendWeights: 2
    textureQuality: 0
    anisotropicTextures: 1
    antiAliasing: 0
    softParticles: 0
    softVegetation: 1
    realtimeReflectionProbes: 1
    billboardsFaceCameraPosition: 1
    vSyncCount: 1
    lodBias: 1
    maximumLODLevel: 0
    particleRaycastBudget: 256
    asyncUploadTimeSlice: 2
    asyncUploadBufferSize: 4
    excludedTargetPlatforms: []
  m_PerPlatformDefaultQuality:
    Android: 0
    Nintendo 3DS: 0
    PS3: 0
    PS4: 0
    PSM: 0
    PSP2: 0
    Samsung TV: 0
    Standalone: 0
    Tizen: 0
    Web: 0
    WebGL: 0
    WiiU: 0
    Windows Store Apps: 0
    XBOX360: 0
    XboxOne: 0
    iPhone: 0
    tvOS: 0


text:
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!126 &1
NavMeshAreas:
  m_ObjectHideFlags: 0
  serializedVersion: 2
  areas:
  - name: Walkable
    cost: 1
  - name: Not Walkable
    cost: 1
  - name: Jump
    cost: 2
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1


text:
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!159 &1
EditorSettings:
  m_ObjectHideFlags: 0
  serializedVersion: 3
  m_ExternalVersionControlSupport: Visible Meta Files
  m_SerializationMode: 2
  m_WebSecurityEmulationEnabled: 0
  m_WebSecurityEmulationHostUrl: http://www.mydomain.com/mygame.unity3d
  m_DefaultBehaviorMode: 0
  m_SpritePackerMode: 2
  m_SpritePackerPaddingPower: 1
  m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd
  m_ProjectGenerationRootNamespace:


text:
fileFormatVersion: 2
guid: 96d6f0c23b5b349a39907f19574573ef
folderAsset: yes
timeCreated: 1435811145
licenseType: Pro
DefaultImporter:
  userData:
  assetBundleName:
  assetBundleVariant: