Full Code of SilentByte/selfie2anime-site for AI

master 88186d7d8ac1 cached
45 files
173.8 KB
40.0k tokens
15 symbols
1 requests
Download .txt
Repository: SilentByte/selfie2anime-site
Branch: master
Commit: 88186d7d8ac1
Files: 45
Total size: 173.8 KB

Directory structure:
gitextract_zizv086x/

├── .browserslistrc
├── .gitignore
├── .gitmodules
├── LICENSE.txt
├── README.md
├── babel.config.js
├── build-portfolio.js
├── buildspec.yml
├── cdk/
│   ├── .gitignore
│   ├── .npmignore
│   ├── README.md
│   ├── bin/
│   │   └── cdk.ts
│   ├── cdk.json
│   ├── lib/
│   │   └── cdk-stack.ts
│   ├── package.json
│   └── tsconfig.json
├── package.json
├── postcss.config.js
├── public/
│   ├── 9593990f27faca6931121a16d4131090.html
│   ├── ads.txt
│   ├── email/
│   │   └── index.html
│   ├── gen/
│   │   └── .gitkeep
│   ├── index.html
│   ├── privacy/
│   │   └── index.html
│   ├── self-sitemap.xml
│   ├── sitemap.xml
│   ├── terms/
│   │   └── index.html
│   └── vendor/
│       └── magnific-popup.css
├── public_assets/
│   └── md/
│       ├── privacy.md
│       └── terms.md
├── src/
│   ├── App.vue
│   ├── components/
│   │   ├── Cropper.vue
│   │   └── PhotoUploader.vue
│   ├── gen/
│   │   └── .gitkeep
│   ├── i18n.ts
│   ├── main.ts
│   ├── router.ts
│   ├── shims-tsx.d.ts
│   ├── shims-vendor.d.ts
│   ├── shims-vue.d.ts
│   ├── vendor/
│   │   └── creative.js
│   └── views/
│       └── Home.vue
├── tsconfig.json
├── tslint.json
└── vue.config.js

================================================
FILE CONTENTS
================================================

================================================
FILE: .browserslistrc
================================================
> 1%
last 2 versions


================================================
FILE: .gitignore
================================================
.idea/
.vscode/

node_modules/
dist/

src/gen/*.gen.*
public/**/*.gen.*

.env.local
.env.*.local


================================================
FILE: .gitmodules
================================================
[submodule "blog"]
	path = blog
	url = git@github.com:SilentByte/selfie2anime-blog.git


================================================
FILE: LICENSE.txt
================================================
MIT License

Copyright (c) 2019 SilentByte <https://www.silentbyte.com/>

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================

![Selfie2Anime](s2a.png) 

[![Selfie2Anime](https://img.shields.io/badge/app-selfie2anime-f06292.svg?style=for-the-badge)](https://selfie2anime.com)&nbsp;
[![Version](https://img.shields.io/badge/version-1.0-05A5CC.svg?style=for-the-badge)](https://selfie2anime.com)&nbsp;
[![Status](https://img.shields.io/badge/status-live-00B20E.svg?style=for-the-badge)](https://selfie2anime.com)

# Selfie2Anime

*What do YOU look like in ANIME?*

This repository contains the source code for the [selfie2anime.com](https://selfie2anime.com) website. Upload a selfie and find out what you look like as an anime character!


# How Does it Work?

Using machine learning techniques combined with a [Generative Adversarial Network (GAN)](https://en.wikipedia.org/wiki/Generative_adversarial_network) makes it possible to generate anime-style characters based on real people. With this website, you can generate your own anime alter ego!

The GAN we are using is based on original work by *Junho Kim*, *Minjae Kim*, *Hyeonwoo Kang*, and *Kwanghee Lee*. More information can be found in their awesome repository, which is [available here](https://github.com/taki0112/UGATIT), or in [their research paper](https://arxiv.org/abs/1907.10830).


# Sample Photos

Recent anime selfies are being published on Twitter [@RicoBeti](https://twitter.com/RicoBeti).

### Here is a bunch of images that have been generated...

![Preview](wall.jpg)


### ...and here are some of Australia's Prime Ministers

![Preview](pms.png)


# Development
![AWS BAdge](https://codebuild.us-east-1.amazonaws.com/badges?uuid=eyJlbmNyeXB0ZWREYXRhIjoiZWJIeXI2TzlGWmx1eEc3dzJicFFEZ0FnZVpUK2U4LzZDeVQ2V0JhZE84bkZKK1BpQiswbG93OXlWUE96dnI1UVJzL3hucCtham43bHQrT3VDN3lmVHdnPSIsIml2UGFyYW1ldGVyU3BlYyI6IlkwbTJscTNWUlBiMEsrWTkiLCJtYXRlcmlhbFNldFNlcmlhbCI6MX0%3D&branch=master)

*(More detailed instructions will follow later)*

*   Install dependencies:
    ```bash
    npm install
    ```
    
*   Pull submodules (the blog):
    ```bash
    git submodule update --init --recursive
    ```

*   Set correct values for environment variables in the `.env` files.

*   Run a quick build to generate all assets needed for development:
    ```bash
    DISABLE_IMAGE_OPTIMIZATION=1 npm run build
    ```

*   Run development server:
    ```bash
    npm run serve
    ```
    
*   Alternatively, build the release version:
    ```bash
    npm run build
    ```
    
    Building a release version may take a long time due to generation of the portfolio and due to image optimizations being performed. In case the portfolio has not changed, set `DISABLE_PORTFOLIO_BUILD=1` to suppress regeneration of the images.
    
    For development and testing, set `DISABLE_IMAGE_OPTIMIZATION=1` to avoid wasting time on image compression.


# License

MIT, see [LICENSE.txt](LICENSE.txt).


================================================
FILE: babel.config.js
================================================
module.exports = {
    presets: [
        "@vue/app",
    ],
};


================================================
FILE: build-portfolio.js
================================================
/**
 * Selfie2Anime <https://selfie2anime.com>
 * Copyright (c) 2019 by SilentByte <https://www.silentbyte.com/>
 */

// Builds portfolio images and generates composites for the portfolio lightbox.

const fs = require("fs").promises;
const path = require("path");
const crypto = require("crypto");
const glob = require("glob");
const del = require("del");
const fx = require("mkdir-recursive");
const Jimp = require("jimp");
const guetzli = require("imagemin-guetzli");

const PORTFOLIO_SRC_DIR = "./public_assets/portfolio/";
const PORTFOLIO_DST_DIR = "./public/gen/portfolio/";
const PORTFOLIO_TREE_DST_DIR = "./src/gen/portfolio-tree.gen.json";

const COMPOSITE_SIZE = 256;
const PORTFOLIO_SIZE = 160;

const QUALITY = 90;

function sha1(buffer) {
    const hash = crypto.createHash("sha1");
    hash.update(buffer);
    return hash.digest("hex");
}

function rgbToCssHex(r, g, b) {
    return "#" + r.toString(16).padStart(2, "0")
        + g.toString(16).padStart(2, "0")
        + b.toString(16).padStart(2, "0");
}

async function generate() {
    fx.mkdirSync(PORTFOLIO_DST_DIR, undefined);
    del.sync(path.join(PORTFOLIO_DST_DIR, "*.gen.jpg"));

    const dirs = glob.sync(path.join(PORTFOLIO_SRC_DIR, "*"));
    const font = await Jimp.loadFont(Jimp.FONT_SANS_16_WHITE);
    const box = new Jimp(135, 40, "#000000aa");

    let counter = 0;
    const portfolioTree = [];
    for(const filename of dirs) {
        let progress = ++counter / dirs.length * 100;
        console.log(`PROCESSING (${progress.toFixed(1).padStart(5)}%) ${filename}`);

        const compositeImage = new Jimp(COMPOSITE_SIZE * 2, COMPOSITE_SIZE);
        const [originalImage, ganImage] = await Promise.all([
            Jimp.read(path.join(filename, "original.jpg")),
            Jimp.read(path.join(filename, "gan.jpg")),
        ]);

        let [compositeBuffer, originalBuffer, ganBuffer] = await Promise.all([
            compositeImage
                .blit(new Jimp(originalImage).resize(COMPOSITE_SIZE, COMPOSITE_SIZE), 0, 0)
                .blit(new Jimp(ganImage).resize(COMPOSITE_SIZE, COMPOSITE_SIZE), COMPOSITE_SIZE, 0)
                .blit(box, 2 * COMPOSITE_SIZE - 135, COMPOSITE_SIZE - 18)
                .print(font, 2 * COMPOSITE_SIZE - 129, COMPOSITE_SIZE - 18, "selfie2anime.com")
                .getBufferAsync(Jimp.MIME_JPEG),
            originalImage
                .resize(PORTFOLIO_SIZE, PORTFOLIO_SIZE)
                .getBufferAsync(Jimp.MIME_JPEG),
            ganImage
                .resize(PORTFOLIO_SIZE, PORTFOLIO_SIZE)
                .getBufferAsync(Jimp.MIME_JPEG),
        ]);

        if(!process.env.DISABLE_IMAGE_OPTIMIZATION) {
            [compositeBuffer, originalBuffer, ganBuffer] = await Promise.all([
                guetzli({quality: QUALITY})(compositeBuffer),
                guetzli({quality: QUALITY})(originalBuffer),
                guetzli({quality: QUALITY})(ganBuffer),
            ]);
        }

        const originalSha1 = sha1(originalBuffer);
        const ganSha1 = sha1(ganBuffer);
        const compositeSha1 = sha1(compositeBuffer);

        const originalDst = path.join(PORTFOLIO_DST_DIR, originalSha1 + ".gen.jpg");
        const ganDst = path.join(PORTFOLIO_DST_DIR, ganSha1 + ".gen.jpg");
        const compositeDst = path.join(PORTFOLIO_DST_DIR, compositeSha1 + ".gen.jpg");

        await Promise.all([
            fs.writeFile(originalDst, originalBuffer),
            fs.writeFile(ganDst, ganBuffer),
            fs.writeFile(compositeDst, compositeBuffer),
        ]);

        const thumb = Jimp.intToRGBA(ganImage.resize(1, 1).getPixelColor(0, 0));
        portfolioTree.push({
            original: originalDst.replace("public/", ""),
            gan: ganDst.replace("public/", ""),
            composite: compositeDst.replace("public/", ""),
            size: PORTFOLIO_SIZE,
            thumb: rgbToCssHex(thumb.r, thumb.g, thumb.b),
        });
    }

    await fs.writeFile(PORTFOLIO_TREE_DST_DIR, JSON.stringify(portfolioTree, null, 4));
}

if(process.env.DISABLE_PORTFOLIO_BUILD) {
    console.log("SKIPPING PORTFOLIO BUILD");
} else {
    generate().then(() => {
        console.log("DONE");
    });
}


================================================
FILE: buildspec.yml
================================================
version: 0.2

phases:
  pre_build:
    commands:
      - npm install
  build:
    commands:
      - npm run build
  post_build:
    commands:
      - aws s3 sync "./dist/" s3://$S3_BUCKET --delete --acl public-read


================================================
FILE: cdk/.gitignore
================================================
*.js
*.d.ts
node_modules

# CDK asset staging directory
.cdk.staging
cdk.out


================================================
FILE: cdk/.npmignore
================================================
*.ts
!*.d.ts

# CDK asset staging directory
.cdk.staging
cdk.out


================================================
FILE: cdk/README.md
================================================
# Useful commands

- `npm run build` compile typescript to js
- `npm run watch` watch for changes and compile
- `cdk deploy` deploy this stack to your default AWS account/region
- `cdk diff` compare deployed stack with current state
- `cdk synth` emits the synthesized CloudFormation template


================================================
FILE: cdk/bin/cdk.ts
================================================
#!/usr/bin/env node
import cdk = require('@aws-cdk/core');
import { CdkStack } from '../lib/cdk-stack';

const app = new cdk.App();
new CdkStack(app, 'selfie2anime-stack');


================================================
FILE: cdk/cdk.json
================================================
{
  "app": "npx ts-node bin/cdk.ts"
}


================================================
FILE: cdk/lib/cdk-stack.ts
================================================
import cdk = require('@aws-cdk/core');
import codebuild = require("@aws-cdk/aws-codebuild");
import iam = require("@aws-cdk/aws-iam");

export class CdkStack extends cdk.Stack {
  constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // CloudWatch Log Read/Write Access
    const log_policy = new iam.PolicyStatement({
      actions: [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents",
      ],
      resources: [
        `arn:aws:logs:${cdk.Aws.REGION}:${cdk.Aws.ACCOUNT_ID}:/aws/codebuild/*`,
      ]
    });

    const s3_policy = new iam.PolicyStatement({
      actions: [
        "s3:*",
      ],
      resources: [
        "arn:aws:s3:::selfie2anime.com",
        "arn:aws:s3:::selfie2anime.com/*"
      ]
    });

    //
    // Source - (GitHub_Source)
    //
    const gitHubSource = codebuild.Source.gitHub({
      owner: "SilentByte",
      repo: "selfie2anime-site",
      reportBuildStatus: true
    });

    //
    // CodeBuild - Build
    //
    const buildProject = new codebuild.Project(this, "selfie2anime-build", {
      badge: true,
      projectName: "selfie2anime-build",
      buildSpec: codebuild.BuildSpec.fromSourceFilename("buildspec.yml"),
      source: gitHubSource,
      environment: {
        buildImage: codebuild.LinuxBuildImage.UBUNTU_14_04_NODEJS_10_14_1,
        environmentVariables: {
          S3_BUCKET: {
            type: codebuild.BuildEnvironmentVariableType.PLAINTEXT,
            value: "selfie2anime.com"
          }
        }
      },
    });
    buildProject.addToRolePolicy(log_policy);
    buildProject.addToRolePolicy(s3_policy);

  }
}


================================================
FILE: cdk/package.json
================================================
{
  "name": "cdk",
  "version": "0.1.0",
  "bin": {
    "cdk": "bin/cdk.js"
  },
  "scripts": {
    "build": "tsc",
    "watch": "tsc -w",
    "cdk": "cdk"
  },
  "devDependencies": {
    "@types/node": "8.10.45",
    "typescript": "^3.3.3333",
    "ts-node": "^8.1.0",
    "aws-cdk": "^1.4.0"
  },
  "dependencies": {
    "@aws-cdk/aws-codebuild": "^1.4.0",
    "@aws-cdk/aws-iam": "^1.4.0",
    "@aws-cdk/core": "^1.4.0"
  }
}


================================================
FILE: cdk/tsconfig.json
================================================
{
  "compilerOptions": {
    "target": "ES2018",
    "module": "commonjs",
    "lib": ["es2016", "es2017.object", "es2017.string"],
    "declaration": true,
    "strict": true,
    "noImplicitAny": true,
    "strictNullChecks": true,
    "noImplicitThis": true,
    "alwaysStrict": true,
    "noUnusedLocals": false,
    "noUnusedParameters": false,
    "noImplicitReturns": true,
    "noFallthroughCasesInSwitch": false,
    "inlineSourceMap": true,
    "inlineSources": true,
    "experimentalDecorators": true,
    "strictPropertyInitialization": false
  },
  "exclude": ["cdk.out"]
}


================================================
FILE: package.json
================================================
{
  "name": "selfie2anime-site",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "npm run build-blog && node build-portfolio.js && vue-cli-service build && cp -R blog/.deploy/dist dist/blog",
    "lint": "vue-cli-service lint",
    "build-blog": "git submodule update --init --recursive --remote && (cd blog; ./s2a.sh build)",
    "dev": "vue-cli-service serve",
    "i18n:report": "vue-cli-service i18n:report --src './src/**/*.?(js|vue)' --locales './src/locales/**/*.json'"
  },
  "dependencies": {
    "axios": "^0.19.2",
    "blueimp-load-image": "^2.23.0",
    "core-js": "^2.6.5",
    "croppr": "^2.3.1",
    "vue": "^2.6.10",
    "vue-class-component": "^7.0.2",
    "vue-i18n": "^8.0.0",
    "vue-property-decorator": "^8.1.0",
    "vue-router": "^3.0.3"
  },
  "devDependencies": {
    "@kazupon/vue-i18n-loader": "^0.3.0",
    "@types/blueimp-load-image": "^2.23.1",
    "@types/webpack": "^4.4.0",
    "@vue/cli-plugin-babel": "^3.10.0",
    "@vue/cli-plugin-typescript": "^3.10.0",
    "@vue/cli-service": "^4.1.1",
    "del": "^5.0.0",
    "glob": "^7.1.4",
    "imagemin": "^7.0.0",
    "imagemin-guetzli": "^2.0.0",
    "jimp": "^0.10.3",
    "mkdir-recursive": "^0.4.0",
    "sass": "^1.18.0",
    "sass-loader": "^7.1.0",
    "typescript": "^3.4.3",
    "vue-cli-plugin-i18n": "^0.6.0",
    "vue-template-compiler": "^2.6.10",
    "yaml-loader": "^0.5.0"
  }
}


================================================
FILE: postcss.config.js
================================================
module.exports = {
    plugins: {
        autoprefixer: {},
    },
};


================================================
FILE: public/9593990f27faca6931121a16d4131090.html
================================================
site-verification: 9593990f27faca6931121a16d4131090

================================================
FILE: public/ads.txt
================================================
google.com, pub-9169830803956537, DIRECT, f08c47fec0942fa0

================================================
FILE: public/email/index.html
================================================
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <meta property="og:url" content="{{viewer_url_escaped}}" />
    <meta property="og:type" content="website" />
    <meta property="og:title" content="Selfie2Anime | It's Me!" />
    <meta property="og:description" content="What do YOU look like in Anime?" />
    <meta property="og:image" content="{{image_url_escaped}}" />

    <link rel="image_src" type="image/jpg" href="{{image_url_escaped}}" />

    <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
    <script>
        (adsbygoogle = window.adsbygoogle || []).push({
            google_ad_client: "ca-pub-9169830803956537",
            enable_page_level_ads: true,
        });
    </script>

    <script async src="https://www.googletagmanager.com/gtag/js?id=UA-71336829-28"></script>
    <script>
        window.dataLayer = window.dataLayer || [];

        function gtag() {
            dataLayer.push(arguments);
        }

        gtag("js", new Date());
        gtag("config", "UA-71336829-28");
    </script>

    <link rel="icon" href="https://selfie2anime.com/favicon.ico">
    <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Merriweather+Sans:400,400i,700,700i">
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css">

    <title>Selfie2Anime | It's Me!</title>
    <style>
        * {
            -ms-text-size-adjust: 100%;
            -webkit-text-size-adjust: 100%;
        }

        html,
        body {
            margin: 0 auto !important;
            padding: 0 !important;
            height: 100% !important;
            width: 100% !important;
            background: #f1f1f1;
        }

        div[style*="margin: 16px 0"] {
            margin: 0 !important;
        }

        table,
        td {
            mso-table-lspace: 0 !important;
            mso-table-rspace: 0 !important;
        }

        table {
            border-spacing: 0 !important;
            border-collapse: collapse !important;
            table-layout: fixed !important;
            margin: 0 auto !important;
        }

        img {
            -ms-interpolation-mode: bicubic;
        }

        a {
            text-decoration: none;
        }

        .bg_primary {
            background: #f06292;
        }

        .text_primary {
            color: #f06292;
            font-weight: bold;
        }

        .bg_white {
            background: #fff;
        }

        .bg_dark {
            background: rgba(0, 0, 0, .8);
        }

        .email-section {
            padding: 2.5em;
        }

        h1,
        h2 {
            font-family: 'Merriweather Sans', sans-serif;
            color: #000;
            margin-top: 0;
        }

        body {
            font-family: 'Merriweather Sans', sans-serif;
            font-weight: 400;
            font-size: 18px;
            line-height: 1.8;
            color: rgba(0, 0, 0, .7);
        }

        a {
            color: #f06292;
            font-weight: bold;
        }

        .logo h1 {
            margin: 0;
        }

        .logo h1 a {
            color: #000;
            font-size: 24px;
            font-weight: 700;
            text-transform: uppercase;
            font-family: 'Merriweather Sans', sans-serif;
        }

        .navigation li {
            list-style: none;
            display: inline-block;
            margin-left: 5px;
            font-size: 12px;
            font-weight: 700;
            text-transform: uppercase;
        }

        .navigation li a {
            color: rgba(0, 0, 0, .6);
        }

        .heading-section h2 {
            color: #000;
            font-size: 28px;
            margin-top: 0;
            line-height: 1.4;
            font-weight: 700;
        }

        .heading-section .subheading {
            margin-bottom: 20px !important;
            display: inline-block;
            font-size: 13px;
            text-transform: uppercase;
            letter-spacing: 2px;
            color: rgba(0, 0, 0, .4);
            position: relative;
        }

        .heading-section .subheading::after {
            position: absolute;
            left: 0;
            right: 0;
            bottom: -10px;
            content: '';
            width: 100%;
            height: 2px;
            background: #f5564e;
            margin: 0 auto;
        }

        .heading-section-white {
            color: rgba(255, 255, 255, .8);
        }

        .heading-section-white h2 {
            line-height: 1em;
            padding-bottom: 0;
        }

        .heading-section-white h2 {
            color: #fff;
        }

        .heading-section-white .subheading {
            margin-bottom: 0;
            display: inline-block;
            font-size: 13px;
            text-transform: uppercase;
            letter-spacing: 2px;
            color: rgba(255, 255, 255, .4);
        }

        .spinner-container {
            position: absolute;
            display: flex;
            flex-direction: row;
            flex-wrap: wrap;
            width: 100%;
            height: 100%;
            justify-content: center;
            align-items: center;
            background-color: rgba(240, 98, 146, 0.5);
        }

        .spinner {
            border: 10px solid #fff;
            border-top: 10px solid transparent;
            border-radius: 50%;
            width: 50px;
            height: 50px;
            animation: spinner 2s both infinite;
        }

        @keyframes spinner {
            0% {
                transform: rotate(0deg);
            }

            100% {
                transform: rotate(360deg);
            }
        }
    </style>
</head>

<body width="100%" style="margin: 0; padding: 0 !important; mso-line-height-rule: exactly; background-color: #222;">
    <center style="width: 100%; background-color: #f1f1f1;">
        <div style="max-width: 600px; margin: 0 auto;" class="email-container">
            <table align="center" role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%"
                style="margin: auto;">
                <tr>
                    <td valign="top" class="bg_white" style="padding: 1em 2.5em;">
                        <table role="presentation" border="0" cellpadding="0" cellspacing="0" width="100%">
                            <tr>
                                <td width="60%" class="logo" style="text-align: left;">
                                    <h1>
                                        <a href="https://selfie2anime.com">
                                            Selfie<span class="text_primary">2</span>Anime&nbsp;<span
                                                class="text_primary">アニメ</span>
                                        </a>
                                    </h1>
                                </td>
                                <td width="40%" class="logo" style="text-align: right;">
                                    <a href="https://www.facebook.com/sharer/sharer.php?u={{viewer_url_escaped}}">
                                        <img width="32" height="32" src="https://selfie2anime.com/email/facebook.png"
                                            alt="Share on Facebook">
                                    </a>
                                    <a href="https://twitter.com/intent/tweet?url={{viewer_url_escaped}}&text=Hey, this is me as an anime character!&hashtags=selfie2anime"
                                        target="_blank">
                                        <img width="32" height="32" src="https://selfie2anime.com/email/twitter.png"
                                            alt="Share on Twitter">
                                    </a>
                                </td>
                            </tr>
                        </table>
                    </td>
                </tr>
                <tr>
                    <td valign="middle" class="bg_primary" style="line-height: 0; position: relative;">
                        <div id="spinner-container" class="spinner-container">
                            <div id="spinner" class="spinner"></div>
                            <div id="error"
                                style="display: none; color: white; font-size: 20pt; line-height: 1.5em; text-align: center;">
                                <b>Oh No! There was an error!<br> Please try again.</b>
                            </div>
                        </div>
                        <a href="https://selfie2anime.com/" title="Create your own selfie!">
                            <img id="selfie" width="600" height="600" src="https://selfie2anime.com/email/frame.jpg" alt="Your Anime Selfie!"
                                style="max-width: 100%; height: auto">
                        </a>
                    </td>
                </tr>
                <tr>
                    <td class="bg_white email-section">
                        <div class="heading-section" style="text-align: center; padding: 0 30px;">
                            <h2>Enjoying Your Selfie?</h2>
                            <p><b>Share it</b> on social media and <a href="https://selfie2anime.com/">create your
                                    own!</a></p>
                        </div>
                        <table width="50%">
                            <tr>
                                <td>
                                    <div class="text" style="text-align: center">
                                        <a href="https://www.facebook.com/sharer/sharer.php?u={{viewer_url_escaped}}">
                                            <img width="64" height="64"
                                                src="https://selfie2anime.com/email/facebook.png"
                                                alt="Share on Facebook">
                                        </a>
                                    </div>
                                </td>
                                <td>
                                    <div class="text" style="text-align: center">
                                        <a href="https://twitter.com/intent/tweet?url={{viewer_url_escaped}}&text=Hey, this is me as an anime character!&hashtags=selfie2anime"
                                            target="_blank">
                                            <img width="64" height="64" src="https://selfie2anime.com/email/twitter.png"
                                                alt="Share on Twitter">
                                        </a>
                                    </div>
                                </td>
                            </tr>
                        </table>
                    </td>
                </tr>
                <tr>
                    <td valign="middle" class="bg_primary"
                        style="background-image: url(https://selfie2anime.com/email/wall.jpg); background-size: cover; height: 480px;">
                    </td>
                </tr>
                <tr>
                    <td class="bg_dark email-section" style="text-align:center;">
                        <div class="heading-section heading-section-white">
                            <p>
                                Copyright &copy; 2019-2020 by
                                <a href="https://selfie2anime.com">Selfie2Anime.com</a>
                            </p>
                        </div>
                    </td>
                </tr>
            </table>
        </div>
    </center>
    <script>
        const FRAME_URL = "https://selfie2anime.com/email/frame.jpg";
        const SELFIE_URL = "{{image_url_escaped}}";

        function fetchImage(url) {
            return new Promise((resolve, reject) => {
                const image = new Image();
                image.crossOrigin = "anonymous";
                image.onerror = () => reject(new Error("Failed to load frame/selfie"));
                image.onload = () => resolve(image);
                image.src = url;
            });
        }

        function generateFrame() {
            const canvas = window.document.createElement("canvas");
            const frameImage = fetchImage(FRAME_URL);
            const selfieImage = fetchImage(SELFIE_URL);

            const context = canvas.getContext("2d");
            Promise.all([frameImage, selfieImage])
                .then(images => {
                    canvas.width = 600;
                    canvas.height = 600;

                    context.drawImage(images[0], 0, 0, 600, 600);
                    context.drawImage(images[1], 93, 113, 407, 407);

                    document.getElementById("selfie").src = canvas.toDataURL("image/jpeg", 1.0);
                    document.getElementById("spinner-container").style.display = "none";
                })
                .catch(() => {
                    document.getElementById("spinner").style.display = "none";
                    document.getElementById("error").style.display = "inline";
                });
        }

        window.addEventListener("load", function () {
            generateFrame();
        });
    </script>
</body>

</html>


================================================
FILE: public/gen/.gitkeep
================================================


================================================
FILE: public/index.html
================================================
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <meta property="og:url" content="https://selfie2anime.com" />
    <meta property="og:type" content="website" />
    <meta property="og:title" content="Selfie2Anime" />

    <meta property="og:description" content="What do YOU look like in Anime?" />
    <meta property="og:image" content="https://selfie2anime.com/og.jpg" />
    <link rel="image_src" type="image/png" href="https://selfie2anime.com/og.jpg" />

    <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>

    <script>
        (adsbygoogle = window.adsbygoogle || []).push({
            google_ad_client: "<%= VUE_APP_ADSENSE_CODE %>",
            enable_page_level_ads: true,
        });
    </script>
    <script async src="https://www.googletagmanager.com/gtag/js?id=UA-71336829-28"></script>
    <script>
        window.dataLayer = window.dataLayer || [];

        function gtag() {
            dataLayer.push(arguments);
        }

        gtag("js", new Date());
        gtag("config", "<%= VUE_APP_ANALYTICS_CODE %>");
    </script>
    <script async src="https://platform.twitter.com/widgets.js"></script>

    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Merriweather+Sans:400,400i,700,700i">
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/magnific-popup.js/1.1.0/magnific-popup.min.css"
          integrity="sha256-PZLhE6wwMbg4AB3d35ZdBF9HD/dI/y4RazA3iRDurss="
          crossorigin="anonymous" />
    <link rel="stylesheet" href="./vendor/creative.min.css">

    <title>Selfie2Anime</title>
</head>
<body>
    <noscript>
        Oh Noes! JavaScript is required for this site! :-(
    </noscript>
    <div id="app"></div>

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.bundle.min.js"
            integrity="sha384-xrRywqdh3PHs8keKZN+8zzc5TX0GRTLCcmivcbNJWm2rs5C8PRhcEn3czEjhAO9o"
            crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-easing/1.4.1/jquery.easing.min.js"
            integrity="sha256-H3cjtrm/ztDeuhCN9I4yh4iN2Ybx/y1RM7rMmAesA0k="
            crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/magnific-popup.js/1.1.0/jquery.magnific-popup.min.js"
            integrity="sha256-P93G0oq6PBPWTP1IR8Mz/0jHHUpaWL0aBJTKauisG7Q="
            crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/lazyload@2.0.0-rc.2/lazyload.min.js"
            integrity="sha256-WzuqEKxV9O7ODH5mbq3dUYcrjOknNnFia8zOyPhurXg="
            crossorigin="anonymous"></script>
</body>
</html>


================================================
FILE: public/privacy/index.html
================================================
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <meta property="og:url" content="https://selfie2anime.com" />
    <meta property="og:type" content="website" />
    <meta property="og:title" content="Selfie2Anime" />

    <meta property="og:description" content="What do YOU look like in Anime?" />
    <meta property="og:image" content="https://selfie2anime.com/og.jpg" />
    <link rel="image_src" type="image/png" href="https://selfie2anime.com/og.jpg" />

    <script async src="https://www.googletagmanager.com/gtag/js?id=UA-71336829-28"></script>
    <script>
        window.dataLayer = window.dataLayer || [];

        function gtag() {
            dataLayer.push(arguments);
        }

        gtag("js", new Date());
        gtag("config", "UA-71336829-28");
    </script>

    <link rel="icon" href="https://selfie2anime.com/favicon.ico">
    <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Merriweather+Sans:400,400i,700,700i">

    <title>Privacy | Selfie2Anime</title>

    <style>
        body {
            margin: 1em 2em 1em 2em;
            font-family: "Merriweather Sans", sans-serif;
            font-size: 12pt;
            line-height: 1.5em;
        }

        @media (min-width: 1200px) {
            body {
                margin: 2em 3em 4em 3em;
                font-size: 18pt;
            }
        }

        @media (min-width: 1600px) {
            body {
                margin: 4em 12em 4em 12em;
            }
        }

        h1, h2 {
            text-transform: uppercase;
            color: #f06292;
        }

        h1 {
            font-size: 2em;
        }

        h2 {
            margin: 1.5em 0 0.5em 0;
            font-size: 1.5em;
        }

        ol ol {
            list-style-type: lower-roman;
        }

        a {
            color: #f06292;
            font-weight: bold;
            text-decoration: none;
        }

        .content {
            text-align: justify;
        }
    </style>
</head>
<body>
    <div class="content">
        <h1>PRIVACY POLICY</h1>
        <small>Effective Date: 22 August 2019</small>

        <ol>
            <li>
                <p>This Privacy Policy explains how we and some of the companies we work with collect, use, share and
                    protect information in relation to our mobile services, web site, and any software provided on or in
                    connection with Selfie2Anime services (collectively, the “Service”), and your choices about the
                    collection and use of your information.</p>
            </li>
            <li>
                <p>By using our Service, you understand and agree that we are providing a platform for you to process
                    your content.</p>
            </li>
            <li>
                <p>Our Policy applies to all visitors, users, and others who access the Service (“Users”).</p>
            </li>
        </ol>
        <h2>INFORMATION WE COLLECT</h2>
        <ol start="4">
            <li>
                <p>We collect the following types of information.</p>
            </li>
            <li>
                <p>Information you provide us directly:</p>
                <ol>
                    <li>User Content (e.g., photos and other materials) that you post through the Service.
                        Communications between you and Selfie2Anime. For example, we may send you Service-related emails
                        (e.g., changes/updates to features of the Service, technical and security notices). Note that
                        you may not opt out of Service-related e-mails.
                    </li>
                </ol>
            </li>
            <li>
                <p>Analytics information:</p>
                <ol>
                    <li>We use third-party analytics tools to help us measure traffic and usage trends for the Service.
                        These tools collect information sent by your device or our Service, including the web pages you
                        visit, add-ons, and other information that assists us in improving the Service. We collect and
                        use this analytics information with analytics information from other Users so that it cannot
                        reasonably be used to identify any individual User.
                    </li>
                </ol>
            </li>
            <li>
                <p>Cookies and similar technologies:</p>
                <ol>
                    <li>
                        <p>When you visit the Service, we may use cookies and similar technologies like pixels, web
                            beacons, and local storage to collect information about how you use Selfie2Anime and provide
                            features to you.</p>
                    </li>
                    <li>
                        <p>We may ask advertisers or other partners to serve ads or services to your devices, which may
                            use cookies or similar technologies placed by us or the third party.</p>
                    </li>
                </ol>
            </li>
            <li>
                <p>Log file information:</p>
                <ol>
                    <li>
                        <p>Log file information is automatically reported by your browser each time you make a request
                            to access (i.e., visit) a web page or app. It can also be provided when the content of the
                            webpage or app is downloaded to your browser or device.</p>
                    </li>
                    <li>
                        <p>When you use our Service, our servers automatically record certain log file information,
                            including your web request, Internet Protocol (“IP”) address, browser type, referring / exit
                            pages and URLs, number of clicks and how you interact with links on the Service, domain
                            names, landing pages, pages viewed, and other such information. We may also collect similar
                            information from emails sent to our Users which then help us track which emails are opened
                            and which links are clicked by recipients. The information allows for more accurate
                            reporting and improvement of the Service.</p>
                    </li>
                </ol>
            </li>
            <li>
                <p>Device identifiers:</p>
                <ol>
                    <li>
                        <p>When you use a mobile device like a tablet or phone to access our Service, we may access,
                            collect, monitor, store on your device, and/or remotely store one or more “device
                            identifiers”. Device identifiers are small data files or similar data structures stored on
                            or associated with your mobile device, which uniquely identify your mobile device. A device
                            identifier may be data stored in connection with the device hardware, data stored in
                            connection with the device’s operating system or other software, or data sent to the device
                            by Selfie2Anime.</p>
                    </li>
                    <li>
                        <p>A device identifier may deliver information to us or to a third-party partner about how you
                            browse and use the Service and may help us or others provide reports or personalized content
                            and ads. Some features of the Service may not function properly if use or availability of
                            device identifiers is impaired or disabled.</p>
                    </li>
                </ol>
            </li>
            <li>
                <p>Metadata:</p>
                <ol>
                    <li>
                        <p>Metadata is usually technical data that is associated with User Content. For example,
                            Metadata can describe how, when and by whom a piece of User Content was collected and how
                            that content is formatted.</p>
                    </li>
                    <li>
                        <p>Users can add or may have Metadata added to their User Content including a hashtag (e.g., to
                            mark keywords when you share a photo) or other data.</p>
                    </li>
                </ol>
            </li>
        </ol>
        <h2>HOW WE USE YOUR INFORMATION</h2>
        <ol start="11">
            <li>
                <p>In addition to some of the specific uses of information we describe in this Privacy Policy, we may
                    use information that we receive to:</p>
                <ol>
                    <li>
                        <p>provide personalized content and information to you and others, which could include online
                            ads or other forms of marketing</p>
                    </li>
                    <li>
                        <p>provide, improve, test, and monitor the effectiveness of our Service</p>
                    </li>
                    <li>
                        <p>develop and test new products and features</p>
                    </li>
                    <li>
                        <p>monitor metrics such as total number of visitors, traffic, and demographic patterns</p>
                    </li>
                    <li>
                        <p>diagnose or fix technology problems</p>
                    </li>
                    <li>
                        <p>automatically update the Selfie2Anime application on your device</p>
                    </li>
                </ol>
            </li>
        </ol>
        <h2>SHARING OF YOUR INFORMATION</h2>
        <ol start="12">
            <li>
                <p>We will not rent or sell your information to third parties outside Selfie2Anime (or the group of
                    companies of which Selfie2Anime is a part) without your consent, except as Parties with whom we may
                    share your information in this Policy.</p>
            </li>
            <li>
                <p>Parties with whom we may share your information:</p>
                <ol>
                    <li>
                        <p>We may share User Content and your information (including but not limited to, information
                            from cookies, log files, device identifiers, location data, and usage data) with businesses
                            that are legally part of the same group of companies that Selfie2Anime is part of, or that
                            become part of that group (“Affiliates”).</p>
                    </li>
                    <li>
                        <p>Affiliates may use this information to help provide, understand, and improve the Service
                            (including by providing analytics) and Affiliates’ own services (including by providing you
                            with better and more relevant experiences). But these Affiliates will honour the choices you
                            make about who can see your photos.</p>
                    </li>
                    <li>
                        <p>We also may share your information as well as information from tools like cookies, log files,
                            and device identifiers and location data, with third-party organizations that help us
                            provide the Service to you (“Service Providers”).</p>
                    </li>
                    <li>
                        <p>Our Service Providers will be given access to your information as is reasonably necessary to
                            provide the Service under reasonable confidentiality terms.</p>
                    </li>
                    <li>
                        <p>We may also share certain information such as cookie data with third-party advertising
                            partners. This information would allow third-party ad networks to, among other things,
                            deliver targeted advertisements that they believe will be of most interest to you.</p>
                    </li>
                    <li>
                        <p>We may remove parts of data that can identify you and share anonymized data with other
                            parties.</p>
                    </li>
                    <li>
                        <p>We may also combine your information with other information in a way that it is no longer
                            associated with you and share that aggregated information.</p>
                    </li>
                </ol>
            </li>
            <li>
                <p>Parties with whom you may choose to share your User Content:<br>
                    i. Any information or content that you voluntarily process with the Service, such as User Content,
                    becomes available to the Selfie2Anime anonymously.</p>
            </li>
            <li>
                <p>If we sell or otherwise transfer part or the whole of Selfie2Anime or our assets to another
                    organization (e.g., in the course of a transaction like a merger, acquisition, bankruptcy,
                    dissolution, liquidation), your information such as User Content and any other information collected
                    through the Service may be among the items sold or transferred. You will continue to own your User
                    Content. The buyer or transferee will have to honour the commitments we have made in this Privacy
                    Policy.</p>
            </li>
            <li>
                <p>We may access, preserve, and share your information in response to a legal request (like a search
                    warrant, court order or subpoena) if we have a good faith belief that the law requires us to do so.
                    This may include responding to legal requests from jurisdictions outside of Australia where we have
                    a good faith belief that the response is required by law in that jurisdiction, affects users in that
                    jurisdiction, and is consistent with internationally recognized standards.</p>
            </li>
            <li>
                <p>We may also access, preserve, and share information when we have a good faith belief it is necessary
                    to:</p>
                <ol>
                    <li>
                        <p>detect, prevent, and address fraud and other illegal activity;</p>
                    </li>
                    <li>
                        <p>to protect ourselves, you, and others, including as part of investigations; and</p>
                    </li>
                    <li>
                        <p>to prevent death or imminent bodily harm.</p>
                    </li>
                    <li>
                        <p>Information we receive about you may be accessed, processed, and retained for an extended
                            period when it is the subject of a legal request or obligation, governmental investigation,
                            or investigations concerning possible violations of our terms or policies, or otherwise to
                            prevent harm.</p>
                    </li>
                </ol>
            </li>
        </ol>
        <h2>HOW WE STORE YOUR INFORMATION</h2>
        <ol start="18">
            <li>
                <p>Your information collected through the Service may be stored and processed in Australia or any other
                    country in which Selfie2Anime, its Affiliates or Service Providers maintain facilities.</p>
            </li>
            <li>
                <p>Selfie2Anime, its Affiliates, or Service Providers may transfer information that we collect about
                    you, including personal information across borders and from your country or jurisdiction to other
                    countries or jurisdictions around the world. If you are located in the European Union or other
                    regions with laws governing data collection and use that may differ from Australian law, please note
                    that we may transfer information, including personal information, to a country and jurisdiction that
                    does not have the same data protection laws as your jurisdiction.</p>
            </li>
            <li>
                <p>By registering for and using the Service you consent to the transfer of information to Australia or
                    to any other country in which Selfie2Anime, its Affiliates or Service Providers maintain facilities
                    and the use and disclosure of information about you as described in this Privacy Policy.</p>
            </li>
            <li>
                <p>We use commercially reasonable safeguards to help keep the information collected through the Service
                    secure. However, Selfie2Anime cannot ensure the security of any information you transmit to
                    Selfie2Anime or guarantee that information on the Service may not be accessed, disclosed, altered,
                    or destroyed.</p>
            </li>
        </ol>
        <h2>CHILDREN’S PRIVACY</h2>
        <ol start="22">
            <li>Selfie2Anime does not knowingly collect or solicit any information from anyone under the age of 13. The
                Service and its content are not directed at children under the age of 13. If we learn that we have
                collected personal information from a child under age 13 without parental consent, we will delete that
                information as quickly as possible. If you believe that we might have any information from or about a
                child under 13, please contact us.
            </li>
        </ol>
        <h2>OTHER WEB SITES AND SERVICES</h2>
        <ol start="23">
            <li>We are not responsible for the practices employed by any websites or services linked to or from our
                Service, including the information or content contained within them.
            </li>
        </ol>
        <h2>HOW TO CONTACT US</h2>
        <ol start="24">
            <li>If you have any questions about this Privacy Policy or the Service, please contact us through the email
                <a href="mailto:legal@selfie2anime.com">legal@selfie2anime.com</a>.
            </li>
        </ol>
        <h2>CHANGES TO OUR PRIVACY POLICY</h2>
        <ol start="25">
            <li>Selfie2Anime may modify or update this Privacy Policy from time to time, so please review it
                periodically. We may provide you additional forms of notice of modifications or updates as appropriate
                under the circumstances. Your continued use of Selfie2Anime or the Service after any modification to
                this Privacy Policy will constitute your acceptance of such modification.
            </li>
        </ol>
    </div>
</body>
</html>


================================================
FILE: public/self-sitemap.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:image="http://www.google.com/schemas/sitemap-image/1.1"
        xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"
        xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url>
        <loc>https://selfie2anime.com/</loc>
        <changefreq>daily</changefreq>
        <priority>1</priority>
    </url>
    <url>
        <loc>https://selfie2anime.com/blog/</loc>
        <changefreq>daily</changefreq>
        <priority>1</priority>
    </url>
    <url>
        <loc>https://selfie2anime.com/terms/</loc>
        <changefreq>monthly</changefreq>
        <priority>0.1</priority>
    </url>
    <url>
        <loc>https://selfie2anime.com/privacy/</loc>
        <changefreq>monthly</changefreq>
        <priority>0.1</priority>
    </url>
</urlset>


================================================
FILE: public/sitemap.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <sitemap>
        <loc>https://selfie2anime.com/self-sitemap.xml</loc>
        <lastmod>2019-08-26T00:00:00.000Z</lastmod>
    </sitemap>
    <sitemap>
        <loc>https://selfie2anime.com/blog/sitemap.xml</loc>
    </sitemap>
</sitemapindex>


================================================
FILE: public/terms/index.html
================================================
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <meta property="og:url" content="https://selfie2anime.com" />
    <meta property="og:type" content="website" />
    <meta property="og:title" content="Selfie2Anime" />

    <meta property="og:description" content="What do YOU look like in Anime?" />
    <meta property="og:image" content="https://selfie2anime.com/og.jpg" />
    <link rel="image_src" type="image/png" href="https://selfie2anime.com/og.jpg" />

    <script async src="https://www.googletagmanager.com/gtag/js?id=UA-71336829-28"></script>
    <script>
        window.dataLayer = window.dataLayer || [];

        function gtag() {
            dataLayer.push(arguments);
        }

        gtag("js", new Date());
        gtag("config", "UA-71336829-28");
    </script>

    <link rel="icon" href="https://selfie2anime.com/favicon.ico">
    <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Merriweather+Sans:400,400i,700,700i">

    <title>Terms of Service | Selfie2Anime</title>

    <style>
        body {
            margin: 1em 2em 1em 2em;
            font-family: "Merriweather Sans", sans-serif;
            font-size: 12pt;
            line-height: 1.5em;
        }

        @media (min-width: 1200px) {
            body {
                margin: 2em 3em 4em 3em;
                font-size: 18pt;
            }
        }

        @media (min-width: 1600px) {
            body {
                margin: 4em 12em 4em 12em;
            }
        }

        h1, h2 {
            text-transform: uppercase;
            color: #f06292;
        }

        h1 {
            font-size: 2em;
        }

        h2 {
            margin: 1.5em 0 0.5em 0;
            font-size: 1.5em;
        }

        ol ol {
            list-style-type: lower-roman;
        }

        a {
            color: #f06292;
            font-weight: bold;
            text-decoration: none;
        }

        .content {
            text-align: justify;
        }
    </style>
</head>
<body>
    <div class="content">
        <h1>Terms of Use</h1>
        <p><em>Last Updated: 22 August 2019</em></p>
        <ol>
            <li>
                <p>These Terms of Use (“Terms”) apply to your access and use of this website, or the applications and
                    other online products and services (collectively, our “Services”) provided by Selfie2Anime
                    (“Selfie2Anime” or “we”).</p>
            </li>
            <li>
                <p>By accessing the Selfie2Anime website, you agree to these Terms. If you do not agree to these Terms,
                    including the mandatory arbitration provision and class action waiver in Section 15, do not access
                    or use our Services.</p>
            </li>
            <li>
                <p>If you have any questions about these Terms or our Services, please contact us at <a
                        href="mailto:legal@selfie2anime.com">legal@selfie2anime.com</a>.</p>
            </li>
        </ol>
        <h2>Description of Services</h2>
        <ol start="4">
            <li>Selfie2Anime is a webservice software that uses artificial intelligence algorithms to transform your
                photos or videos into works of art. The artificial intelligence algorithms use styles inspired by
                various artists within the animation industry. The webservice allows you to upload photographs onto the
                application which will then run through Selfie2Anime’s algorithms, transforming the photo. You can then
                share the photos through social media sites or store them for personal use.
            </li>
        </ol>
        <h2>Eligibility</h2>
        <ol start="5">
            <li>
                <p>You must be at least 13 years of age to access or use our Services. If you are under 18 years of age
                    (or the age of legal majority where you live), you may only access or use our Services under the
                    supervision of a parent or legal guardian who agrees to be bound by these Terms.</p>
            </li>
            <li>
                <p>If you are a parent or legal guardian of a user under the age of 18 (or the age of legal majority),
                    you agree to be fully responsible for the acts or omissions of such user in connection with our
                    Services.</p>
            </li>
            <li>
                <p>If you are accessing or using our Services on behalf of another person or entity, you represent that
                    you are authorised to accept these Terms on that person or entity’s behalf and that the person or
                    entity agrees to be responsible to us if you or the other person or entity violates these Terms.</p>
            </li>
        </ol>
        <h2>User Accounts and Account Security</h2>
        <ol start="8">
            <li>
                <p>As Selfie2Anime is an image transformation webservice, no user account or credentials are store by us
                    or a third party.</p>
            </li>
            <li>
                <p>If you do use a third-party account in conjunction with Selfie2Anime you must maintain the security
                    of your third-party account and promptly notify us if you discover or suspect that someone has
                    accessed your account without your permission. If you permit others to use your account credentials,
                    you are responsible for the activities of such users that occur in connection with your account.</p>
            </li>
        </ol>
        <h2>Privacy</h2>
        <ol start="10">
            <li>Please refer to our Privacy Policy for information about how we collect, use, and disclose information
                about you.
            </li>
        </ol>
        <h2>User Content</h2>
        <ol start="11">
            <li>
                <p>Our Services may allow you and other users to create, post, store and share content, including
                    messages, text, photos, videos, software, and other materials (collectively, “User Content”).</p>
            </li>
            <li>
                <p>Except for the license you grant below, you retain all rights in and to your User Content, as between
                    you and Selfie2Anime.</p>
            </li>
            <li>
                <p>Selfie2Anime does not claim ownership of any User Content that you post on or through the
                    Services.</p>
            </li>
            <li>
                <p>You grant Selfie2Anime a perpetual, irrevocable, nonexclusive, royalty-free, worldwide, fully-paid,
                    transferable sub-licensable license to use, reproduce, modify, adapt, publish, translate, create
                    derivative works from, distribute, publicly perform and display your User Content and any name,
                    username or likeness provided in connection with your User Content in all media formats and channels
                    now known or later developed, without compensation to you.</p>
            </li>
            <li>
                <p>When you post or otherwise share User Content on or through our Services, you understand that your
                    User Content and any associated information (such as your location or photographs) will be visible
                    to the public.</p>
            </li>
            <li>
                <p>You grant Selfie2Anime consent to use the User Content, regardless of whether it includes an
                    individual’s name, likeness, voice, or persona, sufficient to indicate the individual’s
                    identity.</p>
            </li>
            <li>
                <p>By using the Services, you agree that the User Content may be used for commercial purposes. You
                    further acknowledge that Selfie2Anime’s use of the User Content for commercial purposes will not
                    result in any injury to you or to any person you authorised to act on its behalf.</p>
            </li>
            <li>
                <p>You acknowledge that some of the Services are supported by advertising revenue and may display
                    advertisements and promotions, and you hereby agree that Selfie2Anime may place such advertising and
                    promotions on the Services or on, about, or in conjunction with your User Content.</p>
            </li>
            <li>
                <p>The manner, mode and extent of such advertising and promotions are subject to change without specific
                    notice to you. You acknowledge that we may not always identify paid services, sponsored content, or
                    commercial communications as such.</p>
            </li>
            <li>
                <p>You represent and warrant that:</p>
                <ol>
                    <li>
                        <p>you own the User Content modified by you on or through the Services or otherwise have the
                            right to grant the rights and licenses set forth in these Terms;</p>
                    </li>
                    <li>
                        <p>you agree to pay for all royalties, fees, and any other monies owed by reason of User Content
                            you stylize on or through the Services; and</p>
                    </li>
                    <li>
                        <p>you have the legal right and capacity to enter into these Terms in your jurisdiction.</p>
                    </li>
                </ol>
            </li>
            <li>
                <p>You may not create, post, store or share any User Content that violates these Terms or for which you
                    do not have all the rights necessary to grant us the license described above.</p>
            </li>
            <li>
                <p>Although we have no obligation to screen, edit or monitor User Content, we may delete or remove User
                    Content at any time and for any reason.</p>
            </li>
            <li>
                <p>User Content removed from the Services may continue to be stored by Selfie2Anime, including, without
                    limitation, to comply with certain legal obligations.</p>
            </li>
            <li>
                <p>Selfie2Anime is not a backup service and you agree that you will not rely on the Services for the
                    purposes of User Content backup or storage. Selfie2Anime will not be liable to you for any
                    modification, suspension, or discontinuation of the Services, or the loss of any User Content.</p>
            </li>
        </ol>
        <h2>Prohibited Conduct and Content</h2>
        <ol start="25">
            <li>
                <p>You will not violate any applicable law, contract, intellectual property, or other third-party right
                    or commit a tort, and you are solely responsible for your conduct while accessing or using our
                    Services.</p>
            </li>
            <li>
                <p>You will not:</p>
                <ol>
                    <li>
                        <p>Engage in any harassing, threatening, intimidating, predatory or stalking conduct;</p>
                    </li>
                    <li>
                        <p>Use or attempt to use another user’s account without authorization from that user and
                            Selfie2Anime;</p>
                    </li>
                    <li>
                        <p>Use our Services in any manner that could interfere with, disrupt, negatively affect, or
                            inhibit other users from fully enjoying our Services or that could damage, disable,
                            overburden, or impair the functioning of our Services in any manner;</p>
                    </li>
                    <li>
                        <p>Reverse engineer any aspect of our Services or do anything that might discover source code or
                            bypass or circumvent measures employed to prevent or limit access to any part of our
                            Services;</p>
                    </li>
                    <li>
                        <p>Attempt to circumvent any content-filtering techniques we employ or attempt to access any
                            feature or area of our Services that you are not authorised to access;</p>
                    </li>
                    <li>
                        <p>Develop or use any third-party applications that interact with our Services without our prior
                            written consent, including any scripts designed to scrape or extract data from our
                            Services;</p>
                    </li>
                    <li>
                        <p>Use our Services for any illegal or unauthorised purpose, or engage in, encourage, or promote
                            any activity that violates these Terms.</p>
                    </li>
                </ol>
            </li>
            <li>
                <p>You may also only post or otherwise share User Content that is non-confidential and you have all
                    necessary rights to disclose. You may not create, post, store or share any User Content that:</p>
                <ol>
                    <li>
                        <p>Is unlawful, libellous, defamatory, obscene, pornographic, indecent, lewd, suggestive,
                            harassing, threatening, invasive of privacy or publicity rights, abusive, inflammatory, or
                            fraudulent;</p>
                    </li>
                    <li>
                        <p>Would constitute, encourage, or provide instructions for a criminal offense, violate the
                            rights of any party, or otherwise create liability or violate any local, state, national or
                            international law;</p>
                    </li>
                    <li>
                        <p>May infringe any patent, trademark, trade secret, copyright or other intellectual or
                            proprietary right of any party;</p>
                    </li>
                    <li>
                        <p>Contains or depicts any statements, remarks, or claims that do not reflect your honest views
                            and experiences;</p>
                    </li>
                    <li>
                        <p>Impersonates, or misrepresents your affiliation with, any person or entity;</p>
                    </li>
                    <li>
                        <p>Contains any unsolicited promotions, political campaigning, advertising, or
                            solicitations;</p>
                    </li>
                    <li>
                        <p>Contains any private or personal information of a third party without such third party’s
                            consent;</p>
                    </li>
                    <li>
                        <p>Contains any viruses, corrupted data or other harmful, disruptive, or destructive files or
                            content; or</p>
                    </li>
                    <li>
                        <p>Is, in our sole judgment, objectionable or that restricts or inhibits any other person from
                            using or enjoying our Services, or that may expose Selfie2Anime or others to any harm or
                            liability of any type.</p>
                    </li>
                </ol>
            </li>
            <li>
                <p>In addition, although we have no obligation to screen, edit or monitor User Content, we may delete or
                    remove User Content at any time and for any reason.</p>
            </li>
        </ol>
        <h2>Limited License; Copyright and Trademark</h2>
        <ol start="29">
            <li>
                <p>Our Services and the text, graphics, images, photographs, videos, illustrations, trademarks, trade
                    dress, trade names, page headers, button icons, scripts, service marks, logos, slogans, filters,
                    user generated filters and other content contained therein (collectively, the “Selfie2Anime
                    Content”) are owned by or licensed to Selfie2Anime and are protected under both Australian and
                    foreign laws. Except as explicitly stated in these Terms, Selfie2Anime and our licensors reserve all
                    rights in and to our Services and the Selfie2Anime Content.</p>
            </li>
            <li>
                <p>You are hereby granted a limited, non-exclusive, non-transferable, non-sublicensable, revocable
                    license to access and use our Services and Selfie2Anime Content for your own personal use; however,
                    such license is subject to these Terms and does not include any right to:</p>
                <ol>
                    <li>
                        <p>sell, resell, or commercially use our Services or Selfie2Anime Content;</p>
                    </li>
                    <li>
                        <p>copy, reproduce, distribute, publicly perform, or publicly display Selfie2Anime Content,
                            except as expressly permitted by us or our licensors;</p>
                    </li>
                    <li>
                        <p>modify the Selfie2Anime Content, remove any proprietary rights notices or markings, or
                            otherwise make any derivative uses of our Services or Selfie2Anime Content, except as
                            expressly set forth in these Terms;</p>
                    </li>
                    <li>
                        <p>use any data mining, robots or similar data gathering or extraction methods; or</p>
                    </li>
                    <li>
                        <p>use our Services or Selfie2Anime Content other than as expressly provided in these Terms.</p>
                    </li>
                </ol>
            </li>
            <li>
                <p>Any use of our Services or Selfie2Anime Content other than as specifically authorised herein, without
                    our prior written permission, is strictly prohibited and will terminate the license granted under
                    these Terms. You will not remove, alter, or conceal any copyright, trademark, service mark or other
                    proprietary rights notices incorporated in or accompanying the Selfie2Anime Content.</p>
            </li>
        </ol>
        <h2>Feedback</h2>
        <ol start="32">
            <li>Any questions, comments, suggestions, ideas, original or creative materials or other information you
                submit about Selfie2Anime or our products or Services (collectively, “Feedback”), is non-confidential
                and will become the sole property of Selfie2Anime. We will own exclusive rights, including, without
                limitation, all intellectual property rights, in and to Feedback and will be entitled to the
                unrestricted use and dissemination of Feedback for any purpose, commercial or otherwise, without
                acknowledgment or compensation to you.
            </li>
        </ol>
        <h2>Copyright Complaints</h2>
        <ol start="33">
            <li>
                <p>We have a policy of limiting access to our Services and terminating the accounts of users who
                    infringe the intellectual property rights of others. If you believe that anything on our Services
                    infringes any copyright that you own or control, you may notify Selfie2Anime’s Designated Agent by
                    e-mail: <a href="mailto:legal@selfie2anime.com">legal@selfie2anime.com</a>.</p>
            </li>
            <li>
                <p>Please see Schedule 2 of the Australian Copyright Regulations 2017 (Cth) for the requirements of a
                    proper notification.</p>
            </li>
            <li>
                <p>If you knowingly misrepresent any activity or material on our Services as infringing, you may be
                    liable to Selfie2Anime for certain costs and damages.</p>
            </li>
        </ol>
        <h2>Indemnification</h2>
        <ol start="36">
            <li>
                <p>To the fullest extent permitted by applicable law, you will indemnify, defend, and hold harmless
                    Selfie2Anime and each of our respective officers, directors, agents, partners and employees
                    (individually and collectively, the “Selfie2Anime Parties”) from and against any loss, liability,
                    claim, demand, damages, expenses or costs (“Claims”) arising out of or related to</p>
                <ol>
                    <li>
                        <p>your access to or use of our Services;</p>
                    </li>
                    <li>
                        <p>your User Content or Feedback;</p>
                    </li>
                    <li>
                        <p>your violation of these Terms;</p>
                    </li>
                    <li>
                        <p>your violation, misappropriation, or infringement of any rights of another (including
                            intellectual property rights or privacy rights); or</p>
                    </li>
                    <li>
                        <p>your conduct in connection with our Services.</p>
                    </li>
                </ol>
            </li>
            <li>
                <p>You agree to promptly notify Selfie2Anime Parties of any third-party Claims, cooperate with
                    Selfie2Anime Parties in defending such Claims and pay all fees, costs and expenses associated with
                    defending such Claims (including, but not limited to, our chosen law firms’ professional costs and
                    disbursements).</p>
            </li>
            <li>
                <p>You also agree that the Selfie2Anime Parties will have control of the defence or settlement of any
                    third-party Claims. This indemnity is in addition to, and not in lieu of, any other indemnities set
                    forth in a written agreement between you and Selfie2Anime or the other Selfie2Anime Parties.</p>
            </li>
        </ol>
        <h2>Disclaimers</h2>
        <ol start="39">
            <li>
                <p>We do not control, endorse, or take responsibility for any User Content or third-party content
                    available on or linked to by our Services.</p>
            </li>
            <li>
                <p>Your use of our Services is at your sole risk. Our Services are provided “as is” and “as available”
                    without warranties of any kind, either express or implied, including, but not limited to, implied
                    warranties of merchantability, fitness for a particular purpose, title, and non-infringement.</p>
            </li>
            <li>
                <p>In addition, Selfie2Anime does not represent or warrant that our Services are accurate, complete,
                    reliable, current, or error-free. While Selfie2Anime attempts to make your access to and use of our
                    Services safe, we cannot and do not represent or warrant that our Services or servers are free of
                    viruses or other harmful components. You assume the entire risk as to the quality and performance of
                    the Services.</p>
            </li>
        </ol>
        <h2>Limitation of Liability</h2>
        <ol start="42">
            <li>
                <p>Selfie2Anime and the other Selfie2Anime Parties will not be liable to you under any theory of
                    liability—whether based in contract, tort, negligence, strict liability, warranty, or otherwise—for
                    any indirect, consequential, exemplary, incidental, punitive or special damages or lost profits,
                    even if Selfie2Anime or the other Selfie2Anime Parties have been advised of the possibility of such
                    damages.</p>
            </li>
            <li>
                <p>The total liability of Selfie2Anime and the other Selfie2Anime Parties, for any claim arising out of
                    or relating to these Terms or our Services, regardless of the form of the action, is limited to the
                    amount paid, if any, by you to access or use our Services.</p>
            </li>
            <li>
                <p>The limitations set forth in this section will not limit or exclude liability for the gross
                    negligence, fraud, or intentional misconduct of Selfie2Anime or the other Selfie2Anime Parties or
                    for any other matters in which liability cannot be excluded or limited under applicable law.
                    Additionally, some jurisdictions do not allow the exclusion or limitation of incidental or
                    consequential damages, so the above limitations or exclusions may not apply to you.</p>
            </li>
        </ol>
        <h2>Release</h2>
        <ol start="45">
            <li>
                <p>To the fullest extent permitted by applicable law, you release Selfie2Anime and the other
                    Selfie2Anime Parties from responsibility, liability, claims, demands, and/or damages (actual and
                    consequential) of every kind and nature, known and unknown (including, but not limited to, claims of
                    negligence), arising out of or related to disputes between users and the acts or omissions of third
                    parties.</p>
            </li>
            <li>
                <p>You expressly waive any rights you may have under the Australian Consumer Law as established under
                    Schedule 2 of the Australian Competition and Consumer Act 2010 (Cth) as well as any other statute or
                    common law principles that would otherwise limit the coverage of this release to include only those
                    claims which you may know or suspect to exist in your favour at the time of agreeing to this
                    release.</p>
            </li>
        </ol>
        <h2>Transfer and Processing Data</h2>
        <ol start="47">
            <li>By accessing or using our Services, you consent to the processing, transfer, and storage of information
                about you in and to Australia and other countries, where you may not have the same rights and
                protections as you do under local law.
            </li>
        </ol>
        <h2>Dispute Resolution; Binding Arbitration</h2>
        <ol start="48">
            <li>
                <p>Please read the following section carefully because it requires you to arbitrate certain disputes and
                    claims with Selfie2Anime and limits the way you can seek relief from us.</p>
            </li>
            <li>
                <p>Except for small claims disputes in which you or Selfie2Anime seek to bring an individual action in
                    small claims court located in the state of your billing address or disputes in which you or
                    Selfie2Anime seeks injunctive or other equitable relief for the alleged unlawful use of intellectual
                    property, you and Selfie2Anime waive your rights to a trial and to have any dispute arising out of
                    or related to these Terms or our Services resolved in court.</p>
            </li>
            <li>
                <p>Instead, all disputes arising out of or relating to these Terms or our Services will be resolved
                    through confidential binding arbitration held in Western Australia in accordance with the
                    International Chamber of Commerce (“ICC”) Rules of Arbitration (“ICC Rules”), which are available on
                    the ICC website and hereby incorporated by reference. You either acknowledge and agree that you have
                    read and understand the ICC Rules or waive your opportunity to read the ICC Rules and any claim that
                    the ICC Rules are unfair or should not apply for any reason.</p>
            </li>
            <li>
                <p>You and Selfie2Anime agree that any dispute arising out of or related to these Terms or our Services
                    is personal to you and Selfie2Anime and that any dispute will be resolved solely through individual
                    arbitration and will not be brought as a class arbitration, class action or any other type of
                    representative proceeding.</p>
            </li>
            <li>
                <p>You and Selfie2Anime agree that these Terms affect interstate commerce and that the enforceability of
                    this agreement will be substantively and procedurally governed by the Australian International
                    Arbitration Act 1974 (Cth) (“Arbitration Act”) to the maximum extent permitted by applicable
                    law.</p>
            </li>
            <li>
                <p>As limited by the Arbitration Act, these Terms and the ICC Rules, the arbitrator will have exclusive
                    authority to make all procedural and substantive decisions regarding any dispute and to grant any
                    remedy that would otherwise be available in court; provided, however, that the arbitrator does not
                    have the authority to conduct a class arbitration or a representative action, which is prohibited by
                    these Terms.</p>
            </li>
            <li>
                <p>The arbitrator may only conduct an individual arbitration and may not consolidate more than one
                    individual’s claims, preside over any type of class or representative proceeding, or preside over
                    any proceeding involving more than one individual.</p>
            </li>
            <li>
                <p>You and Selfie2Anime agree that for any arbitration you initiate, you will pay the will fees and
                    costs of Arbitration. For any arbitration initiated by Selfie2Anime, Selfie2Anime will pay the fees
                    and costs of Arbitration.</p>
            </li>
            <li>
                <p>You and Selfie2Anime agree that the Federal Courts of Australia of have exclusive jurisdiction over
                    any appeals and the enforcement of an arbitration award.</p>
            </li>
            <li>
                <p>ANY CLAIM ARISING OUT OF OR RELATED TO THESE TERMS OR OUR SERVICES MUST BE FILED WITHIN ONE YEAR
                    AFTER SUCH CLAIM AROSE; OTHERWISE, THE CLAIM IS PERMANENTLY BARRED, WHICH MEANS THAT YOU AND
                    SELFIE2ANIME WILL NOT HAVE THE RIGHT TO ASSERT THE CLAIM.</p>
            </li>
            <li>
                <p>You have the right to opt out of binding arbitration within 30 days of the date you first accepted
                    the terms of this Section 15 by notifying Selfie2Anime in writing. The notification must be sent to:
                    <a href="mailto:legal@selfie2anime.com">legal@selfie2anime.com</a></p>
            </li>
            <li>
                <p>To be effective, the opt out notice must include your full name and clearly indicate your intent to
                    opt out of binding arbitration. By opting out of binding arbitration, you are agreeing to resolve
                    Disputes in accordance with Section 16.</p>
            </li>
        </ol>
        <h2>Governing Law and Venue</h2>
        <ol start="60">
            <li>
                <p>These Terms and your access to and use of our Services will be governed by and construed and enforced
                    in accordance with the laws of Western Australia, without regard to conflict of law rules or
                    principles (whether of Western Australia or any other jurisdiction) that would cause the application
                    of the laws of any other jurisdiction.</p>
            </li>
            <li>
                <p>Any dispute between the parties that is not subject to arbitration or cannot be heard in small claims
                    court will be resolved in the Federal Courts of Australia, sitting in Perth, Western Australia.</p>
            </li>
        </ol>
        <h2>Changes to these Terms</h2>
        <ol start="62">
            <li>
                <p>We may make changes to these Terms from time to time. If we make changes, we will post the amended
                    Terms to our Services and update the “Last Updated” date above.</p>
            </li>
            <li>
                <p>We may also attempt to notify you by sending an email notification to the address associated with
                    your account, if any, or providing notice through our Services.</p>
            </li>
            <li>
                <p>Unless we say otherwise in our notice, the amended Terms will be effective immediately and your
                    continued access to and use of our Services after we provide notice will confirm your acceptance of
                    the changes.</p>
            </li>
            <li>
                <p>If you do not agree to the amended Terms, you must stop accessing and using our Services.</p>
            </li>
        </ol>
        <h2>Electronic Communications</h2>
        <ol start="66">
            <li>
                <p>By accessing or using the Services, you also consent to receive electronic communications from
                    Selfie2Anime (e.g., via email or by posting notices on our Services). These communications may
                    include notices about your account (e.g., payment authorizations, password changes and other
                    transactional information) and are part of your relationship with us.</p>
            </li>
            <li>
                <p>You agree that any notices, agreements, disclosures, or other communications that we send to you
                    electronically will satisfy any legal communication requirements, including, but not limited to,
                    that such communications be in writing.</p>
            </li>
        </ol>
        <h2>Termination</h2>
        <ol start="68">
            <li>We reserve the right, without notice and in our sole discretion, to terminate your right to access or
                use our Services. We are not responsible for any loss or harm related to your inability to access or use
                our Services.
            </li>
        </ol>
        <h2>Severability</h2>
        <ol start="69">
            <li>If any provision or part of a provision of these Terms is unlawful, void, or unenforceable, that
                provision or part of the provision is deemed severable from these Terms and does not affect the validity
                and enforceability of any remaining provisions.
            </li>
        </ol>
        <h2>Legal Compliance</h2>
        <ol start="70">
            <li>
                <p>You represent and warrant that:</p>
                <ol>
                    <li>
                        <p>you are not located in a country that is subject to an Australian Government embargo, or that
                            has been designated by the Australian Government as a “terrorist supporting” country,
                            and</p>
                    </li>
                    <li>
                        <p>you are not listed on any Australian Government list of prohibited or restricted parties.</p>
                    </li>
                </ol>
            </li>
        </ol>
        <h2>Miscellaneous</h2>
        <ol start="71">
            <li>
                <p>These Terms constitute the entire agreement between you and Selfie2Anime relating to your access to
                    and use of our Services. The failure of Selfie2Anime to exercise or enforce any right or provision
                    of these Terms will not operate as a waiver of such right or provision.</p>
            </li>
            <li>
                <p>The section titles in these Terms are for convenience only and have no legal or contractual effect.
                    Except as otherwise provided herein, these Terms are intended solely for the benefit of the parties
                    and are not intended to confer third party beneficiary rights upon any other person or entity.</p>
            </li>
        </ol>
    </div>
</body>
</html>


================================================
FILE: public/vendor/magnific-popup.css
================================================
/* Magnific Popup CSS */
.mfp-bg {
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: 1042;
  overflow: hidden;
  position: fixed;
  background: #0b0b0b;
  opacity: 0.8; }

.mfp-wrap {
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: 1043;
  position: fixed;
  outline: none !important;
  -webkit-backface-visibility: hidden; }

.mfp-container {
  text-align: center;
  position: absolute;
  width: 100%;
  height: 100%;
  left: 0;
  top: 0;
  padding: 0 8px;
  box-sizing: border-box; }

.mfp-container:before {
  content: '';
  display: inline-block;
  height: 100%;
  vertical-align: middle; }

.mfp-align-top .mfp-container:before {
  display: none; }

.mfp-content {
  position: relative;
  display: inline-block;
  vertical-align: middle;
  margin: 0 auto;
  text-align: left;
  z-index: 1045; }

.mfp-inline-holder .mfp-content,
.mfp-ajax-holder .mfp-content {
  width: 100%;
  cursor: auto; }

.mfp-ajax-cur {
  cursor: progress; }

.mfp-zoom-out-cur, .mfp-zoom-out-cur .mfp-image-holder .mfp-close {
  cursor: -moz-zoom-out;
  cursor: -webkit-zoom-out;
  cursor: zoom-out; }

.mfp-zoom {
  cursor: pointer;
  cursor: -webkit-zoom-in;
  cursor: -moz-zoom-in;
  cursor: zoom-in; }

.mfp-auto-cursor .mfp-content {
  cursor: auto; }

.mfp-close,
.mfp-arrow,
.mfp-preloader,
.mfp-counter {
  -webkit-user-select: none;
  -moz-user-select: none;
  user-select: none; }

.mfp-loading.mfp-figure {
  display: none; }

.mfp-hide {
  display: none !important; }

.mfp-preloader {
  color: #CCC;
  position: absolute;
  top: 50%;
  width: auto;
  text-align: center;
  margin-top: -0.8em;
  left: 8px;
  right: 8px;
  z-index: 1044; }
  .mfp-preloader a {
    color: #CCC; }
    .mfp-preloader a:hover {
      color: #FFF; }

.mfp-s-ready .mfp-preloader {
  display: none; }

.mfp-s-error .mfp-content {
  display: none; }

button.mfp-close,
button.mfp-arrow {
  overflow: visible;
  cursor: pointer;
  background: transparent;
  border: 0;
  -webkit-appearance: none;
  display: block;
  outline: none;
  padding: 0;
  z-index: 1046;
  box-shadow: none;
  touch-action: manipulation; }

button::-moz-focus-inner {
  padding: 0;
  border: 0; }

.mfp-close {
  width: 44px;
  height: 44px;
  line-height: 44px;
  position: absolute;
  right: 0;
  top: 0;
  text-decoration: none;
  text-align: center;
  opacity: 0.65;
  padding: 0 0 18px 10px;
  color: #FFF;
  font-style: normal;
  font-size: 28px;
  font-family: Arial, Baskerville, monospace; }
  .mfp-close:hover,
  .mfp-close:focus {
    opacity: 1; }
  .mfp-close:active {
    top: 1px; }

.mfp-close-btn-in .mfp-close {
  color: #333; }

.mfp-image-holder .mfp-close,
.mfp-iframe-holder .mfp-close {
  color: #FFF;
  right: -6px;
  text-align: right;
  padding-right: 6px;
  width: 100%; }

.mfp-counter {
  position: absolute;
  top: 0;
  right: 0;
  color: #CCC;
  font-size: 12px;
  line-height: 18px;
  white-space: nowrap; }

.mfp-arrow {
  position: absolute;
  opacity: 0.65;
  margin: 0;
  top: 50%;
  margin-top: -55px;
  padding: 0;
  width: 90px;
  height: 110px;
  -webkit-tap-highlight-color: transparent; }
  .mfp-arrow:active {
    margin-top: -54px; }
  .mfp-arrow:hover,
  .mfp-arrow:focus {
    opacity: 1; }
  .mfp-arrow:before,
  .mfp-arrow:after {
    content: '';
    display: block;
    width: 0;
    height: 0;
    position: absolute;
    left: 0;
    top: 0;
    margin-top: 35px;
    margin-left: 35px;
    border: medium inset transparent; }
  .mfp-arrow:after {
    border-top-width: 13px;
    border-bottom-width: 13px;
    top: 8px; }
  .mfp-arrow:before {
    border-top-width: 21px;
    border-bottom-width: 21px;
    opacity: 0.7; }

.mfp-arrow-left {
  left: 0; }
  .mfp-arrow-left:after {
    border-right: 17px solid #FFF;
    margin-left: 31px; }
  .mfp-arrow-left:before {
    margin-left: 25px;
    border-right: 27px solid #3F3F3F; }

.mfp-arrow-right {
  right: 0; }
  .mfp-arrow-right:after {
    border-left: 17px solid #FFF;
    margin-left: 39px; }
  .mfp-arrow-right:before {
    border-left: 27px solid #3F3F3F; }

.mfp-iframe-holder {
  padding-top: 40px;
  padding-bottom: 40px; }
  .mfp-iframe-holder .mfp-content {
    line-height: 0;
    width: 100%;
    max-width: 900px; }
  .mfp-iframe-holder .mfp-close {
    top: -40px; }

.mfp-iframe-scaler {
  width: 100%;
  height: 0;
  overflow: hidden;
  padding-top: 56.25%; }
  .mfp-iframe-scaler iframe {
    position: absolute;
    display: block;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    box-shadow: 0 0 8px rgba(0, 0, 0, 0.6);
    background: #000; }

/* Main image in popup */
img.mfp-img {
  width: auto;
  max-width: 100%;
  height: auto;
  display: block;
  line-height: 0;
  box-sizing: border-box;
  padding: 40px 0 40px;
  margin: 0 auto; }

/* The shadow behind the image */
.mfp-figure {
  line-height: 0; }
  .mfp-figure:after {
    content: '';
    position: absolute;
    left: 0;
    top: 40px;
    bottom: 40px;
    display: block;
    right: 0;
    width: auto;
    height: auto;
    z-index: -1;
    box-shadow: 0 0 8px rgba(0, 0, 0, 0.6);
    background: #444; }
  .mfp-figure small {
    color: #BDBDBD;
    display: block;
    font-size: 12px;
    line-height: 14px; }
  .mfp-figure figure {
    margin: 0; }

.mfp-bottom-bar {
  margin-top: -36px;
  position: absolute;
  top: 100%;
  left: 0;
  width: 100%;
  cursor: auto; }

.mfp-title {
  text-align: left;
  line-height: 18px;
  color: #F3F3F3;
  word-wrap: break-word;
  padding-right: 36px; }

.mfp-image-holder .mfp-content {
  max-width: 100%; }

.mfp-gallery .mfp-image-holder .mfp-figure {
  cursor: pointer; }

@media screen and (max-width: 800px) and (orientation: landscape), screen and (max-height: 300px) {
  /**
       * Remove all paddings around the image on small screen
       */
  .mfp-img-mobile .mfp-image-holder {
    padding-left: 0;
    padding-right: 0; }
  .mfp-img-mobile img.mfp-img {
    padding: 0; }
  .mfp-img-mobile .mfp-figure:after {
    top: 0;
    bottom: 0; }
  .mfp-img-mobile .mfp-figure small {
    display: inline;
    margin-left: 5px; }
  .mfp-img-mobile .mfp-bottom-bar {
    background: rgba(0, 0, 0, 0.6);
    bottom: 0;
    margin: 0;
    top: auto;
    padding: 3px 5px;
    position: fixed;
    box-sizing: border-box; }
    .mfp-img-mobile .mfp-bottom-bar:empty {
      padding: 0; }
  .mfp-img-mobile .mfp-counter {
    right: 5px;
    top: 3px; }
  .mfp-img-mobile .mfp-close {
    top: 0;
    right: 0;
    width: 35px;
    height: 35px;
    line-height: 35px;
    background: rgba(0, 0, 0, 0.6);
    position: fixed;
    text-align: center;
    padding: 0; } }

@media all and (max-width: 900px) {
  .mfp-arrow {
    -webkit-transform: scale(0.75);
    transform: scale(0.75); }
  .mfp-arrow-left {
    -webkit-transform-origin: 0;
    transform-origin: 0; }
  .mfp-arrow-right {
    -webkit-transform-origin: 100%;
    transform-origin: 100%; }
  .mfp-container {
    padding-left: 6px;
    padding-right: 6px; } }


================================================
FILE: public_assets/md/privacy.md
================================================

# PRIVACY POLICY

*Effective Date: 22 August 2019*

1. This Privacy Policy explains how we and some of the companies we work with collect, use, share and protect information in relation to our mobile services, web site, and any software provided on or in connection with Selfie2Anime services (collectively, the “Service”), and your choices about the collection and use of your information.

2. By using our Service, you understand and agree that we are providing a platform for you to process your content.

3. Our Policy applies to all visitors, users, and others who access the Service (“Users”).

## INFORMATION WE COLLECT

4. We collect the following types of information.

5. Information you provide us directly:

    1. User Content (e.g., photos and other materials) that you post through the Service. Communications between you and Selfie2Anime. For example, we may send you Service-related emails (e.g., changes/updates to features of the Service, technical and security notices). Note that you may not opt out of Service-related e-mails.

6. Analytics information:

    1. We use third-party analytics tools to help us measure traffic and usage trends for the Service. These tools collect information sent by your device or our Service, including the web pages you visit, add-ons, and other information that assists us in improving the Service. We collect and use this analytics information with analytics information from other Users so that it cannot reasonably be used to identify any individual User.

7. Cookies and similar technologies:

    1. When you visit the Service, we may use cookies and similar technologies like pixels, web beacons, and local storage to collect information about how you use Selfie2Anime and provide features to you.
   
    2. We may ask advertisers or other partners to serve ads or services to your devices, which may use cookies or similar technologies placed by us or the third party.
    
8. Log file information:
   
    1. Log file information is automatically reported by your browser each time you make a request to access (i.e., visit) a web page or app. It can also be provided when the content of the webpage or app is downloaded to your browser or device.
   
   2. When you use our Service, our servers automatically record certain log file information, including your web request, Internet Protocol (“IP”) address, browser type, referring / exit pages and URLs, number of clicks and how you interact with links on the Service, domain names, landing pages, pages viewed, and other such information. We may also collect similar information from emails sent to our Users which then help us track which emails are opened and which links are clicked by recipients. The information allows for more accurate reporting and improvement of the Service.

9. Device identifiers:
    1. When you use a mobile device like a tablet or phone to access our Service, we may access, collect, monitor, store on your device, and/or remotely store one or more “device identifiers”. Device identifiers are small data files or similar data structures stored on or associated with your mobile device, which uniquely identify your mobile device. A device identifier may be data stored in connection with the device hardware, data stored in connection with the device’s operating system or other software, or data sent to the device by Selfie2Anime.
     
    2. A device identifier may deliver information to us or to a third-party partner about how you browse and use the Service and may help us or others provide reports or personalized content and ads. Some features of the Service may not function properly if use or availability of device identifiers is impaired or disabled.
    
10. Metadata:
    
    1. Metadata is usually technical data that is associated with User Content. For example, Metadata can describe how, when and by whom a piece of User Content was collected and how that content is formatted.
    
    2. Users can add or may have Metadata added to their User Content including a hashtag (e.g., to mark keywords when you share a photo) or other data.

## HOW WE USE YOUR INFORMATION

11. In addition to some of the specific uses of information we describe in this Privacy Policy, we may use information that we receive to:

    1. provide personalized content and information to you and others, which could include online ads or other forms of marketing
    
    2. provide, improve, test, and monitor the effectiveness of our Service
     
    3. develop and test new products and features
    
    4. monitor metrics such as total number of visitors, traffic, and demographic patterns
    
    5. diagnose or fix technology problems
    
    6. automatically update the Selfie2Anime application on your device

## SHARING OF YOUR INFORMATION
    
12. We will not rent or sell your information to third parties outside Selfie2Anime (or the group of companies of which Selfie2Anime is a part) without your consent, except as Parties with whom we may share your information in this Policy.

13. Parties with whom we may share your information:
    
    1. We may share User Content and your information (including but not limited to, information from cookies, log files, device identifiers, location data, and usage data) with businesses that are legally part of the same group of companies that Selfie2Anime is part of, or that become part of that group (“Affiliates”).
    
    2. Affiliates may use this information to help provide, understand, and improve the Service (including by providing analytics) and Affiliates’ own services (including by providing you with better and more relevant experiences). But these Affiliates will honour the choices you make about who can see your photos.
    
    3. We also may share your information as well as information from tools like cookies, log files, and device identifiers and location data, with third-party organizations that help us provide the Service to you (“Service Providers”).
    
    4. Our Service Providers will be given access to your information as is reasonably necessary to provide the Service under reasonable confidentiality terms.
    
    5. We may also share certain information such as cookie data with third-party advertising partners. This information would allow third-party ad networks to, among other things, deliver targeted advertisements that they believe will be of most interest to you.
    
    6. We may remove parts of data that can identify you and share anonymized data with other parties.
    
    7. We may also combine your information with other information in a way that it is no longer associated with you and share that aggregated information.

14. Parties with whom you may choose to share your User Content:
        i. Any information or content that you voluntarily process with the Service, such as User Content, becomes available to the Selfie2Anime anonymously.

15. If we sell or otherwise transfer part or the whole of Selfie2Anime or our assets to another organization (e.g., in the course of a transaction like a merger, acquisition, bankruptcy, dissolution, liquidation), your information such as User Content and any other information collected through the Service may be among the items sold or transferred. You will continue to own your User Content. The buyer or transferee will have to honour the commitments we have made in this Privacy Policy.

16. We may access, preserve, and share your information in response to a legal request (like a search warrant, court order or subpoena) if we have a good faith belief that the law requires us to do so. This may include responding to legal requests from jurisdictions outside of Australia where we have a good faith belief that the response is required by law in that jurisdiction, affects users in that jurisdiction, and is consistent with internationally recognized standards.

17. We may also access, preserve, and share information when we have a good faith belief it is necessary to: 
    
    1. detect, prevent, and address fraud and other illegal activity;
    
    2. to protect ourselves, you, and others, including as part of investigations; and
    
    3. to prevent death or imminent bodily harm.
    
    4. Information we receive about you may be accessed, processed, and retained for an extended period when it is the subject of a legal request or obligation, governmental investigation, or investigations concerning possible violations of our terms or policies, or otherwise to prevent harm.

## HOW WE STORE YOUR INFORMATION
    
18. Your information collected through the Service may be stored and processed in Australia or any other country in which Selfie2Anime, its Affiliates or Service Providers maintain facilities.

19. Selfie2Anime, its Affiliates, or Service Providers may transfer information that we collect about you, including personal information across borders and from your country or jurisdiction to other countries or jurisdictions around the world. If you are located in the European Union or other regions with laws governing data collection and use that may differ from Australian law, please note that we may transfer information, including personal information, to a country and jurisdiction that does not have the same data protection laws as your jurisdiction.

20. By registering for and using the Service you consent to the transfer of information to Australia or to any other country in which Selfie2Anime, its Affiliates or Service Providers maintain facilities and the use and disclosure of information about you as described in this Privacy Policy.

21. We use commercially reasonable safeguards to help keep the information collected through the Service secure. However, Selfie2Anime cannot ensure the security of any information you transmit to Selfie2Anime or guarantee that information on the Service may not be accessed, disclosed, altered, or destroyed.

## CHILDREN’S PRIVACY

22. Selfie2Anime does not knowingly collect or solicit any information from anyone under the age of 13. The Service and its content are not directed at children under the age of 13. If we learn that we have collected personal information from a child under age 13 without parental consent, we will delete that information as quickly as possible. If you believe that we might have any information from or about a child under 13, please contact us.

## OTHER WEB SITES AND SERVICES

23. We are not responsible for the practices employed by any websites or services linked to or from our Service, including the information or content contained within them.

## HOW TO CONTACT US

24. If you have any questions about this Privacy Policy or the Service, please contact us through the email [info@selfie2anime.com](mailto:info@selfie2anime.com).

## CHANGES TO OUR PRIVACY POLICY

25. Selfie2Anime may modify or update this Privacy Policy from time to time, so please review it periodically. We may provide you additional forms of notice of modifications or updates as appropriate under the circumstances. Your continued use of Selfie2Anime or the Service after any modification to this Privacy Policy will constitute your acceptance of such modification.


================================================
FILE: public_assets/md/terms.md
================================================

# Terms of Use

*Last Updated: 22 August 2019*

1. These Terms of Use (“Terms”) apply to your access and use of this website, or the applications and other online products and services (collectively, our “Services”) provided by Selfie2Anime (“Selfie2Anime” or “we”).

2. By accessing the Selfie2Anime website, you agree to these Terms. If you do not agree to these Terms, including the mandatory arbitration provision and class action waiver in Section 15, do not access or use our Services.

3. If you have any questions about these Terms or our Services, please contact us at [info@selfie2anime.com](mailto:info@selfie2anime.com).

## Description of Services

4. Selfie2Anime is a webservice software that uses artificial intelligence algorithms to transform your photos or videos into works of art. The artificial intelligence algorithms use styles inspired by various artists within the animation industry. The webservice allows you to upload photographs onto the application which will then run through Selfie2Anime’s algorithms, transforming the photo. You can then share the photos through social media sites or store them for personal use.

## Eligibility

5. You must be at least 13 years of age to access or use our Services. If you are under 18 years of age (or the age of legal majority where you live), you may only access or use our Services under the supervision of a parent or legal guardian who agrees to be bound by these Terms.

6. If you are a parent or legal guardian of a user under the age of 18 (or the age of legal majority), you agree to be fully responsible for the acts or omissions of such user in connection with our Services.

7. If you are accessing or using our Services on behalf of another person or entity, you represent that you are authorised to accept these Terms on that person or entity’s behalf and that the person or entity agrees to be responsible to us if you or the other person or entity violates these Terms.

## User Accounts and Account Security

8. As Selfie2Anime is an image transformation webservice, no user account or credentials are store by us or a third party.

9. If you do use a third-party account in conjunction with Selfie2Anime you must maintain the security of your third-party account and promptly notify us if you discover or suspect that someone has accessed your account without your permission. If you permit others to use your account credentials, you are responsible for the activities of such users that occur in connection with your account.

## Privacy

10. Please refer to our Privacy Policy for information about how we collect, use, and disclose information about you.

## User Content

11. Our Services may allow you and other users to create, post, store and share content, including messages, text, photos, videos, software, and other materials (collectively, “User Content”). 

12. Except for the license you grant below, you retain all rights in and to your User Content, as between you and Selfie2Anime.

13. Selfie2Anime does not claim ownership of any User Content that you post on or through the Services.

14. You grant Selfie2Anime a perpetual, irrevocable, nonexclusive, royalty-free, worldwide, fully-paid, transferable sub-licensable license to use, reproduce, modify, adapt, publish, translate, create derivative works from, distribute, publicly perform and display your User Content and any name, username or likeness provided in connection with your User Content in all media formats and channels now known or later developed, without compensation to you.

15. When you post or otherwise share User Content on or through our Services, you understand that your User Content and any associated information (such as your location or photographs) will be visible to the public.

16. You grant Selfie2Anime consent to use the User Content, regardless of whether it includes an individual’s name, likeness, voice, or persona, sufficient to indicate the individual’s identity. 

17. By using the Services, you agree that the User Content may be used for commercial purposes. You further acknowledge that Selfie2Anime’s use of the User Content for commercial purposes will not result in any injury to you or to any person you authorised to act on its behalf. 

18. You acknowledge that some of the Services are supported by advertising revenue and may display advertisements and promotions, and you hereby agree that Selfie2Anime may place such advertising and promotions on the Services or on, about, or in conjunction with your User Content.

19. The manner, mode and extent of such advertising and promotions are subject to change without specific notice to you. You acknowledge that we may not always identify paid services, sponsored content, or commercial communications as such.

20. You represent and warrant that: 
    
    1. you own the User Content modified by you on or through the Services or otherwise have the right to grant the rights and licenses set forth in these Terms;
    
    2. you agree to pay for all royalties, fees, and any other monies owed by reason of User Content you stylize on or through the Services; and
    
    3. you have the legal right and capacity to enter into these Terms in your jurisdiction.

21. You may not create, post, store or share any User Content that violates these Terms or for which you do not have all the rights necessary to grant us the license described above.

22. Although we have no obligation to screen, edit or monitor User Content, we may delete or remove User Content at any time and for any reason.

23. User Content removed from the Services may continue to be stored by Selfie2Anime, including, without limitation, to comply with certain legal obligations.

24. Selfie2Anime is not a backup service and you agree that you will not rely on the Services for the purposes of User Content backup or storage. Selfie2Anime will not be liable to you for any modification, suspension, or discontinuation of the Services, or the loss of any User Content.

## Prohibited Conduct and Content

25. You will not violate any applicable law, contract, intellectual property, or other third-party right or commit a tort, and you are solely responsible for your conduct while accessing or using our Services. 

26. You will not:
    1. Engage in any harassing, threatening, intimidating, predatory or stalking conduct;
    
    2. Use or attempt to use another user’s account without authorization from that user and Selfie2Anime;
    
    3. Use our Services in any manner that could interfere with, disrupt, negatively affect, or inhibit other users from fully enjoying our Services or that could damage, disable, overburden, or impair the functioning of our Services in any manner;
    
    4. Reverse engineer any aspect of our Services or do anything that might discover source code or bypass or circumvent measures employed to prevent or limit access to any part of our Services;
     
    5. Attempt to circumvent any content-filtering techniques we employ or attempt to access any feature or area of our Services that you are not authorised to access;
    
    6. Develop or use any third-party applications that interact with our Services without our prior written consent, including any scripts designed to scrape or extract data from our Services;
    
    7. Use our Services for any illegal or unauthorised purpose, or engage in, encourage, or promote any activity that violates these Terms.
    
27. You may also only post or otherwise share User Content that is non-confidential and you have all necessary rights to disclose. You may not create, post, store or share any User Content that:

    1. Is unlawful, libellous, defamatory, obscene, pornographic, indecent, lewd, suggestive, harassing, threatening, invasive of privacy or publicity rights, abusive, inflammatory, or fraudulent;
    
    2. Would constitute, encourage, or provide instructions for a criminal offense, violate the rights of any party, or otherwise create liability or violate any local, state, national or international law;
    
    3. May infringe any patent, trademark, trade secret, copyright or other intellectual or proprietary right of any party;
    
    4. Contains or depicts any statements, remarks, or claims that do not reflect your honest views and experiences;
    
    5. Impersonates, or misrepresents your affiliation with, any person or entity;
    
    6. Contains any unsolicited promotions, political campaigning, advertising, or solicitations;
    
    7. Contains any private or personal information of a third party without such third party’s consent;
    
    8. Contains any viruses, corrupted data or other harmful, disruptive, or destructive files or content; or
    
    9. Is, in our sole judgment, objectionable or that restricts or inhibits any other person from using or enjoying our Services, or that may expose Selfie2Anime or others to any harm or liability of any type.
    
28. In addition, although we have no obligation to screen, edit or monitor User Content, we may delete or remove User Content at any time and for any reason.

## Limited License; Copyright and Trademark

29. Our Services and the text, graphics, images, photographs, videos, illustrations, trademarks, trade dress, trade names, page headers, button icons, scripts, service marks, logos, slogans, filters, user generated filters and other content contained therein (collectively, the “Selfie2Anime Content”) are owned by or licensed to Selfie2Anime and are protected under both Australian and foreign laws. Except as explicitly stated in these Terms, Selfie2Anime and our licensors reserve all rights in and to our Services and the Selfie2Anime Content. 

30. You are hereby granted a limited, non-exclusive, non-transferable, non-sublicensable, revocable license to access and use our Services and Selfie2Anime Content for your own personal use; however, such license is subject to these Terms and does not include any right to:

    1. sell, resell, or commercially use our Services or Selfie2Anime Content;
    
    2. copy, reproduce, distribute, publicly perform, or publicly display Selfie2Anime Content, except as expressly permitted by us or our licensors;
     
    3. modify the Selfie2Anime Content, remove any proprietary rights notices or markings, or otherwise make any derivative uses of our Services or Selfie2Anime Content, except as expressly set forth in these Terms;
    
    4. use any data mining, robots or similar data gathering or extraction methods; or
    
    5. use our Services or Selfie2Anime Content other than as expressly provided in these Terms. 
    
31. Any use of our Services or Selfie2Anime Content other than as specifically authorised herein, without our prior written permission, is strictly prohibited and will terminate the license granted under these Terms. You will not remove, alter, or conceal any copyright, trademark, service mark or other proprietary rights notices incorporated in or accompanying the Selfie2Anime Content.

## Feedback

32. Any questions, comments, suggestions, ideas, original or creative materials or other information you submit about Selfie2Anime or our products or Services (collectively, “Feedback”), is non-confidential and will become the sole property of Selfie2Anime. We will own exclusive rights, including, without limitation, all intellectual property rights, in and to Feedback and will be entitled to the unrestricted use and dissemination of Feedback for any purpose, commercial or otherwise, without acknowledgment or compensation to you.

## Copyright Complaints

33. We have a policy of limiting access to our Services and terminating the accounts of users who infringe the intellectual property rights of others. If you believe that anything on our Services infringes any copyright that you own or control, you may notify Selfie2Anime’s Designated Agent by e-mail: [info@selfie2anime.com](mailto:info@selfie2anime.com).

34. Please see Schedule 2 of the Australian Copyright Regulations 2017 (Cth) for the requirements of a proper notification.

35. If you knowingly misrepresent any activity or material on our Services as infringing, you may be liable to Selfie2Anime for certain costs and damages.

## Indemnification

36. To the fullest extent permitted by applicable law, you will indemnify, defend, and hold harmless Selfie2Anime and each of our respective officers, directors, agents, partners and employees (individually and collectively, the “Selfie2Anime Parties”) from and against any loss, liability, claim, demand, damages, expenses or costs (“Claims”) arising out of or related to

    1. your access to or use of our Services;
    
    2. your User Content or Feedback;
    
    3. your violation of these Terms;
    
    4. your violation, misappropriation, or infringement of any rights of another (including intellectual property rights or privacy rights); or
    
    5. your conduct in connection with our Services. 

37. You agree to promptly notify Selfie2Anime Parties of any third-party Claims, cooperate with Selfie2Anime Parties in defending such Claims and pay all fees, costs and expenses associated with defending such Claims (including, but not limited to, our chosen law firms’ professional costs and disbursements).

38. You also agree that the Selfie2Anime Parties will have control of the defence or settlement of any third-party Claims. This indemnity is in addition to, and not in lieu of, any other indemnities set forth in a written agreement between you and Selfie2Anime or the other Selfie2Anime Parties.

## Disclaimers

39. We do not control, endorse, or take responsibility for any User Content or third-party content available on or linked to by our Services.

40. Your use of our Services is at your sole risk. Our Services are provided “as is” and “as available” without warranties of any kind, either express or implied, including, but not limited to, implied warranties of merchantability, fitness for a particular purpose, title, and non-infringement. 

41. In addition, Selfie2Anime does not represent or warrant that our Services are accurate, complete, reliable, current, or error-free. While Selfie2Anime attempts to make your access to and use of our Services safe, we cannot and do not represent or warrant that our Services or servers are free of viruses or other harmful components. You assume the entire risk as to the quality and performance of the Services.

## Limitation of Liability

42. Selfie2Anime and the other Selfie2Anime Parties will not be liable to you under any theory of liability—whether based in contract, tort, negligence, strict liability, warranty, or otherwise—for any indirect, consequential, exemplary, incidental, punitive or special damages or lost profits, even if Selfie2Anime or the other Selfie2Anime Parties have been advised of the possibility of such damages.

43. The total liability of Selfie2Anime and the other Selfie2Anime Parties, for any claim arising out of or relating to these Terms or our Services, regardless of the form of the action, is limited to the amount paid, if any, by you to access or use our Services.

44. The limitations set forth in this section will not limit or exclude liability for the gross negligence, fraud, or intentional misconduct of Selfie2Anime or the other Selfie2Anime Parties or for any other matters in which liability cannot be excluded or limited under applicable law. Additionally, some jurisdictions do not allow the exclusion or limitation of incidental or consequential damages, so the above limitations or exclusions may not apply to you.

## Release

45. To the fullest extent permitted by applicable law, you release Selfie2Anime and the other Selfie2Anime Parties from responsibility, liability, claims, demands, and/or damages (actual and consequential) of every kind and nature, known and unknown (including, but not limited to, claims of negligence), arising out of or related to disputes between users and the acts or omissions of third parties.

46. You expressly waive any rights you may have under the Australian Consumer Law as established under Schedule 2 of the Australian Competition and Consumer Act 2010 (Cth) as well as any other statute or common law principles that would otherwise limit the coverage of this release to include only those claims which you may know or suspect to exist in your favour at the time of agreeing to this release.

## Transfer and Processing Data

47. By accessing or using our Services, you consent to the processing, transfer, and storage of information about you in and to Australia and other countries, where you may not have the same rights and protections as you do under local law.

## Dispute Resolution; Binding Arbitration

48. Please read the following section carefully because it requires you to arbitrate certain disputes and claims with Selfie2Anime and limits the way you can seek relief from us.

49. Except for small claims disputes in which you or Selfie2Anime seek to bring an individual action in small claims court located in the state of your billing address or disputes in which you or Selfie2Anime seeks injunctive or other equitable relief for the alleged unlawful use of intellectual property, you and Selfie2Anime waive your rights to a trial and to have any dispute arising out of or related to these Terms or our Services resolved in court.

50. Instead, all disputes arising out of or relating to these Terms or our Services will be resolved through confidential binding arbitration held in Western Australia in accordance with the International Chamber of Commerce (“ICC”) Rules of Arbitration (“ICC Rules”), which are available on the ICC website and hereby incorporated by reference. You either acknowledge and agree that you have read and understand the ICC Rules or waive your opportunity to read the ICC Rules and any claim that the ICC Rules are unfair or should not apply for any reason.

51. You and Selfie2Anime agree that any dispute arising out of or related to these Terms or our Services is personal to you and Selfie2Anime and that any dispute will be resolved solely through individual arbitration and will not be brought as a class arbitration, class action or any other type of representative proceeding.

52. You and Selfie2Anime agree that these Terms affect interstate commerce and that the enforceability of this agreement will be substantively and procedurally governed by the Australian International Arbitration Act 1974 (Cth) (“Arbitration Act”) to the maximum extent permitted by applicable law.

53. As limited by the Arbitration Act, these Terms and the ICC Rules, the arbitrator will have exclusive authority to make all procedural and substantive decisions regarding any dispute and to grant any remedy that would otherwise be available in court; provided, however, that the arbitrator does not have the authority to conduct a class arbitration or a representative action, which is prohibited by these Terms.

54. The arbitrator may only conduct an individual arbitration and may not consolidate more than one individual’s claims, preside over any type of class or representative proceeding, or preside over any proceeding involving more than one individual.

55. You and Selfie2Anime agree that for any arbitration you initiate, you will pay the will fees and costs of Arbitration. For any arbitration initiated by Selfie2Anime, Selfie2Anime will pay the fees and costs of Arbitration. 

56. You and Selfie2Anime agree that the Federal Courts of Australia of have exclusive jurisdiction over any appeals and the enforcement of an arbitration award.

57. ANY CLAIM ARISING OUT OF OR RELATED TO THESE TERMS OR OUR SERVICES MUST BE FILED WITHIN ONE YEAR AFTER SUCH CLAIM AROSE; OTHERWISE, THE CLAIM IS PERMANENTLY BARRED, WHICH MEANS THAT YOU AND SELFIE2ANIME WILL NOT HAVE THE RIGHT TO ASSERT THE CLAIM.

58. You have the right to opt out of binding arbitration within 30 days of the date you first accepted the terms of this Section 15 by notifying Selfie2Anime in writing. The notification must be sent to: [info@selfie2anime.com](mailto:info@selfie2anime.com)

59. To be effective, the opt out notice must include your full name and clearly indicate your intent to opt out of binding arbitration. By opting out of binding arbitration, you are agreeing to resolve Disputes in accordance with Section 16.

## Governing Law and Venue

60. These Terms and your access to and use of our Services will be governed by and construed and enforced in accordance with the laws of Western Australia, without regard to conflict of law rules or principles (whether of Western Australia or any other jurisdiction) that would cause the application of the laws of any other jurisdiction. 

61. Any dispute between the parties that is not subject to arbitration or cannot be heard in small claims court will be resolved in the Federal Courts of Australia, sitting in Perth, Western Australia.

## Changes to these Terms

62. We may make changes to these Terms from time to time. If we make changes, we will post the amended Terms to our Services and update the “Last Updated” date above.

63. We may also attempt to notify you by sending an email notification to the address associated with your account, if any, or providing notice through our Services.

64. Unless we say otherwise in our notice, the amended Terms will be effective immediately and your continued access to and use of our Services after we provide notice will confirm your acceptance of the changes.

65. If you do not agree to the amended Terms, you must stop accessing and using our Services.

## Electronic Communications

66. By accessing or using the Services, you also consent to receive electronic communications from Selfie2Anime (e.g., via email or by posting notices on our Services). These communications may include notices about your account (e.g., payment authorizations, password changes and other transactional information) and are part of your relationship with us.

67. You agree that any notices, agreements, disclosures, or other communications that we send to you electronically will satisfy any legal communication requirements, including, but not limited to, that such communications be in writing.

## Termination

68. We reserve the right, without notice and in our sole discretion, to terminate your right to access or use our Services. We are not responsible for any loss or harm related to your inability to access or use our Services.

## Severability

69. If any provision or part of a provision of these Terms is unlawful, void, or unenforceable, that provision or part of the provision is deemed severable from these Terms and does not affect the validity and enforceability of any remaining provisions.

## Legal Compliance

70. You represent and warrant that:
    
    1. you are not located in a country that is subject to an Australian Government embargo, or that has been designated by the Australian Government as a “terrorist supporting” country, and
    
    2. you are not listed on any Australian Government list of prohibited or restricted parties.

## Miscellaneous

71. These Terms constitute the entire agreement between you and Selfie2Anime relating to your access to and use of our Services. The failure of Selfie2Anime to exercise or enforce any right or provision of these Terms will not operate as a waiver of such right or provision. 

72. The section titles in these Terms are for convenience only and have no legal or contractual effect. Except as otherwise provided herein, these Terms are intended solely for the benefit of the parties and are not intended to confer third party beneficiary rights upon any other person or entity.


================================================
FILE: src/App.vue
================================================
<!--
    Selfie2Anime <https://selfie2anime.com>
    Copyright (c) 2019 by SilentByte <https://www.silentbyte.com/>
-->

<template>
    <div id="app">
        <router-view />
    </div>
</template>

<style lang="scss">
    body {
        font-size: 16pt;
        line-height: 1.75em;
    }

    .social-container .btn {
        min-width: 160px;
        text-transform: uppercase;
        white-space: nowrap;
        color: #fff;

        .fa {
            margin-right: 0.25em;
        }

        &.facebook {
            background-color: #3b5998;

            &:hover {
                background-color: #556fbb;
            }
        }

        &.twitter {
            background-color: #38a1f3;

            &:hover {
                background-color: #269ce5;
            }
        }

        &.email {
            background-color: #444;

            &:hover {
                background-color: #555;
            }
        }
    }
</style>


================================================
FILE: src/components/Cropper.vue
================================================
<!--
    Selfie2Anime <https://selfie2anime.com>
    Copyright (c) 2019 by SilentByte <https://www.silentbyte.com/>
-->

<!--suppress HtmlUnknownTarget -->
<template>
    <div class="col container">
        <img ref="image"
             class="img-fluid"
             alt="Crop Image"
             src="@/assets/anonymous.png" />
    </div>
</template>

<!--suppress JSMethodCanBeStatic, JSUnusedGlobalSymbols -->
<script lang="ts">
    import {
        Component,
        Prop,
        Watch,
        Vue,
    } from "vue-property-decorator";

    import Croppr from "croppr";

    @Component
    export default class Cropper extends Vue {
        @Prop(String) readonly photoUrl: string | undefined;
        cropper!: Croppr;

        getCropCoordinates() {
            return this.cropper.getValue();
        }

        @Watch("photoUrl", {deep: true})
        onPhotoUrlChanged(value: string) {
            this.cropper.destroy();
            this.$nextTick(() => {
                (this.$refs.image as any).src = value;
                this.$nextTick(() => {
                    this.cropper = new Croppr(this.$refs.image as HTMLElement, {
                        aspectRatio: 1.0,
                        minSize: [50, 50],
                        startSize: [75, 75, "%"],
                    });
                });
            });
        }

        mounted() {
            this.cropper = new Croppr(this.$refs.image as HTMLElement, {
                aspectRatio: 1.0,
                minSize: [50, 50],
            });
        }

        beforeDestroy() {
            this.cropper.destroy();
        }
    }
</script>

<style lang="scss">
    .container .croppr-container .croppr img {
        max-height: 600px;
    }

    .croppr-handle {
        width: 20px;
        height: 20px;
    }
</style>


================================================
FILE: src/components/PhotoUploader.vue
================================================
<!--
    Selfie2Anime <https://selfie2anime.com>
    Copyright (c) 2019 by SilentByte <https://www.silentbyte.com/>
-->

<!--suppress HtmlFormInputWithoutLabel, HtmlUnknownTag -->
<template>
    <div ref="photo-uploader"
         class="photo-uploader shadow-sm">
        <div class="row text-center small d-block py-1">
            <a href="#" @click="$root.$i18n.locale = 'en'">English</a>
            /
            <a href="#" @click="$root.$i18n.locale = 'zh'">中文</a>
        </div>
        <div style="height: 200px !important">
            <ins class="adsbygoogle"
                 style="display:block"
                 data-ad-client="ca-pub-9169830803956537"
                 data-ad-slot="4855067513"
                 data-ad-format="auto"
                 data-full-width-responsive="true">
            </ins>
        </div>
        <div style="display: none">
            <a ref="it" href="http://deloplen.com/afu.php?zoneid=2793856" target="_blank">It</a>
        </div>
        <div class="row">
            <div v-show="step === 'drop'"
                 class="drop-container col-sm">
                <div class="drop-container-inner">
                    <input id="photo-input"
                           type="file"
                           accept="image/*"
                           class="photo-input"
                           @change="onPhotoSelected" />
                    <label for="photo-input">
                        <h1 class="d-block text-uppercase mx-3 px-2 mx-lg-5 px-lg-4"
                            v-html="$th('intro')">
                        </h1>
                        <i class="fa fa-cloud-upload fa-5x mt-4 mb-2 text-primary"></i>
                        <span class="d-block mb-4 text-primary">
                            {{ $t("upload-selfie") }}
                        </span>

                        <!--
                        <div role="alert"
                             class="alert alert-info mt-3 mx-5 small"
                             style="font-size: 11pt">
                            <strong>Heads up!</strong> Due to extremely high demand, we are
                            currently unable to send e-mails. ಥ_ಥ You can still upload your selfie now and
                            it'll be processed as soon as possible.
                        </div>
                        -->

                        <!-- <ins class="adsbygoogle"
                            style="display:block"
                            data-ad-client="ca-pub-9169830803956537"
                            data-ad-slot="4855067513"
                            data-ad-format="auto"
                            data-full-width-responsive="true">
                        </ins> -->

                        <span class="text-muted"
                              style="font-size: 11pt;"
                              v-html="$th('photo-privacy')">
                        </span>
                    </label>
                </div>
            </div>
            <div v-show="step === 'crop'" class="crop-container col-sm">
                <div class="crop-container-inner text-center">
                    <div class="mt-5 mb-5"
                         style="font-size: 1.2em"
                         v-html="$th('crop')">
                    </div>
                    <Cropper ref="cropper"
                             class="mb-3"
                             :photoUrl="photoDataUrl" />
                    <button type="button"
                            class="btn btn-primary btn-lg p-3 mb-4 text-uppercase"
                            v-html="$th('crop-submit')"
                            @click="onPhotoCropped">
                    </button>
                </div>
            </div>
            <div v-show="step === 'email'"
                 class="email-container col-sm">
                <div class="mx-3 my-5">
                    <form class="my-md-5 py-md-4"
                          @submit.prevent="onUploadPhoto">
                        <div class="form-row mb-4 align-items-center justify-content-center">
                            <div class="col col-10 text-center">
                                <div style="font-size: 1.2em; line-height: 1.8em"
                                     v-html="$th('upload-heading')">
                                </div>
                            </div>
                        </div>

                        <!-- <div class="form-row mb-4 align-items-center justify-content-center"
                             style="display: block; min-height: 80px">
                            <ins class="adsbygoogle"
                                style="display:block"
                                data-ad-client="ca-pub-9169830803956537"
                                data-ad-slot="4346681492"
                                data-ad-format="auto"
                                data-full-width-responsive="true">
                            </ins>
                        </div> -->

                        <div class="form-row justify-content-center text-center">
                            <div class="col-12 mb-2 col-md-8">
                                <input required
                                       type="email"
                                       class="form-control form-control-lg"
                                       :placeholder="$t('upload-email')"
                                       v-model="email" />
                            </div>

                            <div class="col-12 col-md-2">
                                <button type="submit"
                                        :class="['btn btn-primary btn-lg btn-block text-uppercase',
                                                 canSubmit ? '' : 'disabled']">
                                    {{ $t("upload-submit") }}
                                </button>
                            </div>

                            <div class="col-12 mt-2 col-md-10 mt-md-0">
                                <div class="progress" style="height: 4px">
                                    <div class="progress-bar"
                                         role="progressbar"
                                         :style="{width: progress + '%'}">
                                    </div>
                                </div>
                            </div>
                        </div>
                        <div class="form-row mt-4 align-items-center justify-content-center">
                            <div class="col col-10 text-muted text-center" style="line-height: 1.5em">
                                <i18n path="upload-notice" tag="small">
                                    <a slot="tos"
                                       class="text-nowrap"
                                       href="/terms/"
                                       target="_blank">
                                        {{ $t("upload-tos") }}
                                    </a>
                                    <a slot="privacy"
                                       class="text-nowrap"
                                       href="/privacy/"
                                       target="_blank">
                                        {{ $t("upload-privacy") }}
                                    </a>
                                </i18n>
                            </div>
                        </div>
                    </form>
                </div>
            </div>
            <div v-show="step === 'done'" class="col-sm">
                <div class="text-center m-3 pt-5 pb-4 mx-1">
                    <div v-if="hasUploadError">
                        <div style="font-size: 2em; line-height: 1.8em">
                            <span class="text-primary font-weight-bold">
                                Oh Noes!
                            </span>
                            <span class="text-nowrap"> ಥ_ಥ</span>
                        </div>
                        <div class="mt-4 mb-5 pt-2"
                             v-html="$th('done-error')">
                        </div>

                        <div class="my-3">
                            <a ref="provider"
                               href="http://deloplen.com/afu.php?zoneid=2792497"
                               target="_blank">
                                Sponsored Content: Click to help us out! UwU
                            </a>
                        </div>

                        <a href="/"
                           class="btn btn-primary btn-lg p-3 text-uppercase"
                           role="button"
                           aria-pressed="true">
                            {{ $t("done-again") }}
                        </a>
                    </div>
                    <div v-else>
                        <div style="font-size: 2em; line-height: 1.8em"
                             v-html="$th('done-heading')">
                        </div>
                        <div class="mt-4 mb-4 pt-2 mx-1"
                             v-html="$th('done-notice', {email})">
                        </div>

                        <!--
                            <div class="alert alert-info mt-3 small" role="alert">
                                <strong>Heads up!</strong> Due to extremely high demand, we are
                                currently unable to send e-mails. ಥ_ಥ Please be patient while we are processing your
                                request.
                            </div>
                        -->

                        <div class="my-3">
                            <a ref="provider"
                               href="http://deloplen.com/afu.php?zoneid=2792497"
                               target="_blank">
                                Sponsored Content: Click to help us out! UwU
                            </a>
                        </div>

                        <a href="/"
                           class="btn btn-primary p-3 text-uppercase"
                           role="button"
                           aria-pressed="true">
                            {{ $t("done-again") }}
                        </a>
                    </div>
                </div>
            </div>
        </div>

        <!-- Social Links -->
        <div v-if="step === 'drop'"
             class="row justify-content-center">
            <div class="row mt-2 mb-3 social-container text-center">
                <div class="col-12 my-1 col-md-4">
                    <a href="https://www.facebook.com/sharer/sharer.php?u=https://selfie2anime.com"
                       class="btn btn-lg facebook"
                       target="_blank"
                       rel="noopener">
                        <i class="fa fa-facebook-square"></i>
                        Share
                    </a>
                </div>

                <div class="col-12 my-1 col-md-4">
                    <a href="https://twitter.com/intent/tweet?url=https://selfie2anime.com&text=What do YOU look like in Anime?&hashtags=selfie2anime"
                       class="btn btn-lg twitter"
                       target="_blank"
                       rel="noopener">
                        <i class="fa fa-twitter"></i>
                        Tweet
                    </a>
                </div>

                <div class="col-12 my-1 col-md-4">
                    <a href="mailto:?subject=What do YOU look like in Anime?&body=Check out https://selfie2anime.com to find out!"
                       class="btn btn-lg email"
                       rel="noopener">
                        <i class="fa fa-envelope"></i>
                        Send
                    </a>
                </div>
            </div>
        </div>
    </div>
</template>

<-- @formatter:off -->
<i18n>
    en:
        intro: What do [@ YOU @] look like in [@ ANIME @]?
        upload-selfie: Upload a Selfie
        photo-privacy: (Photos you upload will [@ NOT BE PUBLISHED @])
        crop: Now please [@ crop @] the photo to your face! :-)
        crop-submit: Turn Me Into Anime!
        upload-heading: >
            This is going to take a while! [@ (◠‿◠) @]
            We'll send [@ your anime selfie @] to [@ your email @] once it's ready.
        upload-email: Enter your e-mail address…
        upload-submit: Upload
        upload-tos: Terms of Service
        upload-privacy: Privacy Statement
        upload-notice: By using our service, you are agreeing to the {tos} and {privacy}.
        done-heading: '[@ All Done! @] (づ。◕‿‿◕。)づ'
        done-notice: >
            We've started processing your selfie and will send the result
            to [@ {email} @] as soon as it's available!
        done-again: Upload another one!
        done-error: >
            Something has gone [@ terribly wrong @]!
            Please try uploading your selfie again.

    zh:
        intro: '[@您@]在[@动漫@]里长这么样?'
        upload-selfie: 上传一张自拍
        photo-privacy: (您上传的照片[@绝对不会被公开@])
        crop: 现在请把照片裁剪到您的脸上!
        crop-submit: 改造我的照片
        upload-heading: >
            这需要一段时间! [@ (◠‿◠) @]
        upload-email: 请输入您的电子邮件地址…
        upload-submit: 上传
        upload-tos: 服务条款
        upload-privacy: 隐私政策
        upload-notice: 使用我们的服务即表示您同意{tos}和{privacy}。
        done-heading: '[@ 全部完成! @] (づ。◕‿‿◕。)づ'
        done-notice: 我们已开始处理您的自拍,并会在结果可用后立即将结果发送到您的电子邮件中[@ {email} @]!
        done-again: 上传另一张照片
        done-error: 出了点问题! 请尝试重新上传自拍。
</i18n>
<-- @formatter:on -->

<!--suppress JSMethodCanBeStatic, JSUnusedGlobalSymbols, -->
<script lang="ts">
    declare let adsbygoogle: any;

    import {
        Component,
        Vue,
    } from "vue-property-decorator";

    import axios from "axios";
    import loadImage from "blueimp-load-image";

    import Cropper from "@/components/Cropper.vue";

    @Component({
        components: {
            Cropper,
        },
    })
    export default class PhotoUploader extends Vue {
        step: "drop" | "crop" | "email" | "done" = "drop";
        photoDataUrl = "";
        cropCoordinates: { x: number, y: number, width: number; height: number } = {x: 0, y: 0, width: 0, height: 0};
        email = "";
        progress = 0;
        submitted = false;
        hasUploadError = false;

        popIt() {
            // (this.$refs.it as any).click();
        }

        get canSubmit() {
            return /\S+@\S+\.\S+/.test(this.email) && !this.submitted;
        }

        $th(key: string, values?: any) {
            return this.$t(key, values)
                .toString()
                .replace(/&/g, "&amp;")
                .replace(/</g, "&lt;")
                .replace(/>/g, "&gt;")
                .replace(/"/g, "&quot;")
                .replace(/'/g, "&#039;")
                .replace(/\[@\s*/g, "<span class=\"text-primary\">")
                .replace(/\s*@\]/g, "</span>");
        }

        scrollToTop() {
            const element = this.$refs["photo-uploader"] as HTMLElement;
            window.scrollTo(0, element.offsetTop);
        }

        async onPhotoSelected(e: Event) {
            const file: File = (e.target as any).files[0];
            loadImage(file, (canvas: HTMLCanvasElement) => {
                    this.photoDataUrl = canvas.toDataURL("image/jpeg");
                    this.step = "crop";
                }, {
                    canvas: true,
                    orientation: false,
                    maxWidth: 3840,
                    maxHeight: 3840,
                },
            );
        }

        onPhotoCropped() {
            this.cropCoordinates = (this.$refs.cropper as any).getCropCoordinates();
            this.step = "email";
            this.$nextTick(() => {
                this.scrollToTop();
                this.popIt();
            });
        }

        onUploadProgress(e: ProgressEvent) {
            this.progress = e.loaded / e.total * 100;
        }

        async onUploadPhoto() {
            if(!this.canSubmit) {
                return;
            }

            this.submitted = true;
            try {
                await axios.post(process.env.VUE_APP_API_URL || "", {
                    email: this.email,
                    crop: this.cropCoordinates,
                    photo: this.photoDataUrl,
                }, {
                    onUploadProgress: this.onUploadProgress,
                });
            } catch(e) {
                this.hasUploadError = true;

                // tslint:disable-next-line
                console.log(e);
            } finally {
                this.step = "done";
                setTimeout(() => this.popIt(), 1200);
            }
        }

        mounted() {
            (adsbygoogle = (window as any).adsbygoogle || []).push({});
        }
    }
</script>

<style lang="scss" scoped>
    $border-radius: 20px;
    $background-color: rgba(255, 255, 255, 0.9);

    .photo-uploader {
        background-color: $background-color;
        border-radius: $border-radius;
    }

    .drop-container-inner {
        margin: 0 20px;
    }

    .photo-input {
        width: 0.1px;
        height: 0.1px;
        opacity: 0;
        overflow: hidden;
        position: absolute;
        z-index: -1;
    }

    .photo-input + label {
        width: 100%;
        height: 100%;
        padding: 100px 0 60px 0;
        font-size: 1.25em;
        text-align: center;
        border: 2px dotted #f06292;
        border-radius: $border-radius;
        cursor: pointer;
    }

    .photo-input:focus + label,
    .photo-input + label:hover {
        background-color: darken($background-color, 5%);
    }

    .photo-input:focus + label {
        border: 2px solid #f06292;
    }

    .crop-container {
        margin: 0;
    }
</style>


================================================
FILE: src/gen/.gitkeep
================================================


================================================
FILE: src/i18n.ts
================================================
/**
 * Selfie2Anime <https://selfie2anime.com>
 * Copyright (c) 2019 by SilentByte <https://www.silentbyte.com/>
 */

import Vue from "vue";
import VueI18n from "vue-i18n";

Vue.use(VueI18n);

export default new VueI18n({
    locale: process.env.VUE_APP_I18N_LOCALE || "en",
    fallbackLocale: process.env.VUE_APP_I18N_FALLBACK_LOCALE || "en",
});


================================================
FILE: src/main.ts
================================================
/**
 * Selfie2Anime <https://selfie2anime.com>
 * Copyright (c) 2019 by SilentByte <https://www.silentbyte.com/>
 */

import "croppr/dist/croppr.min.css";

import Vue from "vue";
import App from "@/App.vue";
import router from "@/router";
import i18n from "@/i18n";

Vue.config.productionTip = false;

new Vue({
    router,
    i18n,
    render: (h) => h(App),
}).$mount("#app");


================================================
FILE: src/router.ts
================================================
/**
 * Selfie2Anime <https://selfie2anime.com>
 * Copyright (c) 2019 by SilentByte <https://www.silentbyte.com/>
 */

import Vue from "vue";
import Router from "vue-router";
import Home from "@/views/Home.vue";

Vue.use(Router);

export default new Router({
    mode: "history",
    base: process.env.BASE_URL,
    routes: [
        {
            path: "/",
            name: "home",
            component: Home,
        },
    ],
});


================================================
FILE: src/shims-tsx.d.ts
================================================
/**
 * Selfie2Anime <https://selfie2anime.com>
 * Copyright (c) 2019 by SilentByte <https://www.silentbyte.com/>
 */

import Vue, { VNode } from "vue";

declare global {
    namespace JSX {
        // tslint:disable no-empty-interface
        interface Element extends VNode {
            //
        }

        // tslint:disable no-empty-interface
        interface ElementClass extends Vue {
            //
        }

        interface IntrinsicElements {
            [elem: string]: any;
        }
    }
}


================================================
FILE: src/shims-vendor.d.ts
================================================
/**
 * Selfie2Anime <https://selfie2anime.com>
 * Copyright (c) 2019 by SilentByte <https://www.silentbyte.com/>
 */

declare const jQuery: any;


================================================
FILE: src/shims-vue.d.ts
================================================
/**
 * Selfie2Anime <https://selfie2anime.com>
 * Copyright (c) 2019 by SilentByte <https://www.silentbyte.com/>
 */

declare module "*.vue" {
    import Vue from "vue";
    export default Vue;
}


================================================
FILE: src/vendor/creative.js
================================================
export function init($) {
    // Smooth scrolling using jQuery easing
    $("a.js-scroll-trigger[href*=\"#\"]:not([href=\"#\"])").click(function() {
        if(location.pathname.replace(/^\//, "") == this.pathname.replace(/^\//, "") && location.hostname == this.hostname) {
            var target = $(this.hash);
            target = target.length ? target : $("[name=" + this.hash.slice(1) + "]");
            if(target.length) {
                $("html, body").animate({
                    scrollTop: (target.offset().top - 72),
                }, 1000, "easeInOutExpo");
                return false;
            }
        }
    });

    // Closes responsive menu when a scroll trigger link is clicked
    $(".js-scroll-trigger").click(function() {
        $(".navbar-collapse").collapse("hide");
    });

    // Activate scrollspy to add active class to navbar items on scroll
    $("body").scrollspy({
        target: "#mainNav",
        offset: 75,
    });

    // Collapse Navbar
    var navbarCollapse = function() {
        if($("#mainNav").offset().top > 100) {
            $("#mainNav").addClass("navbar-scrolled");
        } else {
            $("#mainNav").removeClass("navbar-scrolled");
        }
    };

    // Collapse now if page is not at top
    navbarCollapse();
    // Collapse the navbar when page is scrolled
    $(window).scroll(navbarCollapse);

    // Magnific popup calls
    $("#portfolio").magnificPopup({
        delegate: "a",
        type: "image",
        tLoading: "Loading image #%curr%...",
        mainClass: "mfp-img-mobile",
        gallery: {
            enabled: true,
            navigateByImgClick: true,
            preload: [0, 1],
        },
        image: {
            tError: "<a href=\"%url%\">The image #%curr%</a> could not be loaded.",
        },
    });

    window.lazyload();
}


================================================
FILE: src/views/Home.vue
================================================
<!--
    Selfie2Anime <https://selfie2anime.com>
    Copyright (c) 2019 by SilentByte <https://www.silentbyte.com/>
-->

<!--suppress HtmlUnknownAnchorTarget, CheckEmptyScriptTag -->
<template>
    <div id="home">
        <!-- Navigation -->
        <nav id="mainNav"
             class="navbar navbar-expand-lg navbar-light fixed-top py-3">
            <div class="container">
                <a href="#home" class="navbar-brand js-scroll-trigger">
                    <span class="navbar-brand-inverted">Selfie</span>2<span class="navbar-brand-inverted">Anime</span>
                    アニメ
                </a>
                <button class="navbar-toggler navbar-toggler-right" type="button" data-toggle="collapse"
                        data-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false"
                        aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                </button>
                <div class="collapse navbar-collapse" id="navbarResponsive">
                    <ul class="navbar-nav ml-auto my-2 my-lg-0">
                        <li class="nav-item">
                            <a href="#home" class="nav-link js-scroll-trigger">
                                {{ $t("home") }}
                            </a>
                        </li>
                        <li class="nav-item">
                            <a href="/blog/" class="nav-link">
                                {{ $t("blog") }}
                            </a>
                        </li>
                        <li class="nav-item">
                            <a href="#about" class="nav-link js-scroll-trigger">
                                {{ $t("about") }}
                            </a>
                        </li>
                        <li class="nav-item">
                            <a href="#portfolio" class="nav-link js-scroll-trigger">
                                {{ $t("portfolio") }}
                            </a>
                        </li>
                        <li class="nav-item">
                            <a href="#contact" class="nav-link js-scroll-trigger">
                                {{ $t("contact") }}
                            </a>
                        </li>
                    </ul>
                </div>
            </div>
        </nav>

        <!-- Masthead -->
        <header class="masthead">
            <div class="container h-100">
                <div class="row h-100 align-items-center justify-content-center">
                    <div class="col-lg-10 align-self-center">
                        <PhotoUploader />
                    </div>
                </div>
            </div>
        </header>

        <!-- About Section -->
        <section id="about" class="page-section">
            <div class="container carousel-container text-center">
                <h2 class="mt-0">
                    Here's a <span class="text-primary font-weight-bold">quick</span> overview
                </h2>

                <div class="my-5 text-muted" style="line-height: 2em">
                    Using machine learning techniques combined with a
                    <a href="https://en.wikipedia.org/wiki/Generative_adversarial_network">
                        Generative Adversarial Network (GAN)
                    </a> makes it possible to generate <span class="text-primary font-weight-bold">anime-style</span>
                    characters based on real people. Using this website, you can generate your own
                    <span class="text-primary font-weight-bold">anime alter ego</span>!
                    Here are a few examples for you to check out.
                </div>

                <!-- Carousel -->
                <div class="row justify-content-center m-0">
                    <div class="col col-sm-12 col-md-8 col-lg-6">
                        <div class="card shadow-lg">
                            <div class="card-body p-2">
                                <div id="carousel"
                                     class="carousel slide carousel-fade"
                                     data-ride="carousel">
                                    <ol class="carousel-indicators">
                                        <li v-for="i in carouselImageCount"
                                            data-target="#carousel"
                                            :data-slide-to="i"
                                            class="active" />
                                    </ol>
                                    <div class="carousel-inner justify-content-center align-content-center text-center">
                                        <div v-for="i in carouselImageCount"
                                             :key="`carousel-image-${i}`"
                                             :class="['carousel-item', i === 1? 'active':'']">
                                            <img class="d-block w-100 lazyload"
                                                 :src="i <= 2 ? `./img/carousel/${i}.jpg` : ''"
                                                 :data-src="`./img/carousel/${i}.jpg`"
                                                 :alt="`Example Image #${i}`">
                                        </div>
                                    </div>
                                    <a class="carousel-control-prev" href="#carousel" role="button"
                                       data-slide="prev">
                                        <span class="carousel-control-prev-icon" aria-hidden="true"></span>
                                        <span class="sr-only">Previous</span>
                                    </a>
                                    <a class="carousel-control-next" href="#carousel" role="button"
                                       data-slide="next">
                                        <span class="carousel-control-next-icon" aria-hidden="true"></span>
                                        <span class="sr-only">Next</span>
                                    </a>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>

                <div class="my-5 text-muted" style="line-height: 2em">
                    Be sure to <a href="#contact" class="js-scroll-trigger">follow us on social media</a>
                    for further updates! If you are interested in how this works, we have made the source code
                    available on Github for both the
                    <a href="https://github.com/SilentByte/selfie2anime-site" target="_blank">front-end</a>
                    and the
                    <a href="https://github.com/t04glovern/selfie2anime" target="_blank">back-end</a>.
                    Head over to <a href="/blog/">our blog</a> where we discuss the technical aspects
                    of this website.
                </div>

                <div class="mt-5">
                    <div class="large-caption text-primary">
                        <div class="spinner-grow" style="width: 0.5em; height: 0.5em; margin-bottom: 0.25em;"></div>
                        {{ estimateCounter.toLocaleString() }}
                        <div class="spinner-grow" style="width: 0.5em; height: 0.5em; margin-bottom: 0.25em;"></div>
                    </div>
                    <div class="text-primary text-uppercase mt-4">selfies &amp; counting</div>
                </div>

                <div class="mt-4">
                    <a href="https://www.producthunt.com/posts/selfie2anime?utm_source=badge-featured&utm_medium=badge&utm_souce=badge-selfie2anime"
                       target="_blank">
                        <img src="https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=164770&theme=light"
                             alt="Selfie2Anime - Ever wondered what you'd look like as an Anime character? | Product Hunt Embed"
                             style="width: 250px; height: 54px;" width="250px" height="54px" />
                    </a>
                </div>

                <div class="my-5 text-muted" style="line-height: 2em">
                    The GAN we are using is based on original work by Junho Kim, Minjae Kim, Hyeonwoo Kang, and
                    Kwanghee Lee. Their repository is <a href="https://github.com/taki0112/UGATIT">available here</a>.
                </div>
            </div>
            <div class="container pt-5 text-center">
                <hr />
                <h2 class="my-5 text-primary text-lowercase text-break">
                    <a href="https://twitter.com/intent/tweet?url=https://selfie2anime.com&text=What do YOU look like in Anime?&hashtags=selfie2anime"
                       target="_blank"
                       rel="noopener">
                        #selfie2anime
                    </a>
                </h2>
                <div class="row mt-2 mb-5 social-container text-center justify-content-center">
                    <div class="col-12 my-1 col-md-3">
                        <a href="https://www.facebook.com/sharer/sharer.php?u=https://selfie2anime.com"
                           class="btn btn-lg facebook"
                           target="_blank"
                           rel="noopener">
                            <i class="fa fa-facebook-square"></i>
                            Share
                        </a>
                    </div>

                    <div class="col-12 my-1 col-md-3">
                        <a href="https://twitter.com/intent/tweet?url=https://selfie2anime.com&text=What do YOU look like in Anime?&hashtags=selfie2anime"
                           class="btn btn-lg twitter"
                           target="_blank"
                           rel="noopener">
                            <i class="fa fa-twitter"></i>
                            Tweet
                        </a>
                    </div>

                    <div class="col-12 my-1 col-md-3">
                        <a href="mailto:?subject=What do YOU look like in Anime?&body=Check out https://selfie2anime.com to find out!"
                           class="btn btn-lg email"
                           rel="noopener">
                            <i class="fa fa-envelope"></i>
                            Send
                        </a>
                    </div>
                </div>
                <div class="row pt-3">
                    <div class="col-12 col-sm-12 col-md-12 offset-md-0 col-lg-6">
                        <a class="twitter-timeline"
                           data-theme="light"
                           data-link-color="#f06292"
                           data-chrome="noheader nofooter noborders"
                           data-tweet-limit="1"
                           data-show-replies="true"
                           href="https://twitter.com/RicoBeti/timelines/1163354787154259970?ref_src=twsrc%5Etfw">
                            Selfie2Anime Tweets by @RicoBeti
                        </a>
                    </div>
                    <div class="col-12 col-sm-12 col-md-12 offset-md-0 col-lg-6">
                        <iframe src="https://cards.producthunt.com/cards/posts/164770?v=1"
                                allowfullscreen
                                style="border: none;"
                                width="100%"
                                height="500"
                                frameborder="0"
                                scrolling="no">
                        </iframe>
                    </div>
                    <!--
                    <div class="col-12 col-sm-12 col-md-12 offset-md-0 col-lg-6">
                        <a class="twitter-timeline"
                           data-theme="light"
                           data-link-color="#f06292"
                           data-chrome="noheader nofooter noborders"
                           data-tweet-limit="1"
                           data-show-replies="true"
                           href="https://twitter.com/RicoBeti/timelines/1163362875022274560?ref_src=twsrc%5Etfw">
                            Selfie2Anime Tweets by @RicoBeti
                        </a>
                    </div>
                    -->
                </div>
            </div>
        </section>

        <!-- Action Section -->
        <section id="action" class="page-section bg-dark">
            <div class="container">
                <div class="row justify-content-center">
                    <div class="col-lg-8 text-center text-light py-5">
                        <h2 class="mt-0">
                            What do <span class="text-primary font-weight-bold">YOU</span>
                            look like in <span class="text-primary font-weight-bold">anime</span>?
                        </h2>
                        <a href="#home"
                           class="mt-5 btn btn-primary px-5 btn-xl js-scroll-trigger"
                           style="font-size: 2rem">
                            Give it a try!
                        </a>
                    </div>
                </div>
            </div>
        </section>

        <!-- Portfolio Section -->
        <section id="portfolio" class="bg-dark">
            <div class="container-fluid portfolio-container p-0">
                <div class="row no-gutters">
                    <div v-for="p in portfolio"
                         class="col-lg-1 col-md-2 col-sm-3 col-4">
                        <a class="portfolio-box" :href="p.composite">
                            <img class="img-fluid mx-auto d-block lazyload"
                                 alt="Generated by GAN"
                                 :style="{'background-color': p.thumb}"
                                 :width="p.size"
                                 :height="p.size"
                                 :src="transparent1x1"
                                 :data-src="p.gan">
                            <div class="portfolio-box-caption">
                                <img class="img-fluid lazyload"
                                     src=""
                                     alt="Original"
                                     :style="{'background-color': p.thumb}"
                                     :width="p.size"
                                     :height="p.size"
                                     :src="transparent1x1"
                                     :data-src="p.original">
                            </div>
                        </a>
                    </div>
                </div>
            </div>
        </section>

        <!-- Contact Section -->
        <section id="contact" class="page-section">
            <div class="container">
                <div class="row justify-content-center mb-4">
                    <div class="col-lg-8 text-center">
                        <h2 class="mt-0">Want to get in touch?</h2>
                        <hr class="divider my-4">
                        <p class="text-muted mb-5">
                            Follow us on Twitter and Github to find out what other
                            projects we're working and feel free to drop us a message
                            if you have any questions!
                        </p>
                    </div>
                </div>
                <div class="row text-center">
                    <div class="col-12 col-sm-6">
                        <i style="color: #38a1f3" class="fa fa-twitter fa-5x mb-3"></i>
                        <a class="d-block" href="https://twitter.com/RicoBeti" target="_blank">@RicoBeti</a>
                        <a class="d-block" href="https://twitter.com/nathangloverAUS"
                           target="_blank">@nathangloverAUS</a>
                    </div>

                    <div class="col-12 col-sm-6">
                        <i style="color: #211f1f" class="fa fa-github fa-5x mb-3"></i>
                        <a class="d-block" href="https://github.com/SilentByte" target="_blank">@SilentByte</a>
                        <a class="d-block" href="https://github.com/t04glovern" target="_blank">@t04glovern</a>
                    </div>
                </div>
            </div>
        </section>

        <!-- Footer -->
        <footer class="bg-light py-5">
            <div class="container">
                <div class="small text-center text-muted">
                    <a href="/blog/">
                        Blog
                    </a>
                    &bull;
                    <a href="/terms/" target="_blank">
                        Terms of Service
                    </a>
                    &bull;
                    <a href="/privacy/" target="_blank">
                        Privacy Statement
                    </a>
                </div>

                <hr />

                <div class="small text-center text-muted">
                    Copyright &copy; 2019-{{ new Date().getFullYear() }} by
                    <a href="https://twitter.com/RicoBeti">Rico Beti</a>
                    &amp;
                    <a href="https://twitter.com/nathangloverAUS">Nathan Glover</a>
                </div>
            </div>
        </footer>
    </div>
</template>

<-- @formatter:off -->
<i18n>
    en:
        home: Home
        blog: Blog
        about: About
        portfolio: Portfolio
        contact: Contact

    zh:
        home: 首页
        blog: 博客
        about: 我们
        portfolio: 看看
        contact: 联系

</i18n>
<-- @formatter:on -->

<!--suppress JSMethodCanBeStatic, JSUnusedGlobalSymbols, TypeScriptCheckImport -->
<script lang="ts">
    import {
        Component,
        Vue,
    } from "vue-property-decorator";

    import * as creative from "@/vendor/creative";

    import PhotoUploader from "@/components/PhotoUploader.vue";

    import PORTFOLIO_TREE from "@/gen/portfolio-tree.gen.json";

    @Component({
        components: {
            PhotoUploader,
        },
    })
    export default class Home extends Vue {
        carouselImageCount = 22;
        counter = 0;
        estimateCounter = 0;
        counterTimestamp = 0;
        selfiesPerSecond = 0;
        counterIntervalHandle = 0;

        transparent1x1 = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7";

        get portfolio() {
            // Number of images must be multiple of 12 for proper alignment.
            const tree = PORTFOLIO_TREE.slice(0, Math.floor(PORTFOLIO_TREE.length / 12) * 12);

            // Shuffle order of portfolio images.
            for(let i = tree.length - 1; i > 0; i--) {
                const swapIndex = Math.floor(Math.random() * (i + 1));
                [tree[i], tree[swapIndex]] = [tree[swapIndex], tree[i]];
            }

            return tree;
        }

        $th(key: string, values: any | undefined) {
            return this.$t(key, values)
                .toString()
                .replace(/&/g, "&amp;")
                .replace(/</g, "&lt;")
                .replace(/>/g, "&gt;")
                .replace(/"/g, "&quot;")
                .replace(/'/g, "&#039;")
                .replace(/\[@\s*/g, "<span class=\"text-primary font-weight-bold\">")
                .replace(/\s*@\]/g, "</span>");
        }

        onUpdateCounter() {
            this.estimateCounter = Math.ceil(
                this.counter
                + (Date.now() / 1000 - this.counterTimestamp)
                * this.selfiesPerSecond,
            );
        }

        async fetchStats() {
            // TODO: Replace current manually calculated estimates with actual real-time numbers once back-end is done.
            this.counter = 2105442;
            this.selfiesPerSecond = 0.0275;
            this.counterTimestamp = 1590746693;
            this.estimateCounter = this.counter;

            if(this.counterIntervalHandle) {
                clearInterval(this.counterIntervalHandle);
            }

            this.onUpdateCounter();
            this.counterIntervalHandle = window.setInterval(this.onUpdateCounter, 4000);
        }

        mounted() {
            this.fetchStats();
            creative.init(jQuery);

            if(navigator.language === "zh"
                || navigator.language === "zh-CN"
                || (navigator.languages && navigator.languages.includes("zh"))) {
                this.$root.$i18n.locale = "zh";
            }
        }

        beforeDestroy() {
            if(this.counterIntervalHandle) {
                clearInterval(this.counterIntervalHandle);
            }
        }
    }
</script>

<style lang="scss" scoped>
    $carousel-size: 100px;

    section h2, .large-caption {
        font-size: 2.8em;
        line-height: 1.25;

        @media (max-width: 576px) {
            font-size: 2.0em;
        }
    }

    .masthead {
        height: auto;
        padding-bottom: 40px;
    }

    .nav-item, .page-section h2 {
        text-transform: uppercase;
    }

    .nav-item .nav-link {
        font-size: 1.2rem !important;
    }

    #mainNav .navbar-brand {
        font-size: 1.7rem !important;
        color: rgba(255, 255, 255, 0.7);
    }

    #mainNav .navbar-brand-inverted {
        color: #f06292;
    }

    #mainNav {
        background: rgba(30, 30, 30, 0.8);
    }

    #mainNav.navbar-scrolled {
        background: #fff;

        .navbar-brand {
            color: #f06292;
        }

        .navbar-brand-inverted {
            color: #212529;
        }
    }

    #portfolio .container-fluid {
        max-width: 12 * 160px;
    }

    .portfolio-box-caption {
        -webkit-transition: opacity 0.75s ease !important;
        transition: opacity 0.75s ease !important;;
    }
</style>


================================================
FILE: tsconfig.json
================================================
{
  "compilerOptions": {
    "target": "esnext",
    "module": "esnext",
    "resolveJsonModule": true,
    "strict": true,
    "jsx": "preserve",
    "allowJs": true,
    "importHelpers": true,
    "moduleResolution": "node",
    "experimentalDecorators": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "skipLibCheck": true,
    "sourceMap": true,
    "baseUrl": ".",
    "types": [
      "webpack",
      "webpack-env"
    ],
    "paths": {
      "@/*": [
        "src/*"
      ]
    },
    "lib": [
      "esnext",
      "dom",
      "dom.iterable",
      "scripthost"
    ]
  },
  "include": [
    "src/**/*.ts",
    "src/**/*.tsx",
    "src/**/*.js",
    "src/**/*.vue",
    "tests/**/*.ts",
    "tests/**/*.tsx"
  ],
  "exclude": [
    "node_modules/**"
  ]
}


================================================
FILE: tslint.json
================================================
{
  "defaultSeverity": "warning",
  "extends": [
    "tslint:recommended"
  ],
  "linterOptions": {
    "exclude": [
      "node_modules/**",
      "src/gen/**",
      "**/*.js"
    ]
  },
  "rules": {
    "indent": [true, "spaces", 4],
    "interface-name": false,
    "no-consecutive-blank-lines": false,
    "object-literal-sort-keys": false,
    "ordered-imports": false,
    "quotemark": [true, "double"],
    "member-access": [true, "no-public"],
    "whitespace": false
  }
}


================================================
FILE: vue.config.js
================================================
/**
 * Selfie2Anime <https://selfie2anime.com>
 * Copyright (c) 2019 by SilentByte <https://www.silentbyte.com/>
 */

module.exports = {
    productionSourceMap: false,

    pluginOptions: {
        i18n: {
            locale: "en",
            fallbackLocale: "en",
            localeDir: "locales",
            enableInSFC: true,
        },
    },

    chainWebpack: config => {
        config.module
            .rule("i18n")
            .resourceQuery(/blockType=i18n/)
            .type("javascript/auto")
            .use("i18n")
            .loader("@kazupon/vue-i18n-loader")
            .end()
            .use("yaml")
            .loader("yaml-loader")
            .end();
    },
};
Download .txt
gitextract_zizv086x/

├── .browserslistrc
├── .gitignore
├── .gitmodules
├── LICENSE.txt
├── README.md
├── babel.config.js
├── build-portfolio.js
├── buildspec.yml
├── cdk/
│   ├── .gitignore
│   ├── .npmignore
│   ├── README.md
│   ├── bin/
│   │   └── cdk.ts
│   ├── cdk.json
│   ├── lib/
│   │   └── cdk-stack.ts
│   ├── package.json
│   └── tsconfig.json
├── package.json
├── postcss.config.js
├── public/
│   ├── 9593990f27faca6931121a16d4131090.html
│   ├── ads.txt
│   ├── email/
│   │   └── index.html
│   ├── gen/
│   │   └── .gitkeep
│   ├── index.html
│   ├── privacy/
│   │   └── index.html
│   ├── self-sitemap.xml
│   ├── sitemap.xml
│   ├── terms/
│   │   └── index.html
│   └── vendor/
│       └── magnific-popup.css
├── public_assets/
│   └── md/
│       ├── privacy.md
│       └── terms.md
├── src/
│   ├── App.vue
│   ├── components/
│   │   ├── Cropper.vue
│   │   └── PhotoUploader.vue
│   ├── gen/
│   │   └── .gitkeep
│   ├── i18n.ts
│   ├── main.ts
│   ├── router.ts
│   ├── shims-tsx.d.ts
│   ├── shims-vendor.d.ts
│   ├── shims-vue.d.ts
│   ├── vendor/
│   │   └── creative.js
│   └── views/
│       └── Home.vue
├── tsconfig.json
├── tslint.json
└── vue.config.js
Download .txt
SYMBOL INDEX (15 symbols across 4 files)

FILE: build-portfolio.js
  constant PORTFOLIO_SRC_DIR (line 17) | const PORTFOLIO_SRC_DIR = "./public_assets/portfolio/";
  constant PORTFOLIO_DST_DIR (line 18) | const PORTFOLIO_DST_DIR = "./public/gen/portfolio/";
  constant PORTFOLIO_TREE_DST_DIR (line 19) | const PORTFOLIO_TREE_DST_DIR = "./src/gen/portfolio-tree.gen.json";
  constant COMPOSITE_SIZE (line 21) | const COMPOSITE_SIZE = 256;
  constant PORTFOLIO_SIZE (line 22) | const PORTFOLIO_SIZE = 160;
  constant QUALITY (line 24) | const QUALITY = 90;
  function sha1 (line 26) | function sha1(buffer) {
  function rgbToCssHex (line 32) | function rgbToCssHex(r, g, b) {
  function generate (line 38) | async function generate() {

FILE: cdk/lib/cdk-stack.ts
  class CdkStack (line 5) | class CdkStack extends cdk.Stack {
    method constructor (line 6) | constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {

FILE: src/shims-tsx.d.ts
  type Element (line 11) | interface Element extends VNode {
  type ElementClass (line 16) | interface ElementClass extends Vue {
  type IntrinsicElements (line 20) | interface IntrinsicElements {

FILE: src/vendor/creative.js
  function init (line 1) | function init($) {
Condensed preview — 45 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (187K chars).
[
  {
    "path": ".browserslistrc",
    "chars": 21,
    "preview": "> 1%\nlast 2 versions\n"
  },
  {
    "path": ".gitignore",
    "chars": 97,
    "preview": ".idea/\n.vscode/\n\nnode_modules/\ndist/\n\nsrc/gen/*.gen.*\npublic/**/*.gen.*\n\n.env.local\n.env.*.local\n"
  },
  {
    "path": ".gitmodules",
    "chars": 87,
    "preview": "[submodule \"blog\"]\n\tpath = blog\n\turl = git@github.com:SilentByte/selfie2anime-blog.git\n"
  },
  {
    "path": "LICENSE.txt",
    "chars": 1097,
    "preview": "MIT License\n\nCopyright (c) 2019 SilentByte <https://www.silentbyte.com/>\n\nPermission is hereby granted, free of charge, "
  },
  {
    "path": "README.md",
    "chars": 2818,
    "preview": "\n![Selfie2Anime](s2a.png) \n\n[![Selfie2Anime](https://img.shields.io/badge/app-selfie2anime-f06292.svg?style=for-the-badg"
  },
  {
    "path": "babel.config.js",
    "chars": 64,
    "preview": "module.exports = {\n    presets: [\n        \"@vue/app\",\n    ],\n};\n"
  },
  {
    "path": "build-portfolio.js",
    "chars": 4184,
    "preview": "/**\n * Selfie2Anime <https://selfie2anime.com>\n * Copyright (c) 2019 by SilentByte <https://www.silentbyte.com/>\n */\n\n//"
  },
  {
    "path": "buildspec.yml",
    "chars": 215,
    "preview": "version: 0.2\n\nphases:\n  pre_build:\n    commands:\n      - npm install\n  build:\n    commands:\n      - npm run build\n  post"
  },
  {
    "path": "cdk/.gitignore",
    "chars": 77,
    "preview": "*.js\n*.d.ts\nnode_modules\n\n# CDK asset staging directory\n.cdk.staging\ncdk.out\n"
  },
  {
    "path": "cdk/.npmignore",
    "chars": 65,
    "preview": "*.ts\n!*.d.ts\n\n# CDK asset staging directory\n.cdk.staging\ncdk.out\n"
  },
  {
    "path": "cdk/README.md",
    "chars": 293,
    "preview": "# Useful commands\n\n- `npm run build` compile typescript to js\n- `npm run watch` watch for changes and compile\n- `cdk dep"
  },
  {
    "path": "cdk/bin/cdk.ts",
    "chars": 173,
    "preview": "#!/usr/bin/env node\nimport cdk = require('@aws-cdk/core');\nimport { CdkStack } from '../lib/cdk-stack';\n\nconst app = new"
  },
  {
    "path": "cdk/cdk.json",
    "chars": 38,
    "preview": "{\n  \"app\": \"npx ts-node bin/cdk.ts\"\n}\n"
  },
  {
    "path": "cdk/lib/cdk-stack.ts",
    "chars": 1677,
    "preview": "import cdk = require('@aws-cdk/core');\nimport codebuild = require(\"@aws-cdk/aws-codebuild\");\nimport iam = require(\"@aws-"
  },
  {
    "path": "cdk/package.json",
    "chars": 429,
    "preview": "{\n  \"name\": \"cdk\",\n  \"version\": \"0.1.0\",\n  \"bin\": {\n    \"cdk\": \"bin/cdk.js\"\n  },\n  \"scripts\": {\n    \"build\": \"tsc\",\n    "
  },
  {
    "path": "cdk/tsconfig.json",
    "chars": 588,
    "preview": "{\n  \"compilerOptions\": {\n    \"target\": \"ES2018\",\n    \"module\": \"commonjs\",\n    \"lib\": [\"es2016\", \"es2017.object\", \"es201"
  },
  {
    "path": "package.json",
    "chars": 1438,
    "preview": "{\n  \"name\": \"selfie2anime-site\",\n  \"version\": \"0.1.0\",\n  \"private\": true,\n  \"scripts\": {\n    \"serve\": \"vue-cli-service s"
  },
  {
    "path": "postcss.config.js",
    "chars": 70,
    "preview": "module.exports = {\n    plugins: {\n        autoprefixer: {},\n    },\n};\n"
  },
  {
    "path": "public/9593990f27faca6931121a16d4131090.html",
    "chars": 51,
    "preview": "site-verification: 9593990f27faca6931121a16d4131090"
  },
  {
    "path": "public/ads.txt",
    "chars": 58,
    "preview": "google.com, pub-9169830803956537, DIRECT, f08c47fec0942fa0"
  },
  {
    "path": "public/email/index.html",
    "chars": 13436,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-widt"
  },
  {
    "path": "public/gen/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "public/index.html",
    "chars": 3077,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width"
  },
  {
    "path": "public/privacy/index.html",
    "chars": 19380,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width"
  },
  {
    "path": "public/self-sitemap.xml",
    "chars": 942,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n        xmlns:image"
  },
  {
    "path": "public/sitemap.xml",
    "chars": 354,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<sitemapindex xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n    <sitemap>\n"
  },
  {
    "path": "public/terms/index.html",
    "chars": 37052,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width"
  },
  {
    "path": "public/vendor/magnific-popup.css",
    "chars": 6951,
    "preview": "/* Magnific Popup CSS */\n.mfp-bg {\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  z-index: 1042;\n  overflow: hidd"
  },
  {
    "path": "public_assets/md/privacy.md",
    "chars": 11197,
    "preview": "\n# PRIVACY POLICY\n\n*Effective Date: 22 August 2019*\n\n1. This Privacy Policy explains how we and some of the companies we"
  },
  {
    "path": "public_assets/md/terms.md",
    "chars": 23723,
    "preview": "\n# Terms of Use\n\n*Last Updated: 22 August 2019*\n\n1. These Terms of Use (“Terms”) apply to your access and use of this we"
  },
  {
    "path": "src/App.vue",
    "chars": 948,
    "preview": "<!--\n    Selfie2Anime <https://selfie2anime.com>\n    Copyright (c) 2019 by SilentByte <https://www.silentbyte.com/>\n-->\n"
  },
  {
    "path": "src/components/Cropper.vue",
    "chars": 1809,
    "preview": "<!--\n    Selfie2Anime <https://selfie2anime.com>\n    Copyright (c) 2019 by SilentByte <https://www.silentbyte.com/>\n-->\n"
  },
  {
    "path": "src/components/PhotoUploader.vue",
    "chars": 17808,
    "preview": "<!--\n    Selfie2Anime <https://selfie2anime.com>\n    Copyright (c) 2019 by SilentByte <https://www.silentbyte.com/>\n-->\n"
  },
  {
    "path": "src/gen/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "src/i18n.ts",
    "chars": 349,
    "preview": "/**\n * Selfie2Anime <https://selfie2anime.com>\n * Copyright (c) 2019 by SilentByte <https://www.silentbyte.com/>\n */\n\nim"
  },
  {
    "path": "src/main.ts",
    "chars": 380,
    "preview": "/**\n * Selfie2Anime <https://selfie2anime.com>\n * Copyright (c) 2019 by SilentByte <https://www.silentbyte.com/>\n */\n\nim"
  },
  {
    "path": "src/router.ts",
    "chars": 435,
    "preview": "/**\n * Selfie2Anime <https://selfie2anime.com>\n * Copyright (c) 2019 by SilentByte <https://www.silentbyte.com/>\n */\n\nim"
  },
  {
    "path": "src/shims-tsx.d.ts",
    "chars": 508,
    "preview": "/**\n * Selfie2Anime <https://selfie2anime.com>\n * Copyright (c) 2019 by SilentByte <https://www.silentbyte.com/>\n */\n\nim"
  },
  {
    "path": "src/shims-vendor.d.ts",
    "chars": 145,
    "preview": "/**\n * Selfie2Anime <https://selfie2anime.com>\n * Copyright (c) 2019 by SilentByte <https://www.silentbyte.com/>\n */\n\nde"
  },
  {
    "path": "src/shims-vue.d.ts",
    "chars": 196,
    "preview": "/**\n * Selfie2Anime <https://selfie2anime.com>\n * Copyright (c) 2019 by SilentByte <https://www.silentbyte.com/>\n */\n\nde"
  },
  {
    "path": "src/vendor/creative.js",
    "chars": 1836,
    "preview": "export function init($) {\n    // Smooth scrolling using jQuery easing\n    $(\"a.js-scroll-trigger[href*=\\\"#\\\"]:not([href="
  },
  {
    "path": "src/views/Home.vue",
    "chars": 21901,
    "preview": "<!--\n    Selfie2Anime <https://selfie2anime.com>\n    Copyright (c) 2019 by SilentByte <https://www.silentbyte.com/>\n-->\n"
  },
  {
    "path": "tsconfig.json",
    "chars": 800,
    "preview": "{\n  \"compilerOptions\": {\n    \"target\": \"esnext\",\n    \"module\": \"esnext\",\n    \"resolveJsonModule\": true,\n    \"strict\": tr"
  },
  {
    "path": "tslint.json",
    "chars": 483,
    "preview": "{\n  \"defaultSeverity\": \"warning\",\n  \"extends\": [\n    \"tslint:recommended\"\n  ],\n  \"linterOptions\": {\n    \"exclude\": [\n   "
  },
  {
    "path": "vue.config.js",
    "chars": 693,
    "preview": "/**\n * Selfie2Anime <https://selfie2anime.com>\n * Copyright (c) 2019 by SilentByte <https://www.silentbyte.com/>\n */\n\nmo"
  }
]

About this extraction

This page contains the full source code of the SilentByte/selfie2anime-site GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 45 files (173.8 KB), approximately 40.0k tokens, and a symbol index with 15 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!