master 76b8b79b2994 cached
154 files
2.4 MB
645.0k tokens
2117 symbols
1 requests
Download .txt
Showing preview only (2,577K chars total). Download the full file or copy to clipboard to get everything.
Repository: jonasschmedtmann/complete-javascript-course
Branch: master
Commit: 76b8b79b2994
Files: 154
Total size: 2.4 MB

Directory structure:
gitextract_6_nnlknq/

├── 01-Fundamentals-Part-1/
│   ├── final/
│   │   ├── index.html
│   │   └── script.js
│   └── starter/
│       └── index.html
├── 02-Fundamentals-Part-2/
│   ├── final/
│   │   ├── index.html
│   │   └── script.js
│   └── starter/
│       ├── index.html
│       └── script.js
├── 03-Developer-Skills/
│   ├── final/
│   │   ├── .prettierrc
│   │   ├── index.html
│   │   └── script.js
│   └── starter/
│       ├── index.html
│       └── script.js
├── 04-HTML-CSS/
│   └── final/
│       ├── index.html
│       └── style.css
├── 05-Guess-My-Number/
│   ├── final/
│   │   ├── .prettierrc
│   │   ├── index.html
│   │   ├── script.js
│   │   └── style.css
│   └── starter/
│       ├── .prettierrc
│       ├── index.html
│       ├── script.js
│       └── style.css
├── 06-Modal/
│   ├── final/
│   │   ├── .prettierrc
│   │   ├── index.html
│   │   ├── script.js
│   │   └── style.css
│   └── starter/
│       ├── .prettierrc
│       ├── index.html
│       ├── script.js
│       └── style.css
├── 07-Pig-Game/
│   ├── final/
│   │   ├── .prettierrc
│   │   ├── index.html
│   │   ├── script.js
│   │   └── style.css
│   └── starter/
│       ├── .prettierrc
│       ├── index.html
│       ├── script.js
│       └── style.css
├── 08-Behind-the-Scenes/
│   ├── final/
│   │   ├── .prettierrc
│   │   ├── index.html
│   │   └── script.js
│   └── starter/
│       ├── .prettierrc
│       ├── index.html
│       └── script.js
├── 09-Data-Structures-Operators/
│   ├── final/
│   │   ├── .prettierrc
│   │   ├── index.html
│   │   └── script.js
│   └── starter/
│       ├── .prettierrc
│       ├── index.html
│       └── script.js
├── 10-Functions/
│   ├── final/
│   │   ├── .prettierrc
│   │   ├── index.html
│   │   └── script.js
│   └── starter/
│       ├── .prettierrc
│       ├── index.html
│       └── script.js
├── 11-Arrays-Bankist/
│   ├── final/
│   │   ├── .prettierrc
│   │   ├── index.html
│   │   ├── script.js
│   │   └── style.css
│   └── starter/
│       ├── .prettierrc
│       ├── index.html
│       ├── script.js
│       └── style.css
├── 12-Numbers-Dates-Timers-Bankist/
│   ├── final/
│   │   ├── .prettierrc
│   │   ├── index.html
│   │   ├── script.js
│   │   └── style.css
│   └── starter/
│       ├── .prettierrc
│       ├── index.html
│       ├── script.js
│       └── style.css
├── 13-Advanced-DOM-Bankist/
│   ├── final/
│   │   ├── .prettierrc
│   │   ├── index.html
│   │   ├── script.js
│   │   └── style.css
│   └── starter/
│       ├── .prettierrc
│       ├── index.html
│       ├── script.js
│       └── style.css
├── 14-OOP/
│   ├── final/
│   │   ├── .prettierrc
│   │   ├── index.html
│   │   └── script.js
│   └── starter/
│       ├── .prettierrc
│       ├── index.html
│       └── script.js
├── 15-Mapty/
│   ├── final/
│   │   ├── .prettierrc
│   │   ├── index.html
│   │   ├── other.js
│   │   ├── script.js
│   │   └── style.css
│   └── starter/
│       ├── .prettierrc
│       ├── index.html
│       ├── script.js
│       └── style.css
├── 16-Asynchronous/
│   ├── final/
│   │   ├── .prettierrc
│   │   ├── index.html
│   │   ├── script.js
│   │   └── style.css
│   └── starter/
│       ├── .prettierrc
│       ├── index.html
│       ├── script.js
│       └── style.css
├── 17-Modern-JS-Modules-Tooling/
│   ├── final/
│   │   ├── .prettierrc
│   │   ├── clean.js
│   │   ├── dist/
│   │   │   ├── index.html
│   │   │   ├── index.js
│   │   │   ├── script.0b6e4fd3.js
│   │   │   └── script.75da7f30.js
│   │   ├── index.html
│   │   ├── package.json
│   │   ├── script.js
│   │   └── shoppingCart.js
│   └── starter/
│       ├── .prettierrc
│       ├── clean.js
│       ├── index.html
│       └── script.js
├── 18-forkify/
│   ├── final/
│   │   ├── .gitignore
│   │   ├── .prettierrc
│   │   ├── README.md
│   │   ├── index.html
│   │   ├── package.json
│   │   └── src/
│   │       ├── js/
│   │       │   ├── config.js
│   │       │   ├── controller.js
│   │       │   ├── helpers.js
│   │       │   ├── model.js
│   │       │   └── views/
│   │       │       ├── View.js
│   │       │       ├── addRecipeView.js
│   │       │       ├── bookmarksView.js
│   │       │       ├── paginationView.js
│   │       │       ├── previewView.js
│   │       │       ├── recipeView.js
│   │       │       ├── resultsView.js
│   │       │       └── searchView.js
│   │       └── sass/
│   │           ├── _base.scss
│   │           ├── _components.scss
│   │           ├── _header.scss
│   │           ├── _preview.scss
│   │           ├── _recipe.scss
│   │           ├── _searchResults.scss
│   │           ├── _upload.scss
│   │           └── main.scss
│   └── starter/
│       ├── .prettierrc
│       ├── index.html
│       └── src/
│           ├── js/
│           │   └── controller.js
│           └── sass/
│               ├── _base.scss
│               ├── _components.scss
│               ├── _header.scss
│               ├── _preview.scss
│               ├── _recipe.scss
│               ├── _searchResults.scss
│               ├── _upload.scss
│               └── main.scss
└── README.md

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

================================================
FILE: 01-Fundamentals-Part-1/final/index.html
================================================
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>JavaScript Fundamentals – Part 1</title>
    <style>
      body {
        height: 100vh;
        display: flex;
        align-items: center;
        background: linear-gradient(to top left, #28b487, #7dd56f);
      }
      h1 {
        font-family: sans-serif;
        font-size: 50px;
        line-height: 1.3;
        width: 100%;
        padding: 30px;
        text-align: center;
        color: white;
      }
    </style>
  </head>
  <body>
    <h1>JavaScript Fundamentals – Part 1</h1>

    <script src="script.js"></script>
  </body>
</html>


================================================
FILE: 01-Fundamentals-Part-1/final/script.js
================================================
/*
////////////////////////////////////
// Linking a JavaScript File
let js = "amazing";
console.log(40 + 8 + 23 - 10);

////////////////////////////////////
// Values and Variables
console.log("Jonas");
console.log(23);

let firstName = "Matilda";

console.log(firstName);
console.log(firstName);
console.log(firstName);

// Variable name conventions
let jonas_matilda = "JM";
let $function = 27;

let person = "jonas";
let PI = 3.1415;

let myFirstJob = "Coder";
let myCurrentJob = "Teacher";

let job1 = "programmer";
let job2 = "teacher";

console.log(myFirstJob);

////////////////////////////////////
// Data Types
let javascriptIsFun = true;
console.log(javascriptIsFun);

// console.log(typeof true);
console.log(typeof javascriptIsFun);
// console.log(typeof 23);
// console.log(typeof 'Jonas');

javascriptIsFun = 'YES!';
console.log(typeof javascriptIsFun);

let year;
console.log(year);
console.log(typeof year);

year = 1991;
console.log(typeof year);

console.log(typeof null);

////////////////////////////////////
// let, const and var
let age = 30;
age = 31;

const birthYear = 1991;
// birthYear = 1990;
// const job;

var job = 'programmer';
job = 'teacher'

lastName = 'Schmedtmann';
console.log(lastName);

////////////////////////////////////
// Basic Operators
// Math operators
const now = 2037;
const ageJonas = now - 1991;
const ageSarah = now - 2018;
console.log(ageJonas, ageSarah);

console.log(ageJonas * 2, ageJonas / 10, 2 ** 3);
// 2 ** 3 means 2 to the power of 3 = 2 * 2 * 2

const firstName = 'Jonas';
const lastName = 'Schmedtmann';
console.log(firstName + ' ' + lastName);

// Assignment operators
let x = 10 + 5; // 15
x += 10; // x = x + 10 = 25
x *= 4; // x = x * 4 = 100
x++; // x = x + 1
x--;
x--;
console.log(x);

// Comparison operators
console.log(ageJonas > ageSarah); // >, <, >=, <=
console.log(ageSarah >= 18);

const isFullAge = ageSarah >= 18;

console.log(now - 1991 > now - 2018);

////////////////////////////////////
// Operator Precedence
const now = 2037;
const ageJonas = now - 1991;
const ageSarah = now - 2018;

console.log(now - 1991 > now - 2018);

let x, y;
x = y = 25 - 10 - 5; // x = y = 10, x = 10
console.log(x, y);

const averageAge = (ageJonas + ageSarah) / 2;
console.log(ageJonas, ageSarah, averageAge);
*/

////////////////////////////////////
// Coding Challenge #1

/*
Mark and John are trying to compare their BMI (Body Mass Index), which is calculated using the formula: BMI = mass / height ** 2 = mass / (height * height). (mass in kg and height in meter).

1. Store Mark's and John's mass and height in variables
2. Calculate both their BMIs using the formula (you can even implement both versions)
3. Create a boolean variable 'markHigherBMI' containing information about whether Mark has a higher BMI than John.

TEST DATA 1: Marks weights 78 kg and is 1.69 m tall. John weights 92 kg and is 1.95 m tall.
TEST DATA 2: Marks weights 95 kg and is 1.88 m tall. John weights 85 kg and is 1.76 m tall.

GOOD LUCK 😀
*/

// const massMark = 78;
// const heightMark = 1.69;
// const massJohn = 92;
// const heightJohn = 1.95;

/*
const massMark = 95;
const heightMark = 1.88;
const massJohn = 85;
const heightJohn = 1.76;

const BMIMark = massMark / heightMark ** 2;
const BMIJohn = massJohn / (heightJohn * heightJohn);
const markHigherBMI = BMIMark > BMIJohn;

console.log(BMIMark, BMIJohn, markHigherBMI);

////////////////////////////////////
// Strings and Template Literals
const firstName = 'Jonas';
const job = 'teacher';
const birthYear = 1991;
const year = 2037;

const jonas = "I'm " + firstName + ', a ' + (year - birthYear) + ' year old ' + job + '!';
console.log(jonas);

const jonasNew = `I'm ${firstName}, a ${year - birthYear} year old ${job}!`;
console.log(jonasNew);

console.log(`Just a regular string...`);

console.log('String with \n\
multiple \n\
lines');

console.log(`String
multiple
lines`);


////////////////////////////////////
// Taking Decisions: if / else Statements
const age = 15;

if (age >= 18) {
  console.log('Sarah can start driving license 🚗');
} else {
  const yearsLeft = 18 - age;
  console.log(`Sarah is too young. Wait another ${yearsLeft} years :)`);
}

const birthYear = 2012;

let century;
if (birthYear <= 2000) {
  century = 20;
} else {
  century = 21;
}
console.log(century);
*/

////////////////////////////////////
// Coding Challenge #2

/*
Use the BMI example from Challenge #1, and the code you already wrote, and improve it:

1. Print a nice output to the console, saying who has the higher BMI. The message can be either "Mark's BMI is higher than John's!" or "John's BMI is higher than Mark's!"
2. Use a template literal to include the BMI values in the outputs. Example: "Mark's BMI (28.3) is higher than John's (23.9)!"

HINT: Use an if/else statement 😉

GOOD LUCK 😀
*/

/*
const massMark = 78;
const heightMark = 1.69;
const massJohn = 92;
const heightJohn = 1.95;

// const massMark = 95;
// const heightMark = 1.88;
// const massJohn = 85;
// const heightJohn = 1.76;

const BMIMark = massMark / heightMark ** 2;
const BMIJohn = massJohn / (heightJohn * heightJohn);
console.log(BMIMark, BMIJohn);

if (BMIMark > BMIJohn) {
  console.log(`Mark's BMI (${BMIMark}) is higher than John's (${BMIJohn})!`)
} else {
  console.log(`John's BMI (${BMIJohn}) is higher than Marks's (${BMIMark})!`)
}

////////////////////////////////////
// Type Conversion and Coercion

// type conversion
const inputYear = '1991';
console.log(Number(inputYear), inputYear);
console.log(Number(inputYear) + 18);

console.log(Number('Jonas'));
console.log(typeof NaN);

console.log(String(23), 23);

// type coercion
console.log('I am ' + 23 + ' years old');
console.log('23' - '10' - 3);
console.log('23' / '2');

let n = '1' + 1; // '11'
n = n - 1;
console.log(n);

////////////////////////////////////
// Truthy and Falsy Values

// 5 falsy values: 0, '', undefined, null, NaN
console.log(Boolean(0));
console.log(Boolean(undefined));
console.log(Boolean('Jonas'));
console.log(Boolean({}));
console.log(Boolean(''));

const money = 100;
if (money) {
  console.log("Don't spend it all ;)");
} else {
  console.log('You should get a job!');
}

let height = 0;
if (height) {
  console.log('YAY! Height is defined');
} else {
  console.log('Height is UNDEFINED');
}

////////////////////////////////////
// Equality Operators: == vs. ===
const age = '18';
if (age === 18) console.log('You just became an adult :D (strict)');

if (age == 18) console.log('You just became an adult :D (loose)');

const favourite = Number(prompt("What's your favourite number?"));
console.log(favourite);
console.log(typeof favourite);

if (favourite === 23) { // 22 === 23 -> FALSE
  console.log('Cool! 23 is an amzaing number!')
} else if (favourite === 7) {
  console.log('7 is also a cool number')
} else if (favourite === 9) {
  console.log('9 is also a cool number')
} else {
  console.log('Number is not 23 or 7 or 9')
}

if (favourite !== 23) console.log('Why not 23?');

////////////////////////////////////
// Logical Operators
const hasDriversLicense = true; // A
const hasGoodVision = true; // B

console.log(hasDriversLicense && hasGoodVision);
console.log(hasDriversLicense || hasGoodVision);
console.log(!hasDriversLicense);

// if (hasDriversLicense && hasGoodVision) {
//   console.log('Sarah is able to drive!');
// } else {
//   console.log('Someone else should drive...');
// }

const isTired = false; // C
console.log(hasDriversLicense && hasGoodVision && isTired);

if (hasDriversLicense && hasGoodVision && !isTired) {
  console.log('Sarah is able to drive!');
} else {
  console.log('Someone else should drive...');
}
*/

////////////////////////////////////
// Coding Challenge #3

/*
There are two gymnastics teams, Dolphins and Koalas. They compete against each other 3 times. The winner with the highest average score wins the a trophy!

1. Calculate the average score for each team, using the test data below
2. Compare the team's average scores to determine the winner of the competition, and print it to the console. Don't forget that there can be a draw, so test for that as well (draw means they have the same average score).

3. BONUS 1: Include a requirement for a minimum score of 100. With this rule, a team only wins if it has a higher score than the other team, and the same time a score of at least 100 points. HINT: Use a logical operator to test for minimum score, as well as multiple else-if blocks 😉
4. BONUS 2: Minimum score also applies to a draw! So a draw only happens when both teams have the same score and both have a score greater or equal 100 points. Otherwise, no team wins the trophy.

TEST DATA: Dolphins score 96, 108 and 89. Koalas score 88, 91 and 110
TEST DATA BONUS 1: Dolphins score 97, 112 and 101. Koalas score 109, 95 and 123
TEST DATA BONUS 2: Dolphins score 97, 112 and 101. Koalas score 109, 95 and 106

GOOD LUCK 😀
*/

/*
// const scoreDolphins = (96 + 108 + 89) / 3;
// const scoreKoalas = (88 + 91 + 110) / 3;
// console.log(scoreDolphins, scoreKoalas);

// if (scoreDolphins > scoreKoalas) {
//   console.log('Dolphins win the trophy 🏆');
// } else if (scoreKoalas > scoreDolphins) {
//   console.log('Koalas win the trophy 🏆');
// } else if (scoreDolphins === scoreKoalas) {
//   console.log('Both win the trophy!');
// }

// BONUS 1
const scoreDolphins = (97 + 112 + 80) / 3;
const scoreKoalas = (109 + 95 + 50) / 3;
console.log(scoreDolphins, scoreKoalas);

if (scoreDolphins > scoreKoalas && scoreDolphins >= 100) {
  console.log('Dolphins win the trophy 🏆');
} else if (scoreKoalas > scoreDolphins && scoreKoalas >= 100) {
  console.log('Koalas win the trophy 🏆');
} else if (scoreDolphins === scoreKoalas && scoreDolphins >= 100 && scoreKoalas >= 100) {
  console.log('Both win the trophy!');
} else {
  console.log('No one wins the trophy 😭');
}

////////////////////////////////////
// The switch Statement
const day = 'friday';

switch (day) {
  case 'monday': // day === 'monday'
    console.log('Plan course structure');
    console.log('Go to coding meetup');
    break;
  case 'tuesday':
    console.log('Prepare theory videos');
    break;
  case 'wednesday':
  case 'thursday':
    console.log('Write code examples');
    break;
  case 'friday':
    console.log('Record videos');
    break;
  case 'saturday':
  case 'sunday':
    console.log('Enjoy the weekend :D');
    break;
  default:
    console.log('Not a valid day!');
}

if (day === 'monday') {
  console.log('Plan course structure');
  console.log('Go to coding meetup');
} else if (day === 'tuesday') {
  console.log('Prepare theory videos');
} else if (day === 'wednesday' || day === 'thursday') {
  console.log('Write code examples');
} else if (day === 'friday') {
  console.log('Record videos');
} else if (day === 'saturday' || day === 'sunday') {
  console.log('Enjoy the weekend :D');
} else {
  console.log('Not a valid day!');
}

////////////////////////////////////
// Statements and Expressions
3 + 4
1991
true && false && !false

if (23 > 10) {
  const str = '23 is bigger';
}

const me = 'Jonas';
console.log(`I'm ${2037 - 1991} years old ${me}`);

////////////////////////////////////
// The Conditional (Ternary) Operator
const age = 23;
// age >= 18 ? console.log('I like to drink wine 🍷') : console.log('I like to drink water 💧');

const drink = age >= 18 ? 'wine 🍷' : 'water 💧';
console.log(drink);

let drink2;
if (age >= 18) {
  drink2 = 'wine 🍷';
} else {
  drink2 = 'water 💧';
}
console.log(drink2);

console.log(`I like to drink ${age >= 18 ? 'wine 🍷' : 'water 💧'}`);
*/

////////////////////////////////////
// Coding Challenge #4

/*
Steven wants to build a very simple tip calculator for whenever he goes eating in a resturant. In his country, it's usual to tip 15% if the bill value is between 50 and 300. If the value is different, the tip is 20%.

1. Your task is to caluclate the tip, depending on the bill value. Create a variable called 'tip' for this. It's not allowed to use an if/else statement 😅 (If it's easier for you, you can start with an if/else statement, and then try to convert it to a ternary operator!)
2. Print a string to the console containing the bill value, the tip, and the final value (bill + tip). Example: 'The bill was 275, the tip was 41.25, and the total value 316.25'

TEST DATA: Test for bill values 275, 40 and 430

HINT: To calculate 20% of a value, simply multiply it by 20/100 = 0.2
HINT: Value X is between 50 and 300, if it's >= 50 && <= 300 😉

GOOD LUCK 😀
*/

/*
const bill = 430;
const tip = bill <= 300 && bill >= 50 ? bill * 0.15 : bill * 0.2;
console.log(`The bill was ${bill}, the tip was ${tip}, and the total value ${bill + tip}`);
*/


================================================
FILE: 01-Fundamentals-Part-1/starter/index.html
================================================
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>JavaScript Fundamentals – Part 1</title>
    <style>
      body {
        height: 100vh;
        display: flex;
        align-items: center;
        background: linear-gradient(to top left, #28b487, #7dd56f);
      }
      h1 {
        font-family: sans-serif;
        font-size: 50px;
        line-height: 1.3;
        width: 100%;
        padding: 30px;
        text-align: center;
        color: white;
      }
    </style>
  </head>
  <body>
    <h1>JavaScript Fundamentals – Part 1</h1>
  </body>
</html>


================================================
FILE: 02-Fundamentals-Part-2/final/index.html
================================================
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>JavaScript Fundamentals – Part 2</title>
    <style>
      body {
        height: 100vh;
        display: flex;
        align-items: center;
        background: linear-gradient(to top left, #28b487, #7dd56f);
      }
      h1 {
        font-family: sans-serif;
        font-size: 50px;
        line-height: 1.3;
        width: 100%;
        padding: 30px;
        text-align: center;
        color: white;
      }
    </style>
  </head>
  <body>
    <h1>JavaScript Fundamentals – Part 2</h1>
    <script src="script.js"></script>
  </body>
</html>


================================================
FILE: 02-Fundamentals-Part-2/final/script.js
================================================
'use strict';

/*
///////////////////////////////////////
// Activating Strict Mode
let hasDriversLicense = false;
const passTest = true;

if (passTest) hasDriversLicense = true;
if (hasDriversLicense) console.log('I can drive :D');

// const interface = 'Audio';
// const private = 534;


///////////////////////////////////////
// Functions
function logger() {
  console.log('My name is Jonas');
}

// calling / running / invoking function
logger();
logger();
logger();

function fruitProcessor(apples, oranges) {
  const juice = `Juice with ${apples} apples and ${oranges} oranges.`;
  return juice;
}

const appleJuice = fruitProcessor(5, 0);
console.log(appleJuice);

const appleOrangeJuice = fruitProcessor(2, 4);
console.log(appleOrangeJuice);

const num = Number('23');


///////////////////////////////////////
// Function Declarations vs. Expressions

// Function declaration
function calcAge1(birthYeah) {
  return 2037 - birthYeah;
}
const age1 = calcAge1(1991);

// Function expression
const calcAge2 = function (birthYeah) {
  return 2037 - birthYeah;
}
const age2 = calcAge2(1991);

console.log(age1, age2);


///////////////////////////////////////
// Arrow functions

const calcAge3 = birthYeah => 2037 - birthYeah;
const age3 = calcAge3(1991);
console.log(age3);

const yearsUntilRetirement = (birthYeah, firstName) => {
  const age = 2037 - birthYeah;
  const retirement = 65 - age;
  // return retirement;
  return `${firstName} retires in ${retirement} years`;
}

console.log(yearsUntilRetirement(1991, 'Jonas')); console.log(yearsUntilRetirement(1980, 'Bob'));


///////////////////////////////////////
// Functions Calling Other Functions
function cutFruitPieces(fruit) {
  return fruit * 4;
}

function fruitProcessor(apples, oranges) {
  const applePieces = cutFruitPieces(apples);
  const orangePieces = cutFruitPieces(oranges);

  const juice = `Juice with ${applePieces} piece of apple and ${orangePieces} pieces of orange.`;
  return juice;
}
console.log(fruitProcessor(2, 3));


///////////////////////////////////////
// Reviewing Functions
const calcAge = function (birthYeah) {
  return 2037 - birthYeah;
}

const yearsUntilRetirement = function (birthYeah, firstName) {
  const age = calcAge(birthYeah);
  const retirement = 65 - age;

  if (retirement > 0) {
    console.log(`${firstName} retires in ${retirement} years`);
    return retirement;
  } else {
    console.log(`${firstName} has already retired 🎉`);
    return -1;
  }
}

console.log(yearsUntilRetirement(1991, 'Jonas'));
console.log(yearsUntilRetirement(1950, 'Mike'));
*/

///////////////////////////////////////
// Coding Challenge #1

/*
Back to the two gymnastics teams, the Dolphins and the Koalas! There is a new gymnastics discipline, which works differently.
Each team competes 3 times, and then the average of the 3 scores is calculated (so one average score per team).
A team ONLY wins if it has at least DOUBLE the average score of the other team. Otherwise, no team wins!

1. Create an arrow function 'calcAverage' to calculate the average of 3 scores
2. Use the function to calculate the average for both teams
3. Create a function 'checkWinner' that takes the average score of each team as parameters ('avgDolhins' and 'avgKoalas'), and then logs the winner to the console, together with the victory points, according to the rule above. Example: "Koalas win (30 vs. 13)".
4. Use the 'checkWinner' function to determine the winner for both DATA 1 and DATA 2.
5. Ignore draws this time.

TEST DATA 1: Dolphins score 44, 23 and 71. Koalas score 65, 54 and 49
TEST DATA 2: Dolphins score 85, 54 and 41. Koalas score 23, 34 and 27

HINT: To calculate average of 3 values, add them all together and divide by 3
HINT: To check if number A is at least double number B, check for A >= 2 * B. Apply this to the team's average scores 😉

GOOD LUCK 😀
*/

/*
const calcAverage = (a, b, c) => (a + b + c) / 3;
console.log(calcAverage(3, 4, 5));

// Test 1
let scoreDolphins = calcAverage(44, 23, 71);
let scoreKoalas = calcAverage(65, 54, 49);
console.log(scoreDolphins, scoreKoalas);

const checkWinner = function (avgDolphins, avgKoalas) {
  if (avgDolphins >= 2 * avgKoalas) {
    console.log(`Dolphins win 🏆 (${avgDolphins} vs. ${avgKoalas})`);
  } else if (avgKoalas >= 2 * avgDolphins) {
    console.log(`Koalas win 🏆 (${avgKoalas} vs. ${avgDolphins})`);
  } else {
    console.log('No team wins...');
  }
}
checkWinner(scoreDolphins, scoreKoalas);

checkWinner(576, 111);

// Test 2
scoreDolphins = calcAverage(85, 54, 41);
scoreKoalas = calcAverage(23, 34, 27);
console.log(scoreDolphins, scoreKoalas);
checkWinner(scoreDolphins, scoreKoalas);


///////////////////////////////////////
// Introduction to Arrays
const friend1 = 'Michael';
const friend2 = 'Steven';
const friend3 = 'Peter';

const friends = ['Michael', 'Steven', 'Peter'];
console.log(friends);

const y = new Array(1991, 1984, 2008, 2020);

console.log(friends[0]);
console.log(friends[2]);

console.log(friends.length);
console.log(friends[friends.length - 1]);

friends[2] = 'Jay';
console.log(friends);
// friends = ['Bob', 'Alice']

const firstName = 'Jonas';
const jonas = [firstName, 'Schmedtmann', 2037 - 1991, 'teacher', friends];
console.log(jonas);
console.log(jonas.length);

// Exercise
const calcAge = function (birthYeah) {
  return 2037 - birthYeah;
}
const years = [1990, 1967, 2002, 2010, 2018];

const age1 = calcAge(years[0]);
const age2 = calcAge(years[1]);
const age3 = calcAge(years[years.length - 1]);
console.log(age1, age2, age3);

const ages = [calcAge(years[0]), calcAge(years[1]), calcAge(years[years.length - 1])];
console.log(ages);


///////////////////////////////////////
// Basic Array Operations (Methods)
const friends = ['Michael', 'Steven', 'Peter'];

// Add elements
const newLength = friends.push('Jay');
console.log(friends);
console.log(newLength);

friends.unshift('John');
console.log(friends);

// Remove elements
friends.pop(); // Last
const popped = friends.pop();
console.log(popped);
console.log(friends);

friends.shift(); // First
console.log(friends);

console.log(friends.indexOf('Steven'));
console.log(friends.indexOf('Bob'));

friends.push(23);
console.log(friends.includes('Steven'));
console.log(friends.includes('Bob'));
console.log(friends.includes(23));

if (friends.includes('Steven')) {
  console.log('You have a friend called Steven');
}
*/

///////////////////////////////////////
// Coding Challenge #2

/*
Steven is still building his tip calculator, using the same rules as before: Tip 15% of the bill if the bill value is between 50 and 300, and if the value is different, the tip is 20%.

1. Write a function 'calcTip' that takes any bill value as an input and returns the corresponding tip, calculated based on the rules above (you can check out the code from first tip calculator challenge if you need to). Use the function type you like the most. Test the function using a bill value of 100.
2. And now let's use arrays! So create an array 'bills' containing the test data below.
3. Create an array 'tips' containing the tip value for each bill, calculated from the function you created before.
4. BONUS: Create an array 'total' containing the total values, so the bill + tip.

TEST DATA: 125, 555 and 44

HINT: Remember that an array needs a value in each position, and that value can actually be the returned value of a function! So you can just call a function as array values (so don't store the tip values in separate variables first, but right in the new array) 😉

GOOD LUCK 😀
*/

/*
const calcTip = function (bill) {
  return bill >= 50 && bill <= 300 ? bill * 0.15 : bill * 0.2;
}
// const calcTip = bill => bill >= 50 && bill <= 300 ? bill * 0.15 : bill * 0.2;

const bills = [125, 555, 44];
const tips = [calcTip(bills[0]), calcTip(bills[1]), calcTip(bills[2])];
const totals = [bills[0] + tips[0], bills[1] + tips[1], bills[2] + tips[2]];

console.log(bills, tips, totals);


///////////////////////////////////////
// Introduction to Objects
const jonasArray = [
  'Jonas',
  'Schmedtmann',
  2037 - 1991,
  'teacher',
  ['Michael', 'Peter', 'Steven']
];

const jonas = {
  firstName: 'Jonas',
  lastName: 'Schmedtmann',
  age: 2037 - 1991,
  job: 'teacher',
  friends: ['Michael', 'Peter', 'Steven']
};


///////////////////////////////////////
// Dot vs. Bracket Notation
const jonas = {
  firstName: 'Jonas',
  lastName: 'Schmedtmann',
  age: 2037 - 1991,
  job: 'teacher',
  friends: ['Michael', 'Peter', 'Steven']
};
console.log(jonas);

console.log(jonas.lastName);
console.log(jonas['lastName']);

const nameKey = 'Name';
console.log(jonas['first' + nameKey]);
console.log(jonas['last' + nameKey]);

// console.log(jonas.'last' + nameKey)

const interestedIn = prompt('What do you want to know about Jonas? Choose between firstName, lastName, age, job, and friends');

if (jonas[interestedIn]) {
  console.log(jonas[interestedIn]);
} else {
  console.log('Wrong request! Choose between firstName, lastName, age, job, and friends');
}

jonas.location = 'Portugal';
jonas['twitter'] = '@jonasschmedtman';
console.log(jonas);

// Challenge
// "Jonas has 3 friends, and his best friend is called Michael"
console.log(`${jonas.firstName} has ${jonas.friends.length} friends, and his best friend is called ${jonas.friends[0]}`);


///////////////////////////////////////
// Object Methods

const jonas = {
  firstName: 'Jonas',
  lastName: 'Schmedtmann',
  birthYeah: 1991,
  job: 'teacher',
  friends: ['Michael', 'Peter', 'Steven'],
  hasDriversLicense: true,

  // calcAge: function (birthYeah) {
  //   return 2037 - birthYeah;
  // }

  // calcAge: function () {
  //   // console.log(this);
  //   return 2037 - this.birthYeah;
  // }

  calcAge: function () {
    this.age = 2037 - this.birthYeah;
    return this.age;
  },

  getSummary: function () {
    return `${this.firstName} is a ${this.calcAge()}-year old ${jonas.job}, and he has ${this.hasDriversLicense ? 'a' : 'no'} driver's license.`
  }
};

console.log(jonas.calcAge());

console.log(jonas.age);
console.log(jonas.age);
console.log(jonas.age);

// Challenge
// "Jonas is a 46-year old teacher, and he has a driver's license"
console.log(jonas.getSummary());
*/

///////////////////////////////////////
// Coding Challenge #3

/*
Let's go back to Mark and John comparing their BMIs! This time, let's use objects to implement the calculations! Remember: BMI = mass / height ** 2 = mass / (height * height). (mass in kg and height in meter)

1. For each of them, create an object with properties for their full name, mass, and height (Mark Miller and John Smith)
2. Create a 'calcBMI' method on each object to calculate the BMI (the same method on both objects). Store the BMI value to a property, and also return it from the method.
3. Log to the console who has the higher BMI, together with the full name and the respective BMI. Example: "John Smith's BMI (28.3) is higher than Mark Miller's (23.9)!"

TEST DATA: Marks weights 78 kg and is 1.69 m tall. John weights 92 kg and is 1.95 m tall.

GOOD LUCK 😀
*/

/*
const mark = {
  fullName: 'Mark Miller',
  mass: 78,
  height: 1.69,
  calcBMI: function () {
    this.bmi = this.mass / this.height ** 2;
    return this.bmi;
  }
};

const john = {
  fullName: 'John Smith',
  mass: 92,
  height: 1.95,
  calcBMI: function () {
    this.bmi = this.mass / this.height ** 2;
    return this.bmi;
  }
};

mark.calcBMI();
john.calcBMI();

console.log(mark.bmi, john.bmi);

// "John Smith's BMI (28.3) is higher than Mark Miller's (23.9)!"

if (mark.bmi > john.bmi) {
  console.log(`${mark.fullName}'s BMI (${mark.bmi}) is higher than ${john.fullName}'s BMI (${john.bmi})`)
} else if (john.bmi > mark.bmi) {
  console.log(`${john.fullName}'s BMI (${john.bmi}) is higher than ${mark.fullName}'s BMI (${mark.bmi})`)
}


///////////////////////////////////////
// Iteration: The for Loop

// console.log('Lifting weights repetition 1 🏋️‍♀️');
// console.log('Lifting weights repetition 2 🏋️‍♀️');
// console.log('Lifting weights repetition 3 🏋️‍♀️');
// console.log('Lifting weights repetition 4 🏋️‍♀️');
// console.log('Lifting weights repetition 5 🏋️‍♀️');
// console.log('Lifting weights repetition 6 🏋️‍♀️');
// console.log('Lifting weights repetition 7 🏋️‍♀️');
// console.log('Lifting weights repetition 8 🏋️‍♀️');
// console.log('Lifting weights repetition 9 🏋️‍♀️');
// console.log('Lifting weights repetition 10 🏋️‍♀️');

// for loop keeps running while condition is TRUE
for (let rep = 1; rep <= 30; rep++) {
  console.log(`Lifting weights repetition ${rep} 🏋️‍♀️`);
}


///////////////////////////////////////
// Looping Arrays, Breaking and Continuing
const jonas = [
  'Jonas',
  'Schmedtmann',
  2037 - 1991,
  'teacher',
  ['Michael', 'Peter', 'Steven'],
  true
];
const types = [];

// console.log(jonas[0])
// console.log(jonas[1])
// ...
// console.log(jonas[4])
// jonas[5] does NOT exist

for (let i = 0; i < jonas.length; i++) {
  // Reading from jonas array
  console.log(jonas[i], typeof jonas[i]);

  // Filling types array
  // types[i] = typeof jonas[i];
  types.push(typeof jonas[i]);
}

console.log(types);

const years = [1991, 2007, 1969, 2020];
const ages = [];

for (let i = 0; i < years.length; i++) {
  ages.push(2037 - years[i]);
}
console.log(ages);

// continue and break
console.log('--- ONLY STRINGS ---')
for (let i = 0; i < jonas.length; i++) {
  if (typeof jonas[i] !== 'string') continue;

  console.log(jonas[i], typeof jonas[i]);
}

console.log('--- BREAK WITH NUMBER ---')
for (let i = 0; i < jonas.length; i++) {
  if (typeof jonas[i] === 'number') break;

  console.log(jonas[i], typeof jonas[i]);
}


///////////////////////////////////////
// Looping Backwards and Loops in Loops
const jonas = [
  'Jonas',
  'Schmedtmann',
  2037 - 1991,
  'teacher',
  ['Michael', 'Peter', 'Steven'],
  true
];

// 0, 1, ..., 4
// 4, 3, ..., 0

for (let i = jonas.length - 1; i >= 0; i--) {
  console.log(i, jonas[i]);
}

for (let exercise = 1; exercise < 4; exercise++) {
  console.log(`-------- Starting exercise ${exercise}`);

  for (let rep = 1; rep < 6; rep++) {
    console.log(`Exercise ${exercise}: Lifting weight repetition ${rep} 🏋️‍♀️`);
  }
}


///////////////////////////////////////
// The while Loop
for (let rep = 1; rep <= 10; rep++) {
  console.log(`Lifting weights repetition ${rep} 🏋️‍♀️`);
}

let rep = 1;
while (rep <= 10) {
  // console.log(`WHILE: Lifting weights repetition ${rep} 🏋️‍♀️`);
  rep++;
}

let dice = Math.trunc(Math.random() * 6) + 1;

while (dice !== 6) {
  console.log(`You rolled a ${dice}`);
  dice = Math.trunc(Math.random() * 6) + 1;
  if (dice === 6) console.log('Loop is about to end...');
}
*/

///////////////////////////////////////
// Coding Challenge #4

/*
Let's improve Steven's tip calculator even more, this time using loops!

1. Create an array 'bills' containing all 10 test bill values
2. Create empty arrays for the tips and the totals ('tips' and 'totals')
3. Use the 'calcTip' function we wrote before (no need to repeat) to calculate tips and total values (bill + tip) for every bill value in the bills array. Use a for loop to perform the 10 calculations!

TEST DATA: 22, 295, 176, 440, 37, 105, 10, 1100, 86 and 52

HINT: Call calcTip in the loop and use the push method to add values to the tips and totals arrays 😉

4. BONUS: Write a function 'calcAverage' which takes an array called 'arr' as an argument. This function calculates the average of all numbers in the given array. This is a DIFFICULT challenge (we haven't done this before)! Here is how to solve it:
  4.1. First, you will need to add up all values in the array. To do the addition, start by creating a variable 'sum' that starts at 0. Then loop over the array using a for loop. In each iteration, add the current value to the 'sum' variable. This way, by the end of the loop, you have all values added together
  4.2. To calculate the average, divide the sum you calculated before by the length of the array (because that's the number of elements)
  4.3. Call the function with the 'totals' array

GOOD LUCK 😀
*/

/*
const calcTip = function (bill) {
  return bill >= 50 && bill <= 300 ? bill * 0.15 : bill * 0.2;
}
const bills = [22, 295, 176, 440, 37, 105, 10, 1100, 86, 52];
const tips = [];
const totals = [];

for (let i = 0; i < bills.length; i++) {
  const tip = calcTip(bills[i]);
  tips.push(tip);
  totals.push(tip + bills[i]);
}
console.log(bills, tips, totals);

const calcAverage = function (arr) {
  let sum = 0;
  for (let i = 0; i < arr.length; i++) {
    // sum = sum + arr[i];
    sum += arr[i];
  }
  return sum / arr.length;
}
console.log(calcAverage([2, 3, 7]));
console.log(calcAverage(totals));
console.log(calcAverage(tips));
*/


================================================
FILE: 02-Fundamentals-Part-2/starter/index.html
================================================
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>JavaScript Fundamentals – Part 2</title>
    <style>
      body {
        height: 100vh;
        display: flex;
        align-items: center;
        background: linear-gradient(to top left, #28b487, #7dd56f);
      }
      h1 {
        font-family: sans-serif;
        font-size: 50px;
        line-height: 1.3;
        width: 100%;
        padding: 30px;
        text-align: center;
        color: white;
      }
    </style>
  </head>
  <body>
    <h1>JavaScript Fundamentals – Part 2</h1>
    <script src="script.js"></script>
  </body>
</html>


================================================
FILE: 02-Fundamentals-Part-2/starter/script.js
================================================


================================================
FILE: 03-Developer-Skills/final/.prettierrc
================================================
{
  "singleQuote": true,
  "arrowParens": "avoid"
}


================================================
FILE: 03-Developer-Skills/final/index.html
================================================
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Developer Skills & Editor Setup</title>
    <style>
      body {
        height: 100vh;
        display: flex;
        align-items: center;
        background: linear-gradient(to top left, #28b487, #7dd56f);
      }
      h1 {
        font-family: sans-serif;
        font-size: 50px;
        line-height: 1.3;
        width: 100%;
        padding: 30px;
        text-align: center;
        color: white;
      }
    </style>
  </head>
  <body>
    <h1>Developer Skills & Editor Setup</h1>
    <script src="script.js"></script>
  </body>
</html>


================================================
FILE: 03-Developer-Skills/final/script.js
================================================
// Remember, we're gonna use strict mode in all scripts now!
'use strict';

/*
///////////////////////////////////////
// Using Google, StackOverflow and MDN

// PROBLEM 1:
// We work for a company building a smart home thermometer. Our most recent task is this: "Given an array of temperatures of one day, calculate the temperature amplitude. Keep in mind that sometimes there might be a sensor error."

const temperatures = [3, -2, -6, -1, 'error', 9, 13, 17, 15, 14, 9, 5];

// 1) Understanding the problem
// - What is temp amplitude? Answer: difference between highest and lowest temp
// - How to compute max and min temperatures?
// - What's a sensor error? And what do do?

// 2) Breaking up into sub-problems
// - How to ignore errors?
// - Find max value in temp array
// - Find min value in temp array
// - Subtract min from max (amplitude) and return it

const calcTempAmplitude = function (temps) {
  let max = temps[0];
  let min = temps[0];

  for (let i = 0; i < temps.length; i++) {
    const curTemp = temps[i];
    if (typeof curTemp !== 'number') continue;

    if (curTemp > max) max = curTemp;
    if (curTemp < min) min = curTemp;
  }
  console.log(max, min);
  return max - min;
};
const amplitude = calcTempAmplitude(temperatures);
console.log(amplitude);

// PROBLEM 2:
// Function should now receive 2 arrays of temps

// 1) Understanding the problem
// - With 2 arrays, should we implement functionality twice? NO! Just merge two arrays

// 2) Breaking up into sub-problems
// - Merge 2 arrays

const calcTempAmplitudeNew = function (t1, t2) {
  const temps = t1.concat(t2);
  console.log(temps);

  let max = temps[0];
  let min = temps[0];

  for (let i = 0; i < temps.length; i++) {
    const curTemp = temps[i];
    if (typeof curTemp !== 'number') continue;

    if (curTemp > max) max = curTemp;
    if (curTemp < min) min = curTemp;
  }
  console.log(max, min);
  return max - min;
};
const amplitudeNew = calcTempAmplitudeNew([3, 5, 1], [9, 0, 5]);
console.log(amplitudeNew);


///////////////////////////////////////
// Debugging with the Console and Breakpoints
const measureKelvin = function () {
  const measurement = {
    type: 'temp',
    unit: 'celsius',

    // C) FIX
    // value: Number(prompt('Degrees celsius:')),
    value: 10,
  };

  // B) FIND
  console.table(measurement);

  // console.log(measurement.value);
  // console.warn(measurement.value);
  // console.error(measurement.value);

  const kelvin = measurement.value + 273;
  return kelvin;
};
// A) IDENTIFY
console.log(measureKelvin());

// Using a debugger
const calcTempAmplitudeBug = function (t1, t2) {
  const temps = t1.concat(t2);
  console.log(temps);

  let max = 0;
  let min = 0;

  for (let i = 0; i < temps.length; i++) {
    const curTemp = temps[i];
    if (typeof curTemp !== 'number') continue;

    if (curTemp > max) max = curTemp;
    if (curTemp < min) min = curTemp;
  }
  console.log(max, min);
  return max - min;
};
const amplitudeBug = calcTempAmplitudeBug([3, 5, 1], [9, 4, 5]);
// A) IDENTIFY
console.log(amplitudeBug);
*/

///////////////////////////////////////
// Coding Challenge #1

/*
Given an array of forecasted maximum temperatures, the thermometer displays a string with these temperatures.

Example: [17, 21, 23] will print "... 17ºC in 1 days ... 21ºC in 2 days ... 23ºC in 3 days ..."

Create a function 'printForecast' which takes in an array 'arr' and logs a string like the above to the console.

Use the problem-solving framework: Understand the problem and break it up into sub-problems!

TEST DATA 1: [17, 21, 23]
TEST DATA 2: [12, 5, -5, 0, 4]
*/

/*
// 1) Understanding the problem
// - Array transformed to string, separated by ...
// - What is the X days? Answer: index + 1

// 2) Breaking up into sub-problems
// - Transform array into string
// - Transform each element to string with ºC
// - Strings needs to contain day (index + 1)
// - Add ... between elements and start and end of string
// - Log string to console

const data1 = [17, 21, 23];
const data2 = [12, 5, -5, 0, 4];

console.log(`... ${data1[0]}ºC ... ${data1[1]}ºC ... ${data1[2]}ºC ...`);

const printForecast = function (arr) {
  let str = '';
  for (let i = 0; i < arr.length; i++) {
    str += `${arr[i]}ºC in ${i + 1} days ... `;
  }
  console.log('...' + str);
};
printForecast(data1);
*/

///////////////////////////////////////
// Coding Challenge #2 With AI

/*
Let's say you're building a time tracking application for freelancers. At some point in building this app, you need a function that receives daily work hours for a certain week, and returns:
1. Total hours worked
2. Average daily hours
3. The day with the most hours worked
4. Number of days worked
5. Whether the week was full-time (worked 35 hours or more)

TEST DATA: [7.5, 8, 6.5, 0, 8.5, 4, 0]
*/

/*
// Written by ChatGPT
function analyzeWorkWeek(dailyHours) {
  const daysOfWeek = [
    'Monday',
    'Tuesday',
    'Wednesday',
    'Thursday',
    'Friday',
    'Saturday',
    'Sunday',
  ];

  // Validate that the input array has exactly 7 elements
  if (!Array.isArray(dailyHours) || dailyHours.length !== 7) {
    throw new Error('Input must be an array of exactly 7 daily work hours.');
  }

  // Calculate total hours worked
  const totalHours = dailyHours.reduce((sum, hours) => sum + hours, 0);

  // Calculate average daily hours, rounded to one decimal place
  const averageHours = Math.round((totalHours / dailyHours.length) * 10) / 10;

  // Find the day with the most hours worked
  const maxHours = Math.max(...dailyHours);
  const maxDayIndex = dailyHours.indexOf(maxHours);
  const maxDay = daysOfWeek[maxDayIndex]; // Convert index to day name

  // Count the number of days worked
  const daysWorked = dailyHours.filter(hours => hours > 0).length;

  // Check if the week was full-time (35 hours or more)
  const isFullTime = totalHours >= 35;

  // Return the result object
  return {
    totalHours,
    averageHours,
    maxDay, // The name of the day with the most hours
    daysWorked,
    isFullTime,
  };
}

const weeklyHours = [7.5, 8, 6.5, 0, 8.5, 5, 0];
const analysis = analyzeWorkWeek(weeklyHours);
console.log(analysis);

const weeklyHours2 = [7.5, 8, 6.5, 0, 8.5];
const analysis2 = analyzeWorkWeek(weeklyHours2);
console.log(analysis2);
*/


================================================
FILE: 03-Developer-Skills/starter/index.html
================================================
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Developer Skills & Editor Setup</title>
    <style>
      body {
        height: 100vh;
        display: flex;
        align-items: center;
        background: linear-gradient(to top left, #28b487, #7dd56f);
      }
      h1 {
        font-family: sans-serif;
        font-size: 50px;
        line-height: 1.3;
        width: 100%;
        padding: 30px;
        text-align: center;
        color: white;
      }
    </style>
  </head>
  <body>
    <h1>Developer Skills & Editor Setup</h1>
    <script src="script.js"></script>
  </body>
</html>


================================================
FILE: 03-Developer-Skills/starter/script.js
================================================
// Remember, we're gonna use strict mode in all scripts now!
'use strict';



================================================
FILE: 04-HTML-CSS/final/index.html
================================================
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />

    <link href="style.css" rel="stylesheet" />

    <title>Learning HTML & CSS</title>
  </head>
  <body>
    <h1>JavaScript is fun, but so is HTML & CSS!</h1>
    <p class="first">
      You can learn JavaScript without HTML and CSS, but for DOM manipulation
      it's useful to have some basic ideas of HTML & CSS. You can learn more
      about it
      <a href="https://www.udemy.com/user/jonasschmedtmann/">on Udemy</a>.
    </p>

    <h2>Another heading</h2>
    <p class="second">
      Just another paragraph
    </p>

    <img
      id="course-image"
      src="https://img-a.udemycdn.com/course/480x270/437398_46c3_9.jpg"
    />

    <form id="your-name">
      <h2>Your name here</h2>
      <p class="first">Please fill in this form :)</p>

      <input type="text" placeholder="Your name" />
      <button>OK!</button>
    </form>
  </body>
</html>


================================================
FILE: 04-HTML-CSS/final/style.css
================================================
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

body {
  background-color: rgb(255, 247, 201);
  font-family: Arial;
  font-size: 20px;
  padding: 50px;
}

h1 {
  font-size: 35px;
  margin-bottom: 25px;
}

h2 {
  margin-bottom: 20px;
  text-align: center;
}

p {
  margin-bottom: 20px;
}

.first {
  color: red;
}

#your-name {
  background-color: rgb(255, 220, 105);
  border: 5px solid #444;
  width: 400px;
  padding: 25px;
  margin-top: 30px;
}

input,
button {
  padding: 10px;
  font-size: 16px;
}

a {
  background-color: yellowgreen;
}

#course-image {
  width: 300px;
}

#your-name h2 {
  color: olivedrab;
}


================================================
FILE: 05-Guess-My-Number/final/.prettierrc
================================================
{
  "singleQuote": true,
  "arrowParens": "avoid"
}


================================================
FILE: 05-Guess-My-Number/final/index.html
================================================
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <link rel="stylesheet" href="style.css" />
    <title>Guess My Number!</title>
  </head>
  <body>
    <header>
      <h1>Guess My Number!</h1>
      <p class="between">(Between 1 and 20)</p>
      <button class="btn again">Again!</button>
      <div class="number">?</div>
    </header>
    <main>
      <section class="left">
        <input type="number" class="guess" />
        <button class="btn check">Check!</button>
      </section>
      <section class="right">
        <p class="message">Start guessing...</p>
        <p class="label-score">💯 Score: <span class="score">20</span></p>
        <p class="label-highscore">
          🥇 Highscore: <span class="highscore">0</span>
        </p>
      </section>
    </main>
    <script src="script.js"></script>
  </body>
</html>


================================================
FILE: 05-Guess-My-Number/final/script.js
================================================
'use strict';

/*
console.log(document.querySelector('.message').textContent);
document.querySelector('.message').textContent = '🎉 Correct Number!';

document.querySelector('.number').textContent = 13;
document.querySelector('.score').textContent = 10;

document.querySelector('.guess').value = 23;
console.log(document.querySelector('.guess').value);
*/

let secretNumber = Math.trunc(Math.random() * 20) + 1;
let score = 20;
let highscore = 0;

const displayMessage = function (message) {
  document.querySelector('.message').textContent = message;
};

document.querySelector('.check').addEventListener('click', function () {
  const guess = Number(document.querySelector('.guess').value);
  console.log(guess, typeof guess);

  // When there is no input
  if (!guess) {
    // document.querySelector('.message').textContent = '⛔️ No number!';
    displayMessage('⛔️ No number!');

    // When player wins
  } else if (guess === secretNumber) {
    // document.querySelector('.message').textContent = '🎉 Correct Number!';
    displayMessage('🎉 Correct Number!');
    document.querySelector('.number').textContent = secretNumber;

    document.querySelector('body').style.backgroundColor = '#60b347';
    document.querySelector('.number').style.width = '30rem';

    if (score > highscore) {
      highscore = score;
      document.querySelector('.highscore').textContent = highscore;
    }

    // When guess is wrong
  } else if (guess !== secretNumber) {
    if (score > 1) {
      // document.querySelector('.message').textContent =
      // guess > secretNumber ? '📈 Too high!' : '📉 Too low!';
      displayMessage(guess > secretNumber ? '📈 Too high!' : '📉 Too low!');
      score--;
      document.querySelector('.score').textContent = score;
    } else {
      // document.querySelector('.message').textContent = '💥 You lost the game!';
      displayMessage('💥 You lost the game!');
      document.querySelector('.score').textContent = 0;
    }
  }

  //   // When guess is too high
  // } else if (guess > secretNumber) {
  //   if (score > 1) {
  //     document.querySelector('.message').textContent = '📈 Too high!';
  //     score--;
  //     document.querySelector('.score').textContent = score;
  //   } else {
  //     document.querySelector('.message').textContent = '💥 You lost the game!';
  //     document.querySelector('.score').textContent = 0;
  //   }

  //   // When guess is too low
  // } else if (guess < secretNumber) {
  //   if (score > 1) {
  //     document.querySelector('.message').textContent = '📉 Too low!';
  //     score--;
  //     document.querySelector('.score').textContent = score;
  //   } else {
  //     document.querySelector('.message').textContent = '💥 You lost the game!';
  //     document.querySelector('.score').textContent = 0;
  //   }
  // }
});

document.querySelector('.again').addEventListener('click', function () {
  score = 20;
  secretNumber = Math.trunc(Math.random() * 20) + 1;

  // document.querySelector('.message').textContent = 'Start guessing...';
  displayMessage('Start guessing...');
  document.querySelector('.score').textContent = score;
  document.querySelector('.number').textContent = '?';
  document.querySelector('.guess').value = '';

  document.querySelector('body').style.backgroundColor = '#222';
  document.querySelector('.number').style.width = '15rem';
});

///////////////////////////////////////
// Coding Challenge #1

/* 
Implement a game rest functionality, so that the player can make a new guess! Here is how:

1. Select the element with the 'again' class and attach a click event handler
2. In the handler function, restore initial values of the score and secretNumber variables
3. Restore the initial conditions of the message, number, score and guess input field
4. Also restore the original background color (#222) and number width (15rem)

GOOD LUCK 😀
*/


================================================
FILE: 05-Guess-My-Number/final/style.css
================================================
@import url('https://fonts.googleapis.com/css?family=Press+Start+2P&display=swap');

* {
  margin: 0;
  padding: 0;
  box-sizing: inherit;
}

html {
  font-size: 62.5%;
  box-sizing: border-box;
}

body {
  font-family: 'Press Start 2P', sans-serif;
  color: #eee;
  background-color: #222;
  /* background-color: #60b347; */
}

/* LAYOUT */
header {
  position: relative;
  height: 35vh;
  border-bottom: 7px solid #eee;
}

main {
  height: 65vh;
  color: #eee;
  display: flex;
  align-items: center;
  justify-content: space-around;
}

.left {
  width: 52rem;
  display: flex;
  flex-direction: column;
  align-items: center;
}

.right {
  width: 52rem;
  font-size: 2rem;
}

/* ELEMENTS STYLE */
h1 {
  font-size: 4rem;
  text-align: center;
  position: absolute;
  width: 100%;
  top: 52%;
  left: 50%;
  transform: translate(-50%, -50%);
}

.number {
  background: #eee;
  color: #333;
  font-size: 6rem;
  width: 15rem;
  padding: 3rem 0rem;
  text-align: center;
  position: absolute;
  bottom: 0;
  left: 50%;
  transform: translate(-50%, 50%);
}

.between {
  font-size: 1.4rem;
  position: absolute;
  top: 2rem;
  right: 2rem;
}

.again {
  position: absolute;
  top: 2rem;
  left: 2rem;
}

.guess {
  background: none;
  border: 4px solid #eee;
  font-family: inherit;
  color: inherit;
  font-size: 5rem;
  padding: 2.5rem;
  width: 25rem;
  text-align: center;
  display: block;
  margin-bottom: 3rem;
}

.btn {
  border: none;
  background-color: #eee;
  color: #222;
  font-size: 2rem;
  font-family: inherit;
  padding: 2rem 3rem;
  cursor: pointer;
}

.btn:hover {
  background-color: #ccc;
}

.message {
  margin-bottom: 8rem;
  height: 3rem;
}

.label-score {
  margin-bottom: 2rem;
}


================================================
FILE: 05-Guess-My-Number/starter/.prettierrc
================================================
{
  "singleQuote": true,
  "arrowParens": "avoid"
}


================================================
FILE: 05-Guess-My-Number/starter/index.html
================================================
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <link rel="stylesheet" href="style.css" />
    <title>Guess My Number!</title>
  </head>
  <body>
    <header>
      <h1>Guess My Number!</h1>
      <p class="between">(Between 1 and 20)</p>
      <button class="btn again">Again!</button>
      <div class="number">?</div>
    </header>
    <main>
      <section class="left">
        <input type="number" class="guess" />
        <button class="btn check">Check!</button>
      </section>
      <section class="right">
        <p class="message">Start guessing...</p>
        <p class="label-score">💯 Score: <span class="score">20</span></p>
        <p class="label-highscore">
          🥇 Highscore: <span class="highscore">0</span>
        </p>
      </section>
    </main>
    <script src="script.js"></script>
  </body>
</html>


================================================
FILE: 05-Guess-My-Number/starter/script.js
================================================
'use strict';


================================================
FILE: 05-Guess-My-Number/starter/style.css
================================================
@import url('https://fonts.googleapis.com/css?family=Press+Start+2P&display=swap');

* {
  margin: 0;
  padding: 0;
  box-sizing: inherit;
}

html {
  font-size: 62.5%;
  box-sizing: border-box;
}

body {
  font-family: 'Press Start 2P', sans-serif;
  color: #eee;
  background-color: #222;
  /* background-color: #60b347; */
}

/* LAYOUT */
header {
  position: relative;
  height: 35vh;
  border-bottom: 7px solid #eee;
}

main {
  height: 65vh;
  color: #eee;
  display: flex;
  align-items: center;
  justify-content: space-around;
}

.left {
  width: 52rem;
  display: flex;
  flex-direction: column;
  align-items: center;
}

.right {
  width: 52rem;
  font-size: 2rem;
}

/* ELEMENTS STYLE */
h1 {
  font-size: 4rem;
  text-align: center;
  position: absolute;
  width: 100%;
  top: 52%;
  left: 50%;
  transform: translate(-50%, -50%);
}

.number {
  background: #eee;
  color: #333;
  font-size: 6rem;
  width: 15rem;
  padding: 3rem 0rem;
  text-align: center;
  position: absolute;
  bottom: 0;
  left: 50%;
  transform: translate(-50%, 50%);
}

.between {
  font-size: 1.4rem;
  position: absolute;
  top: 2rem;
  right: 2rem;
}

.again {
  position: absolute;
  top: 2rem;
  left: 2rem;
}

.guess {
  background: none;
  border: 4px solid #eee;
  font-family: inherit;
  color: inherit;
  font-size: 5rem;
  padding: 2.5rem;
  width: 25rem;
  text-align: center;
  display: block;
  margin-bottom: 3rem;
}

.btn {
  border: none;
  background-color: #eee;
  color: #222;
  font-size: 2rem;
  font-family: inherit;
  padding: 2rem 3rem;
  cursor: pointer;
}

.btn:hover {
  background-color: #ccc;
}

.message {
  margin-bottom: 8rem;
  height: 3rem;
}

.label-score {
  margin-bottom: 2rem;
}


================================================
FILE: 06-Modal/final/.prettierrc
================================================
{
  "singleQuote": true,
  "arrowParens": "avoid"
}


================================================
FILE: 06-Modal/final/index.html
================================================
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <link rel="stylesheet" href="style.css" />
    <title>Modal window</title>
  </head>
  <body>
    <button class="show-modal">Show modal 1</button>
    <button class="show-modal">Show modal 2</button>
    <button class="show-modal">Show modal 3</button>

    <div class="modal hidden">
      <button class="close-modal">&times;</button>
      <h1>I'm a modal window 😍</h1>
      <p>
        Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
        tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
        veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
        commodo consequat. Duis aute irure dolor in reprehenderit in voluptate
        velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
        occaecat cupidatat non proident, sunt in culpa qui officia deserunt
        mollit anim id est laborum.
      </p>
    </div>
    <div class="overlay hidden"></div>

    <script src="script.js"></script>
  </body>
</html>


================================================
FILE: 06-Modal/final/script.js
================================================
'use strict';

const modal = document.querySelector('.modal');
const overlay = document.querySelector('.overlay');
const btnCloseModal = document.querySelector('.close-modal');
const btnsOpenModal = document.querySelectorAll('.show-modal');

const openModal = function () {
  modal.classList.remove('hidden');
  overlay.classList.remove('hidden');
};

const closeModal = function () {
  modal.classList.add('hidden');
  overlay.classList.add('hidden');
};

for (let i = 0; i < btnsOpenModal.length; i++)
  btnsOpenModal[i].addEventListener('click', openModal);

btnCloseModal.addEventListener('click', closeModal);
overlay.addEventListener('click', closeModal);

document.addEventListener('keydown', function (e) {
  // console.log(e.key);

  if (e.key === 'Escape' && !modal.classList.contains('hidden')) {
    closeModal();
  }
});


================================================
FILE: 06-Modal/final/style.css
================================================
* {
  margin: 0;
  padding: 0;
  box-sizing: inherit;
}

html {
  font-size: 62.5%;
  box-sizing: border-box;
}

body {
  font-family: sans-serif;
  color: #333;
  line-height: 1.5;
  height: 100vh;
  position: relative;
  display: flex;
  align-items: flex-start;
  justify-content: center;
  background: linear-gradient(to top left, #28b487, #7dd56f);
}

.show-modal {
  font-size: 2rem;
  font-weight: 600;
  padding: 1.75rem 3.5rem;
  margin: 5rem 2rem;
  border: none;
  background-color: #fff;
  color: #444;
  border-radius: 10rem;
  cursor: pointer;
}

.close-modal {
  position: absolute;
  top: 1.2rem;
  right: 2rem;
  font-size: 5rem;
  color: #333;
  cursor: pointer;
  border: none;
  background: none;
}

h1 {
  font-size: 2.5rem;
  margin-bottom: 2rem;
}

p {
  font-size: 1.8rem;
}

/* -------------------------- */
/* CLASSES TO MAKE MODAL WORK */
.hidden {
  display: none;
}

.modal {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: 70%;

  background-color: white;
  padding: 6rem;
  border-radius: 5px;
  box-shadow: 0 3rem 5rem rgba(0, 0, 0, 0.3);
  z-index: 10;
}

.overlay {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: rgba(0, 0, 0, 0.6);
  backdrop-filter: blur(3px);
  z-index: 5;
}


================================================
FILE: 06-Modal/starter/.prettierrc
================================================
{
  "singleQuote": true,
  "arrowParens": "avoid"
}


================================================
FILE: 06-Modal/starter/index.html
================================================
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <link rel="stylesheet" href="style.css" />
    <title>Modal window</title>
  </head>
  <body>
    <button class="show-modal">Show modal 1</button>
    <button class="show-modal">Show modal 2</button>
    <button class="show-modal">Show modal 3</button>

    <div class="modal hidden">
      <button class="close-modal">&times;</button>
      <h1>I'm a modal window 😍</h1>
      <p>
        Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
        tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
        veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
        commodo consequat. Duis aute irure dolor in reprehenderit in voluptate
        velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
        occaecat cupidatat non proident, sunt in culpa qui officia deserunt
        mollit anim id est laborum.
      </p>
    </div>
    <div class="overlay hidden"></div>

    <script src="script.js"></script>
  </body>
</html>


================================================
FILE: 06-Modal/starter/script.js
================================================
'use strict';


================================================
FILE: 06-Modal/starter/style.css
================================================
* {
  margin: 0;
  padding: 0;
  box-sizing: inherit;
}

html {
  font-size: 62.5%;
  box-sizing: border-box;
}

body {
  font-family: sans-serif;
  color: #333;
  line-height: 1.5;
  height: 100vh;
  position: relative;
  display: flex;
  align-items: flex-start;
  justify-content: center;
  background: linear-gradient(to top left, #28b487, #7dd56f);
}

.show-modal {
  font-size: 2rem;
  font-weight: 600;
  padding: 1.75rem 3.5rem;
  margin: 5rem 2rem;
  border: none;
  background-color: #fff;
  color: #444;
  border-radius: 10rem;
  cursor: pointer;
}

.close-modal {
  position: absolute;
  top: 1.2rem;
  right: 2rem;
  font-size: 5rem;
  color: #333;
  cursor: pointer;
  border: none;
  background: none;
}

h1 {
  font-size: 2.5rem;
  margin-bottom: 2rem;
}

p {
  font-size: 1.8rem;
}

/* -------------------------- */
/* CLASSES TO MAKE MODAL WORK */
.hidden {
  display: none;
}

.modal {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: 70%;

  background-color: white;
  padding: 6rem;
  border-radius: 5px;
  box-shadow: 0 3rem 5rem rgba(0, 0, 0, 0.3);
  z-index: 10;
}

.overlay {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: rgba(0, 0, 0, 0.6);
  backdrop-filter: blur(3px);
  z-index: 5;
}


================================================
FILE: 07-Pig-Game/final/.prettierrc
================================================
{
  "singleQuote": true,
  "arrowParens": "avoid"
}


================================================
FILE: 07-Pig-Game/final/index.html
================================================
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <link rel="stylesheet" href="style.css" />
    <title>Pig Game</title>
  </head>
  <body>
    <main>
      <section class="player player--0 player--active">
        <h2 class="name" id="name--0">Player 1</h2>
        <p class="score" id="score--0">43</p>
        <div class="current">
          <p class="current-label">Current</p>
          <p class="current-score" id="current--0">0</p>
        </div>
      </section>
      <section class="player player--1">
        <h2 class="name" id="name--1">Player 2</h2>
        <p class="score" id="score--1">24</p>
        <div class="current">
          <p class="current-label">Current</p>
          <p class="current-score" id="current--1">0</p>
        </div>
      </section>

      <img src="dice-5.png" alt="Playing dice" class="dice" />
      <button class="btn btn--new">🔄 New game</button>
      <button class="btn btn--roll">🎲 Roll dice</button>
      <button class="btn btn--hold">📥 Hold</button>
    </main>
    <script src="script.js"></script>
  </body>
</html>


================================================
FILE: 07-Pig-Game/final/script.js
================================================
'use strict';

// Selecting elements
const player0El = document.querySelector('.player--0');
const player1El = document.querySelector('.player--1');
const score0El = document.querySelector('#score--0');
const score1El = document.getElementById('score--1');
const current0El = document.getElementById('current--0');
const current1El = document.getElementById('current--1');

const diceEl = document.querySelector('.dice');
const btnNew = document.querySelector('.btn--new');
const btnRoll = document.querySelector('.btn--roll');
const btnHold = document.querySelector('.btn--hold');

let scores, currentScore, activePlayer, playing;

// Starting conditions
const init = function () {
  scores = [0, 0];
  currentScore = 0;
  activePlayer = 0;
  playing = true;

  score0El.textContent = 0;
  score1El.textContent = 0;
  current0El.textContent = 0;
  current1El.textContent = 0;

  diceEl.classList.add('hidden');
  player0El.classList.remove('player--winner');
  player1El.classList.remove('player--winner');
  player0El.classList.add('player--active');
  player1El.classList.remove('player--active');
};
init();

const switchPlayer = function () {
  document.getElementById(`current--${activePlayer}`).textContent = 0;
  currentScore = 0;
  activePlayer = activePlayer === 0 ? 1 : 0;
  player0El.classList.toggle('player--active');
  player1El.classList.toggle('player--active');
};

// Rolling dice functionality
btnRoll.addEventListener('click', function () {
  if (playing) {
    // 1. Generating a random dice roll
    const dice = Math.trunc(Math.random() * 6) + 1;

    // 2. Display dice
    diceEl.classList.remove('hidden');
    diceEl.src = `dice-${dice}.png`;

    // 3. Check for rolled 1
    if (dice !== 1) {
      // Add dice to current score
      currentScore += dice;
      document.getElementById(
        `current--${activePlayer}`
      ).textContent = currentScore;
    } else {
      // Switch to next player
      switchPlayer();
    }
  }
});

btnHold.addEventListener('click', function () {
  if (playing) {
    // 1. Add current score to active player's score
    scores[activePlayer] += currentScore;
    // scores[1] = scores[1] + currentScore

    document.getElementById(`score--${activePlayer}`).textContent =
      scores[activePlayer];

    // 2. Check if player's score is >= 100
    if (scores[activePlayer] >= 100) {
      // Finish the game
      playing = false;
      diceEl.classList.add('hidden');

      document
        .querySelector(`.player--${activePlayer}`)
        .classList.add('player--winner');
      document
        .querySelector(`.player--${activePlayer}`)
        .classList.remove('player--active');
    } else {
      // Switch to the next player
      switchPlayer();
    }
  }
});

btnNew.addEventListener('click', init);


================================================
FILE: 07-Pig-Game/final/style.css
================================================
@import url('https://fonts.googleapis.com/css2?family=Nunito&display=swap');

* {
  margin: 0;
  padding: 0;
  box-sizing: inherit;
}

html {
  font-size: 62.5%;
  box-sizing: border-box;
}

body {
  font-family: 'Nunito', sans-serif;
  font-weight: 400;
  height: 100vh;
  color: #333;
  background-image: linear-gradient(to top left, #753682 0%, #bf2e34 100%);
  display: flex;
  align-items: center;
  justify-content: center;
}

/* LAYOUT */
main {
  position: relative;
  width: 100rem;
  height: 60rem;
  background-color: rgba(255, 255, 255, 0.35);
  backdrop-filter: blur(200px);
  filter: blur();
  box-shadow: 0 3rem 5rem rgba(0, 0, 0, 0.25);
  border-radius: 9px;
  overflow: hidden;
  display: flex;
}

.player {
  flex: 50%;
  padding: 9rem;
  display: flex;
  flex-direction: column;
  align-items: center;
  transition: all 0.75s;
}

/* ELEMENTS */
.name {
  position: relative;
  font-size: 4rem;
  text-transform: uppercase;
  letter-spacing: 1px;
  word-spacing: 2px;
  font-weight: 300;
  margin-bottom: 1rem;
}

.score {
  font-size: 8rem;
  font-weight: 300;
  color: #c7365f;
  margin-bottom: auto;
}

.player--active {
  background-color: rgba(255, 255, 255, 0.4);
}
.player--active .name {
  font-weight: 700;
}
.player--active .score {
  font-weight: 400;
}

.player--active .current {
  opacity: 1;
}

.current {
  background-color: #c7365f;
  opacity: 0.8;
  border-radius: 9px;
  color: #fff;
  width: 65%;
  padding: 2rem;
  text-align: center;
  transition: all 0.75s;
}

.current-label {
  text-transform: uppercase;
  margin-bottom: 1rem;
  font-size: 1.7rem;
  color: #ddd;
}

.current-score {
  font-size: 3.5rem;
}

/* ABSOLUTE POSITIONED ELEMENTS */
.btn {
  position: absolute;
  left: 50%;
  transform: translateX(-50%);
  color: #444;
  background: none;
  border: none;
  font-family: inherit;
  font-size: 1.8rem;
  text-transform: uppercase;
  cursor: pointer;
  font-weight: 400;
  transition: all 0.2s;

  background-color: white;
  background-color: rgba(255, 255, 255, 0.6);
  backdrop-filter: blur(10px);

  padding: 0.7rem 2.5rem;
  border-radius: 50rem;
  box-shadow: 0 1.75rem 3.5rem rgba(0, 0, 0, 0.1);
}

.btn::first-letter {
  font-size: 2.4rem;
  display: inline-block;
  margin-right: 0.7rem;
}

.btn--new {
  top: 4rem;
}
.btn--roll {
  top: 39.3rem;
}
.btn--hold {
  top: 46.1rem;
}

.btn:active {
  transform: translate(-50%, 3px);
  box-shadow: 0 1rem 2rem rgba(0, 0, 0, 0.15);
}

.btn:focus {
  outline: none;
}

.dice {
  position: absolute;
  left: 50%;
  top: 16.5rem;
  transform: translateX(-50%);
  height: 10rem;
  box-shadow: 0 2rem 5rem rgba(0, 0, 0, 0.2);
}

.player--winner {
  background-color: #2f2f2f;
}

.player--winner .name {
  font-weight: 700;
  color: #c7365f;
}

.hidden {
  display: none;
}


================================================
FILE: 07-Pig-Game/starter/.prettierrc
================================================
{
  "singleQuote": true,
  "arrowParens": "avoid"
}


================================================
FILE: 07-Pig-Game/starter/index.html
================================================
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <link rel="stylesheet" href="style.css" />
    <title>Pig Game</title>
  </head>
  <body>
    <main>
      <section class="player player--0 player--active">
        <h2 class="name" id="name--0">Player 1</h2>
        <p class="score" id="score--0">43</p>
        <div class="current">
          <p class="current-label">Current</p>
          <p class="current-score" id="current--0">0</p>
        </div>
      </section>
      <section class="player player--1">
        <h2 class="name" id="name--1">Player 2</h2>
        <p class="score" id="score--1">24</p>
        <div class="current">
          <p class="current-label">Current</p>
          <p class="current-score" id="current--1">0</p>
        </div>
      </section>

      <img src="dice-5.png" alt="Playing dice" class="dice" />
      <button class="btn btn--new">🔄 New game</button>
      <button class="btn btn--roll">🎲 Roll dice</button>
      <button class="btn btn--hold">📥 Hold</button>
    </main>
    <script src="script.js"></script>
  </body>
</html>


================================================
FILE: 07-Pig-Game/starter/script.js
================================================
'use strict';


================================================
FILE: 07-Pig-Game/starter/style.css
================================================
@import url('https://fonts.googleapis.com/css2?family=Nunito&display=swap');

* {
  margin: 0;
  padding: 0;
  box-sizing: inherit;
}

html {
  font-size: 62.5%;
  box-sizing: border-box;
}

body {
  font-family: 'Nunito', sans-serif;
  font-weight: 400;
  height: 100vh;
  color: #333;
  background-image: linear-gradient(to top left, #753682 0%, #bf2e34 100%);
  display: flex;
  align-items: center;
  justify-content: center;
}

/* LAYOUT */
main {
  position: relative;
  width: 100rem;
  height: 60rem;
  background-color: rgba(255, 255, 255, 0.35);
  backdrop-filter: blur(200px);
  filter: blur();
  box-shadow: 0 3rem 5rem rgba(0, 0, 0, 0.25);
  border-radius: 9px;
  overflow: hidden;
  display: flex;
}

.player {
  flex: 50%;
  padding: 9rem;
  display: flex;
  flex-direction: column;
  align-items: center;
  transition: all 0.75s;
}

/* ELEMENTS */
.name {
  position: relative;
  font-size: 4rem;
  text-transform: uppercase;
  letter-spacing: 1px;
  word-spacing: 2px;
  font-weight: 300;
  margin-bottom: 1rem;
}

.score {
  font-size: 8rem;
  font-weight: 300;
  color: #c7365f;
  margin-bottom: auto;
}

.player--active {
  background-color: rgba(255, 255, 255, 0.4);
}
.player--active .name {
  font-weight: 700;
}
.player--active .score {
  font-weight: 400;
}

.player--active .current {
  opacity: 1;
}

.current {
  background-color: #c7365f;
  opacity: 0.8;
  border-radius: 9px;
  color: #fff;
  width: 65%;
  padding: 2rem;
  text-align: center;
  transition: all 0.75s;
}

.current-label {
  text-transform: uppercase;
  margin-bottom: 1rem;
  font-size: 1.7rem;
  color: #ddd;
}

.current-score {
  font-size: 3.5rem;
}

/* ABSOLUTE POSITIONED ELEMENTS */
.btn {
  position: absolute;
  left: 50%;
  transform: translateX(-50%);
  color: #444;
  background: none;
  border: none;
  font-family: inherit;
  font-size: 1.8rem;
  text-transform: uppercase;
  cursor: pointer;
  font-weight: 400;
  transition: all 0.2s;

  background-color: white;
  background-color: rgba(255, 255, 255, 0.6);
  backdrop-filter: blur(10px);

  padding: 0.7rem 2.5rem;
  border-radius: 50rem;
  box-shadow: 0 1.75rem 3.5rem rgba(0, 0, 0, 0.1);
}

.btn::first-letter {
  font-size: 2.4rem;
  display: inline-block;
  margin-right: 0.7rem;
}

.btn--new {
  top: 4rem;
}
.btn--roll {
  top: 39.3rem;
}
.btn--hold {
  top: 46.1rem;
}

.btn:active {
  transform: translate(-50%, 3px);
  box-shadow: 0 1rem 2rem rgba(0, 0, 0, 0.15);
}

.btn:focus {
  outline: none;
}

.dice {
  position: absolute;
  left: 50%;
  top: 16.5rem;
  transform: translateX(-50%);
  height: 10rem;
  box-shadow: 0 2rem 5rem rgba(0, 0, 0, 0.2);
}

.player--winner {
  background-color: #2f2f2f;
}

.player--winner .name {
  font-weight: 700;
  color: #c7365f;
}


================================================
FILE: 08-Behind-the-Scenes/final/.prettierrc
================================================
{
  "singleQuote": true,
  "arrowParens": "avoid"
}


================================================
FILE: 08-Behind-the-Scenes/final/index.html
================================================
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>How JavaScript Works Behind the Scenes</title>
    <style>
      body {
        height: 100vh;
        display: flex;
        align-items: center;
        background: linear-gradient(to top left, #28b487, #7dd56f);
      }
      h1 {
        font-family: sans-serif;
        font-size: 50px;
        line-height: 1.3;
        width: 100%;
        padding: 30px;
        text-align: center;
        color: white;
      }
    </style>
  </head>
  <body>
    <h1>How JavaScript Works Behind the Scenes</h1>
    <script src="script.js"></script>
  </body>
</html>


================================================
FILE: 08-Behind-the-Scenes/final/script.js
================================================
'use strict';

///////////////////////////////////////
// Scoping in Practice

/*
function calcAge(birthYear) {
  const age = 2037 - birthYear;

  function printAge() {
    let output = `${firstName}, you are ${age}, born in ${birthYear}`;
    console.log(output);

    if (birthYear >= 1981 && birthYear <= 1996) {
      var millenial = true;
      // Creating NEW variable with same name as outer scope's variable
      const firstName = 'Steven';

      // Reasssigning outer scope's variable
      output = 'NEW OUTPUT!';

      const str = `Oh, and you're a millenial, ${firstName}`;
      console.log(str);

      function add(a, b) {
        return a + b;
      }
    }
    // console.log(str);
    console.log(millenial);
    // console.log(add(2, 3));
    console.log(output);
  }
  printAge();

  return age;
}

const firstName = 'Jonas';
calcAge(1991);
// console.log(age);
// printAge();


///////////////////////////////////////
// Hoisting and TDZ in Practice

// Variables
console.log(me);
// console.log(job);
// console.log(year);

var me = 'Jonas';
let job = 'teacher';
const year = 1991;

// Functions
console.log(addDecl(2, 3));
// console.log(addExpr(2, 3));
console.log(addArrow);
// console.log(addArrow(2, 3));

function addDecl(a, b) {
  return a + b;
}

const addExpr = function (a, b) {
  return a + b;
};

var addArrow = (a, b) => a + b;

// Example
console.log(undefined);
if (!numProducts) deleteShoppingCart();

var numProducts = 10;

function deleteShoppingCart() {
  console.log('All products deleted!');
}

var x = 1;
let y = 2;
const z = 3;

console.log(x === window.x);
console.log(y === window.y);
console.log(z === window.z);


///////////////////////////////////////
// The this Keyword in Practice
console.log(this);

const calcAge = function (birthYear) {
  console.log(2037 - birthYear);
  console.log(this);
};
calcAge(1991);

const calcAgeArrow = birthYear => {
  console.log(2037 - birthYear);
  console.log(this);
};
calcAgeArrow(1980);

const jonas = {
  year: 1991,
  calcAge: function () {
    console.log(this);
    console.log(2037 - this.year);
  },
};
jonas.calcAge();

const matilda = {
  year: 2017,
};

matilda.calcAge = jonas.calcAge;
matilda.calcAge();

const f = jonas.calcAge;
f();


///////////////////////////////////////
// Regular Functions vs. Arrow Functions
// var firstName = 'Matilda';

const jonas = {
  firstName: 'Jonas',
  year: 1991,
  calcAge: function () {
    // console.log(this);
    console.log(2037 - this.year);

    // Solution 1
    // const self = this; // self or that
    // const isMillenial = function () {
    //   console.log(self);
    //   console.log(self.year >= 1981 && self.year <= 1996);
    // };

    // Solution 2
    const isMillenial = () => {
      console.log(this);
      console.log(this.year >= 1981 && this.year <= 1996);
    };
    isMillenial();
  },

  greet: () => {
    console.log(this);
    console.log(`Hey ${this.firstName}`);
  },
};
jonas.greet();
jonas.calcAge();

// arguments keyword
const addExpr = function (a, b) {
  console.log(arguments);
  return a + b;
};
addExpr(2, 5);
addExpr(2, 5, 8, 12);

var addArrow = (a, b) => {
  console.log(arguments);
  return a + b;
};
addArrow(2, 5, 8);


///////////////////////////////////////
// Object References in Practice (Shallow vs. Deep Copies)

const jessica1 = {
  firstName: 'Jessica',
  lastName: 'Williams',
  age: 27,
};

function marryPerson(originalPerson, newLastName) {
  originalPerson.lastName = newLastName;
  return originalPerson;
}

const marriedJessica = marryPerson(jessica1, 'Davis');

// const marriedJessica = jessica1;
// marriedJessica.lastName = 'Davis';

console.log('Before:', jessica1);
console.log('After:', marriedJessica);

const jessica = {
  firstName: 'Jessica',
  lastName: 'Williams',
  age: 27,
  familiy: ['Alice', 'Bob'],
};

// Shallow copy
const jessicaCopy = { ...jessica };
jessicaCopy.lastName = 'Davis';

// jessicaCopy.familiy.push('Mary');
// jessicaCopy.familiy.push('John');

// console.log('Before:', jessica);
// console.log('After:', jessicaCopy);

// Deep copy/clone
const jessicaClone = structuredClone(jessica);
jessicaClone.familiy.push('Mary');
jessicaClone.familiy.push('John');

console.log('Original:', jessica);
console.log('Clone:', jessicaClone);
*/


================================================
FILE: 08-Behind-the-Scenes/starter/.prettierrc
================================================
{
  "singleQuote": true,
  "arrowParens": "avoid"
}


================================================
FILE: 08-Behind-the-Scenes/starter/index.html
================================================
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>How JavaScript Works Behind the Scenes</title>
    <style>
      body {
        height: 100vh;
        display: flex;
        align-items: center;
        background: linear-gradient(to top left, #28b487, #7dd56f);
      }
      h1 {
        font-family: sans-serif;
        font-size: 50px;
        line-height: 1.3;
        width: 100%;
        padding: 30px;
        text-align: center;
        color: white;
      }
    </style>
  </head>
  <body>
    <h1>How JavaScript Works Behind the Scenes</h1>
    <script src="script.js"></script>
  </body>
</html>


================================================
FILE: 08-Behind-the-Scenes/starter/script.js
================================================
'use strict';


================================================
FILE: 09-Data-Structures-Operators/final/.prettierrc
================================================
{
  "singleQuote": true,
  "arrowParens": "avoid"
}


================================================
FILE: 09-Data-Structures-Operators/final/index.html
================================================
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Data Structures and Modern Operators</title>
    <style>
      body {
        height: 100vh;
        display: flex;
        align-items: center;
        background: linear-gradient(to top left, #28b487, #7dd56f);
      }
      h1 {
        font-family: sans-serif;
        font-size: 50px;
        line-height: 1.3;
        width: 100%;
        padding: 30px;
        text-align: center;
        color: white;
      }
      button {
        width: 50px;
        height: 20px;
        margin: 10px;
      }
      textarea {
        width: 300px;
        height: 100px;
      }
    </style>
  </head>
  <body>
    <h1>Data Structures and Modern Operators</h1>
    <script src="script.js"></script>
  </body>
</html>


================================================
FILE: 09-Data-Structures-Operators/final/script.js
================================================
'use strict';

const weekdays = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'];
const openingHours = {
  [weekdays[3]]: {
    open: 12,
    close: 22,
  },
  [weekdays[4]]: {
    open: 11,
    close: 23,
  },
  [weekdays[5]]: {
    open: 0, // Open 24 hours
    close: 24,
  },
};

const restaurant = {
  name: 'Classico Italiano',
  location: 'Via Angelo Tavanti 23, Firenze, Italy',
  categories: ['Italian', 'Pizzeria', 'Vegetarian', 'Organic'],
  starterMenu: ['Focaccia', 'Bruschetta', 'Garlic Bread', 'Caprese Salad'],
  mainMenu: ['Pizza', 'Pasta', 'Risotto'],

  // ES6 enhanced object literals
  openingHours,

  order(starterIndex, mainIndex) {
    return [this.starterMenu[starterIndex], this.mainMenu[mainIndex]];
  },

  orderDelivery({ starterIndex = 1, mainIndex = 0, time = '20:00', address }) {
    console.log(
      `Order received! ${this.starterMenu[starterIndex]} and ${this.mainMenu[mainIndex]} will be delivered to ${address} at ${time}`
    );
  },

  orderPasta(ing1, ing2, ing3) {
    console.log(
      `Here is your declicious pasta with ${ing1}, ${ing2} and ${ing3}`
    );
  },

  orderPizza(mainIngredient, ...otherIngredients) {
    console.log(mainIngredient);
    console.log(otherIngredients);
  },
};

/*
///////////////////////////////////////
// String Methods Practice

const flights =
  '_Delayed_Departure;fao93766109;txl2133758440;11:25+_Arrival;bru0943384722;fao93766109;11:45+_Delayed_Arrival;hel7439299980;fao93766109;12:05+_Departure;fao93766109;lis2323639855;12:30';

// 🔴 Delayed Departure from FAO to TXL (11h25)
//              Arrival from BRU to FAO (11h45)
//   🔴 Delayed Arrival from HEL to FAO (12h05)
//            Departure from FAO to LIS (12h30)

const getCode = str => str.slice(0, 3).toUpperCase();

for (const flight of flights.split('+')) {
  const [type, from, to, time] = flight.split(';');
  const output = `${type.startsWith('_Delayed') ? '🔴' : ''}${type.replaceAll(
    '_',
    ' '
  )} ${getCode(from)} ${getCode(to)} (${time.replace(':', 'h')})`.padStart(36);
  console.log(output);
}

///////////////////////////////////////
// Coding Challenge #4


Write a program that receives a list of variable names written in underscore_case and convert them to camelCase.

The input will come from a textarea inserted into the DOM (see code below), and conversion will happen when the button is pressed.

THIS TEST DATA (pasted to textarea)
underscore_case
 first_name
Some_Variable 
  calculate_AGE
delayed_departure

SHOULD PRODUCE THIS OUTPUT (5 separate console.log outputs)
underscoreCase      ✅
firstName           ✅✅
someVariable        ✅✅✅
calculateAge        ✅✅✅✅
delayedDeparture    ✅✅✅✅✅

HINT 1: Remember which character defines a new line in the textarea 😉
HINT 2: The solution only needs to work for a variable made out of 2 words, like a_b
HINT 3: Start without worrying about the ✅. Tackle that only after you have the variable name conversion working 😉
HINT 4: This challenge is difficult on purpose, so start watching the solution in case you're stuck. Then pause and continue!

Afterwards, test with your own test data!

GOOD LUCK 😀
*/

/*
document.body.append(document.createElement('textarea'));
document.body.append(document.createElement('button'));

document.querySelector('button').addEventListener('click', function () {
  const text = document.querySelector('textarea').value;
  const rows = text.split('\n');

  for (const [i, row] of rows.entries()) {
    const [first, second] = row.toLowerCase().trim().split('_');

    const output = `${first}${second.replace(
      second[0],
      second[0].toUpperCase()
    )}`;
    console.log(`${output.padEnd(20)}${'✅'.repeat(i + 1)}`);
  }
});
*/

/*
///////////////////////////////////////
// Working With Strings - Part 3

// Split and join
console.log('a+very+nice+string'.split('+'));
console.log('Jonas Schmedtmann'.split(' '));

const [firstName, lastName] = 'Jonas Schmedtmann'.split(' ');

const newName = ['Mr.', firstName, lastName.toUpperCase()].join(' ');
console.log(newName);

const capitalizeName = function (name) {
  const names = name.split(' ');
  const namesUpper = [];

  for (const n of names) {
    // namesUpper.push(n[0].toUpperCase() + n.slice(1));
    namesUpper.push(n.replace(n[0], n[0].toUpperCase()));
  }
  console.log(namesUpper.join(' '));
};

capitalizeName('jessica ann smith davis');
capitalizeName('jonas schmedtmann');

// Padding
const message = 'Go to gate 23!';
console.log(message.padStart(20, '+').padEnd(30, '+'));
console.log('Jonas'.padStart(20, '+').padEnd(30, '+'));

const maskCreditCard = function (number) {
  const str = number + '';
  const last = str.slice(-4);
  return last.padStart(str.length, '*');
};

console.log(maskCreditCard(64637836));
console.log(maskCreditCard(43378463864647384));
console.log(maskCreditCard('334859493847755774747'));

// Repeat
const message2 = 'Bad waether... All Departues Delayed... ';
console.log(message2.repeat(5));

const planesInLine = function (n) {
  console.log(`There are ${n} planes in line ${'🛩'.repeat(n)}`);
};
planesInLine(5);
planesInLine(3);
planesInLine(12);


///////////////////////////////////////
// Working With Strings - Part 2

const airline = 'TAP Air Portugal';

console.log(airline.toLowerCase());
console.log(airline.toUpperCase());

// Fix capitalization in name
const passenger = 'jOnAS'; // Jonas
const passengerLower = passenger.toLowerCase();
const passengerCorrect =
  passengerLower[0].toUpperCase() + passengerLower.slice(1);
console.log(passengerCorrect);

// Comparing emails
const email = 'hello@jonas.io';
const loginEmail = '  Hello@Jonas.Io \n';

// const lowerEmail = loginEmail.toLowerCase();
// const trimmedEmail = lowerEmail.trim();
const normalizedEmail = loginEmail.toLowerCase().trim();
console.log(normalizedEmail);
console.log(email === normalizedEmail);

// replacing
const priceGB = '288,97£';
const priceUS = priceGB.replace('£', '$').replace(',', '.');
console.log(priceUS);

const announcement =
  'All passengers come to boarding door 23. Boarding door 23!';

console.log(announcement.replace('door', 'gate'));
console.log(announcement.replaceAll('door', 'gate'));

// Alternative solution to replaceAll with regular expression
console.log(announcement.replace(/door/g, 'gate'));

// Booleans
const plane = 'Airbus A320neo';
console.log(plane.includes('A320'));
console.log(plane.includes('Boeing'));
console.log(plane.startsWith('Airb'));

if (plane.startsWith('Airbus') && plane.endsWith('neo')) {
  console.log('Part of the NEW ARirbus family');
}

// Practice exercise
const checkBaggage = function (items) {
  const baggage = items.toLowerCase();

  if (baggage.includes('knife') || baggage.includes('gun')) {
    console.log('You are NOT allowed on board');
  } else {
    console.log('Welcome aboard!');
  }
};

checkBaggage('I have a laptop, some Food and a pocket Knife');
checkBaggage('Socks and camera');
checkBaggage('Got some snacks and a gun for protection');


///////////////////////////////////////
// Working With Strings - Part 1
const airline = 'TAP Air Portugal';
const plane = 'A320';

console.log(plane[0]);
console.log(plane[1]);
console.log(plane[2]);
console.log('B737'[0]);

console.log(airline.length);
console.log('B737'.length);

console.log(airline.indexOf('r'));
console.log(airline.lastIndexOf('r'));
console.log(airline.indexOf('portugal'));

console.log(airline.slice(4));
console.log(airline.slice(4, 7));

console.log(airline.slice(0, airline.indexOf(' ')));
console.log(airline.slice(airline.lastIndexOf(' ') + 1));

console.log(airline.slice(-2));
console.log(airline.slice(1, -1));

const checkMiddleSeat = function (seat) {
  // B and E are middle seats
  const s = seat.slice(-1);
  if (s === 'B' || s === 'E') console.log('You got the middle seat 😬');
  else console.log('You got lucky 😎');
};

checkMiddleSeat('11B');
checkMiddleSeat('23C');
checkMiddleSeat('3E');

console.log(new String('jonas'));
console.log(typeof new String('jonas'));

console.log(typeof new String('jonas').slice(1));
*/

///////////////////////////////////////
// Coding Challenge #3

/* 
Let's continue with our football betting app! This time, we have a map with a log of the events that happened during the game. The values are the events themselves, and the keys are the minutes in which each event happened (a football game has 90 minutes plus some extra time).

1. Create an array 'events' of the different game events that happened (no duplicates)
2. After the game has finished, is was found that the yellow card from minute 64 was unfair. So remove this event from the game events log.
3. Print the following string to the console: "An event happened, on average, every 9 minutes" (keep in mind that a game has 90 minutes)
4. Loop over the events and log them to the console, marking whether it's in the first half or second half (after 45 min) of the game, like this:
      [FIRST HALF] 17: ⚽️ GOAL

GOOD LUCK 😀
*/

const gameEvents = new Map([
  [17, '⚽️ GOAL'],
  [36, '🔁 Substitution'],
  [47, '⚽️ GOAL'],
  [61, '🔁 Substitution'],
  [64, '🔶 Yellow card'],
  [69, '🔴 Red card'],
  [70, '🔁 Substitution'],
  [72, '🔁 Substitution'],
  [76, '⚽️ GOAL'],
  [80, '⚽️ GOAL'],
  [92, '🔶 Yellow card'],
]);

/*
// 1.
const events = [...new Set(gameEvents.values())];
console.log(events);

// 2.
gameEvents.delete(64);

// 3.
console.log(
  `An event happened, on average, every ${90 / gameEvents.size} minutes`
);
const time = [...gameEvents.keys()].pop();
console.log(time);
console.log(
  `An event happened, on average, every ${time / gameEvents.size} minutes`
);

// 4.
for (const [min, event] of gameEvents) {
  const half = min <= 45 ? 'FIRST' : 'SECOND';
  console.log(`[${half} HALF] ${min}: ${event}`);
}
*/

/*
///////////////////////////////////////
// Maps: Iteration
const question = new Map([
  ['question', 'What is the best programming language in the world?'],
  [1, 'C'],
  [2, 'Java'],
  [3, 'JavaScript'],
  ['correct', 3],
  [true, 'Correct 🎉'],
  [false, 'Try again!'],
]);
console.log(question);

// Convert object to map
console.log(Object.entries(openingHours));
const hoursMap = new Map(Object.entries(openingHours));
console.log(hoursMap);

// Quiz app
console.log(question.get('question'));
for (const [key, value] of question) {
  if (typeof key === 'number') console.log(`Answer ${key}: ${value}`);
}
// const answer = Number(prompt('Your answer'));
const answer = 3;
console.log(answer);

console.log(question.get(question.get('correct') === answer));

// Convert map to array
console.log([...question]);
// console.log(question.entries());
console.log([...question.keys()]);
console.log([...question.values()]);


///////////////////////////////////////
// Maps: Fundamentals
const rest = new Map();
rest.set('name', 'Classico Italiano');
rest.set(1, 'Firenze, Italy');
console.log(rest.set(2, 'Lisbon, Portugal'));

rest
  .set('categories', ['Italian', 'Pizzeria', 'Vegetarian', 'Organic'])
  .set('open', 11)
  .set('close', 23)
  .set(true, 'We are open :D')
  .set(false, 'We are closed :(');

console.log(rest.get('name'));
console.log(rest.get(true));
console.log(rest.get(1));

const time = 8;
console.log(rest.get(time > rest.get('open') && time < rest.get('close')));

console.log(rest.has('categories'));
rest.delete(2);
// rest.clear();

const arr = [1, 2];
rest.set(arr, 'Test');
rest.set(document.querySelector('h1'), 'Heading');
console.log(rest);
console.log(rest.size);

console.log(rest.get(arr));


///////////////////////////////////////
// New Operations to Make Sets Useful!

const italianFoods = new Set([
  'pasta',
  'gnocchi',
  'tomatoes',
  'olive oil',
  'garlic',
  'basil',
]);

const mexicanFoods = new Set([
  'tortillas',
  'beans',
  'rice',
  'tomatoes',
  'avocado',
  'garlic',
]);

const commonFoods = italianFoods.intersection(mexicanFoods);
console.log('Intersection:', commonFoods);
console.log([...commonFoods]);

const italianMexicanFusion = italianFoods.union(mexicanFoods);
console.log('Union:', italianMexicanFusion);

console.log([...new Set([...italianFoods, ...mexicanFoods])]);

const uniqueItalianFoods = italianFoods.difference(mexicanFoods);
console.log('Difference italian', uniqueItalianFoods);

const uniqueMexicanFoods = mexicanFoods.difference(italianFoods);
console.log('Difference mexican', uniqueMexicanFoods);

const uniqueItalianAndMexicanFoods =
  italianFoods.symmetricDifference(mexicanFoods);
console.log(uniqueItalianAndMexicanFoods);

console.log(italianFoods.isDisjointFrom(mexicanFoods));


///////////////////////////////////////
// Sets
const ordersSet = new Set([
  'Pasta',
  'Pizza',
  'Pizza',
  'Risotto',
  'Pasta',
  'Pizza',
]);
console.log(ordersSet);

console.log(new Set('Jonas'));

console.log(ordersSet.size);
console.log(ordersSet.has('Pizza'));
console.log(ordersSet.has('Bread'));
ordersSet.add('Garlic Bread');
ordersSet.add('Garlic Bread');
ordersSet.delete('Risotto');
// ordersSet.clear();
console.log(ordersSet);

for (const order of ordersSet) console.log(order);

// Example
const staff = ['Waiter', 'Chef', 'Waiter', 'Manager', 'Chef', 'Waiter'];
const staffUnique = [...new Set(staff)];
console.log(staffUnique);

console.log(
  new Set(['Waiter', 'Chef', 'Waiter', 'Manager', 'Chef', 'Waiter']).size
);

console.log(new Set('jonasschmedtmann').size);
*/

///////////////////////////////////////
// Coding Challenge #2

/* 
Let's continue with our football betting app!

1. Loop over the game.scored array and print each player name to the console, along with the goal number (Example: "Goal 1: Lewandowski")
2. Use a loop to calculate the average odd and log it to the console (We already studied how to calculate averages, you can go check if you don't remember)
3. Print the 3 odds to the console, but in a nice formatted way, exaclty like this:
      Odd of victory Bayern Munich: 1.33
      Odd of draw: 3.25
      Odd of victory Borrussia Dortmund: 6.5
Get the team names directly from the game object, don't hardcode them (except for "draw"). HINT: Note how the odds and the game objects have the same property names 😉

BONUS: Create an object called 'scorers' which contains the names of the players who scored as properties, and the number of goals as the value. In this game, it will look like this:
      {
        Gnarby: 1,
        Hummels: 1,
        Lewandowski: 2
      }

GOOD LUCK 😀
*/

const game = {
  team1: 'Bayern Munich',
  team2: 'Borrussia Dortmund',
  players: [
    [
      'Neuer',
      'Pavard',
      'Martinez',
      'Alaba',
      'Davies',
      'Kimmich',
      'Goretzka',
      'Coman',
      'Muller',
      'Gnarby',
      'Lewandowski',
    ],
    [
      'Burki',
      'Schulz',
      'Hummels',
      'Akanji',
      'Hakimi',
      'Weigl',
      'Witsel',
      'Hazard',
      'Brandt',
      'Sancho',
      'Gotze',
    ],
  ],
  score: '4:0',
  scored: ['Lewandowski', 'Gnarby', 'Lewandowski', 'Hummels'],
  date: 'Nov 9th, 2037',
  odds: {
    team1: 1.33,
    x: 3.25,
    team2: 6.5,
  },
};

/*
// 1.
for (const [i, player] of game.scored.entries())
  console.log(`Goal ${i + 1}: ${player}`);

// 2.
const odds = Object.values(game.odds);
let average = 0;
for (const odd of odds) average += odd;
average /= odds.length;
console.log(average);

// 3.
for (const [team, odd] of Object.entries(game.odds)) {
  const teamStr = team === 'x' ? 'draw' : `victory ${game[team]}`;
  console.log(`Odd of ${teamStr} ${odd}`);
}

// Odd of victory Bayern Munich: 1.33
// Odd of draw: 3.25
// Odd of victory Borrussia Dortmund: 6.5

// BONUS
// So the solution is to loop over the array, and add the array elements as object properties, and then increase the count as we encounter a new occurence of a certain element
const scorers = {};
for (const player of game.scored) {
  scorers[player] ? scorers[player]++ : (scorers[player] = 1);
}
*/

/*
///////////////////////////////////////
// Looping Objects: Object Keys, Values, and Entries

// Property NAMES
const properties = Object.keys(openingHours);
console.log(properties);

let openStr = `We are open on ${properties.length} days: `;
for (const day of properties) {
  openStr += `${day}, `;
}
console.log(openStr);

// Property VALUES
const values = Object.values(openingHours);
console.log(values);

// Entire object
const entries = Object.entries(openingHours);
// console.log(entries);

// [key, value]
for (const [day, { open, close }] of entries) {
  console.log(`On ${day} we open at ${open} and close at ${close}`);
}


///////////////////////////////////////
// Optional Chaining
if (restaurant.openingHours && restaurant.openingHours.mon)
  console.log(restaurant.openingHours.mon.open);

// console.log(restaurant.openingHours.mon.open);

// WITH optional chaining
console.log(restaurant.openingHours.mon?.open);
console.log(restaurant.openingHours?.mon?.open);

// Example
const days = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'];

for (const day of days) {
  const open = restaurant.openingHours[day]?.open ?? 'closed';
  console.log(`On ${day}, we open at ${open}`);
}

// Methods
console.log(restaurant.order?.(0, 1) ?? 'Method does not exist');
console.log(restaurant.orderRisotto?.(0, 1) ?? 'Method does not exist');

// Arrays
const users = [{ name: 'Jonas', email: 'hello@jonas.io' }];
// const users = [];

console.log(users[0]?.name ?? 'User array empty');

if (users.length > 0) console.log(users[0].name);
else console.log('user array empty');


///////////////////////////////////////
// The for-of Loop
const menu = [...restaurant.starterMenu, ...restaurant.mainMenu];

for (const item of menu) console.log(item);

for (const [i, el] of menu.entries()) {
  console.log(`${i + 1}: ${el}`);
}

// console.log([...menu.entries()]);
*/

///////////////////////////////////////
// Coding Challenge #1

/* 
We're building a football betting app (soccer for my American friends 😅)!

Suppose we get data from a web service about a certain game (below). In this challenge we're gonna work with the data. So here are your tasks:

1. Create one player array for each team (variables 'players1' and 'players2')
2. The first player in any player array is the goalkeeper and the others are field players. For Bayern Munich (team 1) create one variable ('gk') with the goalkeeper's name, and one array ('fieldPlayers') with all the remaining 10 field players
3. Create an array 'allPlayers' containing all players of both teams (22 players)
4. During the game, Bayern Munich (team 1) used 3 substitute players. So create a new array ('players1Final') containing all the original team1 players plus 'Thiago', 'Coutinho' and 'Perisic'
5. Based on the game.odds object, create one variable for each odd (called 'team1', 'draw' and 'team2')
6. Write a function ('printGoals') that receives an arbitrary number of player names (NOT an array) and prints each of them to the console, along with the number of goals that were scored in total (number of player names passed in)
7. The team with the lower odd is more likely to win. Print to the console which team is more likely to win, WITHOUT using an if/else statement or the ternary operator.

TEST DATA FOR 6: Use players 'Davies', 'Muller', 'Lewandowski' and 'Kimmich'. Then, call the function again with players from game.scored

GOOD LUCK 😀
*/

/*
// 1.
const [players1, players2] = game.players;
console.log(players1, players2);

// 2.
const [gk, ...fieldPlayers] = players1;
console.log(gk, fieldPlayers);

// 3.
const allPlayers = [...players1, ...players2];
console.log(allPlayers);

// 4.
const players1Final = [...players1, 'Thiago', 'Coutinho', 'Periscic'];

// 5.
const {
  odds: { team1, x: draw, team2 },
} = game;
console.log(team1, draw, team2);

// 6.
const printGoals = function (...players) {
  console.log(players);
  console.log(`${players.length} goals were scored`);
};

// printGoals('Davies', 'Muller', 'Lewandowski', 'Kimmich');
// printGoals('Davies', 'Muller');
printGoals(...game.scored);

// 7.
team1 < team2 && console.log('Team 1 is more likely to win');
team1 > team2 && console.log('Team 2 is more likely to win');


///////////////////////////////////////
// Logical Assignment Operators
const rest1 = {
  name: 'Capri',
  // numGuests: 20,
  numGuests: 0,
};

const rest2 = {
  name: 'La Piazza',
  owner: 'Giovanni Rossi',
};

// OR assignment operator
// rest1.numGuests = rest1.numGuests || 10;
// rest2.numGuests = rest2.numGuests || 10;
// rest1.numGuests ||= 10;
// rest2.numGuests ||= 10;

// nullish assignment operator (null or undefined)
rest1.numGuests ??= 10;
rest2.numGuests ??= 10;

// AND assignment operator
// rest1.owner = rest1.owner && '<ANONYMOUS>';
// rest2.owner = rest2.owner && '<ANONYMOUS>';
rest1.owner &&= '<ANONYMOUS>';
rest2.owner &&= '<ANONYMOUS>';

console.log(rest1);
console.log(rest2);


///////////////////////////////////////
// The Nullish Coalescing Operator
restaurant.numGuests = 0;
const guests = restaurant.numGuests || 10;
console.log(guests);

// Nullish: null and undefined (NOT 0 or '')
const guestCorrect = restaurant.numGuests ?? 10;
console.log(guestCorrect);


///////////////////////////////////////
// Short Circuiting (&& and ||)

console.log('---- OR ----');
// Use ANY data type, return ANY data type, short-circuiting
console.log(3 || 'Jonas');
console.log('' || 'Jonas');
console.log(true || 0);
console.log(undefined || null);

console.log(undefined || 0 || '' || 'Hello' || 23 || null);

restaurant.numGuests = 0;
const guests1 = restaurant.numGuests ? restaurant.numGuests : 10;
console.log(guests1);

const guests2 = restaurant.numGuests || 10;
console.log(guests2);

console.log('---- AND ----');
console.log(0 && 'Jonas');
console.log(7 && 'Jonas');

console.log('Hello' && 23 && null && 'jonas');

// Practical example
if (restaurant.orderPizza) {
  restaurant.orderPizza('mushrooms', 'spinach');
}

restaurant.orderPizza && restaurant.orderPizza('mushrooms', 'spinach');


///////////////////////////////////////
// Rest Pattern and Parameters
// 1) Destructuring

// SPREAD, because on RIGHT side of =
const arr = [1, 2, ...[3, 4]];

// REST, because on LEFT side of =
const [a, b, ...others] = [1, 2, 3, 4, 5];
console.log(a, b, others);

const [pizza, , risotto, ...otherFood] = [
  ...restaurant.mainMenu,
  ...restaurant.starterMenu,
];
console.log(pizza, risotto, otherFood);

// Objects
const { sat, ...weekdays } = restaurant.openingHours;
console.log(weekdays);

// 2) Functions
const add = function (...numbers) {
  let sum = 0;
  for (let i = 0; i < numbers.length; i++) sum += numbers[i];
  console.log(sum);
};

add(2, 3);
add(5, 3, 7, 2);
add(8, 2, 5, 3, 2, 1, 4);

const x = [23, 5, 7];
add(...x);

restaurant.orderPizza('mushrooms', 'onion', 'olives', 'spinach');
restaurant.orderPizza('mushrooms');


///////////////////////////////////////
// The Spread Operator (...)

const arr = [7, 8, 9];
const badNewArr = [1, 2, arr[0], arr[1], arr[2]];
console.log(badNewArr);

const newArr = [1, 2, ...arr];
console.log(newArr);

console.log(...newArr);
console.log(1, 2, 7, 8, 9);

const newMenu = [...restaurant.mainMenu, 'Gnocci'];
console.log(newMenu);

// Copy array
const mainMenuCopy = [...restaurant.mainMenu];

// Join 2 arrays
const menu = [...restaurant.starterMenu, ...restaurant.mainMenu];
console.log(menu);

// Iterables: arrays, strings, maps, sets. NOT objects
const str = 'Jonas';
const letters = [...str, ' ', 'S.'];
console.log(letters);
console.log(...str);
// console.log(`${...str} Schmedtmann`);

// Real-world example
const ingredients = [
  // prompt("Let's make pasta! Ingredient 1?"),
  // prompt('Ingredient 2?'),
  // prompt('Ingredient 3'),
];
console.log(ingredients);

restaurant.orderPasta(ingredients[0], ingredients[1], ingredients[2]);
restaurant.orderPasta(...ingredients);

// Objects
const newRestaurant = { foundedIn: 1998, ...restaurant, founder: 'Guiseppe' };
console.log(newRestaurant);

const restaurantCopy = { ...restaurant };
restaurantCopy.name = 'Ristorante Roma';
console.log(restaurantCopy.name);
console.log(restaurant.name);


///////////////////////////////////////
// Destructuring Objects
restaurant.orderDelivery({
  time: '22:30',
  address: 'Via del Sole, 21',
  mainIndex: 2,
  starterIndex: 2,
});

restaurant.orderDelivery({
  address: 'Via del Sole, 21',
  starterIndex: 1,
});

const { name, openingHours, categories } = restaurant;
console.log(name, openingHours, categories);

const {
  name: restaurantName,
  openingHours: hours,
  categories: tags,
} = restaurant;
console.log(restaurantName, hours, tags);

// Default values
const { menu = [], starterMenu: starters = [] } = restaurant;
console.log(menu, starters);

// Mutating variables
let a = 111;
let b = 999;
const obj = { a: 23, b: 7, c: 14 };
({ a, b } = obj);
console.log(a, b);

// Nested objects
const {
  fri: { open: o, close: c },
} = openingHours;
console.log(o, c);


///////////////////////////////////////
// Destructuring Arrays
const arr = [2, 3, 4];
const a = arr[0];
const b = arr[1];
const c = arr[2];

const [x, y, z] = arr;
console.log(x, y, z);
console.log(arr);

let [main, , secondary] = restaurant.categories;
console.log(main, secondary);

// Switching variables
// const temp = main;
// main = secondary;
// secondary = temp;
// console.log(main, secondary);

[main, secondary] = [secondary, main];
console.log(main, secondary);

// Receive 2 return values from a function
const [starter, mainCourse] = restaurant.order(2, 0);
console.log(starter, mainCourse);

// Nested destructuring
const nested = [2, 4, [5, 6]];
// const [i, , j] = nested;
const [i, , [j, k]] = nested;
console.log(i, j, k);

// Default values
const [p = 1, q = 1, r = 1] = [8, 9];
console.log(p, q, r);
*/


================================================
FILE: 09-Data-Structures-Operators/starter/.prettierrc
================================================
{
  "singleQuote": true,
  "arrowParens": "avoid"
}


================================================
FILE: 09-Data-Structures-Operators/starter/index.html
================================================
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Data Structures and Modern Operators</title>
    <style>
      body {
        height: 100vh;
        display: flex;
        align-items: center;
        background: linear-gradient(to top left, #28b487, #7dd56f);
      }
      h1 {
        font-family: sans-serif;
        font-size: 50px;
        line-height: 1.3;
        width: 100%;
        padding: 30px;
        text-align: center;
        color: white;
      }
      button {
        width: 50px;
        height: 20px;
        margin: 10px;
      }
      textarea {
        width: 300px;
        height: 100px;
      }
    </style>
  </head>
  <body>
    <h1>Data Structures and Modern Operators</h1>
    <script src="script.js"></script>
  </body>
</html>


================================================
FILE: 09-Data-Structures-Operators/starter/script.js
================================================
'use strict';

// Data needed for a later exercise
const flights =
  '_Delayed_Departure;fao93766109;txl2133758440;11:25+_Arrival;bru0943384722;fao93766109;11:45+_Delayed_Arrival;hel7439299980;fao93766109;12:05+_Departure;fao93766109;lis2323639855;12:30';

const italianFoods = new Set([
  'pasta',
  'gnocchi',
  'tomatoes',
  'olive oil',
  'garlic',
  'basil',
]);

const mexicanFoods = new Set([
  'tortillas',
  'beans',
  'rice',
  'tomatoes',
  'avocado',
  'garlic',
]);

// Data needed for first part of the section
const restaurant = {
  name: 'Classico Italiano',
  location: 'Via Angelo Tavanti 23, Firenze, Italy',
  categories: ['Italian', 'Pizzeria', 'Vegetarian', 'Organic'],
  starterMenu: ['Focaccia', 'Bruschetta', 'Garlic Bread', 'Caprese Salad'],
  mainMenu: ['Pizza', 'Pasta', 'Risotto'],

  openingHours: {
    thu: {
      open: 12,
      close: 22,
    },
    fri: {
      open: 11,
      close: 23,
    },
    sat: {
      open: 0, // Open 24 hours
      close: 24,
    },
  },
};


================================================
FILE: 10-Functions/final/.prettierrc
================================================
{
  "singleQuote": true,
  "arrowParens": "avoid"
}


================================================
FILE: 10-Functions/final/index.html
================================================
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>A Closer Look at Functions</title>
    <style>
      body {
        height: 100vh;
        display: flex;
        align-items: center;
        background: linear-gradient(to top left, #28b487, #7dd56f);
      }
      h1 {
        font-family: sans-serif;
        font-size: 50px;
        line-height: 1.3;
        width: 100%;
        padding: 30px;
        text-align: center;
        color: white;
      }
      .buy,
      .poll {
        font-size: 1.6rem;
        padding: 1rem 2rem;
        position: absolute;
        top: 2rem;
      }
      .buy {
        left: 2rem;
      }
      .poll {
        right: 2rem;
      }
    </style>
  </head>
  <body>
    <h1>A Closer Look at Functions</h1>
    <button class="buy">Buy new plane 🛩</button>
    <button class="poll">Answer poll ⁉️</button>
    <script src="script.js"></script>
  </body>
</html>


================================================
FILE: 10-Functions/final/script.js
================================================
'use strict';

/*
///////////////////////////////////////
// Default Parameters
const bookings = [];

const createBooking = function (
  flightNum,
  numPassengers = 1,
  price = 199 * numPassengers
) {
  // ES5
  // numPassengers = numPassengers || 1;
  // price = price || 199;

  const booking = {
    flightNum,
    numPassengers,
    price,
  };
  console.log(booking);
  bookings.push(booking);
};

createBooking('LH123');
createBooking('LH123', 2, 800);
createBooking('LH123', 2);
createBooking('LH123', 5);

createBooking('LH123', undefined, 1000);


///////////////////////////////////////
// How Passing Arguments Works: Values vs. Reference
const flight = 'LH234';
const jonas = {
  name: 'Jonas Schmedtmann',
  passport: 24739479284,
};

const checkIn = function (flightNum, passenger) {
  flightNum = 'LH999';
  passenger.name = 'Mr. ' + passenger.name;

  if (passenger.passport === 24739479284) {
    alert('Checked in');
  } else {
    alert('Wrong passport!');
  }
};

// checkIn(flight, jonas);
// console.log(flight);
// console.log(jonas);

// Is the same as doing...
// const flightNum = flight;
// const passenger = jonas;

const newPassport = function (person) {
  person.passport = Math.trunc(Math.random() * 100000000000);
};

newPassport(jonas);
checkIn(flight, jonas);


///////////////////////////////////////
// Functions Accepting Callback Functions
const oneWord = function (str) {
  return str.replace(/ /g, '').toLowerCase();
};

const upperFirstWord = function (str) {
  const [first, ...others] = str.split(' ');
  return [first.toUpperCase(), ...others].join(' ');
};

// Higher-order function
const transformer = function (str, fn) {
  console.log(`Original string: ${str}`);
  console.log(`Transformed string: ${fn(str)}`);

  console.log(`Transformed by: ${fn.name}`);
};

transformer('JavaScript is the best!', upperFirstWord);
transformer('JavaScript is the best!', oneWord);

// JS uses callbacks all the time
const high5 = function () {
  console.log('👋');
};
document.body.addEventListener('click', high5);
['Jonas', 'Martha', 'Adam'].forEach(high5);


///////////////////////////////////////
// Functions Returning Functions
const greet = function (greeting) {
  return function (name) {
    console.log(`${greeting} ${name}`);
  };
};

const greeterHey = greet('Hey');
greeterHey('Jonas');
greeterHey('Steven');

greet('Hello')('Jonas');

// Challenge
const greetArr = greeting => name => console.log(`${greeting} ${name}`);

greetArr('Hi')('Jonas');


///////////////////////////////////////
// The call and apply Methods
const lufthansa = {
  airline: 'Lufthansa',
  iataCode: 'LH',
  bookings: [],
  // book: function() {}
  book(flightNum, name) {
    console.log(
      `${name} booked a seat on ${this.airline} flight ${this.iataCode}${flightNum}`
    );
    this.bookings.push({ flight: `${this.iataCode}${flightNum}`, name });
  },
};

lufthansa.book(239, 'Jonas Schmedtmann');
lufthansa.book(635, 'John Smith');

const eurowings = {
  airline: 'Eurowings',
  iataCode: 'EW',
  bookings: [],
};

const book = lufthansa.book;

// Does NOT work
// book(23, 'Sarah Williams');

// Call method
book.call(eurowings, 23, 'Sarah Williams');
console.log(eurowings);

book.call(lufthansa, 239, 'Mary Cooper');
console.log(lufthansa);

const swiss = {
  airline: 'Swiss Air Lines',
  iataCode: 'LX',
  bookings: [],
};

book.call(swiss, 583, 'Mary Cooper');

// Apply method
const flightData = [583, 'George Cooper'];
book.apply(swiss, flightData);
console.log(swiss);

book.call(swiss, ...flightData);

///////////////////////////////////////
// The bind Method
// book.call(eurowings, 23, 'Sarah Williams');

const bookEW = book.bind(eurowings);
const bookLH = book.bind(lufthansa);
const bookLX = book.bind(swiss);

bookEW(23, 'Steven Williams');

const bookEW23 = book.bind(eurowings, 23);
bookEW23('Jonas Schmedtmann');
bookEW23('Martha Cooper');

// With Event Listeners
lufthansa.planes = 300;
lufthansa.buyPlane = function () {
  console.log(this);

  this.planes++;
  console.log(this.planes);
};
// lufthansa.buyPlane();

document
  .querySelector('.buy')
  .addEventListener('click', lufthansa.buyPlane.bind(lufthansa));

// Partial application
const addTax = (rate, value) => value + value * rate;
console.log(addTax(0.1, 200));

const addVAT = addTax.bind(null, 0.23);
// addVAT = value => value + value * 0.23;

console.log(addVAT(100));
console.log(addVAT(23));

const addTaxRate = function (rate) {
  return function (value) {
    return value + value * rate;
  };
};
const addVAT2 = addTaxRate(0.23);
console.log(addVAT2(100));
console.log(addVAT2(23));
*/

///////////////////////////////////////
// Coding Challenge #1

/* 
Let's build a simple poll app!

A poll has a question, an array of options from which people can choose, and an array with the number of replies for each option. This data is stored in the starter object below.

Here are your tasks:

1. Create a method called 'registerNewAnswer' on the 'poll' object. The method does 2 things:
  1.1. Display a prompt window for the user to input the number of the selected option. The prompt should look like this:
        What is your favourite programming language?
        0: JavaScript
        1: Python
        2: Rust
        3: C++
        (Write option number)
  
  1.2. Based on the input number, update the answers array. For example, if the option is 3, increase the value AT POSITION 3 of the array by 1. Make sure to check if the input is a number and if the number makes sense (e.g answer 52 wouldn't make sense, right?)
2. Call this method whenever the user clicks the "Answer poll" button.
3. Create a method 'displayResults' which displays the poll results. The method takes a string as an input (called 'type'), which can be either 'string' or 'array'. If type is 'array', simply display the results array as it is, using console.log(). This should be the default option. If type is 'string', display a string like "Poll results are 13, 2, 4, 1". 
4. Run the 'displayResults' method at the end of each 'registerNewAnswer' method call.

HINT: Use many of the tools you learned about in this and the last section 😉

BONUS: Use the 'displayResults' method to display the 2 arrays in the test data. Use both the 'array' and the 'string' option. Do NOT put the arrays in the poll object! So what shoud the this keyword look like in this situation?

BONUS TEST DATA 1: [5, 2, 3]
BONUS TEST DATA 2: [1, 5, 3, 9, 6, 1]

GOOD LUCK 😀
*/

/*
const poll = {
  question: 'What is your favourite programming language?',
  options: ['0: JavaScript', '1: Python', '2: Rust', '3: C++'],
  // This generates [0, 0, 0, 0]. More in the next section 😃
  answers: new Array(4).fill(0),
  registerNewAnswer() {
    // Get answer
    const answer = Number(
      prompt(
        `${this.question}\n${this.options.join('\n')}\n(Write option number)`
      )
    );
    console.log(answer);

    // Register answer
    typeof answer === 'number' &&
      answer < this.answers.length &&
      this.answers[answer]++;

    this.displayResults();
    this.displayResults('string');
  },

  displayResults(type = 'array') {
    if (type === 'array') {
      console.log(this.answers);
    } else if (type === 'string') {
      // Poll results are 13, 2, 4, 1
      console.log(`Poll results are ${this.answers.join(', ')}`);
    }
  },
};

document
  .querySelector('.poll')
  .addEventListener('click', poll.registerNewAnswer.bind(poll));

poll.displayResults.call({ answers: [5, 2, 3] }, 'string');
poll.displayResults.call({ answers: [1, 5, 3, 9, 6, 1] }, 'string');
poll.displayResults.call({ answers: [1, 5, 3, 9, 6, 1] });

// [5, 2, 3]
// [1, 5, 3, 9, 6, 1]


///////////////////////////////////////
// Immediately Invoked Function Expressions (IIFE)
const runOnce = function () {
  console.log('This will never run again');
};
runOnce();

// IIFE
(function () {
  console.log('This will never run again');
  const isPrivate = 23;
})();

// console.log(isPrivate);

(() => console.log('This will ALSO never run again'))();

{
  const isPrivate = 23;
  var notPrivate = 46;
}
// console.log(isPrivate);
console.log(notPrivate);


///////////////////////////////////////
// Closures
const secureBooking = function () {
  let passengerCount = 0;

  return function () {
    passengerCount++;
    console.log(`${passengerCount} passengers`);
  };
};

const booker = secureBooking();

booker();
booker();
booker();

console.dir(booker);


///////////////////////////////////////
// More Closure Examples
// Example 1
let f;

const g = function () {
  const a = 23;
  f = function () {
    console.log(a * 2);
  };
};

const h = function () {
  const b = 777;
  f = function () {
    console.log(b * 2);
  };
};

g();
f();
console.dir(f);

// Re-assigning f function
h();
f();
console.dir(f);

// Example 2
const boardPassengers = function (n, wait) {
  const perGroup = n / 3;

  setTimeout(function () {
    console.log(`We are now boarding all ${n} passengers`);
    console.log(`There are 3 groups, each with ${perGroup} passengers`);
  }, wait * 1000);

  console.log(`Will start boarding in ${wait} seconds`);
};

const perGroup = 1000;
boardPassengers(180, 3);
*/

///////////////////////////////////////
// Coding Challenge #2

/* 
This is more of a thinking challenge than a coding challenge 🤓

Take the IIFE below and at the end of the function, attach an event listener that changes the color of the selected h1 element ('header') to blue, each time the BODY element is clicked. Do NOT select the h1 element again!

And now explain to YOURSELF (or someone around you) WHY this worked! Take all the time you need. Think about WHEN exactly the callback function is executed, and what that means for the variables involved in this example.

GOOD LUCK 😀
*/

/*
(function () {
  const header = document.querySelector('h1');
  header.style.color = 'red';

  document.querySelector('body').addEventListener('click', function () {
    header.style.color = 'blue';
  });
})();
*/



================================================
FILE: 10-Functions/starter/.prettierrc
================================================
{
  "singleQuote": true,
  "arrowParens": "avoid"
}


================================================
FILE: 10-Functions/starter/index.html
================================================
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>A Closer Look at Functions</title>
    <style>
      body {
        height: 100vh;
        display: flex;
        align-items: center;
        background: linear-gradient(to top left, #28b487, #7dd56f);
      }
      h1 {
        font-family: sans-serif;
        font-size: 50px;
        line-height: 1.3;
        width: 100%;
        padding: 30px;
        text-align: center;
        color: white;
      }
      .buy,
      .poll {
        font-size: 1.6rem;
        padding: 1rem 2rem;
        position: absolute;
        top: 2rem;
      }
      .buy {
        left: 2rem;
      }
      .poll {
        right: 2rem;
      }
    </style>
  </head>
  <body>
    <h1>A Closer Look at Functions</h1>
    <button class="buy">Buy new plane 🛩</button>
    <button class="poll">Answer poll ⁉️</button>
    <script src="script.js"></script>
  </body>
</html>


================================================
FILE: 10-Functions/starter/script.js
================================================
'use strict';


================================================
FILE: 11-Arrays-Bankist/final/.prettierrc
================================================
{
  "singleQuote": true,
  "arrowParens": "avoid"
}


================================================
FILE: 11-Arrays-Bankist/final/index.html
================================================
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <link rel="shortcut icon" type="image/png" href="/icon.png" />

    <link
      href="https://fonts.googleapis.com/css?family=Poppins:400,500,600&display=swap"
      rel="stylesheet"
    />

    <link rel="stylesheet" href="style.css" />
    <title>Bankist</title>
  </head>
  <body>
    <!-- TOP NAVIGATION -->
    <nav>
      <p class="welcome">Log in to get started</p>
      <img src="logo.png" alt="Logo" class="logo" />
      <form class="login">
        <input
          type="text"
          placeholder="user"
          class="login__input login__input--user"
        />
        <!-- In practice, use type="password" -->
        <input
          type="text"
          placeholder="PIN"
          maxlength="4"
          class="login__input login__input--pin"
        />
        <button class="login__btn">&rarr;</button>
      </form>
    </nav>

    <main class="app">
      <!-- BALANCE -->
      <div class="balance">
        <div>
          <p class="balance__label">Current balance</p>
          <p class="balance__date">
            As of <span class="date">05/03/2037</span>
          </p>
        </div>
        <p class="balance__value">0000€</p>
      </div>

      <!-- MOVEMENTS -->
      <div class="movements">
        <div class="movements__row">
          <div class="movements__type movements__type--deposit">2 deposit</div>
          <div class="movements__date">3 days ago</div>
          <div class="movements__value">4 000€</div>
        </div>
        <div class="movements__row">
          <div class="movements__type movements__type--withdrawal">
            1 withdrawal
          </div>
          <div class="movements__date">24/01/2037</div>
          <div class="movements__value">-378€</div>
        </div>
      </div>

      <!-- SUMMARY -->
      <div class="summary">
        <p class="summary__label">In</p>
        <p class="summary__value summary__value--in">0000€</p>
        <p class="summary__label">Out</p>
        <p class="summary__value summary__value--out">0000€</p>
        <p class="summary__label">Interest</p>
        <p class="summary__value summary__value--interest">0000€</p>
        <button class="btn--sort">&downarrow; SORT</button>
      </div>

      <!-- OPERATION: TRANSFERS -->
      <div class="operation operation--transfer">
        <h2>Transfer money</h2>
        <form class="form form--transfer">
          <input type="text" class="form__input form__input--to" />
          <input type="number" class="form__input form__input--amount" />
          <button class="form__btn form__btn--transfer">&rarr;</button>
          <label class="form__label">Transfer to</label>
          <label class="form__label">Amount</label>
        </form>
      </div>

      <!-- OPERATION: LOAN -->
      <div class="operation operation--loan">
        <h2>Request loan</h2>
        <form class="form form--loan">
          <input type="number" class="form__input form__input--loan-amount" />
          <button class="form__btn form__btn--loan">&rarr;</button>
          <label class="form__label form__label--loan">Amount</label>
        </form>
      </div>

      <!-- OPERATION: CLOSE -->
      <div class="operation operation--close">
        <h2>Close account</h2>
        <form class="form form--close">
          <input type="text" class="form__input form__input--user" />
          <input
            type="password"
            maxlength="6"
            class="form__input form__input--pin"
          />
          <button class="form__btn form__btn--close">&rarr;</button>
          <label class="form__label">Confirm user</label>
          <label class="form__label">Confirm PIN</label>
        </form>
      </div>

      <!-- LOGOUT TIMER -->
      <p class="logout-timer">
        You will be logged out in <span class="timer">05:00</span>
      </p>
    </main>

    <!-- <footer>
      &copy; by Jonas Schmedtmann. Don't claim as your own :)
    </footer> -->

    <script src="script.js"></script>
  </body>
</html>


================================================
FILE: 11-Arrays-Bankist/final/script.js
================================================
'use strict';

/////////////////////////////////////////////////
/////////////////////////////////////////////////
// BANKIST APP

/////////////////////////////////////////////////
// Data
const account1 = {
  owner: 'Jonas Schmedtmann',
  movements: [200, 450, -400, 3000, -650, -130, 70, 1300],
  interestRate: 1.2, // %
  pin: 1111,
  type: 'premium',
};

const account2 = {
  owner: 'Jessica Davis',
  movements: [5000, 3400, -150, -790, -3210, -1000, 8500, -30],
  interestRate: 1.5,
  pin: 2222,
  type: 'standard',
};

const account3 = {
  owner: 'Steven Thomas Williams',
  movements: [200, -200, 340, -300, -20, 50, 400, -460],
  interestRate: 0.7,
  pin: 3333,
  type: 'premium',
};

const account4 = {
  owner: 'Sarah Smith',
  movements: [430, 1000, 700, 50, 90],
  interestRate: 1,
  pin: 4444,
  type: 'basic',
};

const accounts = [account1, account2, account3, account4];

/////////////////////////////////////////////////
// Elements
const labelWelcome = document.querySelector('.welcome');
const labelDate = document.querySelector('.date');
const labelBalance = document.querySelector('.balance__value');
const labelSumIn = document.querySelector('.summary__value--in');
const labelSumOut = document.querySelector('.summary__value--out');
const labelSumInterest = document.querySelector('.summary__value--interest');
const labelTimer = document.querySelector('.timer');

const containerApp = document.querySelector('.app');
const containerMovements = document.querySelector('.movements');

const btnLogin = document.querySelector('.login__btn');
const btnTransfer = document.querySelector('.form__btn--transfer');
const btnLoan = document.querySelector('.form__btn--loan');
const btnClose = document.querySelector('.form__btn--close');
const btnSort = document.querySelector('.btn--sort');

const inputLoginUsername = document.querySelector('.login__input--user');
const inputLoginPin = document.querySelector('.login__input--pin');
const inputTransferTo = document.querySelector('.form__input--to');
const inputTransferAmount = document.querySelector('.form__input--amount');
const inputLoanAmount = document.querySelector('.form__input--loan-amount');
const inputCloseUsername = document.querySelector('.form__input--user');
const inputClosePin = document.querySelector('.form__input--pin');

/////////////////////////////////////////////////
// Functions

const displayMovements = function (movements, sort = false) {
  containerMovements.innerHTML = '';

  const movs = sort ? movements.slice().sort((a, b) => a - b) : movements;

  movs.forEach(function (mov, i) {
    const type = mov > 0 ? 'deposit' : 'withdrawal';

    const html = `
      <div class="movements__row">
        <div class="movements__type movements__type--${type}">${
      i + 1
    } ${type}</div>
        <div class="movements__value">${mov}€</div>
      </div>
    `;

    containerMovements.insertAdjacentHTML('afterbegin', html);
  });
};

const calcDisplayBalance = function (acc) {
  acc.balance = acc.movements.reduce((acc, mov) => acc + mov, 0);
  labelBalance.textContent = `${acc.balance}€`;
};

const calcDisplaySummary = function (acc) {
  const incomes = acc.movements
    .filter(mov => mov > 0)
    .reduce((acc, mov) => acc + mov, 0);
  labelSumIn.textContent = `${incomes}€`;

  const out = acc.movements
    .filter(mov => mov < 0)
    .reduce((acc, mov) => acc + mov, 0);
  labelSumOut.textContent = `${Math.abs(out)}€`;

  const interest = acc.movements
    .filter(mov => mov > 0)
    .map(deposit => (deposit * acc.interestRate) / 100)
    .filter((int, i, arr) => {
      // console.log(arr);
      return int >= 1;
    })
    .reduce((acc, int) => acc + int, 0);
  labelSumInterest.textContent = `${interest}€`;
};

const createUsernames = function (accs) {
  accs.forEach(function (acc) {
    acc.username = acc.owner
      .toLowerCase()
      .split(' ')
      .map(name => name[0])
      .join('');
  });
};
createUsernames(accounts);

const updateUI = function (acc) {
  // Display movements
  displayMovements(acc.movements);

  // Display balance
  calcDisplayBalance(acc);

  // Display summary
  calcDisplaySummary(acc);
};

///////////////////////////////////////
// Event handlers
let currentAccount;

btnLogin.addEventListener('click', function (e) {
  // Prevent form from submitting
  e.preventDefault();

  currentAccount = accounts.find(
    acc => acc.username === inputLoginUsername.value
  );
  console.log(currentAccount);

  if (currentAccount?.pin === Number(inputLoginPin.value)) {
    // Display UI and message
    labelWelcome.textContent = `Welcome back, ${
      currentAccount.owner.split(' ')[0]
    }`;
    containerApp.style.opacity = 1;

    // Clear input fields
    inputLoginUsername.value = inputLoginPin.value = '';
    inputLoginPin.blur();

    // Update UI
    updateUI(currentAccount);
  }
});

btnTransfer.addEventListener('click', function (e) {
  e.preventDefault();
  const amount = Number(inputTransferAmount.value);
  const receiverAcc = accounts.find(
    acc => acc.username === inputTransferTo.value
  );
  inputTransferAmount.value = inputTransferTo.value = '';

  if (
    amount > 0 &&
    receiverAcc &&
    currentAccount.balance >= amount &&
    receiverAcc?.username !== currentAccount.username
  ) {
    // Doing the transfer
    currentAccount.movements.push(-amount);
    receiverAcc.movements.push(amount);

    // Update UI
    updateUI(currentAccount);
  }
});

btnLoan.addEventListener('click', function (e) {
  e.preventDefault();

  const amount = Number(inputLoanAmount.value);

  if (amount > 0 && currentAccount.movements.some(mov => mov >= amount * 0.1)) {
    // Add movement
    currentAccount.movements.push(amount);

    // Update UI
    updateUI(currentAccount);
  }
  inputLoanAmount.value = '';
});

btnClose.addEventListener('click', function (e) {
  e.preventDefault();

  if (
    inputCloseUsername.value === currentAccount.username &&
    Number(inputClosePin.value) === currentAccount.pin
  ) {
    const index = accounts.findIndex(
      acc => acc.username === currentAccount.username
    );
    console.log(index);
    // .indexOf(23)

    // Delete account
    accounts.splice(index, 1);

    // Hide UI
    containerApp.style.opacity = 0;
  }

  inputCloseUsername.value = inputClosePin.value = '';
});

let sorted = false;
btnSort.addEventListener('click', function (e) {
  e.preventDefault();
  displayMovements(currentAccount.movements, !sorted);
  sorted = !sorted;
});

/////////////////////////////////////////////////
/////////////////////////////////////////////////
// LECTURES

const movements = [200, 450, -400, 3000, -650, -130, 70, 1300];

/*
/////////////////////////////////////////////////
// Simple Array Methods
let arr = ['a', 'b', 'c', 'd', 'e'];

// SLICE
console.log(arr.slice(2));
console.log(arr.slice(2, 4));
console.log(arr.slice(-2));
console.log(arr.slice(-1));
console.log(arr.slice(1, -2));
console.log(arr.slice());
console.log([...arr]);

// SPLICE
// console.log(arr.splice(2));
arr.splice(-1);
console.log(arr);
arr.splice(1, 2);
console.log(arr);

// REVERSE
arr = ['a', 'b', 'c', 'd', 'e'];
const arr2 = ['j', 'i', 'h', 'g', 'f'];
console.log(arr2.reverse());
console.log(arr2);

// CONCAT
const letters = arr.concat(arr2);
console.log(letters);
console.log([...arr, ...arr2]);

// JOIN
console.log(letters.join(' - '));


///////////////////////////////////////
// The new at Method
const arr = [23, 11, 64];
console.log(arr[0]);
console.log(arr.at(0));

// getting last array element
console.log(arr[arr.length - 1]);
console.log(arr.slice(-1)[0]);
console.log(arr.at(-1));

console.log('jonas'.at(0));
console.log('jonas'.at(-1));


///////////////////////////////////////
// Looping Arrays: forEach
const movements = [200, 450, -400, 3000, -650, -130, 70, 1300];

// for (const movement of movements) {
for (const [i, movement] of movements.entries()) {
  if (movement > 0) {
    console.log(`Movement ${i + 1}: You deposited ${movement}`);
  } else {
    console.log(`Movement ${i + 1}: You withdrew ${Math.abs(movement)}`);
  }
}

console.log('---- FOREACH ----');
movements.forEach(function (mov, i, arr) {
  if (mov > 0) {
    console.log(`Movement ${i + 1}: You deposited ${mov}`);
  } else {
    console.log(`Movement ${i + 1}: You withdrew ${Math.abs(mov)}`);
  }
});
// 0: function(200)
// 1: function(450)
// 2: function(400)
// ...


///////////////////////////////////////
// forEach With Maps and Sets
// Map
const currencies = new Map([
  ['USD', 'United States dollar'],
  ['EUR', 'Euro'],
  ['GBP', 'Pound sterling'],
]);

currencies.forEach(function (value, key, map) {
  console.log(`${key}: ${value}`);
});

// Set
const currenciesUnique = new Set(['USD', 'GBP', 'USD', 'EUR', 'EUR']);
console.log(currenciesUnique);
currenciesUnique.forEach(function (value, _, map) {
  console.log(`${value}: ${value}`);
});
*/

///////////////////////////////////////
// Coding Challenge #1

/* 
Julia and Kate are doing a study on dogs. So each of them asked 5 dog owners about their dog's age, and stored the data into an array (one array for each). For now, they are just interested in knowing whether a dog is an adult or a puppy. A dog is an adult if it is at least 3 years old, and it's a puppy if it's less than 3 years old.

Create a function 'checkDogs', which accepts 2 arrays of dog's ages ('dogsJulia' and 'dogsKate'), and does the following things:

1. Julia found out that the owners of the FIRST and the LAST TWO dogs actually have cats, not dogs! So create a shallow copy of Julia's array, and remove the cat ages from that copied array (because it's a bad practice to mutate function parameters)
2. Create an array with both Julia's (corrected) and Kate's data
3. For each remaining dog, log to the console whether it's an adult ("Dog number 1 is an adult, and is 5 years old") or a puppy ("Dog number 2 is still a puppy 🐶")
4. Run the function for both test datasets

HINT: Use tools from all lectures in this section so far 😉

TEST DATA 1: Julia's data [3, 5, 2, 12, 7], Kate's data [4, 1, 15, 8, 3]
TEST DATA 2: Julia's data [9, 16, 6, 8, 3], Kate's data [10, 5, 6, 1, 4]

GOOD LUCK 😀
*/

/*
const checkDogs = function (dogsJulia, dogsKate) {
  const dogsJuliaCorrected = dogsJulia.slice();
  dogsJuliaCorrected.splice(0, 1);
  dogsJuliaCorrected.splice(-2);
  // dogsJulia.slice(1, 3);
  const dogs = dogsJuliaCorrected.concat(dogsKate);
  console.log(dogs);

  dogs.forEach(function (dog, i) {
    if (dog >= 3) {
      console.log(`Dog number ${i + 1} is an adult, and is ${dog} years old`);
    } else {
      console.log(`Dog number ${i + 1} is still a puppy 🐶`);
    }
  });
};
// checkDogs([3, 5, 2, 12, 7], [4, 1, 15, 8, 3]);
checkDogs([9, 16, 6, 8, 3], [10, 5, 6, 1, 4]);


///////////////////////////////////////
// The map Method
const eurToUsd = 1.1;

// const movementsUSD = movements.map(function (mov) {
//   return mov * eurToUsd;
// });

const movementsUSD = movements.map(mov => mov * eurToUsd);

console.log(movements);
console.log(movementsUSD);

const movementsUSDfor = [];
for (const mov of movements) movementsUSDfor.push(mov * eurToUsd);
console.log(movementsUSDfor);

const movementsDescriptions = movements.map(
  (mov, i) =>
    `Movement ${i + 1}: You ${mov > 0 ? 'deposited' : 'withdrew'} ${Math.abs(
      mov
    )}`
);
console.log(movementsDescriptions);


///////////////////////////////////////
// The filter Method
const deposits = movements.filter(function (mov, i, arr) {
  return mov > 0;
});
console.log(movements);
console.log(deposits);

const depositsFor = [];
for (const mov of movements) if (mov > 0) depositsFor.push(mov);
console.log(depositsFor);

const withdrawals = movements.filter(mov => mov < 0);
console.log(withdrawals);


///////////////////////////////////////
// The reduce Method
console.log(movements);

// accumulator -> SNOWBALL
// const balance = movements.reduce(function (acc, cur, i, arr) {
//   console.log(`Iteration ${i}: ${acc}`);
//   return acc + cur;
// }, 0);
const balance = movements.reduce((acc, cur) => acc + cur, 0);
console.log(balance);

let balance2 = 0;
for (const mov of movements) balance2 += mov;
console.log(balance2);

// Maximum value
const max = movements.reduce((acc, mov) => {
  if (acc > mov) return acc;
  else return mov;
}, movements[0]);
console.log(max);
*/

///////////////////////////////////////
// Coding Challenge #2

/* 
Let's go back to Julia and Kate's study about dogs. This time, they want to convert dog ages to human ages and calculate the average age of the dogs in their study.

Create a function 'calcAverageHumanAge', which accepts an arrays of dog's ages ('ages'), and does the following things in order:

1. Calculate the dog age in human years using the following formula: if the dog is <= 2 years old, humanAge = 2 * dogAge. If the dog is > 2 years old, humanAge = 16 + dogAge * 4.
2. Exclude all dogs that are less than 18 human years old (which is the same as keeping dogs that are at least 18 years old)
3. Calculate the average human age of all adult dogs (you should already know from other challenges how we calculate averages 😉)
4. Run the function for both test datasets

TEST DATA 1: [5, 2, 4, 1, 15, 8, 3]
TEST DATA 2: [16, 6, 10, 5, 6, 1, 4]

GOOD LUCK 😀
*/

/*
const calcAverageHumanAge = function (ages) {
  const humanAges = ages.map(age => (age <= 2 ? 2 * age : 16 + age * 4));
  const adults = humanAges.filter(age => age >= 18);
  console.log(humanAges);
  console.log(adults);

  // const average = adults.reduce((acc, age) => acc + age, 0) / adults.length;

  const average = adults.reduce(
    (acc, age, i, arr) => acc + age / arr.length,
    0
  );

  // 2 3. (2+3)/2 = 2.5 === 2/2+3/2 = 2.5

  return average;
};
const avg1 = calcAverageHumanAge([5, 2, 4, 1, 15, 8, 3]);
const avg2 = calcAverageHumanAge([16, 6, 10, 5, 6, 1, 4]);
console.log(avg1, avg2);


///////////////////////////////////////
// The Magic of Chaining Methods
const eurToUsd = 1.1;
console.log(movements);

// PIPELINE
const totalDepositsUSD = movements
  .filter(mov => mov > 0)
  .map((mov, i, arr) => {
    // console.log(arr);
    return mov * eurToUsd;
  })
  // .map(mov => mov * eurToUsd)
  .reduce((acc, mov) => acc + mov, 0);
console.log(totalDepositsUSD);
*/

///////////////////////////////////////
// Coding Challenge #3

/* 
Rewrite the 'calcAverageHumanAge' function from the previous challenge, but this time as an arrow function, and using chaining!

TEST DATA 1: [5, 2, 4, 1, 15, 8, 3]
TEST DATA 2: [16, 6, 10, 5, 6, 1, 4]

GOOD LUCK 😀
*/

/*
const calcAverageHumanAge = ages =>
  ages
    .map(age => (age <= 2 ? 2 * age : 16 + age * 4))
    .filter(age => age >= 18)
    .reduce((acc, age, i, arr) => acc + age / arr.length, 0);
// adults.length

const avg1 = calcAverageHumanAge([5, 2, 4, 1, 15, 8, 3]);
const avg2 = calcAverageHumanAge([16, 6, 10, 5, 6, 1, 4]);
console.log(avg1, avg2);


///////////////////////////////////////
// The find Method
const firstWithdrawal = movements.find(mov => mov < 0);
console.log(movements);
console.log(firstWithdrawal);

console.log(accounts);

const account = accounts.find(acc => acc.owner === 'Jessica Davis');
console.log(account);


///////////////////////////////////////
// The New findLast and findLastIndex Methods

console.log(movements);
const lastWithdrawal = movements.findLast(mov => mov < 0);
console.log(lastWithdrawal);

// 'Your latest large movement was X movements ago'

const latestLargeMovementIndex = movements.findLastIndex(
  mov => Math.abs(mov) > 1000
);
console.log(latestLargeMovementIndex);
console.log(
  `Your latest large movement was ${
    movements.length - latestLargeMovementIndex
  } movements ago`
);


///////////////////////////////////////
// some and every
console.log(movements);

// EQUALITY
console.log(movements.includes(-130));

// SOME: CONDITION
console.log(movements.some(mov => mov === -130));

const anyDeposits = movements.some(mov => mov > 0);
console.log(anyDeposits);

// EVERY
console.log(movements.every(mov => mov > 0));
console.log(account4.movements.every(mov => mov > 0));

// Separate callback
const deposit = mov => mov > 0;
console.log(movements.some(deposit));
console.log(movements.every(deposit));
console.log(movements.filter(deposit));


///////////////////////////////////////
// flat and flatMap
const arr = [[1, 2, 3], [4, 5, 6], 7, 8];
console.log(arr.flat());

const arrDeep = [[[1, 2], 3], [4, [5, 6]], 7, 8];
console.log(arrDeep.flat(2));

// flat
const overalBalance = accounts
  .map(acc => acc.movements)
  .flat()
  .reduce((acc, mov) => acc + mov, 0);
console.log(overalBalance);

// flatMap
const overalBalance2 = accounts
  .flatMap(acc => acc.movements)
  .reduce((acc, mov) => acc + mov, 0);
console.log(overalBalance2);
*/

///////////////////////////////////////
// Coding Challenge #4

/*
This time, Julia and Kate are studying the activity levels of different dog breeds.

YOUR TASKS:
1. Store the the average weight of a "Husky" in a variable "huskyWeight"
2. Find the name of the only breed that likes both "running" and "fetch" ("dogBothActivities" variable)
3. Create an array "allActivities" of all the activities of all the dog breeds
4. Create an array "uniqueActivities" that contains only the unique activities (no activity repetitions). HINT: Use a technique with a special data structure that we studied a few sections ago.
5. Many dog breeds like to swim. What other activities do these dogs like? Store all the OTHER activities these breeds like to do, in a unique array called "swimmingAdjacent".
6. Do all the breeds have an average weight of 10kg or more? Log to the console whether "true" or "false".
7. Are there any breeds that are "active"? "Active" means that the dog has 3 or more activities. Log to the console whether "true" or "false".

BONUS: What's the average weight of the heaviest breed that likes to fetch? HINT: Use the "Math.max" method along with the ... operator.

TEST DATA:
*/

/*
const breeds = [
  {
    breed: 'German Shepherd',
    averageWeight: 32,
    activities: ['fetch', 'swimming'],
  },
  {
    breed: 'Dalmatian',
    averageWeight: 24,
    activities: ['running', 'fetch', 'agility'],
  },
  {
    breed: 'Labrador',
    averageWeight: 28,
    activities: ['swimming', 'fetch'],
  },
  {
    breed: 'Beagle',
    averageWeight: 12,
    activities: ['digging', 'fetch'],
  },
  {
    breed: 'Husky',
    averageWeight: 26,
    activities: ['running', 'agility', 'swimming'],
  },
  {
    breed: 'Bulldog',
    averageWeight: 36,
    activities: ['sleeping'],
  },
  {
    breed: 'Poodle',
    averageWeight: 18,
    activities: ['agility', 'fetch'],
  },
];

// 1.
const huskyWeight = breeds.find(breed => breed.breed === 'Husky').averageWeight;
console.log(huskyWeight);

// 2.
const dogBothActivities = breeds.find(
  breed =>
    breed.activities.includes('fetch') && breed.activities.includes('running')
).breed;
console.log(dogBothActivities);

// 3.
// const allActivities = breeds.map(breed => breed.activities).flat();
const allActivities = breeds.flatMap(breed => breed.activities);
console.log(allActivities);

// 4.
const uniqueActivities = [...new Set(allActivities)];
console.log(uniqueActivities);

// 5.
const swimmingAdjacent = [
  ...new Set(
    breeds
      .filter(breed => breed.activities.includes('swimming'))
      .flatMap(breed => breed.activities)
      .filter(activity => activity !== 'swimming')
  ),
];
console.log(swimmingAdjacent);

// 6.
console.log(breeds.every(breed => breed.averageWeight > 10));

// 7.
console.log(breeds.some(breed => breed.activities.length >= 3));

// BONUS
const fetchWeights = breeds
  .filter(breed => breed.activities.includes('fetch'))
  .map(breed => breed.averageWeight);
const heaviestFetchBreed = Math.max(...fetchWeights);

console.log(fetchWeights);
console.log(heaviestFetchBreed);


///////////////////////////////////////
// Sorting Arrays

// Strings
const owners = ['Jonas', 'Zach', 'Adam', 'Martha'];
console.log(owners.sort());
console.log(owners);

// Numbers
console.log(movements);

// return < 0, A, B (keep order)
// return > 0, B, A (switch order)

// Ascending
// movements.sort((a, b) => {
//   if (a > b) return 1;
//   if (a < b) return -1;
// });
movements.sort((a, b) => a - b);
console.log(movements);

// Descending
// movements.sort((a, b) => {
//   if (a > b) return -1;
//   if (a < b) return 1;
// });
movements.sort((a, b) => b - a);
console.log(movements);


///////////////////////////////////////
// Array Grouping

console.log(movements);

const groupedMovements = Object.groupBy(movements, movement =>
  movement > 0 ? 'deposits' : 'withdrawals'
);
console.log(groupedMovements);

const groupedByActivity = Object.groupBy(accounts, account => {
  const movementCount = account.movements.length;

  if (movementCount >= 8) return 'very active';
  if (movementCount >= 4) return 'active';
  if (movementCount >= 1) return 'moderate';
  return 'inactive';
});
console.log(groupedByActivity);

// const groupedAccounts = Object.groupBy(accounts, account => account.type);
const groupedAccounts = Object.groupBy(accounts, ({ type }) => type);
console.log(groupedAccounts);


///////////////////////////////////////
// More Ways of Creating and Filling Arrays
const arr = [1, 2, 3, 4, 5, 6, 7];
console.log(new Array(1, 2, 3, 4, 5, 6, 7));

// Empty arrays + fill method
const x = new Array(7);
console.log(x);
// console.log(x.map(() => 5));
x.fill(1, 3, 5);
x.fill(1);
console.log(x);

arr.fill(23, 2, 6);
console.log(arr);

// Array.from
const y = Array.from({ length: 7 }, () => 1);
console.log(y);

const z = Array.from({ length: 7 }, (_, i) => i + 1);
console.log(z);

labelBalance.addEventListener('click', function () {
  const movementsUI = Array.from(
    document.querySelectorAll('.movements__value'),
    el => Number(el.textContent.replace('€', ''))
  );
  console.log(movementsUI);

  const movementsUI2 = [...document.querySelectorAll('.movements__value')];
});


///////////////////////////////////////
// Non-Destructive Alternatives: toReversed, toSorted, toSpliced, with

console.log(movements);
const reversedMov = movements.toReversed();
console.log(reversedMov);

// toSorted (sort), toSpliced (splice)

// movements[1] = 2000;
const newMovements = movements.with(1, 2000);
console.log(newMovements);

console.log(movements);


///////////////////////////////////////
// Array Methods Practice

// 1.
const bankDepositSum = accounts
  .flatMap(acc => acc.movements)
  .filter(mov => mov > 0)
  .reduce((sum, cur) => sum + cur, 0);

console.log(bankDepositSum);

// 2.
// const numDeposits1000 = accounts
//   .flatMap(acc => acc.movements)
//   .filter(mov => mov >= 1000).length;

const numDeposits1000 = accounts
  .flatMap(acc => acc.movements)
  .reduce((count, cur) => (cur >= 1000 ? ++count : count), 0);

console.log(numDeposits1000);

// Prefixed ++ operator
let a = 10;
console.log(++a);
console.log(a);

// 3.
const { deposits, withdrawals } = accounts
  .flatMap(acc => acc.movements)
  .reduce(
    (sums, cur) => {
      // cur > 0 ? (sums.deposits += cur) : (sums.withdrawals += cur);
      sums[cur > 0 ? 'deposits' : 'withdrawals'] += cur;
      return sums;
    },
    { deposits: 0, withdrawals: 0 },
  );

console.log(deposits, withdrawals);

// 4.
// this is a nice title -> This Is a Nice Title
const convertTitleCase = function (title) {
  const capitalize = str => str[0].toUpperCase() + str.slice(1);

  const exceptions = ['a', 'an', 'and', 'the', 'but', 'or', 'on', 'in', 'with'];

  const titleCase = title
    .toLowerCase()
    .split(' ')
    .map(word => (exceptions.includes(word) ? word : capitalize(word)))
    .join(' ');

  return capitalize(titleCase);
};

console.log(convertTitleCase('this is a nice title'));
console.log(convertTitleCase('this is a LONG title but not too long'));
console.log(convertTitleCase('and here is another title with an EXAMPLE'));
*/

///////////////////////////////////////
// Coding Challenge #5

/* 
Julia and Kate are still studying dogs. This time they are want to figure out if the dogs in their are eating too much or too little food.

- Formula for calculating recommended food portion: recommendedFood = weight ** 0.75 * 28. (The result is in grams of food, and the weight needs to be in kg)
- Eating too much means the dog's current food portion is larger than the recommended portion, and eating too little is the opposite.
- Eating an okay amount means the dog's current food portion is within a range 10% above and below the recommended portion (see hint).

YOUR TASKS:
1. Loop over the array containing dog objects, and for each dog, calculate the recommended food portion (recFood) and add it to the object as a new property. Do NOT create a new array, simply loop over the array (We never did this before, so think about how you can do this without creating a new array).
2. Find Sarah's dog and log to the console whether it's eating too much or too little. HINT: Some dogs have multiple users, so you first need to find Sarah in the owners array, and so this one is a bit tricky (on purpose) 🤓
3. Create an array containing all owners of dogs who eat too much (ownersTooMuch) and an array with all owners of dogs who eat too little (ownersTooLittle).
4. Log a string to the console for each array created in 3., like this: "Matilda and Alice and Bob's dogs eat too much!" and "Sarah and John and Michael's dogs eat too little!"
5. Log to the console whether there is ANY dog eating EXACTLY the amount of food that is recommended (just true or false)
6. Log to the console whether ALL of the dogs are eating an OKAY amount of food (just true or false)
7. Create an array containing the dogs that are eating an OKAY amount of food (try to reuse the condition used in 6.)
8. Group the dogs into the following 3 groups: 'exact', 'too-much' and 'too-little', based on whether they are eating too much, too little or the exact amount of food, based on the recommended food portion.
9. Group the dogs by the number of owners they have
10. Sort the dogs array by recommended food portion in an ascending order. Make sure to NOT mutate the original array!

HINT 1: Use many different tools to solve these challenges, you can use the summary lecture to choose between them 😉
HINT 2: Being within a range 10% above and below the recommended portion means: current > (recommended * 0.90) && current < (recommended * 1.10). Basically, the current portion should be between 90% and 110% of the recommended portion.

TEST DATA:
const dogs = [
  { weight: 22, curFood: 250, owners: ['Alice', 'Bob'] },
  { weight: 8, curFood: 200, owners: ['Matilda'] },
  { weight: 13, curFood: 275, owners: ['Sarah', 'John', 'Leo'] },
  { weight: 18, curFood: 244, owners: ['Joe'] },
  { weight: 32, curFood: 340, owners: ['Michael'] },
];

GOOD LUCK 😀
*/

/*
const dogs = [
  { weight: 22, curFood: 250, owners: ['Alice', 'Bob'] },
  { weight: 8, curFood: 200, owners: ['Matilda'] },
  { weight: 13, curFood: 275, owners: ['Sarah', 'John', 'Leo'] },
  { weight: 18, curFood: 244, owners: ['Joe'] },
  { weight: 32, curFood: 340, owners: ['Michael'] },
];

// 1.
dogs.forEach(dog => (dog.recFood = Math.floor(dog.weight ** 0.75 * 28)));
console.log(dogs);

// 2.
const dogSarah = dogs.find(dog => dog.owners.includes('Sarah'));
console.log(
  `Sarah's dog eats too ${
    dogSarah.curFood > dogSarah.recFood ? 'much' : 'little'
  }`
);

// 3.
const ownersTooMuch = dogs
  .filter(dog => dog.curFood > dog.recFood)
  .flatMap(dog => dog.owners);
const ownersTooLittle = dogs
  .filter(dog => dog.curFood < dog.recFood)
  .flatMap(dog => dog.owners);

console.log(ownersTooMuch);
console.log(ownersTooLittle);

// 4.
console.log(`${ownersTooMuch.join(' and ')}'s dogs are eating too much`);
console.log(`${ownersTooLittle.join(' and ')}'s dogs are eating too little`);

// 5.
console.log(dogs.some(dog => dog.curFood === dog.recFood));

// 6.
const checkEatingOkay = dog =>
  dog.curFood < dog.recFood * 1.1 && dog.curFood > dog.recFood * 0.9;

console.log(dogs.every(checkEatingOkay));

// 7.
const dogsEatingOkay = dogs.filter(checkEatingOkay);
console.log(dogsEatingOkay);

// 8.
const dogsGroupedByPortion = Object.groupBy(dogs, dog => {
  if (dog.curFood > dog.recFood) {
    return 'too-much';
  } else if (dog.curFood < dog.recFood) {
    return 'too-little';
  } else {
    return 'exact';
  }
});
console.log(dogsGroupedByPortion);

// 9.
const dogsGroupedByOwners = Object.groupBy(
  dogs,
  dog => `${dog.owners.length}-owners`
);
console.log(dogsGroupedByOwners);

// 10.
const dogsSorted = dogs.toSorted((a, b) => a.recFood - b.recFood);
console.log(dogsSorted);
*/


================================================
FILE: 11-Arrays-Bankist/final/style.css
================================================
/*
 * Use this CSS to learn some intersting techniques,
 * in case you're wondering how I built the UI.
 * Have fun! 😁
 */

* {
  margin: 0;
  padding: 0;
  box-sizing: inherit;
}

html {
  font-size: 62.5%;
  box-sizing: border-box;
}

body {
  font-family: 'Poppins', sans-serif;
  color: #444;
  background-color: #f3f3f3;
  height: 100vh;
  padding: 2rem;
}

nav {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 0 2rem;
}

.welcome {
  font-size: 1.9rem;
  font-weight: 500;
}

.logo {
  height: 5.25rem;
}

.login {
  display: flex;
}

.login__input {
  border: none;
  padding: 0.5rem 2rem;
  font-size: 1.6rem;
  font-family: inherit;
  text-align: center;
  width: 12rem;
  border-radius: 10rem;
  margin-right: 1rem;
  color: inherit;
  border: 1px solid #fff;
  transition: all 0.3s;
}

.login__input:focus {
  outline: none;
  border: 1px solid #ccc;
}

.login__input::placeholder {
  color: #bbb;
}

.login__btn {
  border: none;
  background: none;
  font-size: 2.2rem;
  color: inherit;
  cursor: pointer;
  transition: all 0.3s;
}

.login__btn:hover,
.login__btn:focus,
.btn--sort:hover,
.btn--sort:focus {
  outline: none;
  color: #777;
}

/* MAIN */
.app {
  position: relative;
  max-width: 100rem;
  margin: 4rem auto;
  display: grid;
  grid-template-columns: 4fr 3fr;
  grid-template-rows: auto repeat(3, 15rem) auto;
  gap: 2rem;

  /* NOTE This creates the fade in/out anumation */
  opacity: 0;
  transition: all 1s;
}

.balance {
  grid-column: 1 / span 2;
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  margin-bottom: 2rem;
}

.balance__label {
  font-size: 2.2rem;
  font-weight: 500;
  margin-bottom: -0.2rem;
}

.balance__date {
  font-size: 1.4rem;
  color: #888;
}

.balance__value {
  font-size: 4.5rem;
  font-weight: 400;
}

/* MOVEMENTS */
.movements {
  grid-row: 2 / span 3;
  background-color: #fff;
  border-radius: 1rem;
  overflow: scroll;
}

.movements__row {
  padding: 2.25rem 4rem;
  display: flex;
  align-items: center;
  border-bottom: 1px solid #eee;
}

.movements__type {
  font-size: 1.1rem;
  text-transform: uppercase;
  font-weight: 500;
  color: #fff;
  padding: 0.1rem 1rem;
  border-radius: 10rem;
  margin-right: 2rem;
}

.movements__date {
  font-size: 1.1rem;
  text-transform: uppercase;
  font-weight: 500;
  color: #666;
}

.movements__type--deposit {
  background-image: linear-gradient(to top left, #39b385, #9be15d);
}

.movements__type--withdrawal {
  background-image: linear-gradient(to top left, #e52a5a, #ff585f);
}

.movements__value {
  font-size: 1.7rem;
  margin-left: auto;
}

/* SUMMARY */
.summary {
  grid-row: 5 / 6;
  display: flex;
  align-items: baseline;
  padding: 0 0.3rem;
  margin-top: 1rem;
}

.summary__label {
  font-size: 1.2rem;
  font-weight: 500;
  text-transform: uppercase;
  margin-right: 0.8rem;
}

.summary__value {
  font-size: 2.2rem;
  margin-right: 2.5rem;
}

.summary__value--in,
.summary__value--interest {
  color: #66c873;
}

.summary__value--out {
  color: #f5465d;
}

.btn--sort {
  margin-left: auto;
  border: none;
  background: none;
  font-size: 1.3rem;
  font-weight: 500;
  cursor: pointer;
}

/* OPERATIONS */
.operation {
  border-radius: 1rem;
  padding: 3rem 4rem;
  color: #333;
}

.operation--transfer {
  background-image: linear-gradient(to top left, #ffb003, #ffcb03);
}

.operation--loan {
  background-image: linear-gradient(to top left, #39b385, #9be15d);
}

.operation--close {
  background-image: linear-gradient(to top left, #e52a5a, #ff585f);
}

h2 {
  margin-bottom: 1.5rem;
  font-size: 1.7rem;
  font-weight: 600;
  color: #333;
}

.form {
  display: grid;
  grid-template-columns: 2.5fr 2.5fr 1fr;
  grid-template-rows: auto auto;
  gap: 0.4rem 1rem;
}

/* Exceptions for interst */
.form.form--loan {
  grid-template-columns: 2.5fr 1fr 2.5fr;
}
.form__label--loan {
  grid-row: 2;
}
/* End exceptions */

.form__input {
  width: 100%;
  border: none;
  background-color: rgba(255, 255, 255, 0.4);
  font-family: inherit;
  font-size: 1.5rem;
  text-align: center;
  color: #333;
  padding: 0.3rem 1rem;
  border-radius: 0.7rem;
  transition: all 0.3s;
}

.form__input:focus {
  outline: none;
  background-color: rgba(255, 255, 255, 0.6);
}

.form__label {
  font-size: 1.3rem;
  text-align: center;
}

.form__btn {
  border: none;
  border-radius: 0.7rem;
  font-size: 1.8rem;
  background-color: #fff;
  cursor: pointer;
  transition: all 0.3s;
}

.form__btn:focus {
  outline: none;
  background-color: rgba(255, 255, 255, 0.8);
}

.logout-timer {
  padding: 0 0.3rem;
  margin-top: 1.9rem;
  text-align: right;
  font-size: 1.25rem;
}

.timer {
  font-weight: 600;
}


================================================
FILE: 11-Arrays-Bankist/starter/.prettierrc
================================================
{
  "singleQuote": true,
  "arrowParens": "avoid"
}


================================================
FILE: 11-Arrays-Bankist/starter/index.html
================================================
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <link rel="shortcut icon" type="image/png" href="/icon.png" />

    <link
      href="https://fonts.googleapis.com/css?family=Poppins:400,500,600&display=swap"
      rel="stylesheet"
    />

    <link rel="stylesheet" href="style.css" />
    <title>Bankist</title>
  </head>
  <body>
    <!-- TOP NAVIGATION -->
    <nav>
      <p class="welcome">Log in to get started</p>
      <img src="logo.png" alt="Logo" class="logo" />
      <form class="login">
        <input
          type="text"
          placeholder="user"
          class="login__input login__input--user"
        />
        <!-- In practice, use type="password" -->
        <input
          type="text"
          placeholder="PIN"
          maxlength="4"
          class="login__input login__input--pin"
        />
        <button class="login__btn">&rarr;</button>
      </form>
    </nav>

    <main class="app">
      <!-- BALANCE -->
      <div class="balance">
        <div>
          <p class="balance__label">Current balance</p>
          <p class="balance__date">
            As of <span class="date">05/03/2037</span>
          </p>
        </div>
        <p class="balance__value">0000€</p>
      </div>

      <!-- MOVEMENTS -->
      <div class="movements">
        <div class="movements__row">
          <div class="movements__type movements__type--deposit">2 deposit</div>
          <div class="movements__date">3 days ago</div>
          <div class="movements__value">4 000€</div>
        </div>
        <div class="movements__row">
          <div class="movements__type movements__type--withdrawal">
            1 withdrawal
          </div>
          <div class="movements__date">24/01/2037</div>
          <div class="movements__value">-378€</div>
        </div>
      </div>

      <!-- SUMMARY -->
      <div class="summary">
        <p class="summary__label">In</p>
        <p class="summary__value summary__value--in">0000€</p>
        <p class="summary__label">Out</p>
        <p class="summary__value summary__value--out">0000€</p>
        <p class="summary__label">Interest</p>
        <p class="summary__value summary__value--interest">0000€</p>
        <button class="btn--sort">&downarrow; SORT</button>
      </div>

      <!-- OPERATION: TRANSFERS -->
      <div class="operation operation--transfer">
        <h2>Transfer money</h2>
        <form class="form form--transfer">
          <input type="text" class="form__input form__input--to" />
          <input type="number" class="form__input form__input--amount" />
          <button class="form__btn form__btn--transfer">&rarr;</button>
          <label class="form__label">Transfer to</label>
          <label class="form__label">Amount</label>
        </form>
      </div>

      <!-- OPERATION: LOAN -->
      <div class="operation operation--loan">
        <h2>Request loan</h2>
        <form class="form form--loan">
          <input type="number" class="form__input form__input--loan-amount" />
          <button class="form__btn form__btn--loan">&rarr;</button>
          <label class="form__label form__label--loan">Amount</label>
        </form>
      </div>

      <!-- OPERATION: CLOSE -->
      <div class="operation operation--close">
        <h2>Close account</h2>
        <form class="form form--close">
          <input type="text" class="form__input form__input--user" />
          <input
            type="password"
            maxlength="6"
            class="form__input form__input--pin"
          />
          <button class="form__btn form__btn--close">&rarr;</button>
          <label class="form__label">Confirm user</label>
          <label class="form__label">Confirm PIN</label>
        </form>
      </div>

      <!-- LOGOUT TIMER -->
      <p class="logout-timer">
        You will be logged out in <span class="timer">05:00</span>
      </p>
    </main>

    <!-- <footer>
      &copy; by Jonas Schmedtmann. Don't claim as your own :)
    </footer> -->

    <script src="script.js"></script>
  </body>
</html>


================================================
FILE: 11-Arrays-Bankist/starter/script.js
================================================
'use strict';

/////////////////////////////////////////////////
/////////////////////////////////////////////////
// BANKIST APP

// Data
const account1 = {
  owner: 'Jonas Schmedtmann',
  movements: [200, 450, -400, 3000, -650, -130, 70, 1300],
  interestRate: 1.2, // %
  pin: 1111,
};

const account2 = {
  owner: 'Jessica Davis',
  movements: [5000, 3400, -150, -790, -3210, -1000, 8500, -30],
  interestRate: 1.5,
  pin: 2222,
};

const account3 = {
  owner: 'Steven Thomas Williams',
  movements: [200, -200, 340, -300, -20, 50, 400, -460],
  interestRate: 0.7,
  pin: 3333,
};

const account4 = {
  owner: 'Sarah Smith',
  movements: [430, 1000, 700, 50, 90],
  interestRate: 1,
  pin: 4444,
};

const accounts = [account1, account2, account3, account4];

// Elements
const labelWelcome = document.querySelector('.welcome');
const labelDate = document.querySelector('.date');
const labelBalance = document.querySelector('.balance__value');
const labelSumIn = document.querySelector('.summary__value--in');
const labelSumOut = document.querySelector('.summary__value--out');
const labelSumInterest = document.querySelector('.summary__value--interest');
const labelTimer = document.querySelector('.timer');

const containerApp = document.querySelector('.app');
const containerMovements = document.querySelector('.movements');

const btnLogin = document.querySelector('.login__btn');
const btnTransfer = document.querySelector('.form__btn--transfer');
const btnLoan = document.querySelector('.form__btn--loan');
const btnClose = document.querySelector('.form__btn--close');
const btnSort = document.querySelector('.btn--sort');

const inputLoginUsername = document.querySelector('.login__input--user');
const inputLoginPin = document.querySelector('.login__input--pin');
const inputTransferTo = document.querySelector('.form__input--to');
const inputTransferAmount = document.querySelector('.form__input--amount');
const inputLoanAmount = document.querySelector('.form__input--loan-amount');
const inputCloseUsername = document.querySelector('.form__input--user');
const inputClosePin = document.querySelector('.form__input--pin');

/////////////////////////////////////////////////
/////////////////////////////////////////////////
// LECTURES

const currencies = new Map([
  ['USD', 'United States dollar'],
  ['EUR', 'Euro'],
  ['GBP', 'Pound sterling'],
]);

const movements = [200, 450, -400, 3000, -650, -130, 70, 1300];

/////////////////////////////////////////////////


================================================
FILE: 11-Arrays-Bankist/starter/style.css
================================================
/*
 * Use this CSS to learn some intersting techniques,
 * in case you're wondering how I built the UI.
 * Have fun! 😁
 */

* {
  margin: 0;
  padding: 0;
  box-sizing: inherit;
}

html {
  font-size: 62.5%;
  box-sizing: border-box;
}

body {
  font-family: "Poppins", sans-serif;
  color: #444;
  background-color: #f3f3f3;
  height: 100vh;
  padding: 2rem;
}

nav {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 0 2rem;
}

.welcome {
  font-size: 1.9rem;
  font-weight: 500;
}

.logo {
  height: 5.25rem;
}

.login {
  display: flex;
}

.login__input {
  border: none;
  padding: 0.5rem 2rem;
  font-size: 1.6rem;
  font-family: inherit;
  text-align: center;
  width: 12rem;
  border-radius: 10rem;
  margin-right: 1rem;
  color: inherit;
  border: 1px solid #fff;
  transition: all 0.3s;
}

.login__input:focus {
  outline: none;
  border: 1px solid #ccc;
}

.login__input::placeholder {
  color: #bbb;
}

.login__btn {
  border: none;
  background: none;
  font-size: 2.2rem;
  color: inherit;
  cursor: pointer;
  transition: all 0.3s;
}

.login__btn:hover,
.login__btn:focus,
.btn--sort:hover,
.btn--sort:focus {
  outline: none;
  color: #777;
}

/* MAIN */
.app {
  position: relative;
  max-width: 100rem;
  margin: 4rem auto;
  display: grid;
  grid-template-columns: 4fr 3fr;
  grid-template-rows: auto repeat(3, 15rem) auto;
  gap: 2rem;

  /* NOTE This creates the fade in/out anumation */
  opacity: 0;
  transition: all 1s;
}

.balance {
  grid-column: 1 / span 2;
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  margin-bottom: 2rem;
}

.balance__label {
  font-size: 2.2rem;
  font-weight: 500;
  margin-bottom: -0.2rem;
}

.balance__date {
  font-size: 1.4rem;
  color: #888;
}

.balance__value {
  font-size: 4.5rem;
  font-weight: 400;
}

/* MOVEMENTS */
.movements {
  grid-row: 2 / span 3;
  background-color: #fff;
  border-radius: 1rem;
  overflow: scroll;
}

.movements__row {
  padding: 2.25rem 4rem;
  display: flex;
  align-items: center;
  border-bottom: 1px solid #eee;
}

.movements__type {
  font-size: 1.1rem;
  text-transform: uppercase;
  font-weight: 500;
  color: #fff;
  padding: 0.1rem 1rem;
  border-radius: 10rem;
  margin-right: 2rem;
}

.movements__date {
  font-size: 1.1rem;
  text-transform: uppercase;
  font-weight: 500;
  color: #666;
}

.movements__type--deposit {
  background-image: linear-gradient(to top left, #39b385, #9be15d);
}

.movements__type--withdrawal {
  background-image: linear-gradient(to top left, #e52a5a, #ff585f);
}

.movements__value {
  font-size: 1.7rem;
  margin-left: auto;
}

/* SUMMARY */
.summary {
  grid-row: 5 / 6;
  display: flex;
  align-items: baseline;
  padding: 0 0.3rem;
  margin-top: 1rem;
}

.summary__label {
  font-size: 1.2rem;
  font-weight: 500;
  text-transform: uppercase;
  margin-right: 0.8rem;
}

.summary__value {
  font-size: 2.2rem;
  margin-right: 2.5rem;
}

.summary__value--in,
.summary__value--interest {
  color: #66c873;
}

.summary__value--out {
  color: #f5465d;
}

.btn--sort {
  margin-left: auto;
  border: none;
  background: none;
  font-size: 1.3rem;
  font-weight: 500;
  cursor: pointer;
}

/* OPERATIONS */
.operation {
  border-radius: 1rem;
  padding: 3rem 4rem;
  color: #333;
}

.operation--transfer {
  background-image: linear-gradient(to top left, #ffb003, #ffcb03);
}

.operation--loan {
  background-image: linear-gradient(to top left, #39b385, #9be15d);
}

.operation--close {
  background-image: linear-gradient(to top left, #e52a5a, #ff585f);
}

h2 {
  margin-bottom: 1.5rem;
  font-size: 1.7rem;
  font-weight: 600;
  color: #333;
}

.form {
  display: grid;
  grid-template-columns: 2.5fr 2.5fr 1fr;
  grid-template-rows: auto auto;
  gap: 0.4rem 1rem;
}

/* Exceptions for interst */
.form.form--loan {
  grid-template-columns: 2.5fr 1fr 2.5fr;
}
.form__label--loan {
  grid-row: 2;
}
/* End exceptions */

.form__input {
  width: 100%;
  border: none;
  background-color: rgba(255, 255, 255, 0.4);
  font-family: inherit;
  font-size: 1.5rem;
  text-align: center;
  color: #333;
  padding: 0.3rem 1rem;
  border-radius: 0.7rem;
  transition: all 0.3s;
}

.form__input:focus {
  outline: none;
  background-color: rgba(255, 255, 255, 0.6);
}

.form__label {
  font-size: 1.3rem;
  text-align: center;
}

.form__btn {
  border: none;
  border-radius: 0.7rem;
  font-size: 1.8rem;
  background-color: #fff;
  cursor: pointer;
  transition: all 0.3s;
}

.form__btn:focus {
  outline: none;
  background-color: rgba(255, 255, 255, 0.8);
}

.logout-timer {
  padding: 0 0.3rem;
  margin-top: 1.9rem;
  text-align: right;
  font-size: 1.25rem;
}

.timer {
  font-weight: 600;
}


================================================
FILE: 12-Numbers-Dates-Timers-Bankist/final/.prettierrc
================================================
{
  "singleQuote": true,
  "arrowParens": "avoid"
}


================================================
FILE: 12-Numbers-Dates-Timers-Bankist/final/index.html
================================================
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <link rel="shortcut icon" type="image/png" href="/icon.png" />

    <link
      href="https://fonts.googleapis.com/css?family=Poppins:400,500,600&display=swap"
      rel="stylesheet"
    />

    <link rel="stylesheet" href="style.css" />
    <title>Bankist</title>
  </head>
  <body>
    <!-- TOP NAVIGATION -->
    <nav>
      <p class="welcome">Log in to get started</p>
      <img src="logo.png" alt="Logo" class="logo" />
      <form class="login">
        <input
          type="text"
          placeholder="user"
          class="login__input login__input--user"
        />
        <!-- In practice, use type="password" -->
        <input
          type="text"
          placeholder="PIN"
          maxlength="4"
          class="login__input login__input--pin"
        />
        <button class="login__btn">&rarr;</button>
      </form>
    </nav>

    <main class="app">
      <!-- BALANCE -->
      <div class="balance">
        <div>
          <p class="balance__label">Current balance</p>
          <p class="balance__date">
            As of <span class="date">05/03/2037</span>
          </p>
        </div>
        <p class="balance__value">0000€</p>
      </div>

      <!-- MOVEMENTS -->
      <div class="movements">
        <div class="movements__row">
          <div class="movements__type movements__type--deposit">2 deposit</div>
          <div class="movements__date">3 days ago</div>
          <div class="movements__value">4 000€</div>
        </div>
        <div class="movements__row">
          <div class="movements__type movements__type--withdrawal">
            1 withdrawal
          </div>
          <div class="movements__date">24/01/2037</div>
          <div class="movements__value">-378€</div>
        </div>
      </div>

      <!-- SUMMARY -->
      <div class="summary">
        <p class="summary__label">In</p>
        <p class="summary__value summary__value--in">0000€</p>
        <p class="summary__label">Out</p>
        <p class="summary__value summary__value--out">0000€</p>
        <p class="summary__label">Interest</p>
        <p class="summary__value summary__value--interest">0000€</p>
        <button class="btn--sort">&downarrow; SORT</button>
      </div>

      <!-- OPERATION: TRANSFERS -->
      <div class="operation operation--transfer">
        <h2>Transfer money</h2>
        <form class="form form--transfer">
          <input type="text" class="form__input form__input--to" />
          <input type="number" class="form__input form__input--amount" />
          <button class="form__btn form__btn--transfer">&rarr;</button>
          <label class="form__label">Transfer to</label>
          <label class="form__label">Amount</label>
        </form>
      </div>

      <!-- OPERATION: LOAN -->
      <div class="operation operation--loan">
        <h2>Request loan</h2>
        <form class="form form--loan">
          <input type="number" class="form__input form__input--loan-amount" />
          <button class="form__btn form__btn--loan">&rarr;</button>
          <label class="form__label form__label--loan">Amount</label>
        </form>
      </div>

      <!-- OPERATION: CLOSE -->
      <div class="operation operation--close">
        <h2>Close account</h2>
        <form class="form form--close">
          <input type="text" class="form__input form__input--user" />
          <input
            type="password"
            maxlength="6"
            class="form__input form__input--pin"
          />
          <button class="form__btn form__btn--close">&rarr;</button>
          <label class="form__label">Confirm user</label>
          <label class="form__label">Confirm PIN</label>
        </form>
      </div>

      <!-- LOGOUT TIMER -->
      <p class="logout-timer">
        You will be logged out in <span class="timer">05:00</span>
      </p>
    </main>

    <!-- <footer>
      &copy; by Jonas Schmedtmann. Don't claim as your own :)
    </footer> -->

    <script src="script.js"></script>
  </body>
</html>


================================================
FILE: 12-Numbers-Dates-Timers-Bankist/final/script.js
================================================
'use strict';

/////////////////////////////////////////////////
/////////////////////////////////////////////////
// BANKIST APP

/////////////////////////////////////////////////
// Data

// DIFFERENT DATA! Contains movement dates, currency and locale

const account1 = {
  owner: 'Jonas Schmedtmann',
  movements: [200, 455.23, -306.5, 25000, -642.21, -133.9, 79.97, 1300],
  interestRate: 1.2, // %
  pin: 1111,

  movementsDates: [
    '2019-11-18T21:31:17.178Z',
    '2019-12-23T07:42:02.383Z',
    '2020-01-28T09:15:04.904Z',
    '2020-04-01T10:17:24.185Z',
    '2020-05-08T14:11:59.604Z',
    '2020-07-26T17:01:17.194Z',
    '2020-07-28T23:36:17.929Z',
    '2020-08-01T10:51:36.790Z',
  ],
  currency: 'EUR',
  locale: 'pt-PT', // de-DE
};

const account2 = {
  owner: 'Jessica Davis',
  movements: [5000, 3400, -150, -790, -3210, -1000, 8500, -30],
  interestRate: 1.5,
  pin: 2222,

  movementsDates: [
    '2019-11-01T13:15:33.035Z',
    '2019-11-30T09:48:16.867Z',
    '2019-12-25T06:04:23.907Z',
    '2020-01-25T14:18:46.235Z',
    '2020-02-05T16:33:06.386Z',
    '2020-04-10T14:43:26.374Z',
    '2020-06-25T18:49:59.371Z',
    '2020-07-26T12:01:20.894Z',
  ],
  currency: 'USD',
  locale: 'en-US',
};

const accounts = [account1, account2];

/////////////////////////////////////////////////
// Elements
const labelWelcome = document.querySelector('.welcome');
const labelDate = document.querySelector('.date');
const labelBalance = document.querySelector('.balance__value');
const labelSumIn = document.querySelector('.summary__value--in');
const labelSumOut = document.querySelector('.summary__value--out');
const labelSumInterest = document.querySelector('.summary__value--interest');
const labelTimer = document.querySelector('.timer');

const containerApp = document.querySelector('.app');
const containerMovements = document.querySelector('.movements');

const btnLogin = document.querySelector('.login__btn');
const btnTransfer = document.querySelector('.form__btn--transfer');
const btnLoan = document.querySelector('.form__btn--loan');
const btnClose = document.querySelector('.form__btn--close');
const btnSort = document.querySelector('.btn--sort');

const inputLoginUsername = document.querySelector('.login__input--user');
const inputLoginPin = document.querySelector('.login__input--pin');
const inputTransferTo = document.querySelector('.form__input--to');
const inputTransferAmount = document.querySelector('.form__input--amount');
const inputLoanAmount = document.querySelector('.form__input--loan-amount');
const inputCloseUsername = document.querySelector('.form__input--user');
const inputClosePin = document.querySelector('.form__input--pin');

/////////////////////////////////////////////////
// Functions

const formatMovementDate = function (date, locale) {
  const calcDaysPassed = (date1, date2) =>
    Math.round(Math.abs(date2 - date1) / (1000 * 60 * 60 * 24));

  const daysPassed = calcDaysPassed(new Date(), date);
  console.log(daysPassed);

  if (daysPassed === 0) return 'Today';
  if (daysPassed === 1) return 'Yesterday';
  if (daysPassed <= 7) return `${daysPassed} days ago`;

  // const day = `${date.getDate()}`.padStart(2, 0);
  // const month = `${date.getMonth() + 1}`.padStart(2, 0);
  // const year = date.getFullYear();
  // return `${day}/${month}/${year}`;
  return new Intl.DateTimeFormat(locale).format(date);
};

const formatCur = function (value, locale, currency) {
  return new Intl.NumberFormat(locale, {
    style: 'currency',
    currency: currency,
  }).format(value);
};

const displayMovements = function (acc, sort = false) {
  containerMovements.innerHTML = '';

  const combinedMovsDates = acc.movements.map((mov, i) => ({
    movement: mov,
    movementDate: acc.movementsDates.at(i),
  }));

  if (sort) combinedMovsDates.sort((a, b) => a.movement - b.movement);

  combinedMovsDates.forEach(function (obj, i) {
    const { movement, movementDate } = obj;
    const type = movement > 0 ? 'deposit' : 'withdrawal';

    const date = new Date(movementDate);
    const displayDate = formatMovementDate(date, acc.locale);

    const formattedMov = formatCur(movement, acc.locale, acc.currency);

    const html = `
      <div class="movements__row">
        <div class="movements__type movements__type--${type}">${
      i + 1
    } ${type}</div>
        <div class="movements__date">${displayDate}</div>
        <div class="movements__value">${formattedMov}</div>
      </div>
    `;

    containerMovements.insertAdjacentHTML('afterbegin', html);
  });
};

const calcDisplayBalance = function (acc) {
  acc.balance = acc.movements.reduce((acc, mov) => acc + mov, 0);
  labelBalance.textContent = formatCur(acc.balance, acc.locale, acc.currency);
};

const calcDisplaySummary = function (acc) {
  const incomes = acc.movements
    .filter(mov => mov > 0)
    .reduce((acc, mov) => acc + mov, 0);
  labelSumIn.textContent = formatCur(incomes, acc.locale, acc.currency);

  const out = acc.movements
    .filter(mov => mov < 0)
    .reduce((acc, mov) => acc + mov, 0);
  labelSumOut.textContent = formatCur(Math.abs(out), acc.locale, acc.currency);

  const interest = acc.movements
    .filter(mov => mov > 0)
    .map(deposit => (deposit * acc.interestRate) / 100)
    .filter((int, i, arr) => {
      // console.log(arr);
      return int >= 1;
    })
    .reduce((acc, int) => acc + int, 0);
  labelSumInterest.textContent = formatCur(interest, acc.locale, acc.currency);
};

const createUsernames = function (accs) {
  accs.forEach(function (acc) {
    acc.username = acc.owner
      .toLowerCase()
      .split(' ')
      .map(name => name[0])
      .join('');
  });
};
createUsernames(accounts);

const updateUI = function (acc) {
  // Display movements
  displayMovements(acc);

  // Display balance
  calcDisplayBalance(acc);

  // Display summary
  calcDisplaySummary(acc);
};

const startLogOutTimer = function () {
  const tick = function () {
    const min = String(Math.trunc(time / 60)).padStart(2, 0);
    const sec = String(time % 60).padStart(2, 0);

    // In each call, print the remaining time to UI
    labelTimer.textContent = `${min}:${sec}`;

    // When 0 seconds, stop timer and log out user
    if (time === 0) {
      clearInterval(timer);
      labelWelcome.textContent = 'Log in to get started';
      containerApp.style.opacity = 0;
    }

    // Decrease 1s
    time--;
  };

  // Set time to 5 minutes
  let time = 120;

  // Call the timer every second
  tick();
  const timer = setInterval(tick, 1000);

  return timer;
};

///////////////////////////////////////
// Event handlers
let currentAccount, timer;

// FAKE ALWAYS LOGGED IN
// currentAccount = account1;
// updateUI(currentAccount);
// containerApp.style.opacity = 100;

btnLogin.addEventListener('click', function (e) {
  // Prevent form from submitting
  e.preventDefault();

  currentAccount = accounts.find(
    acc => acc.username === inputLoginUsername.value
  );
  console.log(currentAccount);

  if (currentAccount?.pin === +inputLoginPin.value) {
    // Display UI and message
    labelWelcome.textContent = `Welcome back, ${
      currentAccount.owner.split(' ')[0]
    }`;
    containerApp.style.opacity = 100;

    // Create current date and time
    const now = new Date();
    const options = {
      hour: 'numeric',
      minute: 'numeric',
      day: 'numeric',
      month: 'numeric',
      year: 'numeric',
      // weekday: 'long',
    };
    // const locale = navigator.language;
    // console.log(locale);

    labelDate.textContent = new Intl.DateTimeFormat(
      currentAccount.locale,
      options
    ).format(now);

    // const day = `${now.getDate()}`.padStart(2, 0);
    // const month = `${now.getMonth() + 1}`.padStart(2, 0);
    // const year = now.getFullYear();
    // const hour = `${now.getHours()}`.padStart(2, 0);
    // const min = `${now.getMinutes()}`.padStart(2, 0);
    // labelDate.textContent = `${day}/${month}/${year}, ${hour}:${min}`;

    // Clear input fields
    inputLoginUsername.value = inputLoginPin.value = '';
    inputLoginPin.blur();

    // Timer
    if (timer) clearInterval(timer);
    timer = startLogOutTimer();

    // Update UI
    updateUI(currentAccount);
  }
});

btnTransfer.addEventListener('click', function (e) {
  e.preventDefault();
  const amount = +inputTransferAmount.value;
  const receiverAcc = accounts.find(
    acc => acc.username === inputTransferTo.value
  );
  inputTransferAmount.value = inputTransferTo.value = '';

  if (
    amount > 0 &&
    receiverAcc &&
    currentAccount.balance >= amount &&
    receiverAcc?.username !== currentAccount.username
  ) {
    // Doing the transfer
    currentAccount.movements.push(-amount);
    receiverAcc.movements.push(amount);

    // Add transfer date
    currentAccount.movementsDates.push(new Date().toISOString());
    receiverAcc.movementsDates.push(new Date().toISOString());

    // Update UI
    updateUI(currentAccount);

    // Reset timer
    clearInterval(timer);
    timer = startLogOutTimer();
  }
});

btnLoan.addEventListener('click', function (e) {
  e.preventDefault();

  const amount = Math.floor(inputLoanAmount.value);

  if (amount > 0 && currentAccount.movements.some(mov => mov >= amount * 0.1)) {
    setTimeout(function () {
      // Add movement
      currentAccount.movements.push(amount);

      // Add loan date
      currentAccount.movementsDates.push(new Date().toISOString());

      // Update UI
      updateUI(currentAccount);

      // Reset timer
      clearInterval(timer);
      timer = startLogOutTimer();
    }, 2500);
  }
  inputLoanAmount.value = '';
});

btnClose.addEventListener('click', function (e) {
  e.preventDefault();

  if (
    inputCloseUsername.value === currentAccount.username &&
    +inputClosePin.value === currentAccount.pin
  ) {
    const index = accounts.findIndex(
      acc => acc.username === currentAccount.username
    );
    console.log(index);
    // .indexOf(23)

    // Delete account
    accounts.splice(index, 1);

    // Hide UI
    containerApp.style.opacity = 0;
  }

  inputCloseUsername.value = inputClosePin.value = '';
});

let sorted = false;
btnSort.addEventListener('click', function (e) {
  e.preventDefault();
  // BUG in video:
  // displayMovements(currentAccount.movements, !sorted);

  // FIX:
  displayMovements(currentAccount, !sorted);
  sorted = !sorted;
});

/////////////////////////////////////////////////
/////////////////////////////////////////////////
// LECTURES

/*
///////////////////////////////////////
// Converting and Checking Numbers
console.log(23 === 23.0);

// Base 10 - 0 to 9. 1/10 = 0.1. 3/10 = 3.3333333
// Binary base 2 - 0 1
console.log(0.1 + 0.2);
console.log(0.1 + 0.2 === 0.3);

// Conversion
console.log(Number('23'));
console.log(+'23');

// Parsing
console.log(Number.parseInt('30px', 10));
console.log(Number.parseInt('e23', 10));

console.log(Number.parseInt('  2.5rem  '));
console.log(Number.parseFloat('  2.5rem  '));

// console.log(parseFloat('  2.5rem  '));

// Check if value is NaN
console.log(Number.isNaN(20));
console.log(Number.isNaN('20'));
console.log(Number.isNaN(+'20X'));
console.log(Number.isNaN(23 / 0));

// Checking if value is number
console.log(Number.isFinite(20));
console.log(Number.isFinite('20'));
console.log(Number.isFinite(+'20X'));
console.log(Number.isFinite(23 / 0));

console.log(Number.isInteger(23));
console.log(Number.isInteger(23.0));
console.log(Number.isInteger(23 / 0));



///////////////////////////////////////
// Math and Rounding

console.log(Math.sqrt(25));
console.log(25 ** (1 / 2));
console.log(8 ** (1 / 3));

console.log(Math.max(5, 18, 23, 11, 2));
console.log(Math.max(5, 18, '23', 11, 2));
console.log(Math.max(5, 18, '23px', 11, 2));

console.log(Math.min(5, 18, 23, 11, 2));

console.log(Math.PI * Number.parseFloat('10px') ** 2);

console.log(Math.trunc(Math.random() * 6) + 1);

const randomInt = (min, max) =>
  Math.floor(Math.random() * (max - min + 1)) + min;

console.log(randomInt(10, 20));
console.log(randomInt(0, 3));

// Rounding integers
console.log(Math.round(23.3));
console.log(Math.round(23.9));

console.log(Math.ceil(23.3));
console.log(Math.ceil(23.9));

console.log(Math.floor(23.3));
console.log(Math.floor('23.9'));

console.log(Math.trunc(23.3));

console.log(Math.trunc(-23.3));
console.log(Math.floor(-23.3));

// Rounding decimals
console.log((2.7).toFixed(0));
console.log((2.7).toFixed(3));
console.log((2.345).toFixed(2));
console.log(+(2.345).toFixed(2));


///////////////////////////////////////
// The Remainder Operator
console.log(5 % 2);
console.log(5 / 2); // 5 = 2 * 2 + 1

console.log(8 % 3);
console.log(8 / 3); // 8 = 2 * 3 + 2

console.log(6 % 2);
console.log(6 / 2);

console.log(7 % 2);
console.log(7 / 2);

const isEven = n => n % 2 === 0;
console.log(isEven(8));
console.log(isEven(23));
console.log(isEven(514));

labelBalance.addEventListener('click', function () {
  [...document.querySelectorAll('.movements__row')].forEach(function (row, i) {
    // 0, 2, 4, 6
    if (i % 2 === 0) row.style.backgroundColor = 'orangered';
    // 0, 3, 6, 9
    if (i % 3 === 0) row.style.backgroundColor = 'blue';
  });
});


///////////////////////////////////////
// Numeric Separators

// 287,460,000,000
const diameter = 287_460_000_000;
console.log(diameter);

const price = 345_99;
console.log(price);

const transferFee1 = 15_00;
const transferFee2 = 1_500;

const PI = 3.1415;
console.log(PI);

console.log(Number('230_000'));
console.log(parseInt('230_000'));


///////////////////////////////////////
// Working with BigInt
console.log(2 ** 53 - 1);
console.log(Number.MAX_SAFE_INTEGER);
console.log(2 ** 53 + 1);
console.log(2 ** 53 + 2);
console.log(2 ** 53 + 3);
console.log(2 ** 53 + 4);

console.log(4838430248342043823408394839483204n);
console.log(BigInt(48384302));

// Operations
console.log(10000n + 10000n);
console.log(36286372637263726376237263726372632n * 10000000n);
// console.log(Math.sqrt(16n));

const huge = 20289830237283728378237n;
const num = 23;
console.log(huge * BigInt(num));

// Exceptions
console.log(20n > 15);
console.log(20n === 20);
console.log(typeof 20n);
console.log(20n == '20');

console.log(huge + ' is REALLY big!!!');

// Divisions
console.log(11n / 3n);
console.log(10 / 3);


///////////////////////////////////////
// Creating Dates

// Create a date

const now = new Date();
console.log(now);

console.log(new Date('Aug 02 2020 18:05:41'));
console.log(new Date('December 24, 2015'));
console.log(new Date(account1.movementsDates[0]));

console.log(new Date(2037, 10, 19, 15, 23, 5));
console.log(new Date(2037, 10, 31));

console.log(new Date(0));
console.log(new Date(3 * 24 * 60 * 60 * 1000));


// Working with dates
const future = new Date(2037, 10, 19, 15, 23);
console.log(future);
console.log(future.getFullYear());
console.log(future.getMonth());
console.log(future.getDate());
console.log(future.getDay());
console.log(future.getHours());
console.log(future.getMinutes());
console.log(future.getSeconds());
console.log(future.toISOString());
console.log(future.getTime());

console.log(new Date(2142256980000));

console.log(Date.now());

future.setFullYear(2040);
console.log(future);


///////////////////////////////////////
// Operations With Dates
const future = new Date(2037, 10, 19, 15, 23);
console.log(+future);

const calcDaysPassed = (date1, date2) =>
  Math.abs(date2 - date1) / (1000 * 60 * 60 * 24);

const days1 = calcDaysPassed(new Date(2037, 3, 4), new Date(2037, 3, 14));
console.log(days1);


///////////////////////////////////////
// Internationalizing Numbers (Intl)
const num = 3884764.23;

const options = {
  style: 'currency',
  unit: 'celsius',
  currency: 'EUR',
  // useGrouping: false,
};

console.log('US:      ', new Intl.NumberFormat('en-US', options).format(num));
console.log('Germany: ', new Intl.NumberFormat('de-DE', options).format(num));
console.log('Syria:   ', new Intl.NumberFormat('ar-SY', options).format(num));
console.log(
  navigator.language,
  new Intl.NumberFormat(navigator.language, options).format(num)
);


///////////////////////////////////////
// Timers

// setTimeout
const ingredients = ['olives', 'spinach'];
const pizzaTimer = setTimeout(
  (ing1, ing2) => console.log(`Here is your pizza with ${ing1} and ${ing2} 🍕`),
  3000,
  ...ingredients
);
console.log('Waiting...');

if (ingredients.includes('spinach')) clearTimeout(pizzaTimer);

// setInterval
setInterval(function () {
  const now = new Date();
  console.log(now);
}, 1000);
*/


================================================
FILE: 12-Numbers-Dates-Timers-Bankist/final/style.css
================================================
/*
 * Use this CSS to learn some intersting techniques,
 * in case you're wondering how I built the UI.
 * Have fun! 😁
 */

* {
  margin: 0;
  padding: 0;
  box-sizing: inherit;
}

html {
  font-size: 62.5%;
  box-sizing: border-box;
}

body {
  font-family: 'Poppins', sans-serif;
  color: #444;
  background-color: #f3f3f3;
  height: 100vh;
  padding: 2rem;
}

nav {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 0 2rem;
}

.welcome {
  font-size: 1.9rem;
  font-weight: 500;
}

.logo {
  height: 5.25rem;
}

.login {
  display: flex;
}

.login__input {
  border: none;
  padding: 0.5rem 2rem;
  font-size: 1.6rem;
  font-family: inherit;
  text-align: center;
  width: 12rem;
  border-radius: 10rem;
  margin-right: 1rem;
  color: inherit;
  border: 1px solid #fff;
  transition: all 0.3s;
}

.login__input:focus {
  outline: none;
  border: 1px solid #ccc;
}

.login__input::placeholder {
  color: #bbb;
}

.login__btn {
  border: none;
  background: none;
  font-size: 2.2rem;
  color: inherit;
  cursor: pointer;
  transition: all 0.3s;
}

.login__btn:hover,
.login__btn:focus,
.btn--sort:hover,
.btn--sort:focus {
  outline: none;
  color: #777;
}

/* MAIN */
.app {
  position: relative;
  max-width: 100rem;
  margin: 4rem auto;
  display: grid;
  grid-template-columns: 4fr 3fr;
  grid-template-rows: auto repeat(3, 15rem) auto;
  gap: 2rem;

  /* NOTE This creates the fade in/out anumation */
  opacity: 0;
  transition: all 1s;
}

.balance {
  grid-column: 1 / span 2;
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  margin-bottom: 2rem;
}

.balance__label {
  font-size: 2.2rem;
  font-weight: 500;
  margin-bottom: -0.2rem;
}

.balance__date {
  font-size: 1.4rem;
  color: #888;
}

.balance__value {
  font-size: 4.5rem;
  font-weight: 400;
}

/* MOVEMENTS */
.movements {
  grid-row: 2 / span 3;
  background-color: #fff;
  border-radius: 1rem;
  overflow: scroll;
}

.movements__row {
  padding: 2.25rem 4rem;
  display: flex;
  align-items: center;
  border-bottom: 1px solid #eee;
}

.movements__type {
  font-size: 1.1rem;
  text-transform: uppercase;
  font-weight: 500;
  color: #fff;
  padding: 0.1rem 1rem;
  border-radius: 10rem;
  margin-right: 2rem;
}

.movements__date {
  font-size: 1.1rem;
  text-transform: uppercase;
  font-weight: 500;
  color: #666;
}

.movements__type--deposit {
  background-image: linear-gradient(to top left, #39b385, #9be15d);
}

.movements__type--withdrawal {
  background-image: linear-gradient(to top left, #e52a5a, #ff585f);
}

.movements__value {
  font-size: 1.7rem;
  margin-left: auto;
}

/* SUMMARY */
.summary {
  grid-row: 5 / 6;
  display: flex;
  align-items: baseline;
  padding: 0 0.3rem;
  margin-top: 1rem;
}

.summary__label {
  font-size: 1.2rem;
  font-weight: 500;
  text-transform: uppercase;
  margin-right: 0.8rem;
}

.summary__value {
  font-size: 2.2rem;
  margin-right: 2.5rem;
}

.summary__value--in,
.summary__value--interest {
  color: #66c873;
}

.summary__value--out {
  color: #f5465d;
}

.btn--sort {
  margin-left: auto;
  border: none;
  background: none;
  font-size: 1.3rem;
  font-weight: 500;
  cursor: pointer;
}

/* OPERATIONS */
.operation {
  border-radius: 1rem;
  padding: 3rem 4rem;
  color: #333;
}

.operation--transfer {
  background-image: linear-gradient(to top left, #ffb003, #ffcb03);
}

.operation--loan {
  background-image: linear-gradient(to top left, #39b385, #9be15d);
}

.operation--close {
  background-image: linear-gradient(to top left, #e52a5a, #ff585f);
}

h2 {
  margin-bottom: 1.5rem;
  font-size: 1.7rem;
  font-weight: 600;
  color: #333;
}

.form {
  display: grid;
  grid-template-columns: 2.5fr 2.5fr 1fr;
  grid-template-rows: auto auto;
  gap: 0.4rem 1rem;
}

/* Exceptions for interst */
.form.form--loan {
  grid-template-columns: 2.5fr 1fr 2.5fr;
}
.form__label--loan {
  grid-row: 2;
}
/* End exceptions */

.form__input {
  width: 100%;
  border: none;
  background-color: rgba(255, 255, 255, 0.4);
  font-family: inherit;
  font-size: 1.5rem;
  text-align: center;
  color: #333;
  padding: 0.3rem 1rem;
  border-radius: 0.7rem;
  transition: all 0.3s;
}

.form__input:focus {
  outline: none;
  background-color: rgba(255, 255, 255, 0.6);
}

.form__label {
  font-size: 1.3rem;
  text-align: center;
}

.form__btn {
  border: none;
  border-radius: 0.7rem;
  font-size: 1.8rem;
  background-color: #fff;
  cursor: pointer;
  transition: all 0.3s;
}

.form__btn:focus {
  outline: none;
  background-color: rgba(255, 255, 255, 0.8);
}

.logout-timer {
  padding: 0 0.3rem;
  margin-top: 1.9rem;
  text-align: right;
  font-size: 1.25rem;
}

.timer {
  font-weight: 600;
}


================================================
FILE: 12-Numbers-Dates-Timers-Bankist/starter/.prettierrc
================================================
{
  "singleQuote": true,
  "arrowParens": "avoid"
}


================================================
FILE: 12-Numbers-Dates-Timers-Bankist/starter/index.html
================================================
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <link rel="shortcut icon" type="image/png" href="/icon.png" />

    <link
      href="https://fonts.googleapis.com/css?family=Poppins:400,500,600&display=swap"
      rel="stylesheet"
    />

    <link rel="stylesheet" href="style.css" />
    <title>Bankist</title>
  </head>
  <body>
    <!-- TOP NAVIGATION 
Download .txt
gitextract_6_nnlknq/

├── 01-Fundamentals-Part-1/
│   ├── final/
│   │   ├── index.html
│   │   └── script.js
│   └── starter/
│       └── index.html
├── 02-Fundamentals-Part-2/
│   ├── final/
│   │   ├── index.html
│   │   └── script.js
│   └── starter/
│       ├── index.html
│       └── script.js
├── 03-Developer-Skills/
│   ├── final/
│   │   ├── .prettierrc
│   │   ├── index.html
│   │   └── script.js
│   └── starter/
│       ├── index.html
│       └── script.js
├── 04-HTML-CSS/
│   └── final/
│       ├── index.html
│       └── style.css
├── 05-Guess-My-Number/
│   ├── final/
│   │   ├── .prettierrc
│   │   ├── index.html
│   │   ├── script.js
│   │   └── style.css
│   └── starter/
│       ├── .prettierrc
│       ├── index.html
│       ├── script.js
│       └── style.css
├── 06-Modal/
│   ├── final/
│   │   ├── .prettierrc
│   │   ├── index.html
│   │   ├── script.js
│   │   └── style.css
│   └── starter/
│       ├── .prettierrc
│       ├── index.html
│       ├── script.js
│       └── style.css
├── 07-Pig-Game/
│   ├── final/
│   │   ├── .prettierrc
│   │   ├── index.html
│   │   ├── script.js
│   │   └── style.css
│   └── starter/
│       ├── .prettierrc
│       ├── index.html
│       ├── script.js
│       └── style.css
├── 08-Behind-the-Scenes/
│   ├── final/
│   │   ├── .prettierrc
│   │   ├── index.html
│   │   └── script.js
│   └── starter/
│       ├── .prettierrc
│       ├── index.html
│       └── script.js
├── 09-Data-Structures-Operators/
│   ├── final/
│   │   ├── .prettierrc
│   │   ├── index.html
│   │   └── script.js
│   └── starter/
│       ├── .prettierrc
│       ├── index.html
│       └── script.js
├── 10-Functions/
│   ├── final/
│   │   ├── .prettierrc
│   │   ├── index.html
│   │   └── script.js
│   └── starter/
│       ├── .prettierrc
│       ├── index.html
│       └── script.js
├── 11-Arrays-Bankist/
│   ├── final/
│   │   ├── .prettierrc
│   │   ├── index.html
│   │   ├── script.js
│   │   └── style.css
│   └── starter/
│       ├── .prettierrc
│       ├── index.html
│       ├── script.js
│       └── style.css
├── 12-Numbers-Dates-Timers-Bankist/
│   ├── final/
│   │   ├── .prettierrc
│   │   ├── index.html
│   │   ├── script.js
│   │   └── style.css
│   └── starter/
│       ├── .prettierrc
│       ├── index.html
│       ├── script.js
│       └── style.css
├── 13-Advanced-DOM-Bankist/
│   ├── final/
│   │   ├── .prettierrc
│   │   ├── index.html
│   │   ├── script.js
│   │   └── style.css
│   └── starter/
│       ├── .prettierrc
│       ├── index.html
│       ├── script.js
│       └── style.css
├── 14-OOP/
│   ├── final/
│   │   ├── .prettierrc
│   │   ├── index.html
│   │   └── script.js
│   └── starter/
│       ├── .prettierrc
│       ├── index.html
│       └── script.js
├── 15-Mapty/
│   ├── final/
│   │   ├── .prettierrc
│   │   ├── index.html
│   │   ├── other.js
│   │   ├── script.js
│   │   └── style.css
│   └── starter/
│       ├── .prettierrc
│       ├── index.html
│       ├── script.js
│       └── style.css
├── 16-Asynchronous/
│   ├── final/
│   │   ├── .prettierrc
│   │   ├── index.html
│   │   ├── script.js
│   │   └── style.css
│   └── starter/
│       ├── .prettierrc
│       ├── index.html
│       ├── script.js
│       └── style.css
├── 17-Modern-JS-Modules-Tooling/
│   ├── final/
│   │   ├── .prettierrc
│   │   ├── clean.js
│   │   ├── dist/
│   │   │   ├── index.html
│   │   │   ├── index.js
│   │   │   ├── script.0b6e4fd3.js
│   │   │   └── script.75da7f30.js
│   │   ├── index.html
│   │   ├── package.json
│   │   ├── script.js
│   │   └── shoppingCart.js
│   └── starter/
│       ├── .prettierrc
│       ├── clean.js
│       ├── index.html
│       └── script.js
├── 18-forkify/
│   ├── final/
│   │   ├── .gitignore
│   │   ├── .prettierrc
│   │   ├── README.md
│   │   ├── index.html
│   │   ├── package.json
│   │   └── src/
│   │       ├── js/
│   │       │   ├── config.js
│   │       │   ├── controller.js
│   │       │   ├── helpers.js
│   │       │   ├── model.js
│   │       │   └── views/
│   │       │       ├── View.js
│   │       │       ├── addRecipeView.js
│   │       │       ├── bookmarksView.js
│   │       │       ├── paginationView.js
│   │       │       ├── previewView.js
│   │       │       ├── recipeView.js
│   │       │       ├── resultsView.js
│   │       │       └── searchView.js
│   │       └── sass/
│   │           ├── _base.scss
│   │           ├── _components.scss
│   │           ├── _header.scss
│   │           ├── _preview.scss
│   │           ├── _recipe.scss
│   │           ├── _searchResults.scss
│   │           ├── _upload.scss
│   │           └── main.scss
│   └── starter/
│       ├── .prettierrc
│       ├── index.html
│       └── src/
│           ├── js/
│           │   └── controller.js
│           └── sass/
│               ├── _base.scss
│               ├── _components.scss
│               ├── _header.scss
│               ├── _preview.scss
│               ├── _recipe.scss
│               ├── _searchResults.scss
│               ├── _upload.scss
│               └── main.scss
└── README.md
Download .txt
SYMBOL INDEX (2117 symbols across 15 files)

FILE: 09-Data-Structures-Operators/final/script.js
  method order (line 29) | order(starterIndex, mainIndex) {
  method orderDelivery (line 33) | orderDelivery({ starterIndex = 1, mainIndex = 0, time = '20:00', address...
  method orderPasta (line 39) | orderPasta(ing1, ing2, ing3) {
  method orderPizza (line 45) | orderPizza(mainIngredient, ...otherIngredients) {

FILE: 15-Mapty/final/script.js
  class Workout (line 3) | class Workout {
    method constructor (line 8) | constructor(coords, distance, duration) {
    method _setDescription (line 16) | _setDescription() {
    method click (line 25) | click() {
  class Running (line 30) | class Running extends Workout {
    method constructor (line 33) | constructor(coords, distance, duration, cadence) {
    method calcPace (line 40) | calcPace() {
  class Cycling (line 47) | class Cycling extends Workout {
    method constructor (line 50) | constructor(coords, distance, duration, elevationGain) {
    method calcSpeed (line 58) | calcSpeed() {
  class App (line 79) | class App {
    method constructor (line 85) | constructor() {
    method _getPosition (line 98) | _getPosition() {
    method _loadMap (line 108) | _loadMap(position) {
    method _showForm (line 130) | _showForm(mapE) {
    method _hideForm (line 136) | _hideForm() {
    method _toggleElevationField (line 146) | _toggleElevationField() {
    method _newWorkout (line 151) | _newWorkout(e) {
    method _renderWorkoutMarker (line 211) | _renderWorkoutMarker(workout) {
    method _renderWorkout (line 229) | _renderWorkout(workout) {
    method _moveToPopup (line 280) | _moveToPopup(e) {
    method _setLocalStorage (line 303) | _setLocalStorage() {
    method _getLocalStorage (line 307) | _getLocalStorage() {
    method reset (line 319) | reset() {

FILE: 17-Modern-JS-Modules-Tooling/final/dist/index.js
  function newRequire (line 13) | function newRequire(name, jumped) {
  function Module (line 61) | function Module(moduleName) {
  function getBundleURLCached (line 123) | function getBundleURLCached() {
  function getBundleURL (line 131) | function getBundleURL() {
  function getBaseURL (line 146) | function getBaseURL(url) {
  function updateLink (line 155) | function updateLink(link) {
  function reloadCSS (line 168) | function reloadCSS() {
  function Module (line 192) | function Module(moduleName) {
  function removeErrorOverlay (line 274) | function removeErrorOverlay() {
  function createErrorOverlay (line 282) | function createErrorOverlay(data) {
  function getParents (line 294) | function getParents(bundle, id) {
  function hmrApply (line 321) | function hmrApply(bundle, asset) {
  function hmrAcceptCheck (line 337) | function hmrAcceptCheck(bundle, id) {
  function hmrAcceptRun (line 365) | function hmrAcceptRun(bundle, id) {

FILE: 17-Modern-JS-Modules-Tooling/final/dist/script.0b6e4fd3.js
  function f (line 1) | function f(t,n){if(!r[t]){if(!e[t]){var i="function"==typeof parcelRequi...
  function c (line 2) | function c(t,r){o.push({product:t,quantity:r}),console.log("".concat(r,"...
  function t (line 7) | function t(e){return e&&e.__esModule?e:{default:e}}
  function t (line 9) | function t(e){return e&&e.__esModule?e:{default:e}}
  function t (line 11) | function t(e){return e&&e.__esModule?e:{default:e}}
  function u (line 11) | function u(e){var t=a.call(e,l),r=e[l];try{e[l]=void 0;var u=!0}catch(i)...
  function r (line 13) | function r(e){return t.call(e)}
  function u (line 15) | function u(e){return e&&e.__esModule?e:{default:e}}
  function a (line 15) | function a(e){return null==e?void 0===e?d:o:l&&l in Object(e)?(0,t.defau...
  function e (line 17) | function e(e){return null!=e&&"object"==typeof e}
  function r (line 19) | function r(e){return e&&e.__esModule?e:{default:e}}
  function o (line 19) | function o(r){return"symbol"==typeof r||(0,t.default)(r)&&(0,e.default)(...
  function r (line 21) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 21) | function u(r){return"number"==typeof r?r:(0,e.default)(r)?t:+r}
  function e (line 23) | function e(e,r){for(var t=-1,o=null==e?0:e.length,u=Array(o);++t<o;)u[t]...
  function a (line 27) | function a(e){return e&&e.__esModule?e:{default:e}}
  function l (line 27) | function l(e){if("string"==typeof e)return e;if((0,t.default)(e))return(...
  function t (line 29) | function t(e){return e&&e.__esModule?e:{default:e}}
  function u (line 29) | function u(t,u){return function(i,o){var d;if(void 0===i&&void 0===o)ret...
  function t (line 31) | function t(e){return e&&e.__esModule?e:{default:e}}
  function e (line 33) | function e(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}
  function r (line 35) | function r(e){return e&&e.__esModule?e:{default:e}}
  function o (line 35) | function o(r){if("number"==typeof r)return r;if((0,t.default)(r))return ...
  function r (line 37) | function r(e){return e&&e.__esModule?e:{default:e}}
  function o (line 37) | function o(r){return r?(r=(0,e.default)(r))===t||r===-t?(r<0?-1:1)*u:r==...
  function t (line 39) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 39) | function r(t){var r=(0,e.default)(t),u=r%1;return r==r?u?r-u:r:0}
  function t (line 41) | function t(e){return e&&e.__esModule?e:{default:e}}
  function u (line 41) | function u(t,u){if("function"!=typeof u)throw new TypeError(r);return t=...
  function e (line 43) | function e(e){return e}
  function r (line 45) | function r(e){return e&&e.__esModule?e:{default:e}}
  function c (line 45) | function c(r){if(!(0,t.default)(r))return!1;var c=(0,e.default)(r);retur...
  function r (line 47) | function r(e){return e&&e.__esModule?e:{default:e}}
  function r (line 49) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 49) | function u(e){return!!t&&t in e}
  function e (line 51) | function e(t){if(null!=t){try{return r.call(t)}catch(e){}try{return t+""...
  function u (line 53) | function u(e){return e&&e.__esModule?e:{default:e}}
  function d (line 53) | function d(u){return!(!(0,r.default)(u)||(0,t.default)(u))&&((0,e.defaul...
  function e (line 55) | function e(e,t){return null==e?void 0:e[t]}
  function r (line 57) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 57) | function u(r,u){var a=(0,t.default)(r,u);return(0,e.default)(a)?a:void 0}
  function r (line 59) | function r(e){return e&&e.__esModule?e:{default:e}}
  function t (line 61) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 63) | function r(e){return e&&e.__esModule?e:{default:e}}
  function t (line 65) | function t(e){return e&&e.__esModule?e:{default:e}}
  function t (line 65) | function t(){}
  function t (line 67) | function t(e){return e&&e.__esModule?e:{default:e}}
  function n (line 67) | function n(t){return function(){var n=arguments;switch(n.length){case 0:...
  function r (line 69) | function r(e){return e&&e.__esModule?e:{default:e}}
  function o (line 69) | function o(r,o,s){var a=o&u,i=(0,e.default)(r);return function e(){retur...
  function e (line 71) | function e(e,r,t){switch(t.length){case 0:return e.call(r);case 1:return...
  function r (line 73) | function r(r,t,o,a){for(var f=-1,l=r.length,n=o.length,u=-1,s=t.length,d...
  function r (line 75) | function r(r,t,a,o){for(var f=-1,l=r.length,n=-1,u=a.length,s=-1,v=t.len...
  function e (line 77) | function e(e,t){for(var r=e.length,o=0;r--;)e[r]===t&&++o;return o}
  function e (line 79) | function e(){}
  function _ (line 81) | function _(e){return e&&e.__esModule?e:{default:e}}
  function s (line 81) | function s(e){this.__wrapped__=e,this.__actions__=[],this.__dir__=1,this...
  function r (line 83) | function r(e){return e&&e.__esModule?e:{default:e}}
  function r (line 87) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 87) | function u(r){for(var t=r.name+"",u=e.default[t],l=a.call(e.default,t)?u...
  function _ (line 89) | function _(e){return e&&e.__esModule?e:{default:e}}
  function r (line 89) | function r(e,t){this.__wrapped__=e,this.__actions__=[],this.__chain__=!!...
  function e (line 91) | function e(e,r){var t=-1,o=e.length;for(r||(r=Array(o));++t<o;)r[t]=e[t]...
  function a (line 93) | function a(_){return _&&_.__esModule?_:{default:_}}
  function t (line 93) | function t(a){if(a instanceof _.default)return a.clone();var t=new e.def...
  function s (line 95) | function s(e){return e&&e.__esModule?e:{default:e}}
  function f (line 95) | function f(t){if((0,u.default)(t)&&!(0,a.default)(t)&&!(t instanceof e.d...
  function a (line 97) | function a(e){return e&&e.__esModule?e:{default:e}}
  function f (line 97) | function f(a){var f=(0,t.default)(a),o=u.default[f];if("function"!=typeo...
  function o (line 99) | function o(o){var u=0,a=0;return function(){var n=t(),i=r-(n-a);if(a=n,i...
  function r (line 101) | function r(e){return e&&e.__esModule?e:{default:e}}
  function r (line 103) | function r(r){var a=r.match(e);return a?a[1].split(t):[]}
  function r (line 105) | function r(r,t){var n=t.length;if(!n)return r;var a=n-1;return t[a]=(n>1...
  function e (line 107) | function e(e){return function(){return e}}
  function t (line 109) | function t(e){return e&&e.__esModule?e:{default:e}}
  function u (line 111) | function u(e){return e&&e.__esModule?e:{default:e}}
  function r (line 113) | function r(e){return e&&e.__esModule?e:{default:e}}
  function e (line 115) | function e(e,t){for(var r=-1,o=null==e?0:e.length;++r<o&&!1!==t(e[r],r,e...
  function e (line 117) | function e(e,r,t,o){for(var u=e.length,f=t+(o?1:-1);o?f--:++f<u;)if(r(e[...
  function e (line 119) | function e(e){return e!=e}
  function e (line 121) | function e(e,r,t){for(var o=t-1,u=e.length;++o<u;)if(e[o]===r)return o;r...
  function u (line 123) | function u(e){return e&&e.__esModule?e:{default:e}}
  function s (line 123) | function s(u,s,d){return s==s?(0,t.default)(u,s,d):(0,e.default)(u,r.def...
  function t (line 125) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 125) | function r(t,r){return!!(null==t?0:t.length)&&(0,e.default)(t,r,0)>-1}
  function t (line 127) | function t(r){return r&&r.__esModule?r:{default:r}}
  function p (line 127) | function p(t,a){return(0,r.default)(c,function(r){var u="_."+r[0];a&r[1]...
  function a (line 129) | function a(e){return e&&e.__esModule?e:{default:e}}
  function s (line 129) | function s(a,s,i){var l=s+"";return(0,t.default)(a,(0,r.default)(l,(0,u....
  function a (line 131) | function a(e){return e&&e.__esModule?e:{default:e}}
  function v (line 131) | function v(a,v,f,n,p,_,c,j,q,x){var b=v&o;v|=b?l:s,(v&=~(b?s:l))&i||(v&=...
  function e (line 133) | function e(e){return e.placeholder}
  function r (line 135) | function r(r,o){var u=typeof r;return!!(o=null==o?e:o)&&("number"==u||"s...
  function t (line 137) | function t(e){return e&&e.__esModule?e:{default:e}}
  function a (line 137) | function a(t,a){for(var o=t.length,d=u(a.length,o),n=(0,e.default)(t);d-...
  function r (line 139) | function r(r,t){for(var o=-1,a=r.length,l=0,d=[];++o<a;){var s=r[o];s!==...
  function d (line 141) | function d(e){return e&&e.__esModule?e:{default:e}}
  function p (line 141) | function p(d,h,q,g,y,x,A,H,m,M){var R=h&v,b=h&f,C=h&n,O=h&(c|_),P=h&j,k=...
  function l (line 143) | function l(e){return e&&e.__esModule?e:{default:e}}
  function o (line 143) | function o(l,o,s){var f=(0,r.default)(l);return function r(){for(var n=a...
  function u (line 145) | function u(e){return e&&e.__esModule?e:{default:e}}
  function o (line 145) | function o(u,o,s,i){var n=o&a,f=(0,r.default)(u);return function r(){for...
  function l (line 147) | function l(e){return e&&e.__esModule?e:{default:e}}
  function _ (line 147) | function _(l,_){var c=l[1],p=_[1],v=c|p,h=v<(a|o|n),g=p==n&&c==d||p==n&&...
  function s (line 149) | function s(e){return e&&e.__esModule?e:{default:e}}
  function h (line 149) | function h(s,h,y,x,D,b,M,m){var w=h&_;if(!w&&"function"!=typeof s)throw ...
  function r (line 151) | function r(e){return e&&e.__esModule?e:{default:e}}
  function o (line 151) | function o(r,o,u){return o=u?void 0:o,o=r&&null==o?r.length:o,(0,e.defau...
  function r (line 153) | function r(e){return e&&e.__esModule?e:{default:e}}
  function t (line 153) | function t(r,t,u){"__proto__"==t&&e.default?(0,e.default)(r,t,{configura...
  function e (line 155) | function e(e,t){return e===t||e!=e&&t!=t}
  function t (line 157) | function t(e){return e&&e.__esModule?e:{default:e}}
  function o (line 157) | function o(t,u,o){var s=t[u];a.call(t,u)&&(0,r.default)(s,o)&&(void 0!==...
  function t (line 159) | function t(e){return e&&e.__esModule?e:{default:e}}
  function u (line 159) | function u(t,u,a,s){var o=!a;a||(a={});for(var d=-1,i=u.length;++d<i;){v...
  function e (line 161) | function e(r){return r&&r.__esModule?r:{default:r}}
  function a (line 161) | function a(e,a,u){return a=t(void 0===a?e.length-1:a,0),function(){for(v...
  function u (line 163) | function u(e){return e&&e.__esModule?e:{default:e}}
  function s (line 163) | function s(u,s){return(0,r.default)((0,t.default)(u,s,e.default),u+"")}
  function t (line 165) | function t(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=e}
  function u (line 167) | function u(e){return e&&e.__esModule?e:{default:e}}
  function r (line 167) | function r(u){return null!=u&&(0,t.default)(u.length)&&!(0,e.default)(u)}
  function i (line 169) | function i(e){return e&&e.__esModule?e:{default:e}}
  function s (line 169) | function s(i,s,n){if(!(0,u.default)(n))return!1;var a=typeof s;return!!(...
  function r (line 171) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 171) | function u(r){return(0,e.default)(function(e,u){var o=-1,i=u.length,n=i>...
  function e (line 173) | function e(e){var o=e&&e.constructor;return e===("function"==typeof o&&o...
  function e (line 175) | function e(e,r){for(var t=-1,o=Array(e);++t<e;)o[t]=r(t);return o}
  function r (line 177) | function r(e){return e&&e.__esModule?e:{default:e}}
  function s (line 177) | function s(r){return(0,t.default)(r)&&(0,e.default)(r)==u}
  function r (line 179) | function r(e){return e&&e.__esModule?e:{default:e}}
  function e (line 181) | function e(){return!1}
  function t (line 184) | function t(e){return e&&e.__esModule?e:{default:e}}
  function o (line 186) | function o(e){return e&&e.__esModule?e:{default:e}}
  function h (line 186) | function h(o){return(0,r.default)(o)&&(0,t.default)(o.length)&&!!O[(0,e....
  function e (line 188) | function e(e){return function(t){return e(t)}}
  function t (line 190) | function t(e){return e&&e.__esModule?e:{default:e}}
  function u (line 192) | function u(e){return e&&e.__esModule?e:{default:e}}
  function f (line 194) | function f(e){return e&&e.__esModule?e:{default:e}}
  function n (line 194) | function n(f,i){var n=(0,t.default)(f),d=!n&&(0,r.default)(f),o=!n&&!d&&...
  function e (line 196) | function e(e,t){return function(r){return e(t(r))}}
  function t (line 198) | function t(e){return e&&e.__esModule?e:{default:e}}
  function t (line 200) | function t(e){return e&&e.__esModule?e:{default:e}}
  function a (line 200) | function a(t){if(!(0,e.default)(t))return(0,r.default)(t);var u=[];for(v...
  function u (line 202) | function u(e){return e&&e.__esModule?e:{default:e}}
  function s (line 202) | function s(u){return(0,t.default)(u)?(0,e.default)(u):(0,r.default)(u)}
  function i (line 204) | function i(e){return e&&e.__esModule?e:{default:e}}
  function e (line 206) | function e(e){var r=[];if(null!=e)for(var t in Object(e))r.push(t);retur...
  function u (line 208) | function u(e){return e&&e.__esModule?e:{default:e}}
  function a (line 208) | function a(u){if(!(0,e.default)(u))return(0,t.default)(u);var o=(0,r.def...
  function u (line 210) | function u(e){return e&&e.__esModule?e:{default:e}}
  function s (line 210) | function s(u){return(0,t.default)(u)?(0,e.default)(u,!0):(0,r.default)(u)}
  function u (line 212) | function u(e){return e&&e.__esModule?e:{default:e}}
  function u (line 214) | function u(e){return e&&e.__esModule?e:{default:e}}
  function u (line 216) | function u(e){return e&&e.__esModule?e:{default:e}}
  function t (line 218) | function t(e){return e&&e.__esModule?e:{default:e}}
  function o (line 218) | function o(t,o){if((0,e.default)(t))return!1;var s=typeof t;return!("num...
  function t (line 220) | function t(e){return e&&e.__esModule?e:{default:e}}
  function t (line 222) | function t(e){return e&&e.__esModule?e:{default:e}}
  function u (line 222) | function u(){this.__data__=e.default?(0,e.default)(null):{},this.size=0}
  function e (line 224) | function e(e){var t=this.has(e)&&delete this.__data__[e];return this.siz...
  function t (line 226) | function t(e){return e&&e.__esModule?e:{default:e}}
  function u (line 226) | function u(t){var a=this.__data__;if(e.default){var u=a[t];return u===r?...
  function t (line 228) | function t(e){return e&&e.__esModule?e:{default:e}}
  function o (line 228) | function o(t){var r=this.__data__;return e.default?void 0!==r[t]:a.call(...
  function t (line 230) | function t(e){return e&&e.__esModule?e:{default:e}}
  function a (line 230) | function a(t,a){var s=this.__data__;return this.size+=this.has(t)?0:1,s[...
  function u (line 232) | function u(e){return e&&e.__esModule?e:{default:e}}
  function o (line 232) | function o(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t<r;){var...
  function e (line 234) | function e(){this.__data__=[],this.size=0}
  function r (line 236) | function r(e){return e&&e.__esModule?e:{default:e}}
  function t (line 236) | function t(r,t){for(var u=r.length;u--;)if((0,e.default)(r[u][0],t))retu...
  function t (line 238) | function t(e){return e&&e.__esModule?e:{default:e}}
  function s (line 238) | function s(t){var r=this.__data__,s=(0,e.default)(r,t);return!(s<0)&&(s=...
  function t (line 240) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 240) | function r(t){var r=this.__data__,u=(0,e.default)(r,t);return u<0?void 0...
  function t (line 242) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 242) | function r(t){return(0,e.default)(this.__data__,t)>-1}
  function t (line 244) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 244) | function r(t,r){var s=this.__data__,u=(0,e.default)(s,t);return u<0?(++t...
  function s (line 246) | function s(e){return e&&e.__esModule?e:{default:e}}
  function u (line 246) | function u(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t<r;){var...
  function r (line 248) | function r(e){return e&&e.__esModule?e:{default:e}}
  function r (line 250) | function r(e){return e&&e.__esModule?e:{default:e}}
  function s (line 250) | function s(){this.size=0,this.__data__={hash:new e.default,map:new(a.def...
  function e (line 252) | function e(e){var t=typeof e;return"string"==t||"number"==t||"symbol"==t...
  function t (line 254) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 254) | function r(t,r){var a=t.__data__;return(0,e.default)(r)?a["string"==type...
  function t (line 256) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 256) | function r(t){var r=(0,e.default)(this,t).delete(t);return this.size-=r?...
  function t (line 258) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 258) | function r(t){return(0,e.default)(this,t).get(t)}
  function t (line 260) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 260) | function r(t){return(0,e.default)(this,t).has(t)}
  function t (line 262) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 262) | function r(t,r){var s=(0,e.default)(this,t),u=s.size;return s.set(t,r),t...
  function o (line 264) | function o(e){return e&&e.__esModule?e:{default:e}}
  function l (line 264) | function l(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t<r;){var...
  function t (line 266) | function t(e){return e&&e.__esModule?e:{default:e}}
  function a (line 266) | function a(t,u){if("function"!=typeof t||null!=u&&"function"!=typeof u)t...
  function r (line 268) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 268) | function u(r){var u=(0,e.default)(r,function(e){return a.size===t&&a.cle...
  function r (line 270) | function r(e){return e&&e.__esModule?e:{default:e}}
  function t (line 272) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 272) | function r(t){return null==t?"":(0,e.default)(t)}
  function s (line 274) | function s(e){return e&&e.__esModule?e:{default:e}}
  function i (line 274) | function i(s,i){return(0,e.default)(s)?s:(0,r.default)(s,i)?[s]:(0,t.def...
  function r (line 276) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 276) | function u(r){if("string"==typeof r||(0,e.default)(r))return r;var u=r+"...
  function r (line 278) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 278) | function u(r,u){for(var o=0,a=(u=(0,e.default)(u,r)).length;null!=r&&o<a...
  function t (line 280) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 280) | function r(t,r,u){var o=null==t?void 0:(0,e.default)(t,r);return void 0=...
  function r (line 282) | function r(e){return e&&e.__esModule?e:{default:e}}
  function t (line 282) | function t(r,t){for(var u=-1,o=t.length,l=Array(o),a=null==r;++u<o;)l[u]...
  function e (line 284) | function e(e,t){for(var r=-1,o=t.length,u=e.length;++r<o;)e[u+r]=t[r];re...
  function u (line 286) | function u(e){return e&&e.__esModule?e:{default:e}}
  function s (line 286) | function s(e){return(0,t.default)(e)||(0,r.default)(e)||!!(a&&e&&e[a])}
  function t (line 288) | function t(e){return e&&e.__esModule?e:{default:e}}
  function u (line 288) | function u(t,a,l,s,n){var o=-1,d=t.length;for(l||(l=r.default),n||(n=[])...
  function t (line 290) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 290) | function r(t){return(null==t?0:t.length)?(0,e.default)(t,1):[]}
  function u (line 292) | function u(e){return e&&e.__esModule?e:{default:e}}
  function o (line 292) | function o(u){return(0,r.default)((0,t.default)(u,void 0,e.default),u+"")}
  function r (line 294) | function r(e){return e&&e.__esModule?e:{default:e}}
  function t (line 296) | function t(e){return e&&e.__esModule?e:{default:e}}
  function o (line 298) | function o(e){return e&&e.__esModule?e:{default:e}}
  function s (line 298) | function s(o){if(!(0,r.default)(o)||(0,e.default)(o)!=u)return!1;var n=(...
  function u (line 300) | function u(e){return e&&e.__esModule?e:{default:e}}
  function i (line 300) | function i(u){if(!(0,t.default)(u))return!1;var i=(0,e.default)(u);retur...
  function u (line 302) | function u(e){return e&&e.__esModule?e:{default:e}}
  function t (line 304) | function t(e){return e&&e.__esModule?e:{default:e}}
  function o (line 304) | function o(t,o){var u;if("function"!=typeof o)throw new TypeError(r);ret...
  function a (line 306) | function a(e){return e&&e.__esModule?e:{default:e}}
  function s (line 308) | function s(e){return e&&e.__esModule?e:{default:e}}
  function a (line 310) | function a(e){return e&&e.__esModule?e:{default:e}}
  function e (line 312) | function e(e,r,t){var o=-1,a=e.length;r<0&&(r=-r>a?0:a+r),(t=t>a?a:t)<0&...
  function t (line 314) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 314) | function r(t,r,u){var o=t.length;return u=void 0===u?o:u,!r&&u>=o?t:(0,e...
  function a (line 316) | function a(e){return s.test(e)}
  function e (line 318) | function e(e){return e.split("")}
  function h (line 320) | function h(f){return f.match(_)||[]}
  function t (line 322) | function t(e){return e&&e.__esModule?e:{default:e}}
  function a (line 322) | function a(t){return(0,r.default)(t)?(0,u.default)(t):(0,e.default)(t)}
  function i (line 324) | function i(e){return e&&e.__esModule?e:{default:e}}
  function a (line 324) | function a(i){return function(a){a=(0,u.default)(a);var o=(0,r.default)(...
  function t (line 326) | function t(e){return e&&e.__esModule?e:{default:e}}
  function t (line 328) | function t(e){return e&&e.__esModule?e:{default:e}}
  function u (line 328) | function u(t){return(0,r.default)((0,e.default)(t).toLowerCase())}
  function e (line 330) | function e(e,t,r,o){var u=-1,l=null==e?0:e.length;for(o&&l&&(r=e[++u]);+...
  function e (line 332) | function e(e){return function(t){return null==e?void 0:e[t]}}
  function u (line 334) | function u(e){return e&&e.__esModule?e:{default:e}}
  function r (line 336) | function r(e){return e&&e.__esModule?e:{default:e}}
  function s (line 336) | function s(r){return(r=(0,u.default)(r))&&r.replace(t,e.default).replace...
  function t (line 338) | function t(t){return t.match(e)||[]}
  function t (line 340) | function t(t){return e.test(t)}
  function q (line 342) | function q(u){return u.match(k)||[]}
  function d (line 344) | function d(e){return e&&e.__esModule?e:{default:e}}
  function o (line 344) | function o(d,o,i){return d=(0,t.default)(d),void 0===(o=i?void 0:o)?(0,r...
  function t (line 346) | function t(e){return e&&e.__esModule?e:{default:e}}
  function o (line 346) | function o(t){return function(a){return(0,e.default)((0,u.default)((0,r....
  function t (line 348) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 350) | function r(e){return e&&e.__esModule?e:{default:e}}
  function t (line 350) | function t(){if(!arguments.length)return[];var r=arguments[0];return(0,e...
  function i (line 352) | function i(e){return e&&e.__esModule?e:{default:e}}
  function l (line 352) | function l(e){var i=Math[e];return function(e,l){if(e=(0,r.default)(e),(...
  function t (line 354) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 356) | function r(e){return e&&e.__esModule?e:{default:e}}
  function t (line 356) | function t(r){var t=(0,e.default)(r);return t.__chain__=!0,t}
  function a (line 358) | function a(e){return e&&e.__esModule?e:{default:e}}
  function i (line 358) | function i(a,i,o){i=(o?(0,r.default)(a,i,o):void 0===i)?1:l((0,t.default...
  function e (line 360) | function e(e,t,o){return e==e&&(void 0!==o&&(e=e<=o?e:o),void 0!==t&&(e=...
  function u (line 362) | function u(e){return e&&e.__esModule?e:{default:e}}
  function r (line 362) | function r(u,r,d){return void 0===d&&(d=r,r=void 0),void 0!==d&&(d=(d=(0...
  function t (line 364) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 364) | function r(){this.__data__=new e.default,this.size=0}
  function e (line 366) | function e(e){var t=this.__data__,r=t.delete(e);return this.size=t.size,r}
  function e (line 368) | function e(e){return this.__data__.get(e)}
  function e (line 370) | function e(e){return this.__data__.has(e)}
  function a (line 372) | function a(e){return e&&e.__esModule?e:{default:e}}
  function i (line 372) | function i(a,i){var u=this.__data__;if(u instanceof e.default){var _=u._...
  function o (line 374) | function o(e){return e&&e.__esModule?e:{default:e}}
  function i (line 374) | function i(t){var r=this.__data__=new e.default(t);this.size=r.size}
  function r (line 376) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 376) | function u(r,u){return r&&(0,e.default)(u,(0,t.default)(u),r)}
  function r (line 378) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 378) | function u(r,u){return r&&(0,e.default)(u,(0,t.default)(u),r)}
  function o (line 381) | function o(e){return e&&e.__esModule?e:{default:e}}
  function l (line 381) | function l(e,o){if(o)return e.slice();var t=e.length,r=s?s(t):new e.cons...
  function e (line 383) | function e(e,r){for(var t=-1,o=null==e?0:e.length,u=0,l=[];++t<o;){var a...
  function e (line 385) | function e(){return[]}
  function t (line 387) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 389) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 389) | function u(r,u){return(0,e.default)(r,(0,t.default)(r),u)}
  function o (line 391) | function o(e){return e&&e.__esModule?e:{default:e}}
  function r (line 393) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 393) | function u(r,u){return(0,e.default)(r,(0,t.default)(r),u)}
  function t (line 395) | function t(e){return e&&e.__esModule?e:{default:e}}
  function u (line 395) | function u(t,u,a){var s=u(t);return(0,r.default)(t)?s:(0,e.default)(s,a(...
  function u (line 397) | function u(e){return e&&e.__esModule?e:{default:e}}
  function s (line 397) | function s(u){return(0,e.default)(u,r.default,t.default)}
  function u (line 399) | function u(e){return e&&e.__esModule?e:{default:e}}
  function s (line 399) | function s(u){return(0,e.default)(u,r.default,t.default)}
  function r (line 401) | function r(e){return e&&e.__esModule?e:{default:e}}
  function r (line 403) | function r(e){return e&&e.__esModule?e:{default:e}}
  function r (line 405) | function r(e){return e&&e.__esModule?e:{default:e}}
  function l (line 407) | function l(e){return e&&e.__esModule?e:{default:e}}
  function r (line 409) | function r(e){var r=e.length,n=new e.constructor(r);return r&&"string"==...
  function r (line 411) | function r(e){return e&&e.__esModule?e:{default:e}}
  function t (line 413) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 413) | function r(t){var r=new t.constructor(t.byteLength);return new e.default...
  function r (line 415) | function r(e){return e&&e.__esModule?e:{default:e}}
  function t (line 415) | function t(r,t){var u=t?(0,e.default)(r.buffer):r.buffer;return new r.co...
  function t (line 417) | function t(t){var r=new t.constructor(t.source,e.exec(t));return r.lastI...
  function t (line 419) | function t(e){return e&&e.__esModule?e:{default:e}}
  function o (line 419) | function o(e){return u?Object(u.call(e)):{}}
  function r (line 421) | function r(e){return e&&e.__esModule?e:{default:e}}
  function t (line 421) | function t(r,t){var u=t?(0,e.default)(r.buffer):r.buffer;return new r.co...
  function o (line 423) | function o(e){return e&&e.__esModule?e:{default:e}}
  function U (line 423) | function U(o,U,g){var B=o.constructor;switch(U){case f:return(0,e.defaul...
  function u (line 425) | function u(e){return e&&e.__esModule?e:{default:e}}
  function o (line 425) | function o(u){return"function"!=typeof u.constructor||(0,r.default)(u)?{...
  function r (line 427) | function r(e){return e&&e.__esModule?e:{default:e}}
  function a (line 427) | function a(r){return(0,t.default)(r)&&(0,e.default)(r)==u}
  function u (line 429) | function u(e){return e&&e.__esModule?e:{default:e}}
  function r (line 431) | function r(e){return e&&e.__esModule?e:{default:e}}
  function a (line 431) | function a(r){return(0,t.default)(r)&&(0,e.default)(r)==u}
  function u (line 433) | function u(e){return e&&e.__esModule?e:{default:e}}
  function v (line 435) | function v(e){return e&&e.__esModule?e:{default:e}}
  function Z (line 435) | function Z(v,E,M,k,x,O){var U,w=E&I,D=E&S,K=E&m;if(M&&(U=x?M(v,k,x,O):M(...
  function r (line 437) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 437) | function u(r){return(0,e.default)(r,t)}
  function r (line 439) | function r(e){return e&&e.__esModule?e:{default:e}}
  function o (line 439) | function o(r){return(0,e.default)(r,t|u)}
  function t (line 441) | function t(e){return e&&e.__esModule?e:{default:e}}
  function o (line 441) | function o(t,o){return o="function"==typeof o?o:void 0,(0,e.default)(t,r...
  function t (line 443) | function t(e){return e&&e.__esModule?e:{default:e}}
  function u (line 443) | function u(t,u){return u="function"==typeof u?u:void 0,(0,e.default)(t,r...
  function t (line 445) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 445) | function r(){return new e.default(this.value(),this.__chain__)}
  function e (line 447) | function e(e){for(var r=-1,t=null==e?0:e.length,o=0,u=[];++r<t;){var l=e...
  function a (line 449) | function a(e){return e&&e.__esModule?e:{default:e}}
  function s (line 449) | function s(){var a=arguments.length;if(!a)return[];for(var s=Array(a-1),...
  function t (line 451) | function t(t){return this.__data__.set(t,e),this}
  function a (line 453) | function a(e){return e&&e.__esModule?e:{default:e}}
  function u (line 453) | function u(t){var r=-1,a=null==t?0:t.length;for(this.__data__=new e.defa...
  function e (line 455) | function e(e,r){for(var t=-1,u=null==e?0:e.length;++t<u;)if(r(e[t],t,e))...
  function e (line 457) | function e(e,t){return e.has(t)}
  function a (line 459) | function a(e){return e&&e.__esModule?e:{default:e}}
  function f (line 459) | function f(a,f,n,o,s,d){var l=n&u,v=a.length,c=f.length;if(v!=c&&!(l&&c>...
  function e (line 461) | function e(e){var r=-1,t=Array(e.size);return e.forEach(function(e,o){t[...
  function e (line 463) | function e(e){var r=-1,t=Array(e.size);return e.forEach(function(e){t[++...
  function o (line 465) | function o(e){return e&&e.__esModule?e:{default:e}}
  function h (line 465) | function h(e,o,m,h,A,w,x){switch(m){case _:if(e.byteLength!=o.byteLength...
  function e (line 467) | function e(t){return t&&t.__esModule?t:{default:t}}
  function u (line 467) | function u(e,o,u,a,f,c){var i=u&r,s=(0,t.default)(e),l=s.length;if(l!=(0...
  function s (line 469) | function s(e){return e&&e.__esModule?e:{default:e}}
  function p (line 469) | function p(s,o,p,q,v,y){var b=(0,l.default)(s),w=(0,l.default)(o),A=b?j:...
  function t (line 471) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 471) | function r(t,l,s,a,d){return t===l||(null==t||null==l||!(0,u.default)(t)...
  function t (line 473) | function t(e){return e&&e.__esModule?e:{default:e}}
  function i (line 473) | function i(t,i,f,n){var l=f.length,o=l,s=!n;if(null==t)return!o;for(t=Ob...
  function t (line 475) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 475) | function r(t){return t==t&&!(0,e.default)(t)}
  function t (line 477) | function t(e){return e&&e.__esModule?e:{default:e}}
  function u (line 477) | function u(t){for(var u=(0,r.default)(t),a=u.length;a--;){var o=u[a],s=t...
  function e (line 479) | function e(e,t){return function(r){return null!=r&&(r[e]===t&&(void 0!==...
  function u (line 481) | function u(e){return e&&e.__esModule?e:{default:e}}
  function a (line 481) | function a(u){var a=(0,t.default)(u);return 1==a.length&&a[0][2]?(0,r.de...
  function e (line 483) | function e(e,t){return null!=e&&t in Object(e)}
  function l (line 485) | function l(e){return e&&e.__esModule?e:{default:e}}
  function i (line 485) | function i(l,i,d){for(var f=-1,n=(i=(0,e.default)(i,l)).length,o=!1;++f<...
  function r (line 487) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 487) | function u(r,u){return null!=r&&(0,t.default)(r,u,e.default)}
  function l (line 489) | function l(e){return e&&e.__esModule?e:{default:e}}
  function o (line 489) | function o(l,o){return(0,u.default)(l)&&(0,a.default)(o)?(0,s.default)((...
  function e (line 491) | function e(e){return function(t){return null==t?void 0:t[e]}}
  function t (line 493) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 493) | function r(t){return function(r){return(0,e.default)(r,t)}}
  function s (line 495) | function s(e){return e&&e.__esModule?e:{default:e}}
  function a (line 495) | function a(s){return(0,t.default)(s)?(0,e.default)((0,u.default)(s)):(0,...
  function a (line 497) | function a(e){return e&&e.__esModule?e:{default:e}}
  function o (line 497) | function o(a){return"function"==typeof a?a:null==a?r.default:"object"==t...
  function a (line 499) | function a(e){return e&&e.__esModule?e:{default:e}}
  function f (line 499) | function f(a){var f=null==a?0:a.length,i=t.default;return a=f?(0,r.defau...
  function e (line 501) | function e(e,r,t){var u=t.length;if(null==e)return!u;for(e=Object(e);u--...
  function t (line 503) | function t(e){return e&&e.__esModule?e:{default:e}}
  function u (line 503) | function u(t){var u=(0,r.default)(t);return function(r){return(0,e.defau...
  function t (line 505) | function t(e){return e&&e.__esModule?e:{default:e}}
  function o (line 505) | function o(t){return(0,r.default)((0,e.default)(t,u))}
  function t (line 507) | function t(e){return e&&e.__esModule?e:{default:e}}
  function u (line 507) | function u(t,u){return null==u||(0,e.default)(t,u,(0,r.default)(u))}
  function e (line 509) | function e(e,r,t,o){for(var u=-1,l=null==e?0:e.length;++u<l;){var a=e[u]...
  function e (line 511) | function e(e){return function(r,t,o){for(var u=-1,n=Object(r),a=o(r),f=a...
  function r (line 513) | function r(e){return e&&e.__esModule?e:{default:e}}
  function t (line 515) | function t(e){return e&&e.__esModule?e:{default:e}}
  function u (line 515) | function u(t,u){return t&&(0,e.default)(t,u,r.default)}
  function r (line 517) | function r(e){return e&&e.__esModule?e:{default:e}}
  function t (line 517) | function t(r,t){return function(u,n){if(null==u)return u;if(!(0,e.defaul...
  function t (line 519) | function t(e){return e&&e.__esModule?e:{default:e}}
  function t (line 521) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 521) | function r(t,r,u,o){return(0,e.default)(t,function(e,t,a){r(o,e,u(e),a)}...
  function a (line 523) | function a(e){return e&&e.__esModule?e:{default:e}}
  function s (line 523) | function s(a,s){return function(o,d){var f=(0,u.default)(o)?e.default:r....
  function r (line 525) | function r(e){return e&&e.__esModule?e:{default:e}}
  function t (line 527) | function t(e){return e&&e.__esModule?e:{default:e}}
  function u (line 527) | function u(t,u){var s=(0,r.default)(t);return null==u?s:(0,e.default)(s,u)}
  function r (line 529) | function r(e){return e&&e.__esModule?e:{default:e}}
  function d (line 529) | function d(r,t,a){t=a?void 0:t;var l=(0,e.default)(r,o,void 0,void 0,voi...
  function r (line 531) | function r(e){return e&&e.__esModule?e:{default:e}}
  function d (line 531) | function d(r,t,a){t=a?void 0:t;var l=(0,e.default)(r,o,void 0,void 0,voi...
  function t (line 533) | function t(e){return e&&e.__esModule?e:{default:e}}
  function i (line 535) | function i(t){return t&&t.__esModule?t:{default:t}}
  function a (line 535) | function a(i,a,f){var d,c,l,v,s,m,p=0,x=!1,T=!1,h=!0;if("function"!=type...
  function e (line 537) | function e(e,t){return null==e||e!=e?t:e}
  function a (line 539) | function a(e){return e&&e.__esModule?e:{default:e}}
  function u (line 541) | function u(e){return e&&e.__esModule?e:{default:e}}
  function r (line 541) | function r(u,r,s){(void 0===s||(0,t.default)(u[r],s))&&(void 0!==s||r in...
  function t (line 543) | function t(e){return e&&e.__esModule?e:{default:e}}
  function u (line 543) | function u(t){return(0,r.default)(t)&&(0,e.default)(t)}
  function t (line 545) | function t(t,e){if(("constructor"!==e||"function"!=typeof t[e])&&"__prot...
  function r (line 547) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 547) | function u(r){return(0,e.default)(r,(0,t.default)(r))}
  function _ (line 549) | function _(e){return e&&e.__esModule?e:{default:e}}
  function v (line 549) | function v(_,v,y,p,b,A,O){var g=(0,q.default)(_,y),x=(0,q.default)(v,y),...
  function d (line 551) | function d(e){return e&&e.__esModule?e:{default:e}}
  function f (line 551) | function f(d,l,o,n,j){d!==l&&(0,u.default)(l,function(u,a){if(j||(j=new ...
  function r (line 553) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 553) | function u(r,d,s,a,l,o){return(0,t.default)(r)&&(0,t.default)(d)&&(o.set...
  function t (line 555) | function t(e){return e&&e.__esModule?e:{default:e}}
  function s (line 557) | function s(e){return e&&e.__esModule?e:{default:e}}
  function t (line 559) | function t(t,o,r){if("function"!=typeof t)throw new TypeError(e);return ...
  function r (line 561) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 563) | function u(e){return e&&e.__esModule?e:{default:e}}
  function e (line 565) | function e(e,r,t){for(var u=-1,o=null==e?0:e.length;++u<o;)if(t(r,e[u]))...
  function s (line 567) | function s(e){return e&&e.__esModule?e:{default:e}}
  function f (line 567) | function f(s,f,i,d){var o=-1,c=r.default,_=!0,h=s.length,v=[],j=f.length...
  function a (line 569) | function a(e){return e&&e.__esModule?e:{default:e}}
  function e (line 571) | function e(e){var t=null==e?0:e.length;return t?e[t-1]:void 0}
  function d (line 573) | function d(e){return e&&e.__esModule?e:{default:e}}
  function s (line 575) | function s(e){return e&&e.__esModule?e:{default:e}}
  function t (line 577) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 579) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 579) | function u(r,u,l){var o=null==r?0:r.length;return o?(u=l||void 0===u?1:(...
  function r (line 581) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 581) | function u(r,u,l){var o=null==r?0:r.length;return o?(u=o-(u=l||void 0===...
  function t (line 583) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 583) | function r(t,r,u,a){for(var l=t.length,o=a?l:-1;(a?o--:++o<l)&&r(t[o],o,...
  function r (line 585) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 585) | function u(r,u){return r&&r.length?(0,t.default)(r,(0,e.default)(u,3),!0...
  function r (line 587) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 587) | function u(r,u){return r&&r.length?(0,t.default)(r,(0,e.default)(u,3),!0...
  function t (line 589) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 589) | function r(t){return"function"==typeof t?t:e.default}
  function a (line 591) | function a(e){return e&&e.__esModule?e:{default:e}}
  function s (line 591) | function s(a,s){return((0,u.default)(a)?e.default:r.default)(a,(0,t.defa...
  function r (line 593) | function r(e){return e&&e.__esModule?e:{default:e}}
  function e (line 595) | function e(e,t){for(var r=null==e?0:e.length;r--&&!1!==t(e[r],r,e););ret...
  function r (line 597) | function r(e){return e&&e.__esModule?e:{default:e}}
  function t (line 599) | function t(e){return e&&e.__esModule?e:{default:e}}
  function u (line 599) | function u(t,u){return t&&(0,e.default)(t,u,r.default)}
  function t (line 601) | function t(e){return e&&e.__esModule?e:{default:e}}
  function a (line 603) | function a(e){return e&&e.__esModule?e:{default:e}}
  function s (line 603) | function s(a,s){return((0,u.default)(a)?e.default:r.default)(a,(0,t.defa...
  function t (line 605) | function t(e){return e&&e.__esModule?e:{default:e}}
  function a (line 607) | function a(e){return e&&e.__esModule?e:{default:e}}
  function l (line 607) | function l(a,l,s){a=(0,u.default)(a),l=(0,t.default)(l);var i=a.length,o...
  function r (line 609) | function r(e){return e&&e.__esModule?e:{default:e}}
  function t (line 609) | function t(r,t){return(0,e.default)(t,function(e){return[e,r[e]]})}
  function e (line 611) | function e(e){var r=-1,t=Array(e.size);return e.forEach(function(e){t[++...
  function a (line 613) | function a(e){return e&&e.__esModule?e:{default:e}}
  function i (line 613) | function i(a){return function(i){var d=(0,r.default)(i);return d==o?(0,t...
  function t (line 615) | function t(e){return e&&e.__esModule?e:{default:e}}
  function t (line 617) | function t(e){return e&&e.__esModule?e:{default:e}}
  function t (line 619) | function t(e){return e&&e.__esModule?e:{default:e}}
  function t (line 621) | function t(e){return e&&e.__esModule?e:{default:e}}
  function t (line 623) | function t(e){return e&&e.__esModule?e:{default:e}}
  function t (line 625) | function t(e){return e&&e.__esModule?e:{default:e}}
  function s (line 625) | function s(t){return(t=(0,r.default)(t))&&a.test(t)?t.replace(u,e.defaul...
  function t (line 627) | function t(e){return e&&e.__esModule?e:{default:e}}
  function o (line 627) | function o(t){return(t=(0,e.default)(t))&&u.test(t)?t.replace(r,"\\$&"):t}
  function e (line 629) | function e(e,r){for(var t=-1,u=null==e?0:e.length;++t<u;)if(!r(e[t],t,e)...
  function r (line 631) | function r(e){return e&&e.__esModule?e:{default:e}}
  function t (line 631) | function t(r,t){var u=!0;return(0,e.default)(r,function(e,r,a){return u=...
  function s (line 633) | function s(e){return e&&e.__esModule?e:{default:e}}
  function d (line 633) | function d(s,d,i){var l=(0,u.default)(s)?e.default:r.default;return i&&(...
  function t (line 635) | function t(e){return e&&e.__esModule?e:{default:e}}
  function t (line 637) | function t(e){return e&&e.__esModule?e:{default:e}}
  function t (line 639) | function t(e){return e&&e.__esModule?e:{default:e}}
  function a (line 639) | function a(t){return t?(0,e.default)((0,r.default)(t),0,u):0}
  function r (line 641) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 641) | function u(r,u,o,d){var a=r.length;for((o=(0,e.default)(o))<0&&(o=-o>a?0...
  function r (line 643) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 643) | function u(r,u,l,a){var s=null==r?0:r.length;return s?(l&&"number"!=type...
  function t (line 645) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 645) | function r(t,r){var u=[];return(0,e.default)(t,function(e,t,a){r(e,t,a)&...
  function a (line 647) | function a(e){return e&&e.__esModule?e:{default:e}}
  function s (line 647) | function s(a,s){return((0,u.default)(a)?e.default:r.default)(a,(0,t.defa...
  function u (line 649) | function u(e){return e&&e.__esModule?e:{default:e}}
  function a (line 649) | function a(u){return function(a,i,n){var s=Object(a);if(!(0,r.default)(a...
  function u (line 651) | function u(e){return e&&e.__esModule?e:{default:e}}
  function l (line 651) | function l(u,l,n){var d=null==u?0:u.length;if(!d)return-1;var s=null==n?...
  function t (line 653) | function t(e){return e&&e.__esModule?e:{default:e}}
  function e (line 655) | function e(e,t,r){var u;return r(e,function(e,r,o){if(t(e,r,o))return u=...
  function u (line 657) | function u(e){return e&&e.__esModule?e:{default:e}}
  function a (line 657) | function a(u,a){return(0,e.default)(u,(0,t.default)(a,3),r.default)}
  function u (line 659) | function u(e){return e&&e.__esModule?e:{default:e}}
  function d (line 659) | function d(u,d,i){var l=null==u?0:u.length;if(!l)return-1;var s=l-1;retu...
  function r (line 661) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 663) | function u(e){return e&&e.__esModule?e:{default:e}}
  function a (line 663) | function a(u,a){return(0,e.default)(u,(0,t.default)(a,3),r.default)}
  function e (line 665) | function e(e){return e&&e.length?e[0]:void 0}
  function t (line 667) | function t(e){return e&&e.__esModule?e:{default:e}}
  function t (line 669) | function t(e){return e&&e.__esModule?e:{default:e}}
  function u (line 669) | function u(t,u){var a=-1,s=(0,r.default)(t)?Array(t.length):[];return(0,...
  function a (line 671) | function a(e){return e&&e.__esModule?e:{default:e}}
  function s (line 671) | function s(a,s){return((0,u.default)(a)?e.default:t.default)(a,(0,r.defa...
  function r (line 673) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 673) | function u(r,u){return(0,e.default)((0,t.default)(r,u),1)}
  function r (line 675) | function r(e){return e&&e.__esModule?e:{default:e}}
  function a (line 675) | function a(r,a){return(0,e.default)((0,t.default)(r,a),u)}
  function u (line 677) | function u(e){return e&&e.__esModule?e:{default:e}}
  function a (line 677) | function a(u,a,d){return d=void 0===d?1:(0,r.default)(d),(0,e.default)((...
  function t (line 679) | function t(e){return e&&e.__esModule?e:{default:e}}
  function u (line 679) | function u(t){return(null==t?0:t.length)?(0,e.default)(t,r):[]}
  function r (line 681) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 681) | function u(r,u){return(null==r?0:r.length)?(u=void 0===u?1:(0,t.default)...
  function r (line 683) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 683) | function u(r){return(0,e.default)(r,t)}
  function r (line 685) | function r(e){return e&&e.__esModule?e:{default:e}}
  function l (line 687) | function l(e){return e&&e.__esModule?e:{default:e}}
  function s (line 687) | function s(l){return(0,r.default)(function(r){var s=r.length,v=s,c=e.def...
  function t (line 689) | function t(e){return e&&e.__esModule?e:{default:e}}
  function t (line 691) | function t(e){return e&&e.__esModule?e:{default:e}}
  function u (line 693) | function u(e){return e&&e.__esModule?e:{default:e}}
  function s (line 693) | function s(u,s){return null==u?u:(0,e.default)(u,(0,r.default)(s),t.defa...
  function u (line 695) | function u(e){return e&&e.__esModule?e:{default:e}}
  function s (line 695) | function s(u,s){return null==u?u:(0,e.default)(u,(0,t.default)(s),r.defa...
  function r (line 697) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 697) | function u(r,u){return r&&(0,e.default)(r,(0,t.default)(u))}
  function r (line 699) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 699) | function u(r,u){return r&&(0,e.default)(r,(0,t.default)(u))}
  function e (line 701) | function e(e){for(var r=-1,t=null==e?0:e.length,o={};++r<t;){var u=e[r];...
  function t (line 703) | function t(e){return e&&e.__esModule?e:{default:e}}
  function u (line 703) | function u(t,u){return(0,e.default)(u,function(e){return(0,r.default)(t[...
  function u (line 705) | function u(e){return e&&e.__esModule?e:{default:e}}
  function r (line 705) | function r(u){return null==u?[]:(0,e.default)(u,(0,t.default)(u))}
  function u (line 707) | function u(e){return e&&e.__esModule?e:{default:e}}
  function r (line 707) | function r(u){return null==u?[]:(0,e.default)(u,(0,t.default)(u))}
  function r (line 709) | function r(e){return e&&e.__esModule?e:{default:e}}
  function e (line 711) | function e(e,t){return e>t}
  function t (line 713) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 713) | function r(t){return function(r,u){return"string"==typeof r&&"string"==t...
  function r (line 715) | function r(e){return e&&e.__esModule?e:{default:e}}
  function t (line 717) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 719) | function r(e,r){return null!=e&&t.call(e,r)}
  function r (line 721) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 721) | function u(r,u){return null!=r&&(0,t.default)(r,u,e.default)}
  function r (line 723) | function r(r,a,o){return r>=t(a,o)&&r<e(a,o)}
  function u (line 725) | function u(e){return e&&e.__esModule?e:{default:e}}
  function a (line 725) | function a(u,a,d){return a=(0,t.default)(a),void 0===d?(d=a,a=0):d=(0,t....
  function u (line 727) | function u(e){return e&&e.__esModule?e:{default:e}}
  function a (line 727) | function a(u){return"string"==typeof u||!(0,r.default)(u)&&(0,t.default)...
  function r (line 729) | function r(e){return e&&e.__esModule?e:{default:e}}
  function t (line 729) | function t(r,t){return(0,e.default)(t,function(e){return r[e]})}
  function r (line 731) | function r(e){return e&&e.__esModule?e:{default:e}}
  function t (line 731) | function t(r){return null==r?[]:(0,e.default)(r,(0,u.default)(r))}
  function s (line 733) | function s(e){return e&&e.__esModule?e:{default:e}}
  function d (line 733) | function d(s,d,f,l){s=(0,r.default)(s)?s:(0,a.default)(s),f=f&&!l?(0,u.d...
  function t (line 735) | function t(e){return e&&e.__esModule?e:{default:e}}
  function a (line 735) | function a(t,a,l){var n=null==t?0:t.length;if(!n)return-1;var d=null==l?...
  function t (line 737) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 737) | function r(t){return(null==t?0:t.length)?(0,e.default)(t,0,-1):[]}
  function n (line 739) | function n(e){return e&&e.__esModule?e:{default:e}}
  function f (line 739) | function f(n,f,d){for(var i=d?a.default:r.default,o=n[0].length,h=n.leng...
  function r (line 741) | function r(e){return e&&e.__esModule?e:{default:e}}
  function t (line 741) | function t(r){return(0,e.default)(r)?r:[]}
  function a (line 743) | function a(e){return e&&e.__esModule?e:{default:e}}
  function d (line 745) | function d(e){return e&&e.__esModule?e:{default:e}}
  function s (line 747) | function s(e){return e&&e.__esModule?e:{default:e}}
  function t (line 749) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 749) | function r(t,r,u,o){return(0,e.default)(t,function(e,t,n){r(o,u(e),t,n)}...
  function r (line 751) | function r(e){return e&&e.__esModule?e:{default:e}}
  function t (line 751) | function t(r,t){return function(u,n){return(0,e.default)(u,r,t(n),{})}}
  function u (line 753) | function u(e){return e&&e.__esModule?e:{default:e}}
  function r (line 755) | function r(e){return e&&e.__esModule?e:{default:e}}
  function r (line 757) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 757) | function u(r,u){return u.length<2?r:(0,e.default)(r,(0,t.default)(u,0,-1))}
  function l (line 759) | function l(e){return e&&e.__esModule?e:{default:e}}
  function s (line 759) | function s(l,s,d){s=(0,r.default)(s,l);var f=null==(l=(0,u.default)(l,s)...
  function r (line 761) | function r(e){return e&&e.__esModule?e:{default:e}}
  function s (line 763) | function s(e){return e&&e.__esModule?e:{default:e}}
  function t (line 765) | function t(e){return e&&e.__esModule?e:{default:e}}
  function a (line 765) | function a(t){return(0,r.default)(t)&&(0,e.default)(t)==u}
  function t (line 767) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 769) | function r(e){return e&&e.__esModule?e:{default:e}}
  function a (line 769) | function a(r){return!0===r||!1===r||(0,t.default)(r)&&(0,e.default)(r)==u}
  function r (line 771) | function r(e){return e&&e.__esModule?e:{default:e}}
  function a (line 771) | function a(r){return(0,t.default)(r)&&(0,e.default)(r)==u}
  function u (line 773) | function u(e){return e&&e.__esModule?e:{default:e}}
  function r (line 775) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 775) | function u(r){return(0,e.default)(r)&&1===r.nodeType&&!(0,t.default)(r)}
  function l (line 777) | function l(e){return e&&e.__esModule?e:{default:e}}
  function j (line 777) | function j(l){if(null==l)return!0;if((0,i.default)(l)&&((0,u.default)(l)...
  function t (line 779) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 779) | function r(t,r){return(0,e.default)(t,r)}
  function t (line 781) | function t(e){return e&&e.__esModule?e:{default:e}}
  function o (line 781) | function o(t,o,r){var u=(r="function"==typeof r?r:void 0)?r(t,o):void 0;...
  function t (line 783) | function t(e){return e&&e.__esModule?e:{default:e}}
  function u (line 783) | function u(e){return"number"==typeof e&&r(e)}
  function t (line 785) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 785) | function r(t){return"number"==typeof t&&t==(0,e.default)(t)}
  function r (line 787) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 787) | function u(r,u){return r===u||(0,e.default)(r,u,(0,t.default)(u))}
  function r (line 789) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 789) | function u(r,u,a){return a="function"==typeof a?a:void 0,(0,e.default)(r...
  function r (line 791) | function r(e){return e&&e.__esModule?e:{default:e}}
  function a (line 791) | function a(r){return"number"==typeof r||(0,t.default)(r)&&(0,e.default)(...
  function r (line 793) | function r(e){return e&&e.__esModule?e:{default:e}}
  function t (line 793) | function t(r){return(0,e.default)(r)&&r!=+r}
  function u (line 795) | function u(e){return e&&e.__esModule?e:{default:e}}
  function t (line 797) | function t(e){return e&&e.__esModule?e:{default:e}}
  function u (line 797) | function u(t){if((0,r.default)(t))throw new Error(s);return(0,e.default)...
  function e (line 799) | function e(e){return null==e}
  function e (line 801) | function e(e){return null===e}
  function r (line 803) | function r(e){return e&&e.__esModule?e:{default:e}}
  function a (line 803) | function a(r){return(0,t.default)(r)&&(0,e.default)(r)==u}
  function u (line 805) | function u(e){return e&&e.__esModule?e:{default:e}}
  function r (line 807) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 807) | function u(r){return(0,e.default)(r)&&r>=-t&&r<=t}
  function e (line 809) | function e(e){return void 0===e}
  function r (line 811) | function r(e){return e&&e.__esModule?e:{default:e}}
  function a (line 811) | function a(r){return(0,t.default)(r)&&(0,e.default)(r)==u}
  function r (line 813) | function r(e){return e&&e.__esModule?e:{default:e}}
  function a (line 813) | function a(r){return(0,t.default)(r)&&(0,e.default)(r)==u}
  function r (line 815) | function r(e){return e&&e.__esModule?e:{default:e}}
  function a (line 815) | function a(r){return(0,t.default)("function"==typeof r?r:(0,e.default)(r...
  function t (line 817) | function t(e,t){return null==e?"":r.call(e,t)}
  function r (line 819) | function r(e){return e&&e.__esModule?e:{default:e}}
  function t (line 821) | function t(e){return e&&e.__esModule?e:{default:e}}
  function e (line 823) | function e(e,r,t){for(var o=t+1;o--;)if(e[o]===r)return o;return o}
  function a (line 825) | function a(e){return e&&e.__esModule?e:{default:e}}
  function n (line 825) | function n(a,n,i){var l=null==a?0:a.length;if(!l)return-1;var f=l;return...
  function r (line 827) | function r(e){return e&&e.__esModule?e:{default:e}}
  function t (line 829) | function t(e){return e&&e.__esModule?e:{default:e}}
  function e (line 831) | function e(e,t){return e<t}
  function r (line 833) | function r(e){return e&&e.__esModule?e:{default:e}}
  function t (line 835) | function t(e){return e&&e.__esModule?e:{default:e}}
  function u (line 837) | function u(e){return e&&e.__esModule?e:{default:e}}
  function a (line 837) | function a(u,a){var s={};return a=(0,t.default)(a,3),(0,r.default)(u,fun...
  function u (line 839) | function u(e){return e&&e.__esModule?e:{default:e}}
  function a (line 839) | function a(u,a){var s={};return a=(0,t.default)(a,3),(0,r.default)(u,fun...
  function t (line 841) | function t(e){return e&&e.__esModule?e:{default:e}}
  function a (line 841) | function a(t){return(0,r.default)((0,e.default)(t,u))}
  function t (line 843) | function t(e){return e&&e.__esModule?e:{default:e}}
  function a (line 843) | function a(t,a){return(0,r.default)(t,(0,e.default)(a,u))}
  function r (line 845) | function r(e){return e&&e.__esModule?e:{default:e}}
  function t (line 845) | function t(r,t,u){for(var o=-1,l=r.length;++o<l;){var a=r[o],d=t(a);if(n...
  function u (line 847) | function u(e){return e&&e.__esModule?e:{default:e}}
  function d (line 847) | function d(u){return u&&u.length?(0,e.default)(u,r.default,t.default):vo...
  function u (line 849) | function u(e){return e&&e.__esModule?e:{default:e}}
  function a (line 849) | function a(u,a){return u&&u.length?(0,e.default)(u,(0,r.default)(a,2),t....
  function e (line 851) | function e(e,r){for(var t,o=-1,d=e.length;++o<d;){var u=r(e[o]);void 0!=...
  function r (line 853) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 853) | function u(r,u){var a=null==r?0:r.length;return a?(0,e.default)(r,u)/a:t}
  function r (line 855) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 855) | function u(r){return(0,e.default)(r,t.default)}
  function r (line 857) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 857) | function u(r,u){return(0,t.default)(r,(0,e.default)(u,2))}
  function t (line 859) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 861) | function r(e){return e&&e.__esModule?e:{default:e}}
  function r (line 863) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 865) | function u(e){return e&&e.__esModule?e:{default:e}}
  function d (line 865) | function d(u){return u&&u.length?(0,e.default)(u,r.default,t.default):vo...
  function u (line 867) | function u(e){return e&&e.__esModule?e:{default:e}}
  function a (line 867) | function a(u,a){return u&&u.length?(0,e.default)(u,(0,t.default)(a,2),r....
  function _ (line 869) | function _(e){return e&&e.__esModule?e:{default:e}}
  function n (line 869) | function n(_,n,c){var o=(0,s.default)(n),f=(0,t.default)(n,o),d=!((0,i.d...
  function t (line 871) | function t(e){return e&&e.__esModule?e:{default:e}}
  function t (line 873) | function t(t){if("function"!=typeof t)throw new TypeError(e);return func...
  function e (line 875) | function e(e){for(var t,r=[];!(t=e.next()).done;)r.push(t.value);return r}
  function l (line 877) | function l(e){return e&&e.__esModule?e:{default:e}}
  function q (line 877) | function q(e){if(!e)return[];if((0,u.default)(e))return(0,a.default)(e)?...
  function _ (line 879) | function _(e){return e&&e.__esModule?e:{default:e}}
  function t (line 879) | function t(){void 0===this.__values__&&(this.__values__=(0,e.default)(th...
  function t (line 881) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 881) | function r(t,r){var u=t.length;if(u)return r+=r<0?u:0,(0,e.default)(r,u)...
  function r (line 883) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 883) | function u(r,u){return r&&r.length?(0,e.default)(r,(0,t.default)(u)):voi...
  function u (line 885) | function u(e){return e&&e.__esModule?e:{default:e}}
  function s (line 885) | function s(u){return u=(0,r.default)(u),(0,t.default)(function(t){return...
  function a (line 887) | function a(e){return e&&e.__esModule?e:{default:e}}
  function l (line 887) | function l(a,l){return l=(0,e.default)(l,a),null==(a=(0,r.default)(a,l))...
  function t (line 889) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 889) | function r(t){return(0,e.default)(t)?void 0:t}
  function n (line 891) | function n(e){return e&&e.__esModule?e:{default:e}}
  function i (line 893) | function i(e){return e&&e.__esModule?e:{default:e}}
  function s (line 893) | function s(i,s,d,l){if(!(0,u.default)(i))return i;for(var f=-1,o=(s=(0,r...
  function u (line 895) | function u(e){return e&&e.__esModule?e:{default:e}}
  function a (line 895) | function a(u,a,s){for(var d=-1,f=a.length,l={};++d<f;){var o=a[d],i=(0,e...
  function a (line 897) | function a(e){return e&&e.__esModule?e:{default:e}}
  function n (line 897) | function n(a,n){if(null==a)return{};var l=(0,e.default)((0,u.default)(a)...
  function u (line 899) | function u(e){return e&&e.__esModule?e:{default:e}}
  function a (line 899) | function a(u,a){return(0,r.default)(u,(0,t.default)((0,e.default)(a)))}
  function r (line 901) | function r(e){return e&&e.__esModule?e:{default:e}}
  function t (line 901) | function t(r){return(0,e.default)(2,r)}
  function e (line 903) | function e(e,t){var r=e.length;for(e.sort(t);r--;)e[r]=e[r].value;return e}
  function r (line 905) | function r(e){return e&&e.__esModule?e:{default:e}}
  function t (line 905) | function t(r,t){if(r!==t){var u=void 0!==r,l=null===r,i=r==r,o=(0,e.defa...
  function r (line 907) | function r(e){return e&&e.__esModule?e:{default:e}}
  function t (line 907) | function t(r,t,i){for(var n=-1,u=r.criteria,a=t.criteria,d=u.length,o=i....
  function l (line 909) | function l(e){return e&&e.__esModule?e:{default:e}}
  function s (line 909) | function s(l,s,d){var f=-1;s=(0,e.default)(s.length?s:[n.default],(0,a.d...
  function u (line 911) | function u(e){return e&&e.__esModule?e:{default:e}}
  function t (line 911) | function t(u,t,l,d){return null==u?[]:((0,r.default)(t)||(t=null==t?[]:[...
  function n (line 913) | function n(e){return e&&e.__esModule?e:{default:e}}
  function f (line 913) | function f(n){return(0,s.default)(function(s){return s=(0,r.default)(s,(...
  function t (line 915) | function t(e){return e&&e.__esModule?e:{default:e}}
  function t (line 917) | function t(e){return e&&e.__esModule?e:{default:e}}
  function d (line 919) | function d(e){return e&&e.__esModule?e:{default:e}}
  function t (line 921) | function t(e){return e&&e.__esModule?e:{default:e}}
  function t (line 923) | function t(e){return e&&e.__esModule?e:{default:e}}
  function t (line 925) | function t(t,o){var u="";if(!t||o<1||o>e)return u;do{o%2&&(u+=t),(o=r(o/...
  function t (line 927) | function t(e){return e&&e.__esModule?e:{default:e}}
  function y (line 929) | function y(f){for(var u=_.lastIndex=0;_.test(f);)++u;return u}
  function t (line 931) | function t(e){return e&&e.__esModule?e:{default:e}}
  function i (line 931) | function i(t){return(0,r.default)(t)?(0,u.default)(t):(0,e.default)(t)}
  function s (line 933) | function s(e){return e&&e.__esModule?e:{default:e}}
  function d (line 933) | function d(s,d){var f=(d=void 0===d?" ":(0,r.default)(d)).length;if(f<2)...
  function a (line 935) | function a(e){return e&&e.__esModule?e:{default:e}}
  function f (line 935) | function f(a,f,l){a=(0,u.default)(a);var o=(f=(0,t.default)(f))?(0,r.def...
  function a (line 937) | function a(e){return e&&e.__esModule?e:{default:e}}
  function d (line 937) | function d(a,d,i){a=(0,u.default)(a);var s=(d=(0,t.default)(d))?(0,r.def...
  function a (line 939) | function a(e){return e&&e.__esModule?e:{default:e}}
  function d (line 939) | function d(a,d,i){a=(0,u.default)(a);var s=(d=(0,t.default)(d))?(0,r.def...
  function t (line 941) | function t(e){return e&&e.__esModule?e:{default:e}}
  function a (line 941) | function a(e,t,a){return a||null==t?t=0:t&&(t=+t),o((0,r.default)(e).rep...
  function a (line 943) | function a(e){return e&&e.__esModule?e:{default:e}}
  function a (line 945) | function a(e){return e&&e.__esModule?e:{default:e}}
  function t (line 947) | function t(e){return e&&e.__esModule?e:{default:e}}
  function t (line 949) | function t(e){return e&&e.__esModule?e:{default:e}}
  function u (line 949) | function u(t,u){return(0,e.default)(t,u,function(e,u){return(0,r.default...
  function r (line 951) | function r(e){return e&&e.__esModule?e:{default:e}}
  function r (line 953) | function r(e){return e&&e.__esModule?e:{default:e}}
  function a (line 953) | function a(r){for(var a,t=this;t instanceof e.default;){var u=(0,_.defau...
  function t (line 955) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 955) | function r(t){return function(r){return null==t?void 0:(0,e.default)(t,r)}}
  function e (line 957) | function e(e,r,t,o){for(var u=t-1,f=e.length;++u<f;)if(o(e[u],r))return ...
  function l (line 959) | function l(e){return e&&e.__esModule?e:{default:e}}
  function d (line 959) | function d(l,s,d,o){var i=o?a.default:r.default,n=-1,p=s.length,_=l;for(...
  function t (line 961) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 961) | function r(t,r){return t&&t.length&&r&&r.length?(0,e.default)(t,r):t}
  function r (line 963) | function r(e){return e&&e.__esModule?e:{default:e}}
  function r (line 965) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 965) | function u(r,u,l){return r&&r.length&&u&&u.length?(0,t.default)(r,u,(0,e...
  function t (line 967) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 967) | function r(t,r,u){return t&&t.length&&r&&r.length?(0,e.default)(t,r,void...
  function t (line 969) | function t(e){return e&&e.__esModule?e:{default:e}}
  function s (line 969) | function s(t,a){for(var s=t?a.length:0,l=s-1;s--;){var o=a[s];if(s==l||o...
  function l (line 971) | function l(e){return e&&e.__esModule?e:{default:e}}
  function r (line 973) | function r(r,o){return r+e(t()*(o-r+1))}
  function r (line 975) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 975) | function u(r,u,l){if(l&&"boolean"!=typeof l&&(0,t.default)(r,u,l)&&(u=l=...
  function t (line 977) | function t(t,a,o,u){for(var s=-1,d=r(e((a-t)/(o||1)),0),f=Array(d);d--;)...
  function u (line 979) | function u(e){return e&&e.__esModule?e:{default:e}}
  function a (line 979) | function a(u){return function(a,d,i){return i&&"number"!=typeof i&&(0,t....
  function t (line 981) | function t(e){return e&&e.__esModule?e:{default:e}}
  function t (line 983) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 985) | function r(e){return e&&e.__esModule?e:{default:e}}
  function e (line 987) | function e(e,t,r,o,u){return u(e,function(e,u,n){r=o?(o=!1,e):t(r,e,u,n)...
  function s (line 989) | function s(e){return e&&e.__esModule?e:{default:e}}
  function d (line 989) | function d(s,d,l){var f=(0,a.default)(s)?e.default:t.default,i=arguments...
  function e (line 991) | function e(e,t,r,o){var u=null==e?0:e.length;for(o&&u&&(r=e[--u]);u--;)r...
  function s (line 993) | function s(e){return e&&e.__esModule?e:{default:e}}
  function d (line 993) | function d(s,d,i){var l=(0,a.default)(s)?e.default:u.default,f=arguments...
  function s (line 995) | function s(e){return e&&e.__esModule?e:{default:e}}
  function i (line 995) | function i(s,i){return((0,u.default)(s)?e.default:r.default)(s,(0,a.defa...
  function t (line 997) | function t(e){return e&&e.__esModule?e:{default:e}}
  function u (line 997) | function u(t,u){var a=[];if(!t||!t.length)return a;var s=-1,l=[],f=t.len...
  function a (line 999) | function a(e){return e&&e.__esModule?e:{default:e}}
  function s (line 999) | function s(a,s,d){return s=(d?(0,t.default)(a,s,d):void 0===s)?1:(0,r.de...
  function t (line 1001) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 1001) | function r(){var t=arguments,r=(0,e.default)(t[0]);return t.length<3?r:r...
  function r (line 1003) | function r(e){return e&&e.__esModule?e:{default:e}}
  function o (line 1003) | function o(r,o){if("function"!=typeof r)throw new TypeError(u);return o=...
  function u (line 1005) | function u(e){return e&&e.__esModule?e:{default:e}}
  function o (line 1005) | function o(u,o,a){var l=-1,d=(o=(0,e.default)(o,u)).length;for(d||(d=1,u...
  function t (line 1007) | function t(e){return null==e?e:r.call(e)}
  function r (line 1009) | function r(e){return e&&e.__esModule?e:{default:e}}
  function t (line 1011) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 1011) | function r(t){var r=t.length;return r?t[(0,e.default)(0,r-1)]:void 0}
  function t (line 1013) | function t(e){return e&&e.__esModule?e:{default:e}}
  function u (line 1013) | function u(t){return(0,e.default)((0,r.default)(t))}
  function u (line 1015) | function u(e){return e&&e.__esModule?e:{default:e}}
  function a (line 1015) | function a(u){return((0,t.default)(u)?e.default:r.default)(u)}
  function r (line 1017) | function r(e){return e&&e.__esModule?e:{default:e}}
  function t (line 1017) | function t(r,t){var u=-1,o=r.length,a=o-1;for(t=void 0===t?o:t;++u<t;){v...
  function u (line 1019) | function u(e){return e&&e.__esModule?e:{default:e}}
  function l (line 1019) | function l(u,l){return(0,t.default)((0,r.default)(u),(0,e.default)(l,0,u...
  function t (line 1021) | function t(e){return e&&e.__esModule?e:{default:e}}
  function l (line 1021) | function l(t,l){var a=(0,u.default)(t);return(0,r.default)(a,(0,e.defaul...
  function i (line 1023) | function i(e){return e&&e.__esModule?e:{default:e}}
  function l (line 1023) | function l(i,l,s){return l=(s?(0,u.default)(i,l,s):void 0===l)?1:(0,a.de...
  function t (line 1025) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 1025) | function r(t,r,u){return null==t?t:(0,e.default)(t,r,u)}
  function t (line 1027) | function t(e){return e&&e.__esModule?e:{default:e}}
  function u (line 1027) | function u(t,u,r,o){return o="function"==typeof o?o:void 0,null==t?t:(0,...
  function t (line 1029) | function t(e){return e&&e.__esModule?e:{default:e}}
  function u (line 1029) | function u(t){return(0,r.default)((0,e.default)(t))}
  function r (line 1031) | function r(e){return e&&e.__esModule?e:{default:e}}
  function t (line 1031) | function t(r){return(0,e.default)((0,u.default)(r))}
  function t (line 1033) | function t(e){return e&&e.__esModule?e:{default:e}}
  function a (line 1033) | function a(t){return((0,u.default)(t)?e.default:r.default)(t)}
  function s (line 1035) | function s(e){return e&&e.__esModule?e:{default:e}}
  function n (line 1035) | function n(s){if(null==s)return 0;if((0,t.default)(s))return(0,u.default...
  function u (line 1037) | function u(e){return e&&e.__esModule?e:{default:e}}
  function l (line 1037) | function l(u,l,a){var d=null==u?0:u.length;return d?(a&&"number"!=typeof...
  function r (line 1039) | function r(e){return e&&e.__esModule?e:{default:e}}
  function r (line 1041) | function r(e){return e&&e.__esModule?e:{default:e}}
  function t (line 1041) | function t(r,t){var u;return(0,e.default)(r,function(e,r,a){return!(u=t(...
  function s (line 1043) | function s(e){return e&&e.__esModule?e:{default:e}}
  function d (line 1043) | function d(s,d,i){var l=(0,u.default)(s)?e.default:t.default;return i&&(...
  function a (line 1045) | function a(e){return e&&e.__esModule?e:{default:e}}
  function r (line 1047) | function r(e){return e&&e.__esModule?e:{default:e}}
  function a (line 1047) | function a(r,t,a,n){t=a(t);for(var d=0,f=null==r?0:r.length,i=t!=t,s=nul...
  function u (line 1049) | function u(e){return e&&e.__esModule?e:{default:e}}
  function a (line 1049) | function a(u,l,a){var d=0,o=null==u?d:u.length;if("number"==typeof l&&l=...
  function t (line 1051) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 1051) | function r(t,r){return(0,e.default)(t,r)}
  function r (line 1053) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 1053) | function u(r,u,a){return(0,t.default)(r,u,(0,e.default)(a,2))}
  function t (line 1055) | function t(e){return e&&e.__esModule?e:{default:e}}
  function u (line 1055) | function u(t,u){var a=null==t?0:t.length;if(a){var d=(0,e.default)(t,u);...
  function t (line 1057) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 1057) | function r(t,r){return(0,e.default)(t,r,!0)}
  function r (line 1059) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 1059) | function u(r,u,a){return(0,t.default)(r,u,(0,e.default)(a,2),!0)}
  function t (line 1061) | function t(e){return e&&e.__esModule?e:{default:e}}
  function u (line 1061) | function u(t,u){if(null==t?0:t.length){var d=(0,e.default)(t,u,!0)-1;if(...
  function r (line 1063) | function r(e){return e&&e.__esModule?e:{default:e}}
  function t (line 1063) | function t(r,t){for(var u=-1,a=r.length,o=0,f=[];++u<a;){var d=r[u],l=t?...
  function t (line 1065) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 1065) | function r(t){return t&&t.length?(0,e.default)(t):[]}
  function r (line 1067) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 1067) | function u(r,u){return r&&r.length?(0,t.default)(r,(0,e.default)(u,2)):[]}
  function l (line 1069) | function l(e){return e&&e.__esModule?e:{default:e}}
  function o (line 1069) | function o(l,o,f){return f&&"number"!=typeof f&&(0,u.default)(l,o,f)&&(o...
  function n (line 1071) | function n(e){return e&&e.__esModule?e:{default:e}}
  function i (line 1071) | function i(n,i){if("function"!=typeof n)throw new TypeError(s);return i=...
  function t (line 1073) | function t(e){return e&&e.__esModule?e:{default:e}}
  function l (line 1075) | function l(e){return e&&e.__esModule?e:{default:e}}
  function s (line 1075) | function s(l,s,a){return l=(0,u.default)(l),a=null==a?0:(0,e.default)((0...
  function e (line 1077) | function e(){return{}}
  function e (line 1079) | function e(){return""}
  function e (line 1081) | function e(){return!0}
  function t (line 1083) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 1085) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 1085) | function u(r){return r&&r.length?(0,e.default)(r,t.default):0}
  function r (line 1087) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 1087) | function u(r,u){return r&&r.length?(0,t.default)(r,(0,e.default)(u,2)):0}
  function t (line 1089) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 1089) | function r(t){var r=null==t?0:t.length;return r?(0,e.default)(t,1,r):[]}
  function r (line 1091) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 1091) | function u(r,u,o){return r&&r.length?(u=o||void 0===u?1:(0,t.default)(u)...
  function r (line 1093) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 1093) | function u(r,u,l){var o=null==r?0:r.length;return o?(u=o-(u=l||void 0===...
  function r (line 1095) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 1095) | function u(r,u){return r&&r.length?(0,t.default)(r,(0,e.default)(u,3),!1...
  function r (line 1097) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 1097) | function u(r,u){return r&&r.length?(0,t.default)(r,(0,e.default)(u,3)):[]}
  function e (line 1099) | function e(e,t){return t(e),e}
  function t (line 1101) | function t(e){return e&&e.__esModule?e:{default:e}}
  function u (line 1101) | function u(t,u,a,d){return void 0===t||(0,e.default)(t,r[a])&&!o.call(d,...
  function r (line 1103) | function r(r){return"\\"+e[r]}
  function u (line 1111) | function u(e){return e&&e.__esModule?e:{default:e}}
  function p (line 1113) | function p(e){return e&&e.__esModule?e:{default:e}}
  function m (line 1113) | function m(p,b,m){var y=o.default.imports._.templateSettings||o.default;...
  function r (line 1115) | function r(e){return e&&e.__esModule?e:{default:e}}
  function n (line 1115) | function n(r,n,a){var u=!0,o=!0;if("function"!=typeof r)throw new TypeEr...
  function e (line 1117) | function e(e,t){return t(e)}
  function u (line 1119) | function u(e){return e&&e.__esModule?e:{default:e}}
  function n (line 1119) | function n(u,n){if((u=(0,t.default)(u))<1||u>a)return[];var o=s,f=i(u,s)...
  function e (line 1121) | function e(){return this}
  function t (line 1123) | function t(e){return e&&e.__esModule?e:{default:e}}
  function a (line 1123) | function a(t,a){var s=t;return s instanceof e.default&&(s=s.value()),(0,...
  function t (line 1125) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 1125) | function r(){return(0,e.default)(this.__wrapped__,this.__actions__)}
  function r (line 1127) | function r(e){return e&&e.__esModule?e:{default:e}}
  function t (line 1129) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 1129) | function r(t){return(0,e.default)(t).toLowerCase()}
  function d (line 1131) | function d(e){return e&&e.__esModule?e:{default:e}}
  function l (line 1131) | function l(d){return(0,t.default)(d)?(0,e.default)(d,s.default):(0,u.def...
  function t (line 1133) | function t(e){return e&&e.__esModule?e:{default:e}}
  function a (line 1133) | function a(t){return t?(0,e.default)((0,r.default)(t),-u,u):0===t?t:0}
  function t (line 1135) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 1135) | function r(t){return(0,e.default)(t).toUpperCase()}
  function n (line 1137) | function n(e){return e&&e.__esModule?e:{default:e}}
  function o (line 1137) | function o(n,o,j){var c=(0,s.default)(n),q=c||(0,i.default)(n)||(0,l.def...
  function r (line 1139) | function r(e){return e&&e.__esModule?e:{default:e}}
  function t (line 1139) | function t(r,t){for(var u=r.length;u--&&(0,e.default)(t,r[u],0)>-1;);ret...
  function r (line 1141) | function r(e){return e&&e.__esModule?e:{default:e}}
  function t (line 1141) | function t(r,t){for(var u=-1,o=r.length;++u<o&&(0,e.default)(t,r[u],0)>-...
  function i (line 1143) | function i(e){return e&&e.__esModule?e:{default:e}}
  function n (line 1143) | function n(i,n,f){if((i=(0,s.default)(i))&&(f||void 0===n))return i.repl...
  function i (line 1145) | function i(e){return e&&e.__esModule?e:{default:e}}
  function d (line 1145) | function d(i,d,n){if((i=(0,a.default)(i))&&(n||void 0===d))return i.repl...
  function i (line 1147) | function i(e){return e&&e.__esModule?e:{default:e}}
  function d (line 1147) | function d(i,d,f){if((i=(0,a.default)(i))&&(f||void 0===d))return i.repl...
  function f (line 1149) | function f(e){return e&&e.__esModule?e:{default:e}}
  function v (line 1149) | function v(f,v){var g=o,j=d;if((0,t.default)(v)){var x="separator"in v?v...
  function r (line 1151) | function r(e){return e&&e.__esModule?e:{default:e}}
  function t (line 1151) | function t(r){return(0,e.default)(r,1)}
  function t (line 1153) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 1155) | function r(e){return e&&e.__esModule?e:{default:e}}
  function o (line 1155) | function o(r){return(r=(0,e.default)(r))&&a.test(r)?r.replace(u,t.defaul...
  function u (line 1157) | function u(e){return e&&e.__esModule?e:{default:e}}
  function l (line 1159) | function l(e){return e&&e.__esModule?e:{default:e}}
  function i (line 1159) | function i(l,i,n){var d=-1,o=r.default,c=l.length,_=!0,h=[],v=h;if(n)_=!...
  function s (line 1161) | function s(e){return e&&e.__esModule?e:{default:e}}
  function d (line 1163) | function d(e){return e&&e.__esModule?e:{default:e}}
  function s (line 1165) | function s(e){return e&&e.__esModule?e:{default:e}}
  function t (line 1167) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 1167) | function r(t){return t&&t.length?(0,e.default)(t):[]}
  function r (line 1169) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 1169) | function u(r,u){return r&&r.length?(0,t.default)(r,(0,e.default)(u,2)):[]}
  function t (line 1171) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 1171) | function r(t,r){return r="function"==typeof r?r:void 0,t&&t.length?(0,e....
  function r (line 1173) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 1173) | function u(r){var u=++t;return(0,e.default)(r)+u}
  function t (line 1175) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 1175) | function r(t,r){return null==t||(0,e.default)(t,r)}
  function i (line 1177) | function i(e){return e&&e.__esModule?e:{default:e}}
  function s (line 1177) | function s(i){if(!i||!i.length)return[];var s=0;return i=(0,e.default)(i...
  function t (line 1179) | function t(e){return e&&e.__esModule?e:{default:e}}
  function a (line 1179) | function a(t,a){if(!t||!t.length)return[];var n=(0,u.default)(t);return ...
  function r (line 1181) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 1181) | function u(r,u,s,a){return(0,t.default)(r,u,s((0,e.default)(r,u)),a)}
  function u (line 1183) | function u(e){return e&&e.__esModule?e:{default:e}}
  function r (line 1183) | function r(u,r,a){return null==u?u:(0,e.default)(u,r,(0,t.default)(a))}
  function u (line 1185) | function u(e){return e&&e.__esModule?e:{default:e}}
  function r (line 1185) | function r(u,r,o,n){return n="function"==typeof n?n:void 0,null==u?u:(0,...
  function r (line 1187) | function r(e){return e&&e.__esModule?e:{default:e}}
  function r (line 1189) | function r(e){return e&&e.__esModule?e:{default:e}}
  function t (line 1189) | function t(r){return null==r?[]:(0,e.default)(r,(0,u.default)(r))}
  function u (line 1191) | function u(e){return e&&e.__esModule?e:{default:e}}
  function r (line 1193) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 1193) | function u(r,u){return(0,t.default)((0,e.default)(u),r)}
  function a (line 1195) | function a(e){return e&&e.__esModule?e:{default:e}}
  function t (line 1197) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 1197) | function r(){return(0,e.default)(this)}
  function s (line 1199) | function s(e){return e&&e.__esModule?e:{default:e}}
  function a (line 1199) | function a(){var s=this.__wrapped__;if(s instanceof e.default){var a=s;r...
  function u (line 1201) | function u(e){return e&&e.__esModule?e:{default:e}}
  function a (line 1201) | function a(u,a,f){var s=u.length;if(s<2)return s?(0,t.default)(u[0]):[];...
  function a (line 1203) | function a(e){return e&&e.__esModule?e:{default:e}}
  function d (line 1205) | function d(e){return e&&e.__esModule?e:{default:e}}
  function s (line 1207) | function s(e){return e&&e.__esModule?e:{default:e}}
  function r (line 1209) | function r(e){return e&&e.__esModule?e:{default:e}}
  function e (line 1211) | function e(e,t,r){for(var o=-1,u=e.length,a=t.length,d={};++o<u;){var l=...
  function r (line 1213) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 1213) | function u(r,u){return(0,t.default)(r||[],u||[],e.default)}
  function r (line 1215) | function r(e){return e&&e.__esModule?e:{default:e}}
  function u (line 1215) | function u(r,u){return(0,t.default)(r||[],u||[],e.default)}
  function r (line 1217) | function r(e){return e&&e.__esModule?e:{default:e}}
  function qe (line 1219) | function qe(e){return e&&e.__esModule?e:{default:e}}
  function pe (line 1221) | function pe(e){return e&&e.__esModule?e:{default:e}}
  function _ (line 1223) | function _(e){return e&&e.__esModule?e:{default:e}}
  function z (line 1225) | function z(e){return e&&e.__esModule?e:{default:e}}
  function t (line 1227) | function t(e){return e&&e.__esModule?e:{default:e}}
  function r (line 1229) | function r(e){return e&&e.__esModule?e:{default:e}}
  function _ (line 1231) | function _(e){return e&&e.__esModule?e:{default:e}}
  function v (line 1233) | function v(e){return e&&e.__esModule?e:{default:e}}
  function ie (line 1235) | function ie(e){return e&&e.__esModule?e:{default:e}}
  function ne (line 1237) | function ne(e){return e&&e.__esModule?e:{default:e}}
  function y (line 1239) | function y(e){return e&&e.__esModule?e:{default:e}}
  function j (line 1241) | function j(e){return e&&e.__esModule?e:{default:e}}
  function t (line 1243) | function t(e){return e&&e.__esModule?e:{default:e}}
  function u (line 1245) | function u(e){return e&&e.__esModule?e:{default:e}}
  function S (line 1247) | function S(e){return e&&e.__esModule?e:{default:e}}
  function T (line 1249) | function T(e){return e&&e.__esModule?e:{default:e}}
  function n (line 1251) | function n(e){return e&&e.__esModule?e:{default:e}}
  function j (line 1253) | function j(e){return e&&e.__esModule?e:{default:e}}
  function I (line 1255) | function I(e){return e&&e.__esModule?e:{default:e}}
  function v (line 1257) | function v(e){return e&&e.__esModule?e:{default:e}}
  function F (line 1259) | function F(e){return e&&e.__esModule?e:{default:e}}
  function I (line 1261) | function I(e){return e&&e.__esModule?e:{default:e}}
  function t (line 1263) | function t(_){return _&&_.__esModule?_:{default:_}}
  function r (line 1263) | function r(){var t=new _.default(this.__wrapped__);return t.__actions__=...
  function r (line 1265) | function r(e){return e&&e.__esModule?e:{default:e}}
  function _ (line 1265) | function _(){if(this.__filtered__){var r=new e.default(this);r.__dir__=-...
  function a (line 1267) | function a(a,r,s){for(var o=-1,i=s.length;++o<i;){var c=s[o],d=c.size;sw...
  function _ (line 1269) | function _(e){return e&&e.__esModule?e:{default:e}}
  function u (line 1269) | function u(){var _=this.__wrapped__.value(),u=this.__dir__,n=(0,r.defaul...
  function M (line 1271) | function M(e){return e&&e.__esModule?e:{default:e}}
  function Hu (line 1273) | function Hu(e){return e&&e.__esModule?e:{default:e}}
  function r (line 1275) | function r(e){return e&&e.__esModule?e:{default:e}}
  function o (line 1275) | function o(){if("function"!=typeof WeakMap)return null;var e=new WeakMap...
  function n (line 1275) | function n(e){if(e&&e.__esModule)return e;if(null===e||"object"!=typeof ...

FILE: 17-Modern-JS-Modules-Tooling/final/dist/script.75da7f30.js
  function newRequire (line 13) | function newRequire(name, jumped) {
  function Module (line 61) | function Module(moduleName) {
  function _default (line 148) | function _default(product, quantity) {
  function _interopRequireDefault (line 178) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 197) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 213) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function getRawTag (line 238) | function getRawTag(value) {
  function objectToString (line 287) | function objectToString(value) {
  function _interopRequireDefault (line 307) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseGetTag (line 323) | function baseGetTag(value) {
  function isObjectLike (line 365) | function isObjectLike(value) {
  function _interopRequireDefault (line 383) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function isSymbol (line 405) | function isSymbol(value) {
  function _interopRequireDefault (line 421) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseToNumber (line 434) | function baseToNumber(value) {
  function arrayMap (line 465) | function arrayMap(array, iteratee) {
  function _interopRequireDefault (line 529) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseToString (line 546) | function baseToString(value) {
  function _interopRequireDefault (line 579) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function createMathOperation (line 589) | function createMathOperation(operator, defaultValue) {
  function _interopRequireDefault (line 633) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function isObject (line 688) | function isObject(value) {
  function _interopRequireDefault (line 707) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function toNumber (line 750) | function toNumber(value) {
  function _interopRequireDefault (line 785) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function toFinite (line 814) | function toFinite(value) {
  function _interopRequireDefault (line 841) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function toInteger (line 869) | function toInteger(value) {
  function _interopRequireDefault (line 887) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function after (line 916) | function after(n, func) {
  function identity (line 955) | function identity(value) {
  function _interopRequireDefault (line 973) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function isFunction (line 998) | function isFunction(value) {
  function _interopRequireDefault (line 1021) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 1037) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function isMasked (line 1053) | function isMasked(func) {
  function toSource (line 1080) | function toSource(func) {
  function _interopRequireDefault (line 1112) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseIsNative (line 1144) | function baseIsNative(value) {
  function getValue (line 1171) | function getValue(object, key) {
  function _interopRequireDefault (line 1189) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function getNative (line 1199) | function getNative(object, key) {
  function _interopRequireDefault (line 1218) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 1234) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 1252) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 1279) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function object (line 1293) | function object() {}
  function _interopRequireDefault (line 1325) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function createCtor (line 1335) | function createCtor(Ctor) {
  function _interopRequireDefault (line 1390) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function createBind (line 1405) | function createBind(func, bitmask, thisArg) {
  function apply (line 1437) | function apply(func, thisArg, args) {
  function composeArgs (line 1479) | function composeArgs(args, partials, holders, isCurried) {
  function composeArgsRight (line 1530) | function composeArgsRight(args, partials, holders, isCurried) {
  function countHolders (line 1578) | function countHolders(array, placeholder) {
  function baseLodash (line 1606) | function baseLodash() {// No operation performed.
  function _interopRequireDefault (line 1623) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function LazyWrapper (line 1635) | function LazyWrapper(value) {
  function noop (line 1670) | function noop() {// No operation performed.
  function _interopRequireDefault (line 1687) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 1723) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function getFuncName (line 1738) | function getFuncName(func) {
  function _interopRequireDefault (line 1769) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function LodashWrapper (line 1778) | function LodashWrapper(value, chainAll) {
  function copyArray (line 1806) | function copyArray(source, array) {
  function _interopRequireDefault (line 1834) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function wrapperClone (line 1843) | function wrapperClone(wrapper) {
  function _interopRequireDefault (line 1877) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function lodash (line 2002) | function lodash(value) {
  function _interopRequireDefault (line 2037) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function isLaziable (line 2047) | function isLaziable(func) {
  function shortOut (line 2089) | function shortOut(func) {
  function _interopRequireDefault (line 2123) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function getWrapDetails (line 2161) | function getWrapDetails(source) {
  function insertWrapDetails (line 2187) | function insertWrapDetails(source, details) {
  function constant (line 2229) | function constant(value) {
  function _interopRequireDefault (line 2247) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 2273) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 2305) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function arrayEach (line 2335) | function arrayEach(array, iteratee) {
  function baseFindIndex (line 2369) | function baseFindIndex(array, predicate, fromIndex, fromRight) {
  function baseIsNaN (line 2399) | function baseIsNaN(value) {
  function strictIndexOf (line 2423) | function strictIndexOf(array, value, fromIndex) {
  function _interopRequireDefault (line 2452) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseIndexOf (line 2463) | function baseIndexOf(array, value, fromIndex) {
  function _interopRequireDefault (line 2479) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function arrayIncludes (line 2490) | function arrayIncludes(array, value) {
  function _interopRequireDefault (line 2509) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function updateWrapDetails (line 2533) | function updateWrapDetails(details, bitmask) {
  function _interopRequireDefault (line 2562) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function setWrapToString (line 2574) | function setWrapToString(wrapper, reference, bitmask) {
  function _interopRequireDefault (line 2595) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function createRecurry (line 2622) | function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, pa...
  function getHolder (line 2663) | function getHolder(func) {
  function isIndex (line 2692) | function isIndex(value, length) {
  function _interopRequireDefault (line 2712) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function reorder (line 2727) | function reorder(array, indexes) {
  function replaceHolders (line 2762) | function replaceHolders(array, placeholder) {
  function _interopRequireDefault (line 2808) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function createHybrid (line 2837) | function createHybrid(func, bitmask, thisArg, partials, holders, partial...
  function _interopRequireDefault (line 2922) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function createCurry (line 2933) | function createCurry(func, bitmask, arity) {
  function _interopRequireDefault (line 2976) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function createPartial (line 2993) | function createPartial(func, bitmask, thisArg, partials) {
  function _interopRequireDefault (line 3035) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function mergeData (line 3067) | function mergeData(data, source) {
  function _interopRequireDefault (line 3156) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function createWrap (line 3197) | function createWrap(func, bitmask, thisArg, partials, holders, argPos, a...
  function _interopRequireDefault (line 3265) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function ary (line 3287) | function ary(func, n, guard) {
  function _interopRequireDefault (line 3305) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseAssignValue (line 3316) | function baseAssignValue(object, key, value) {
  function eq (line 3371) | function eq(value, other) {
  function _interopRequireDefault (line 3389) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function assignValue (line 3407) | function assignValue(object, key, value) {
  function _interopRequireDefault (line 3429) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function copyObject (line 3441) | function copyObject(source, props, object, customizer) {
  function _interopRequireDefault (line 3477) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function overRest (line 3491) | function overRest(func, start, transform) {
  function _interopRequireDefault (line 3531) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseRest (line 3541) | function baseRest(func, start) {
  function isLength (line 3584) | function isLength(value) {
  function _interopRequireDefault (line 3602) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function isArrayLike (line 3629) | function isArrayLike(value) {
  function _interopRequireDefault (line 3651) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function isIterateeCall (line 3663) | function isIterateeCall(value, index, object) {
  function _interopRequireDefault (line 3691) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function createAssigner (line 3700) | function createAssigner(assigner) {
  function isPrototype (line 3747) | function isPrototype(value) {
  function baseTimes (line 3772) | function baseTimes(n, iteratee) {
  function _interopRequireDefault (line 3797) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseIsArguments (line 3809) | function baseIsArguments(value) {
  function _interopRequireDefault (line 3827) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function stubFalse (line 3884) | function stubFalse() {
  function _interopRequireDefault (line 3903) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 3954) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseIsTypedArray (line 3994) | function baseIsTypedArray(value) {
  function baseUnary (line 4015) | function baseUnary(func) {
  function _interopRequireDefault (line 4033) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 4078) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 4123) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function arrayLikeKeys (line 4139) | function arrayLikeKeys(value, inherited) {
  function overArg (line 4179) | function overArg(func, transform) {
  function _interopRequireDefault (line 4197) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 4215) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseKeys (line 4230) | function baseKeys(object) {
  function _interopRequireDefault (line 4262) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function keys (line 4292) | function keys(object) {
  function _interopRequireDefault (line 4318) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function nativeKeysIn (line 4389) | function nativeKeysIn(object) {
  function _interopRequireDefault (line 4417) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseKeysIn (line 4432) | function baseKeysIn(object) {
  function _interopRequireDefault (line 4465) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function keysIn (line 4490) | function keysIn(object) {
  function _interopRequireDefault (line 4510) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 4562) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 4612) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 4659) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function isKey (line 4673) | function isKey(value, object) {
  function _interopRequireDefault (line 4699) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 4715) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function hashClear (line 4724) | function hashClear() {
  function hashDelete (line 4749) | function hashDelete(key) {
  function _interopRequireDefault (line 4767) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function hashGet (line 4787) | function hashGet(key) {
  function _interopRequireDefault (line 4810) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function hashHas (line 4827) | function hashHas(key) {
  function _interopRequireDefault (line 4844) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function hashSet (line 4859) | function hashSet(key, value) {
  function _interopRequireDefault (line 4886) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function Hash (line 4895) | function Hash(entries) {
  function listCacheClear (line 4929) | function listCacheClear() {
  function _interopRequireDefault (line 4946) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function assocIndexOf (line 4956) | function assocIndexOf(array, key) {
  function _interopRequireDefault (line 4980) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function listCacheDelete (line 4997) | function listCacheDelete(key) {
  function _interopRequireDefault (line 5029) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function listCacheGet (line 5040) | function listCacheGet(key) {
  function _interopRequireDefault (line 5058) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function listCacheHas (line 5069) | function listCacheHas(key) {
  function _interopRequireDefault (line 5085) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function listCacheSet (line 5097) | function listCacheSet(key, value) {
  function _interopRequireDefault (line 5131) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function ListCache (line 5140) | function ListCache(entries) {
  function _interopRequireDefault (line 5171) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 5191) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function mapCacheClear (line 5200) | function mapCacheClear() {
  function isKeyable (line 5226) | function isKeyable(value) {
  function _interopRequireDefault (line 5243) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function getMapData (line 5253) | function getMapData(map, key) {
  function _interopRequireDefault (line 5270) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function mapCacheDelete (line 5281) | function mapCacheDelete(key) {
  function _interopRequireDefault (line 5299) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function mapCacheGet (line 5310) | function mapCacheGet(key) {
  function _interopRequireDefault (line 5326) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function mapCacheHas (line 5337) | function mapCacheHas(key) {
  function _interopRequireDefault (line 5353) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function mapCacheSet (line 5365) | function mapCacheSet(key, value) {
  function _interopRequireDefault (line 5393) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function MapCache (line 5402) | function MapCache(entries) {
  function _interopRequireDefault (line 5431) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function memoize (line 5480) | function memoize(func, resolver) {
  function _interopRequireDefault (line 5517) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function memoizeCapped (line 5530) | function memoizeCapped(func) {
  function _interopRequireDefault (line 5554) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 5595) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function toString (line 5618) | function toString(value) {
  function _interopRequireDefault (line 5640) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function castPath (line 5650) | function castPath(value, object) {
  function _interopRequireDefault (line 5670) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function toKey (line 5682) | function toKey(value) {
  function _interopRequireDefault (line 5705) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseGet (line 5715) | function baseGet(object, path) {
  function _interopRequireDefault (line 5739) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function get (line 5766) | function get(object, path, defaultValue) {
  function _interopRequireDefault (line 5783) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseAt (line 5793) | function baseAt(object, paths) {
  function arrayPush (line 5824) | function arrayPush(array, values) {
  function _interopRequireDefault (line 5852) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function isFlattenable (line 5864) | function isFlattenable(value) {
  function _interopRequireDefault (line 5882) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseFlatten (line 5895) | function baseFlatten(array, depth, predicate, isStrict, result) {
  function _interopRequireDefault (line 5931) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function flatten (line 5947) | function flatten(array) {
  function _interopRequireDefault (line 5968) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function flatRest (line 5977) | function flatRest(func) {
  function _interopRequireDefault (line 5995) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 6027) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 6047) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function isPlainObject (line 6093) | function isPlainObject(value) {
  function _interopRequireDefault (line 6124) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function isError (line 6148) | function isError(value) {
  function _interopRequireDefault (line 6173) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 6216) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function before (line 6238) | function before(n, func) {
  function _interopRequireDefault (line 6277) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 6350) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 6403) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseSlice (line 6486) | function baseSlice(array, start, end) {
  function _interopRequireDefault (line 6523) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function castSlice (line 6534) | function castSlice(array, start, end) {
  function hasUnicode (line 6571) | function hasUnicode(string) {
  function asciiToArray (line 6592) | function asciiToArray(string) {
  function unicodeToArray (line 6641) | function unicodeToArray(string) {
  function _interopRequireDefault (line 6661) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function stringToArray (line 6670) | function stringToArray(string) {
  function _interopRequireDefault (line 6692) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function createCaseFirst (line 6701) | function createCaseFirst(methodName) {
  function _interopRequireDefault (line 6723) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 6757) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function capitalize (line 6774) | function capitalize(string) {
  function arrayReduce (line 6800) | function arrayReduce(array, iteratee, accumulator, initAccum) {
  function basePropertyOf (line 6832) | function basePropertyOf(object) {
  function _interopRequireDefault (line 6850) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 7071) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function deburr (line 7109) | function deburr(string) {
  function asciiWords (line 7134) | function asciiWords(string) {
  function hasUnicodeWord (line 7158) | function hasUnicodeWord(string) {
  function unicodeWords (line 7227) | function unicodeWords(string) {
  function _interopRequireDefault (line 7249) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function words (line 7270) | function words(string, pattern, guard) {
  function _interopRequireDefault (line 7297) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function createCompounder (line 7312) | function createCompounder(callback) {
  function _interopRequireDefault (line 7332) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 7370) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function castArray (line 7405) | function castArray() {
  function _interopRequireDefault (line 7432) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function createRound (line 7445) | function createRound(methodName) {
  function _interopRequireDefault (line 7476) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 7512) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function chain (line 7543) | function chain(value) {
  function _interopRequireDefault (line 7565) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function chunk (line 7592) | function chunk(array, size, guard) {
  function baseClamp (line 7635) | function baseClamp(number, lower, upper) {
  function _interopRequireDefault (line 7663) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function clamp (line 7684) | function clamp(number, lower, upper) {
  function _interopRequireDefault (line 7715) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function stackClear (line 7724) | function stackClear() {
  function stackDelete (line 7748) | function stackDelete(key) {
  function stackGet (line 7774) | function stackGet(key) {
  function stackHas (line 7797) | function stackHas(key) {
  function _interopRequireDefault (line 7817) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function stackSet (line 7832) | function stackSet(key, value) {
  function _interopRequireDefault (line 7874) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function Stack (line 7883) | function Stack(entries) {
  function _interopRequireDefault (line 7908) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseAssign (line 7919) | function baseAssign(object, source) {
  function _interopRequireDefault (line 7937) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseAssignIn (line 7948) | function baseAssignIn(object, source) {
  function _interopRequireDefault (line 7965) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function cloneBuffer (line 7988) | function cloneBuffer(buffer, isDeep) {
  function arrayFilter (line 8018) | function arrayFilter(array, predicate) {
  function stubArray (line 8063) | function stubArray() {
  function _interopRequireDefault (line 8081) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 8123) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function copySymbols (line 8133) | function copySymbols(source, object) {
  function _interopRequireDefault (line 8155) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 8191) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function copySymbolsIn (line 8201) | function copySymbolsIn(source, object) {
  function _interopRequireDefault (line 8219) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseGetAllKeys (line 8232) | function baseGetAllKeys(object, keysFunc, symbolsFunc) {
  function _interopRequireDefault (line 8253) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function getAllKeys (line 8262) | function getAllKeys(object) {
  function _interopRequireDefault (line 8282) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function getAllKeysIn (line 8292) | function getAllKeysIn(object) {
  function _interopRequireDefault (line 8310) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 8328) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 8346) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 8374) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function initCloneArray (line 8452) | function initCloneArray(array) {
  function _interopRequireDefault (line 8476) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 8492) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function cloneArrayBuffer (line 8501) | function cloneArrayBuffer(arrayBuffer) {
  function _interopRequireDefault (line 8519) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function cloneDataView (line 8529) | function cloneDataView(dataView, isDeep) {
  function cloneRegExp (line 8554) | function cloneRegExp(regexp) {
  function _interopRequireDefault (line 8572) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function cloneSymbol (line 8585) | function cloneSymbol(symbol) {
  function _interopRequireDefault (line 8601) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function cloneTypedArray (line 8611) | function cloneTypedArray(typedArray, isDeep) {
  function _interopRequireDefault (line 8636) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function initCloneByTag (line 8671) | function initCloneByTag(object, tag, isDeep) {
  function _interopRequireDefault (line 8730) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function initCloneObject (line 8739) | function initCloneObject(object) {
  function _interopRequireDefault (line 8757) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseIsMap (line 8769) | function baseIsMap(value) {
  function _interopRequireDefault (line 8789) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 8826) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseIsSet (line 8838) | function baseIsSet(value) {
  function _interopRequireDefault (line 8858) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 8933) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseClone (line 8989) | function baseClone(value, bitmask, customizer, key, object, stack) {
  function _interopRequireDefault (line 9084) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function clone (line 9115) | function clone(value) {
  function _interopRequireDefault (line 9131) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function cloneDeep (line 9155) | function cloneDeep(value) {
  function _interopRequireDefault (line 9171) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function cloneDeepWith (line 9205) | function cloneDeepWith(value, customizer) {
  function _interopRequireDefault (line 9222) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function cloneWith (line 9258) | function cloneWith(value, customizer) {
  function _interopRequireDefault (line 9275) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function wrapperCommit (line 9303) | function wrapperCommit() {
  function compact (line 9332) | function compact(array) {
  function _interopRequireDefault (line 9367) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function concat (line 9391) | function concat() {
  function setCacheAdd (line 9432) | function setCacheAdd(value) {
  function setCacheHas (line 9457) | function setCacheHas(value) {
  function _interopRequireDefault (line 9477) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function SetCache (line 9487) | function SetCache(values) {
  function arraySome (line 9520) | function arraySome(array, predicate) {
  function cacheHas (line 9551) | function cacheHas(cache, key) {
  function _interopRequireDefault (line 9571) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function equalArrays (line 9590) | function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
  function mapToArray (line 9667) | function mapToArray(map) {
  function setToArray (line 9693) | function setToArray(set) {
  function _interopRequireDefault (line 9724) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function equalByTag (line 9764) | function equalByTag(object, other, tag, bitmask, customizer, equalFunc, ...
  function _interopRequireDefault (line 9845) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function equalObjects (line 9869) | function equalObjects(object, other, bitmask, customizer, equalFunc, sta...
  function _interopRequireDefault (line 9960) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseIsEqualDeep (line 9990) | function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, ...
  function _interopRequireDefault (line 10049) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseIsEqual (line 10065) | function baseIsEqual(value, other, bitmask, customizer, stack) {
  function _interopRequireDefault (line 10091) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseIsMatch (line 10107) | function baseIsMatch(object, source, matchData, customizer) {
  function _interopRequireDefault (line 10164) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function isStrictComparable (line 10174) | function isStrictComparable(value) {
  function _interopRequireDefault (line 10192) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function getMatchData (line 10201) | function getMatchData(object) {
  function matchesStrictComparable (line 10233) | function matchesStrictComparable(key, srcValue) {
  function _interopRequireDefault (line 10259) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseMatches (line 10268) | function baseMatches(source) {
  function baseHasIn (line 10298) | function baseHasIn(object, key) {
  function _interopRequireDefault (line 10324) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function hasPath (line 10335) | function hasPath(object, path, hasFunc) {
  function _interopRequireDefault (line 10373) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function hasIn (line 10401) | function hasIn(object, path) {
  function _interopRequireDefault (line 10429) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseMatchesProperty (line 10443) | function baseMatchesProperty(path, srcValue) {
  function baseProperty (line 10471) | function baseProperty(key) {
  function _interopRequireDefault (line 10489) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function basePropertyDeep (line 10498) | function basePropertyDeep(path) {
  function _interopRequireDefault (line 10522) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function property (line 10546) | function property(path) {
  function _interopRequireDefault (line 10570) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseIteratee (line 10579) | function baseIteratee(value) {
  function _interopRequireDefault (line 10615) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function cond (line 10649) | function cond(pairs) {
  function baseConformsTo (line 10690) | function baseConformsTo(object, source, props) {
  function _interopRequireDefault (line 10726) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseConforms (line 10735) | function baseConforms(source) {
  function _interopRequireDefault (line 10756) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function conforms (line 10785) | function conforms(source) {
  function _interopRequireDefault (line 10803) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function conformsTo (line 10829) | function conformsTo(object, source) {
  function arrayAggregator (line 10853) | function arrayAggregator(array, setter, iteratee, accumulator) {
  function createBaseFor (line 10882) | function createBaseFor(fromRight) {
  function _interopRequireDefault (line 10913) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 10941) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseForOwn (line 10951) | function baseForOwn(object, iteratee) {
  function _interopRequireDefault (line 10967) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function createBaseEach (line 10977) | function createBaseEach(eachFunc, fromRight) {
  function _interopRequireDefault (line 11015) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 11038) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseAggregator (line 11051) | function baseAggregator(collection, setter, iteratee, accumulator) {
  function _interopRequireDefault (line 11076) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function createAggregator (line 11086) | function createAggregator(setter, initializer) {
  function _interopRequireDefault (line 11108) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 11159) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function create (line 11195) | function create(prototype, properties) {
  function _interopRequireDefault (line 11212) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function curry (line 11258) | function curry(func, arity, guard) {
  function _interopRequireDefault (line 11279) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function curryRight (line 11322) | function curryRight(func, arity, guard) {
  function _interopRequireDefault (line 11343) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 11381) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function debounce (line 11444) | function debounce(func, wait, options) {
  function defaultTo (line 11601) | function defaultTo(value, defaultValue) {
  function _interopRequireDefault (line 11623) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 11694) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function assignMergeValue (line 11705) | function assignMergeValue(object, key, value) {
  function _interopRequireDefault (line 11725) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function isArrayLikeObject (line 11752) | function isArrayLikeObject(value) {
  function safeGet (line 11774) | function safeGet(object, key) {
  function _interopRequireDefault (line 11800) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function toPlainObject (line 11826) | function toPlainObject(value) {
  function _interopRequireDefault (line 11870) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseMergeDeep (line 11887) | function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customi...
  function _interopRequireDefault (line 11967) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseMerge (line 11980) | function baseMerge(object, source, srcIndex, customizer, stack) {
  function _interopRequireDefault (line 12016) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function customDefaultsMerge (line 12032) | function customDefaultsMerge(objValue, srcValue, key, object, source, st...
  function _interopRequireDefault (line 12057) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 12111) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseDelay (line 12159) | function baseDelay(func, wait, args) {
  function _interopRequireDefault (line 12183) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 12222) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function arrayIncludesWith (line 12265) | function arrayIncludesWith(array, value, comparator) {
  function _interopRequireDefault (line 12300) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseDifference (line 12316) | function baseDifference(array, values, iteratee, comparator) {
  function _interopRequireDefault (line 12382) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function last (line 12432) | function last(array) {
  function _interopRequireDefault (line 12459) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 12516) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 12562) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 12596) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function drop (line 12623) | function drop(array, n, guard) {
  function _interopRequireDefault (line 12648) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function dropRight (line 12675) | function dropRight(array, n, guard) {
  function _interopRequireDefault (line 12699) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseWhile (line 12712) | function baseWhile(array, predicate, isDrop, fromRight) {
  function _interopRequireDefault (line 12735) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function dropRightWhile (line 12772) | function dropRightWhile(array, predicate) {
  function _interopRequireDefault (line 12790) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function dropWhile (line 12827) | function dropWhile(array, predicate) {
  function _interopRequireDefault (line 12843) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function castFunction (line 12852) | function castFunction(value) {
  function _interopRequireDefault (line 12874) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function forEach (line 12906) | function forEach(collection, iteratee) {
  function _interopRequireDefault (line 12928) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function arrayEachRight (line 12946) | function arrayEachRight(array, iteratee) {
  function _interopRequireDefault (line 12970) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 12997) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseForOwnRight (line 13007) | function baseForOwnRight(object, iteratee) {
  function _interopRequireDefault (line 13025) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 13054) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function forEachRight (line 13076) | function forEachRight(collection, iteratee) {
  function _interopRequireDefault (line 13098) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 13115) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function endsWith (line 13140) | function endsWith(string, target, position) {
  function _interopRequireDefault (line 13162) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseToPairs (line 13173) | function baseToPairs(object, props) {
  function setToPairs (line 13196) | function setToPairs(set) {
  function _interopRequireDefault (line 13223) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function createToPairs (line 13236) | function createToPairs(keysFunc) {
  function _interopRequireDefault (line 13266) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 13310) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 13323) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 13367) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 13378) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 13411) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function escape (line 13445) | function escape(string) {
  function _interopRequireDefault (line 13462) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function escapeRegExp (line 13486) | function escapeRegExp(string) {
  function arrayEvery (line 13511) | function arrayEvery(array, predicate) {
  function _interopRequireDefault (line 13536) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseEvery (line 13547) | function baseEvery(collection, predicate) {
  function _interopRequireDefault (line 13576) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function every (line 13619) | function every(collection, predicate, guard) {
  function _interopRequireDefault (line 13646) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 13662) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 13675) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function toLength (line 13707) | function toLength(value) {
  function _interopRequireDefault (line 13725) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseFill (line 13737) | function baseFill(array, value, start, end) {
  function _interopRequireDefault (line 13774) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function fill (line 13805) | function fill(array, value, start, end) {
  function _interopRequireDefault (line 13832) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseFilter (line 13842) | function baseFilter(collection, predicate) {
  function _interopRequireDefault (line 13870) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function filter (line 13909) | function filter(collection, predicate) {
  function _interopRequireDefault (line 13930) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function createFind (line 13939) | function createFind(findIndexFunc) {
  function _interopRequireDefault (line 13973) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function findIndex (line 14013) | function findIndex(array, predicate, fromIndex) {
  function _interopRequireDefault (line 14043) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseFindKey (line 14103) | function baseFindKey(collection, predicate, eachFunc) {
  function _interopRequireDefault (line 14130) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function findKey (line 14167) | function findKey(object, predicate) {
  function _interopRequireDefault (line 14187) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function findLastIndex (line 14228) | function findLastIndex(array, predicate, fromIndex) {
  function _interopRequireDefault (line 14259) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 14297) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function findLastKey (line 14334) | function findLastKey(object, predicate) {
  function head (line 14366) | function head(array) {
  function _interopRequireDefault (line 14387) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 14400) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseMap (line 14410) | function baseMap(collection, iteratee) {
  function _interopRequireDefault (line 14437) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function map (line 14481) | function map(collection, iteratee) {
  function _interopRequireDefault (line 14500) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function flatMap (line 14523) | function flatMap(collection, iteratee) {
  function _interopRequireDefault (line 14541) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function flatMapDeep (line 14566) | function flatMapDeep(collection, iteratee) {
  function _interopRequireDefault (line 14586) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function flatMapDepth (line 14609) | function flatMapDepth(collection, iteratee, depth) {
  function _interopRequireDefault (line 14626) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function flattenDeep (line 14645) | function flattenDeep(array) {
  function _interopRequireDefault (line 14664) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function flattenDepth (line 14686) | function flattenDepth(array, depth) {
  function _interopRequireDefault (line 14709) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function flip (line 14732) | function flip(func) {
  function _interopRequireDefault (line 14748) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 14794) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function createFlow (line 14812) | function createFlow(fromRight) {
  function _interopRequireDefault (line 14880) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 14917) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 14957) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function forIn (line 14987) | function forIn(object, iteratee) {
  function _interopRequireDefault (line 15007) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function forInRight (line 15035) | function forInRight(object, iteratee) {
  function _interopRequireDefault (line 15053) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function forOwn (line 15083) | function forOwn(object, iteratee) {
  function _interopRequireDefault (line 15101) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function forOwnRight (line 15129) | function forOwnRight(object, iteratee) {
  function fromPairs (line 15158) | function fromPairs(pairs) {
  function _interopRequireDefault (line 15185) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseFunctions (line 15196) | function baseFunctions(object, props) {
  function _interopRequireDefault (line 15216) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function functions (line 15241) | function functions(object) {
  function _interopRequireDefault (line 15259) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function functionsIn (line 15284) | function functionsIn(object) {
  function _interopRequireDefault (line 15302) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseGt (line 15359) | function baseGt(value, other) {
  function _interopRequireDefault (line 15375) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function createRelationalOperation (line 15384) | function createRelationalOperation(operator) {
  function _interopRequireDefault (line 15409) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 15447) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseHas (line 15499) | function baseHas(object, key) {
  function _interopRequireDefault (line 15517) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function has (line 15546) | function has(object, path) {
  function baseInRange (line 15573) | function baseInRange(number, start, end) {
  function _interopRequireDefault (line 15593) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function inRange (line 15633) | function inRange(number, start, end) {
  function _interopRequireDefault (line 15663) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function isString (line 15685) | function isString(value) {
  function _interopRequireDefault (line 15701) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseValues (line 15713) | function baseValues(object, props) {
  function _interopRequireDefault (line 15733) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function values (line 15761) | function values(object) {
  function _interopRequireDefault (line 15785) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function includes (line 15820) | function includes(collection, value, fromIndex, guard) {
  function _interopRequireDefault (line 15846) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function indexOf (line 15874) | function indexOf(array, value, fromIndex) {
  function _interopRequireDefault (line 15902) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function initial (line 15918) | function initial(array) {
  function _interopRequireDefault (line 15945) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseIntersection (line 15960) | function baseIntersection(arrays, iteratee, comparator) {
  function _interopRequireDefault (line 16023) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function castArrayLikeObject (line 16032) | function castArrayLikeObject(value) {
  function _interopRequireDefault (line 16054) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 16099) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 16156) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 16202) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseInverter (line 16215) | function baseInverter(object, setter, iteratee, accumulator) {
  function _interopRequireDefault (line 16234) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function createInverter (line 16244) | function createInverter(setter, toIteratee) {
  function _interopRequireDefault (line 16266) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 16317) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 16383) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function parent (line 16393) | function parent(object, path) {
  function _interopRequireDefault (line 16417) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseInvoke (line 16429) | function baseInvoke(object, path, args) {
  function _interopRequireDefault (line 16450) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 16491) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 16539) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseIsArrayBuffer (line 16550) | function baseIsArrayBuffer(value) {
  function _interopRequireDefault (line 16570) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 16607) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function isBoolean (line 16629) | function isBoolean(value) {
  function _interopRequireDefault (line 16647) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseIsDate (line 16659) | function baseIsDate(value) {
  function _interopRequireDefault (line 16679) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 16716) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function isElement (line 16735) | function isElement(value) {
  function _interopRequireDefault (line 16765) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function isEmpty (line 16810) | function isEmpty(value) {
  function _interopRequireDefault (line 16850) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function isEqual (line 16880) | function isEqual(value, other) {
  function _interopRequireDefault (line 16896) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function isEqualWith (line 16930) | function isEqualWith(value, other, customizer) {
  function _interopRequireDefault (line 16948) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function isFinite (line 16979) | function isFinite(value) {
  function _interopRequireDefault (line 16995) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function isInteger (line 17023) | function isInteger(value) {
  function _interopRequireDefault (line 17041) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function isMatch (line 17071) | function isMatch(object, source) {
  function _interopRequireDefault (line 17089) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function isMatchWith (line 17123) | function isMatchWith(object, source, customizer) {
  function _interopRequireDefault (line 17142) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function isNumber (line 17173) | function isNumber(value) {
  function _interopRequireDefault (line 17189) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function isNaN (line 17219) | function isNaN(value) {
  function _interopRequireDefault (line 17242) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 17266) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function isNative (line 17297) | function isNative(value) {
  function isNil (line 17335) | function isNil(value) {
  function isNull (line 17366) | function isNull(value) {
  function _interopRequireDefault (line 17384) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseIsRegExp (line 17396) | function baseIsRegExp(value) {
  function _interopRequireDefault (line 17416) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 17451) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function isSafeInteger (line 17483) | function isSafeInteger(value) {
  function isUndefined (line 17514) | function isUndefined(value) {
  function _interopRequireDefault (line 17532) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function isWeakMap (line 17554) | function isWeakMap(value) {
  function _interopRequireDefault (line 17572) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function isWeakSet (line 17594) | function isWeakSet(value) {
  function _interopRequireDefault (line 17612) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function iteratee (line 17659) | function iteratee(func) {
  function join (line 17694) | function join(array, separator) {
  function _interopRequireDefault (line 17710) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 17750) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function strictLastIndexOf (line 17803) | function strictLastIndexOf(array, value, fromIndex) {
  function _interopRequireDefault (line 17833) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function lastIndexOf (line 17860) | function lastIndexOf(array, value, fromIndex) {
  function _interopRequireDefault (line 17889) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 17926) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseLt (line 17965) | function baseLt(value, other) {
  function _interopRequireDefault (line 17983) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 18021) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 18065) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function mapKeys (line 18088) | function mapKeys(object, iteratee) {
  function _interopRequireDefault (line 18113) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function mapValues (line 18143) | function mapValues(object, iteratee) {
  function _interopRequireDefault (line 18166) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function matches (line 18199) | function matches(source) {
  function _interopRequireDefault (line 18217) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function matchesProperty (line 18248) | function matchesProperty(path, srcValue) {
  function _interopRequireDefault (line 18264) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseExtremum (line 18276) | function baseExtremum(array, iteratee, comparator) {
  function _interopRequireDefault (line 18309) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function max (line 18329) | function max(array) {
  function _interopRequireDefault (line 18349) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function maxBy (line 18374) | function maxBy(array, iteratee) {
  function baseSum (line 18397) | function baseSum(array, iteratee) {
  function _interopRequireDefault (line 18425) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseMean (line 18439) | function baseMean(array, iteratee) {
  function _interopRequireDefault (line 18458) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function mean (line 18474) | function mean(array) {
  function _interopRequireDefault (line 18492) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function meanBy (line 18517) | function meanBy(array, iteratee) {
  function _interopRequireDefault (line 18535) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 18585) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 18630) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 18676) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function min (line 18696) | function min(array) {
  function _interopRequireDefault (line 18716) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function minBy (line 18741) | function minBy(array, iteratee) {
  function _interopRequireDefault (line 18769) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function mixin (line 18807) | function mixin(object, source, options) {
  function _interopRequireDefault (line 18851) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function negate (line 18904) | function negate(predicate) {
  function iteratorToArray (line 18947) | function iteratorToArray(iterator) {
  function _interopRequireDefault (line 18988) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function toArray (line 19020) | function toArray(value) {
  function _interopRequireDefault (line 19050) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function wrapperNext (line 19074) | function wrapperNext() {
  function _interopRequireDefault (line 19099) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseNth (line 19109) | function baseNth(array, n) {
  function _interopRequireDefault (line 19134) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function nth (line 19157) | function nth(array, n) {
  function _interopRequireDefault (line 19177) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function nthArg (line 19199) | function nthArg(n) {
  function _interopRequireDefault (line 19224) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseUnset (line 19234) | function baseUnset(object, path) {
  function _interopRequireDefault (line 19252) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function customOmitClone (line 19263) | function customOmitClone(value) {
  function _interopRequireDefault (line 19293) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 19367) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseSet (line 19379) | function baseSet(object, path, value, customizer) {
  function _interopRequireDefault (line 19426) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function basePickBy (line 19437) | function basePickBy(object, paths, predicate) {
  function _interopRequireDefault (line 19472) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function pickBy (line 19492) | function pickBy(object, predicate) {
  function _interopRequireDefault (line 19522) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function omitBy (line 19544) | function omitBy(object, predicate) {
  function _interopRequireDefault (line 19560) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function once (line 19580) | function once(func) {
  function baseSortBy (line 19604) | function baseSortBy(array, comparer) {
  function _interopRequireDefault (line 19627) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function compareAscending (line 19637) | function compareAscending(value, other) {
  function _interopRequireDefault (line 19672) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function compareMultiple (line 19688) | function compareMultiple(object, other, orders) {
  function _interopRequireDefault (line 19742) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseOrderBy (line 19753) | function baseOrderBy(collection, iteratees, orders) {
  function _interopRequireDefault (line 19785) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function orderBy (line 19816) | function orderBy(collection, iteratees, orders, guard) {
  function _interopRequireDefault (line 19856) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function createOver (line 19865) | function createOver(arrayFunc) {
  function _interopRequireDefault (line 19891) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 19924) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 19962) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 20026) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 20067) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseRepeat (line 20118) | function baseRepeat(string, n) {
  function _interopRequireDefault (line 20154) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function unicodeSize (line 20209) | function unicodeSize(string) {
  function _interopRequireDefault (line 20235) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function stringSize (line 20244) | function stringSize(string) {
  function _interopRequireDefault (line 20270) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function createPadding (line 20284) | function createPadding(length, chars) {
  function _interopRequireDefault (line 20314) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function pad (line 20343) | function pad(string, length, chars) {
  function _interopRequireDefault (line 20374) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function padEnd (line 20399) | function padEnd(string, length, chars) {
  function _interopRequireDefault (line 20424) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function padStart (line 20449) | function padStart(string, length, chars) {
  function _interopRequireDefault (line 20470) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function parseInt (line 20502) | function parseInt(string, radix, guard) {
  function _interopRequireDefault (line 20530) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 20592) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 20647) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 20704) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function basePick (line 20715) | function basePick(object, paths) {
  function _interopRequireDefault (line 20735) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 20771) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function wrapperPlant (line 20797) | function wrapperPlant(value) {
  function _interopRequireDefault (line 20832) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function propertyOf (line 20855) | function propertyOf(object) {
  function baseIndexOfWith (line 20881) | function baseIndexOfWith(array, value, fromIndex, comparator) {
  function _interopRequireDefault (line 20914) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function basePullAll (line 20933) | function basePullAll(array, values, iteratee, comparator) {
  function _interopRequireDefault (line 20976) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function pullAll (line 20998) | function pullAll(array, values) {
  function _interopRequireDefault (line 21016) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 21056) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function pullAllBy (line 21081) | function pullAllBy(array, values, iteratee) {
  function _interopRequireDefault (line 21097) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function pullAllWith (line 21122) | function pullAllWith(array, values, comparator) {
  function _interopRequireDefault (line 21140) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function basePullAt (line 21157) | function basePullAt(array, indexes) {
  function _interopRequireDefault (line 21200) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseRandom (line 21257) | function baseRandom(lower, upper) {
  function _interopRequireDefault (line 21277) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function random (line 21317) | function random(lower, upper, floating) {
  function baseRange (line 21385) | function baseRange(start, end, step, fromRight) {
  function _interopRequireDefault (line 21414) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function createRange (line 21423) | function createRange(fromRight) {
  function _interopRequireDefault (line 21456) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 21512) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 21565) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseReduce (line 21618) | function baseReduce(collection, iteratee, accumulator, initAccum, eachFu...
  function _interopRequireDefault (line 21645) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function reduce (line 21684) | function reduce(collection, iteratee, accumulator) {
  function arrayReduceRight (line 21712) | function arrayReduceRight(array, iteratee, accumulator, initAccum) {
  function _interopRequireDefault (line 21746) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function reduceRight (line 21770) | function reduceRight(collection, iteratee, accumulator) {
  function _interopRequireDefault (line 21796) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function reject (line 21832) | function reject(collection, predicate) {
  function _interopRequireDefault (line 21851) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function remove (line 21881) | function remove(array, predicate) {
  function _interopRequireDefault (line 21924) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function repeat (line 21948) | function repeat(string, n, guard) {
  function _interopRequireDefault (line 21970) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function replace (line 21991) | function replace() {
  function _interopRequireDefault (line 22011) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function rest (line 22041) | function rest(func, start) {
  function _interopRequireDefault (line 22066) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function result (line 22097) | function result(object, path, defaultValue) {
  function reverse (line 22160) | function reverse(array) {
  function _interopRequireDefault (line 22176) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 22212) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function arraySample (line 22221) | function arraySample(array) {
  function _interopRequireDefault (line 22240) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseSample (line 22249) | function baseSample(collection) {
  function _interopRequireDefault (line 22269) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function sample (line 22285) | function sample(collection) {
  function _interopRequireDefault (line 22302) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function shuffleSelf (line 22312) | function shuffleSelf(array, size) {
  function _interopRequireDefault (line 22345) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function arraySampleSize (line 22355) | function arraySampleSize(array, n) {
  function _interopRequireDefault (line 22375) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseSampleSize (line 22385) | function baseSampleSize(collection, n) {
  function _interopRequireDefault (line 22410) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function sampleSize (line 22432) | function sampleSize(collection, n, guard) {
  function _interopRequireDefault (line 22455) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function set (line 22485) | function set(object, path, value) {
  function _interopRequireDefault (line 22501) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function setWith (line 22527) | function setWith(object, path, value, customizer) {
  function _interopRequireDefault (line 22546) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function arrayShuffle (line 22555) | function arrayShuffle(array) {
  function _interopRequireDefault (line 22573) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseShuffle (line 22582) | function baseShuffle(collection) {
  function _interopRequireDefault (line 22602) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function shuffle (line 22619) | function shuffle(collection) {
  function _interopRequireDefault (line 22644) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function size (line 22671) | function size(collection) {
  function _interopRequireDefault (line 22705) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function slice (line 22723) | function slice(array, start, end) {
  function _interopRequireDefault (line 22753) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 22791) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseSome (line 22802) | function baseSome(collection, predicate) {
  function _interopRequireDefault (line 22831) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function some (line 22869) | function some(collection, predicate, guard) {
  function _interopRequireDefault (line 22897) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 22955) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseSortedIndexBy (line 22978) | function baseSortedIndexBy(array, value, iteratee, retHighest) {
  function _interopRequireDefault (line 23035) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseSortedIndex (line 23053) | function baseSortedIndex(array, value, retHighest) {
  function _interopRequireDefault (line 23087) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function sortedIndex (line 23106) | function sortedIndex(array, value) {
  function _interopRequireDefault (line 23124) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function sortedIndexBy (line 23151) | function sortedIndexBy(array, value, iteratee) {
  function _interopRequireDefault (line 23169) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function sortedIndexOf (line 23187) | function sortedIndexOf(array, value) {
  function _interopRequireDefault (line 23213) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function sortedLastIndex (line 23233) | function sortedLastIndex(array, value) {
  function _interopRequireDefault (line 23251) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function sortedLastIndexBy (line 23278) | function sortedLastIndexBy(array, value, iteratee) {
  function _interopRequireDefault (line 23296) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function sortedLastIndexOf (line 23314) | function sortedLastIndexOf(array, value) {
  function _interopRequireDefault (line 23340) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseSortedUniq (line 23351) | function baseSortedUniq(array, iteratee) {
  function _interopRequireDefault (line 23382) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function sortedUniq (line 23399) | function sortedUniq(array) {
  function _interopRequireDefault (line 23417) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function sortedUniqBy (line 23435) | function sortedUniqBy(array, iteratee) {
  function _interopRequireDefault (line 23463) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function split (line 23487) | function split(string, separator, limit) {
  function _interopRequireDefault (line 23531) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function spread (line 23573) | function spread(func, start) {
  function _interopRequireDefault (line 23605) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 23649) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function startsWith (line 23674) | function startsWith(string, target, position) {
  function stubObject (line 23709) | function stubObject() {
  function stubString (line 23736) | function stubString() {
  function stubTrue (line 23763) | function stubTrue() {
  function _interopRequireDefault (line 23779) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 23813) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function sum (line 23829) | function sum(array) {
  function _interopRequireDefault (line 23847) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function sumBy (line 23872) | function sumBy(array, iteratee) {
  function _interopRequireDefault (line 23888) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function tail (line 23904) | function tail(array) {
  function _interopRequireDefault (line 23923) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function take (line 23950) | function take(array, n, guard) {
  function _interopRequireDefault (line 23973) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function takeRight (line 24000) | function takeRight(array, n, guard) {
  function _interopRequireDefault (line 24026) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function takeRightWhile (line 24063) | function takeRightWhile(array, predicate) {
  function _interopRequireDefault (line 24081) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function takeWhile (line 24118) | function takeWhile(array, predicate) {
  function tap (line 24155) | function tap(value, interceptor) {
  function _interopRequireDefault (line 24172) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function customDefaultsAssignIn (line 24192) | function customDefaultsAssignIn(objValue, srcValue, key, object) {
  function escapeStringChar (line 24227) | function escapeStringChar(chr) {
  function _interopRequireDefault (line 24285) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 24379) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function template (line 24508) | function template(string, options, guard) {
  function _interopRequireDefault (line 24602) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function throttle (line 24651) | function throttle(func, wait, options) {
  function thru (line 24704) | function thru(value, interceptor) {
  function _interopRequireDefault (line 24724) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function times (line 24754) | function times(n, iteratee) {
  function wrapperToIterator (line 24802) | function wrapperToIterator() {
  function _interopRequireDefault (line 24822) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseWrapperValue (line 24834) | function baseWrapperValue(value, actions) {
  function _interopRequireDefault (line 24858) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function wrapperValue (line 24874) | function wrapperValue() {
  function _interopRequireDefault (line 24895) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 24906) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function toLower (line 24929) | function toLower(value) {
  function _interopRequireDefault (line 24957) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function toPath (line 24976) | function toPath(value) {
  function _interopRequireDefault (line 24998) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function toSafeInteger (line 25027) | function toSafeInteger(value) {
  function _interopRequireDefault (line 25043) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function toUpper (line 25066) | function toUpper(value) {
  function _interopRequireDefault (line 25100) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function transform (line 25132) | function transform(object, iteratee, accumulator) {
  function _interopRequireDefault (line 25167) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function charsEndIndex (line 25178) | function charsEndIndex(strSymbols, chrSymbols) {
  function _interopRequireDefault (line 25198) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function charsStartIndex (line 25209) | function charsStartIndex(strSymbols, chrSymbols) {
  function _interopRequireDefault (line 25240) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function trim (line 25267) | function trim(string, chars, guard) {
  function _interopRequireDefault (line 25305) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function trimEnd (line 25329) | function trimEnd(string, chars, guard) {
  function _interopRequireDefault (line 25365) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function trimStart (line 25389) | function trimStart(string, chars, guard) {
  function _interopRequireDefault (line 25433) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function truncate (line 25479) | function truncate(string, options) {
  function _interopRequireDefault (line 25557) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function unary (line 25574) | function unary(func) {
  function _interopRequireDefault (line 25590) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 25623) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function unescape (line 25648) | function unescape(string) {
  function _interopRequireDefault (line 25669) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 25706) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseUniq (line 25720) | function baseUniq(array, iteratee, comparator) {
  function _interopRequireDefault (line 25794) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 25837) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 25891) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 25931) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function uniq (line 25951) | function uniq(array) {
  function _interopRequireDefault (line 25969) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function uniqBy (line 25994) | function uniqBy(array, iteratee) {
  function _interopRequireDefault (line 26010) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function uniqWith (line 26032) | function uniqWith(array, comparator) {
  function _interopRequireDefault (line 26049) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function uniqueId (line 26071) | function uniqueId(prefix) {
  function _interopRequireDefault (line 26088) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function unset (line 26117) | function unset(object, path) {
  function _interopRequireDefault (line 26141) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function unzip (line 26165) | function unzip(array) {
  function _interopRequireDefault (line 26198) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function unzipWith (line 26221) | function unzipWith(array, iteratee) {
  function _interopRequireDefault (line 26251) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseUpdate (line 26263) | function baseUpdate(object, path, updater, customizer) {
  function _interopRequireDefault (line 26281) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function update (line 26310) | function update(object, path, updater) {
  function _interopRequireDefault (line 26328) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function updateWith (line 26354) | function updateWith(object, path, updater, customizer) {
  function _interopRequireDefault (line 26371) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 26413) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 26429) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 26442) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function valuesIn (line 26468) | function valuesIn(object) {
  function _interopRequireDefault (line 26488) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 26527) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function wrap (line 26551) | function wrap(value, wrapper) {
  function _interopRequireDefault (line 26577) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 26635) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function wrapperChain (line 26664) | function wrapperChain() {
  function _interopRequireDefault (line 26686) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function wrapperReverse (line 26708) | function wrapperReverse() {
  function _interopRequireDefault (line 26748) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseXor (line 26760) | function baseXor(arrays, iteratee, comparator) {
  function _interopRequireDefault (line 26802) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 26847) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 26901) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 26943) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function baseZipObject (line 26981) | function baseZipObject(props, values, assignFunc) {
  function _interopRequireDefault (line 27009) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function zipObject (line 27027) | function zipObject(props, values) {
  function _interopRequireDefault (line 27045) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function zipObjectDeep (line 27062) | function zipObjectDeep(props, values) {
  function _interopRequireDefault (line 27080) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 27248) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 27853) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 27918) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 28190) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 28201) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 28230) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 28285) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 28512) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 28633) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 29157) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 29196) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 29351) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 29366) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 29413) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 29516) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 29959) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 29996) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 30142) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 30213) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 30512) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 30585) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 30893) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 30906) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function lazyClone (line 30916) | function lazyClone() {
  function _interopRequireDefault (line 30939) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function lazyReverse (line 30949) | function lazyReverse() {
  function getView (line 30986) | function getView(start, end, transforms) {
  function _interopRequireDefault (line 31035) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function lazyValue (line 31052) | function lazyValue() {
  function _interopRequireDefault (line 31184) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 34375) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function F (line 36268) | function F() { /* empty */ }
  function F (line 36822) | function F() { /* empty */ }
  function RE (line 38141) | function RE(s, f) {
  function getSubstitution (line 38789) | function getSubstitution(matched, str, position, captures, namedCaptures...
  function asinh (line 40028) | function asinh(x) {
  function F (line 43248) | function F() { /* empty */ }
  function get (line 43338) | function get(target, propertyKey /* , receiver */) {
  function set (line 43452) | function set(target, propertyKey, V /* , receiver */) {
  function define (line 45506) | function define(obj, key, value) {
  function wrap (line 45524) | function wrap(innerFn, outerFn, self, tryLocsList) {
  function tryCatch (line 45548) | function tryCatch(fn, obj, arg) {
  function Generator (line 45569) | function Generator() {}
  function GeneratorFunction (line 45570) | function GeneratorFunction() {}
  function GeneratorFunctionPrototype (line 45571) | function GeneratorFunctionPrototype() {}
  function defineIteratorMethods (line 45602) | function defineIteratorMethods(prototype) {
  function AsyncIterator (line 45639) | function AsyncIterator(generator, PromiseImpl) {
  function makeInvokeMethod (line 45730) | function makeInvokeMethod(innerFn, self, context) {
  function maybeInvokeDelegate (line 45812) | function maybeInvokeDelegate(delegate, context) {
  function pushTryEntry (line 45910) | function pushTryEntry(locs) {
  function resetTryEntry (line 45925) | function resetTryEntry(entry) {
  function Context (line 45932) | function Context(tryLocsList) {
  function values (line 45968) | function values(iterable) {
  function doneResult (line 46004) | function doneResult() {
  function handle (line 46055) | function handle(loc, caught) {
  function _interopRequireDefault (line 46250) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _getRequireWildcardCache (line 46252) | function _getRequireWildcardCache() { if (typeof WeakMap !== "function")...
  function _interopRequireWildcard (line 46254) | function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { ret...
  function _classCallCheck (line 46256) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
  function _classPrivateFieldGet (line 46258) | function _classPrivateFieldGet(receiver, privateMap) { var descriptor = ...
  function Module (line 46378) | function Module(moduleName) {
  function removeErrorOverlay (line 46460) | function removeErrorOverlay() {
  function createErrorOverlay (line 46468) | function createErrorOverlay(data) {
  function getParents (line 46480) | function getParents(bundle, id) {
  function hmrApply (line 46507) | function hmrApply(bundle, asset) {
  function hmrAcceptCheck (line 46523) | function hmrAcceptCheck(bundle, id) {
  function hmrAcceptRun (line 46551) | function hmrAcceptRun(bundle, id) {

FILE: 17-Modern-JS-Modules-Tooling/final/script.js
  class Person (line 126) | class Person {
    method constructor (line 128) | constructor(name) {

FILE: 18-forkify/final/src/js/config.js
  constant API_URL (line 1) | const API_URL = 'https://forkify-api.jonas.io/api/v2/recipes/';
  constant TIMEOUT_SEC (line 2) | const TIMEOUT_SEC = 10;
  constant RES_PER_PAGE (line 3) | const RES_PER_PAGE = 10;
  constant KEY (line 4) | const KEY = '<YOUR_KEY>';
  constant MODAL_CLOSE_SEC (line 5) | const MODAL_CLOSE_SEC = 2.5;

FILE: 18-forkify/final/src/js/views/View.js
  class View (line 3) | class View {
    method render (line 15) | render(data, render = true) {
    method update (line 28) | update(data) {
    method _clear (line 57) | _clear() {
    method renderSpinner (line 61) | renderSpinner() {
    method renderError (line 73) | renderError(message = this._errorMessage) {
    method renderMessage (line 88) | renderMessage(message = this._message) {

FILE: 18-forkify/final/src/js/views/addRecipeView.js
  class AddRecipeView (line 4) | class AddRecipeView extends View {
    method constructor (line 13) | constructor() {
    method toggleWindow (line 19) | toggleWindow() {
    method _addHandlerShowWindow (line 24) | _addHandlerShowWindow() {
    method _addHandlerHideWindow (line 28) | _addHandlerHideWindow() {
    method addHandlerUpload (line 33) | addHandlerUpload(handler) {
    method _generateMarkup (line 42) | _generateMarkup() {}

FILE: 18-forkify/final/src/js/views/bookmarksView.js
  class BookmarksView (line 5) | class BookmarksView extends View {
    method addHandlerRender (line 10) | addHandlerRender(handler) {
    method _generateMarkup (line 14) | _generateMarkup() {

FILE: 18-forkify/final/src/js/views/paginationView.js
  class PaginationView (line 4) | class PaginationView extends View {
    method addHandlerClick (line 7) | addHandlerClick(handler) {
    method _generateMarkup (line 17) | _generateMarkup() {

FILE: 18-forkify/final/src/js/views/previewView.js
  class PreviewView (line 4) | class PreviewView extends View {
    method _generateMarkup (line 7) | _generateMarkup() {

FILE: 18-forkify/final/src/js/views/recipeView.js
  class RecipeView (line 7) | class RecipeView extends View {
    method addHandlerRender (line 12) | addHandlerRender(handler) {
    method addHandlerUpdateServings (line 16) | addHandlerUpdateServings(handler) {
    method addHandlerAddBookmark (line 25) | addHandlerAddBookmark(handler) {
    method _generateMarkup (line 33) | _generateMarkup() {
    method _generateMarkupIngredient (line 124) | _generateMarkupIngredient(ing) {

FILE: 18-forkify/final/src/js/views/resultsView.js
  class ResultsView (line 5) | class ResultsView extends View {
    method _generateMarkup (line 10) | _generateMarkup() {

FILE: 18-forkify/final/src/js/views/searchView.js
  class SearchView (line 1) | class SearchView {
    method getQuery (line 4) | getQuery() {
    method _clearInput (line 10) | _clearInput() {
    method addHandlerSearch (line 14) | addHandlerSearch(handler) {
Condensed preview — 154 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,677K chars).
[
  {
    "path": "01-Fundamentals-Part-1/final/index.html",
    "chars": 768,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-w"
  },
  {
    "path": "01-Fundamentals-Part-1/final/script.js",
    "chars": 12649,
    "preview": "/*\n////////////////////////////////////\n// Linking a JavaScript File\nlet js = \"amazing\";\nconsole.log(40 + 8 + 23 - 10);\n"
  },
  {
    "path": "01-Fundamentals-Part-1/starter/index.html",
    "chars": 729,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-w"
  },
  {
    "path": "02-Fundamentals-Part-2/final/index.html",
    "chars": 767,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-w"
  },
  {
    "path": "02-Fundamentals-Part-2/final/script.js",
    "chars": 16690,
    "preview": "'use strict';\n\n/*\n///////////////////////////////////////\n// Activating Strict Mode\nlet hasDriversLicense = false;\nconst"
  },
  {
    "path": "02-Fundamentals-Part-2/starter/index.html",
    "chars": 767,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-w"
  },
  {
    "path": "02-Fundamentals-Part-2/starter/script.js",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "03-Developer-Skills/final/.prettierrc",
    "chars": 52,
    "preview": "{\n  \"singleQuote\": true,\n  \"arrowParens\": \"avoid\"\n}\n"
  },
  {
    "path": "03-Developer-Skills/final/index.html",
    "chars": 765,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-w"
  },
  {
    "path": "03-Developer-Skills/final/script.js",
    "chars": 6285,
    "preview": "// Remember, we're gonna use strict mode in all scripts now!\n'use strict';\n\n/*\n///////////////////////////////////////\n/"
  },
  {
    "path": "03-Developer-Skills/starter/index.html",
    "chars": 765,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-w"
  },
  {
    "path": "03-Developer-Skills/starter/script.js",
    "chars": 76,
    "preview": "// Remember, we're gonna use strict mode in all scripts now!\n'use strict';\n\n"
  },
  {
    "path": "04-HTML-CSS/final/index.html",
    "chars": 1011,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-w"
  },
  {
    "path": "04-HTML-CSS/final/style.css",
    "chars": 630,
    "preview": "* {\n  margin: 0;\n  padding: 0;\n  box-sizing: border-box;\n}\n\nbody {\n  background-color: rgb(255, 247, 201);\n  font-family"
  },
  {
    "path": "05-Guess-My-Number/final/.prettierrc",
    "chars": 52,
    "preview": "{\n  \"singleQuote\": true,\n  \"arrowParens\": \"avoid\"\n}\n"
  },
  {
    "path": "05-Guess-My-Number/final/index.html",
    "chars": 995,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-w"
  },
  {
    "path": "05-Guess-My-Number/final/script.js",
    "chars": 3855,
    "preview": "'use strict';\n\n/*\nconsole.log(document.querySelector('.message').textContent);\ndocument.querySelector('.message').textCo"
  },
  {
    "path": "05-Guess-My-Number/final/style.css",
    "chars": 1706,
    "preview": "@import url('https://fonts.googleapis.com/css?family=Press+Start+2P&display=swap');\n\n* {\n  margin: 0;\n  padding: 0;\n  bo"
  },
  {
    "path": "05-Guess-My-Number/starter/.prettierrc",
    "chars": 52,
    "preview": "{\n  \"singleQuote\": true,\n  \"arrowParens\": \"avoid\"\n}\n"
  },
  {
    "path": "05-Guess-My-Number/starter/index.html",
    "chars": 995,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-w"
  },
  {
    "path": "05-Guess-My-Number/starter/script.js",
    "chars": 14,
    "preview": "'use strict';\n"
  },
  {
    "path": "05-Guess-My-Number/starter/style.css",
    "chars": 1706,
    "preview": "@import url('https://fonts.googleapis.com/css?family=Press+Start+2P&display=swap');\n\n* {\n  margin: 0;\n  padding: 0;\n  bo"
  },
  {
    "path": "06-Modal/final/.prettierrc",
    "chars": 52,
    "preview": "{\n  \"singleQuote\": true,\n  \"arrowParens\": \"avoid\"\n}\n"
  },
  {
    "path": "06-Modal/final/index.html",
    "chars": 1215,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-w"
  },
  {
    "path": "06-Modal/final/script.js",
    "chars": 834,
    "preview": "'use strict';\n\nconst modal = document.querySelector('.modal');\nconst overlay = document.querySelector('.overlay');\nconst"
  },
  {
    "path": "06-Modal/final/style.css",
    "chars": 1304,
    "preview": "* {\n  margin: 0;\n  padding: 0;\n  box-sizing: inherit;\n}\n\nhtml {\n  font-size: 62.5%;\n  box-sizing: border-box;\n}\n\nbody {\n"
  },
  {
    "path": "06-Modal/starter/.prettierrc",
    "chars": 52,
    "preview": "{\n  \"singleQuote\": true,\n  \"arrowParens\": \"avoid\"\n}\n"
  },
  {
    "path": "06-Modal/starter/index.html",
    "chars": 1215,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-w"
  },
  {
    "path": "06-Modal/starter/script.js",
    "chars": 14,
    "preview": "'use strict';\n"
  },
  {
    "path": "06-Modal/starter/style.css",
    "chars": 1304,
    "preview": "* {\n  margin: 0;\n  padding: 0;\n  box-sizing: inherit;\n}\n\nhtml {\n  font-size: 62.5%;\n  box-sizing: border-box;\n}\n\nbody {\n"
  },
  {
    "path": "07-Pig-Game/final/.prettierrc",
    "chars": 52,
    "preview": "{\n  \"singleQuote\": true,\n  \"arrowParens\": \"avoid\"\n}\n"
  },
  {
    "path": "07-Pig-Game/final/index.html",
    "chars": 1234,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-w"
  },
  {
    "path": "07-Pig-Game/final/script.js",
    "chars": 2785,
    "preview": "'use strict';\n\n// Selecting elements\nconst player0El = document.querySelector('.player--0');\nconst player1El = document."
  },
  {
    "path": "07-Pig-Game/final/style.css",
    "chars": 2773,
    "preview": "@import url('https://fonts.googleapis.com/css2?family=Nunito&display=swap');\n\n* {\n  margin: 0;\n  padding: 0;\n  box-sizin"
  },
  {
    "path": "07-Pig-Game/starter/.prettierrc",
    "chars": 52,
    "preview": "{\n  \"singleQuote\": true,\n  \"arrowParens\": \"avoid\"\n}\n"
  },
  {
    "path": "07-Pig-Game/starter/index.html",
    "chars": 1234,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-w"
  },
  {
    "path": "07-Pig-Game/starter/script.js",
    "chars": 14,
    "preview": "'use strict';\n"
  },
  {
    "path": "07-Pig-Game/starter/style.css",
    "chars": 2743,
    "preview": "@import url('https://fonts.googleapis.com/css2?family=Nunito&display=swap');\n\n* {\n  margin: 0;\n  padding: 0;\n  box-sizin"
  },
  {
    "path": "08-Behind-the-Scenes/final/.prettierrc",
    "chars": 52,
    "preview": "{\n  \"singleQuote\": true,\n  \"arrowParens\": \"avoid\"\n}\n"
  },
  {
    "path": "08-Behind-the-Scenes/final/index.html",
    "chars": 779,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-w"
  },
  {
    "path": "08-Behind-the-Scenes/final/script.js",
    "chars": 4283,
    "preview": "'use strict';\n\n///////////////////////////////////////\n// Scoping in Practice\n\n/*\nfunction calcAge(birthYear) {\n  const "
  },
  {
    "path": "08-Behind-the-Scenes/starter/.prettierrc",
    "chars": 52,
    "preview": "{\n  \"singleQuote\": true,\n  \"arrowParens\": \"avoid\"\n}\n"
  },
  {
    "path": "08-Behind-the-Scenes/starter/index.html",
    "chars": 779,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-w"
  },
  {
    "path": "08-Behind-the-Scenes/starter/script.js",
    "chars": 14,
    "preview": "'use strict';\n"
  },
  {
    "path": "09-Data-Structures-Operators/final/.prettierrc",
    "chars": 52,
    "preview": "{\n  \"singleQuote\": true,\n  \"arrowParens\": \"avoid\"\n}\n"
  },
  {
    "path": "09-Data-Structures-Operators/final/index.html",
    "chars": 933,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-w"
  },
  {
    "path": "09-Data-Structures-Operators/final/script.js",
    "chars": 25641,
    "preview": "'use strict';\n\nconst weekdays = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'];\nconst openingHours = {\n  [weekdays[3]"
  },
  {
    "path": "09-Data-Structures-Operators/starter/.prettierrc",
    "chars": 52,
    "preview": "{\n  \"singleQuote\": true,\n  \"arrowParens\": \"avoid\"\n}\n"
  },
  {
    "path": "09-Data-Structures-Operators/starter/index.html",
    "chars": 933,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-w"
  },
  {
    "path": "09-Data-Structures-Operators/starter/script.js",
    "chars": 1007,
    "preview": "'use strict';\n\n// Data needed for a later exercise\nconst flights =\n  '_Delayed_Departure;fao93766109;txl2133758440;11:25"
  },
  {
    "path": "10-Functions/final/.prettierrc",
    "chars": 52,
    "preview": "{\n  \"singleQuote\": true,\n  \"arrowParens\": \"avoid\"\n}\n"
  },
  {
    "path": "10-Functions/final/index.html",
    "chars": 1073,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-w"
  },
  {
    "path": "10-Functions/final/script.js",
    "chars": 9995,
    "preview": "'use strict';\n\n/*\n///////////////////////////////////////\n// Default Parameters\nconst bookings = [];\n\nconst createBookin"
  },
  {
    "path": "10-Functions/starter/.prettierrc",
    "chars": 52,
    "preview": "{\n  \"singleQuote\": true,\n  \"arrowParens\": \"avoid\"\n}\n"
  },
  {
    "path": "10-Functions/starter/index.html",
    "chars": 1073,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-w"
  },
  {
    "path": "10-Functions/starter/script.js",
    "chars": 14,
    "preview": "'use strict';\n"
  },
  {
    "path": "11-Arrays-Bankist/final/.prettierrc",
    "chars": 52,
    "preview": "{\n  \"singleQuote\": true,\n  \"arrowParens\": \"avoid\"\n}\n"
  },
  {
    "path": "11-Arrays-Bankist/final/index.html",
    "chars": 4201,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-w"
  },
  {
    "path": "11-Arrays-Bankist/final/script.js",
    "chars": 28629,
    "preview": "'use strict';\n\n/////////////////////////////////////////////////\n/////////////////////////////////////////////////\n// BA"
  },
  {
    "path": "11-Arrays-Bankist/final/style.css",
    "chars": 4679,
    "preview": "/*\n * Use this CSS to learn some intersting techniques,\n * in case you're wondering how I built the UI.\n * Have fun! 😁\n "
  },
  {
    "path": "11-Arrays-Bankist/starter/.prettierrc",
    "chars": 52,
    "preview": "{\n  \"singleQuote\": true,\n  \"arrowParens\": \"avoid\"\n}\n"
  },
  {
    "path": "11-Arrays-Bankist/starter/index.html",
    "chars": 4201,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-w"
  },
  {
    "path": "11-Arrays-Bankist/starter/script.js",
    "chars": 2483,
    "preview": "'use strict';\n\n/////////////////////////////////////////////////\n/////////////////////////////////////////////////\n// BA"
  },
  {
    "path": "11-Arrays-Bankist/starter/style.css",
    "chars": 4679,
    "preview": "/*\n * Use this CSS to learn some intersting techniques,\n * in case you're wondering how I built the UI.\n * Have fun! 😁\n "
  },
  {
    "path": "12-Numbers-Dates-Timers-Bankist/final/.prettierrc",
    "chars": 52,
    "preview": "{\n  \"singleQuote\": true,\n  \"arrowParens\": \"avoid\"\n}\n"
  },
  {
    "path": "12-Numbers-Dates-Timers-Bankist/final/index.html",
    "chars": 4201,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-w"
  },
  {
    "path": "12-Numbers-Dates-Timers-Bankist/final/script.js",
    "chars": 16500,
    "preview": "'use strict';\n\n/////////////////////////////////////////////////\n/////////////////////////////////////////////////\n// BA"
  },
  {
    "path": "12-Numbers-Dates-Timers-Bankist/final/style.css",
    "chars": 4679,
    "preview": "/*\n * Use this CSS to learn some intersting techniques,\n * in case you're wondering how I built the UI.\n * Have fun! 😁\n "
  },
  {
    "path": "12-Numbers-Dates-Timers-Bankist/starter/.prettierrc",
    "chars": 52,
    "preview": "{\n  \"singleQuote\": true,\n  \"arrowParens\": \"avoid\"\n}\n"
  },
  {
    "path": "12-Numbers-Dates-Timers-Bankist/starter/index.html",
    "chars": 4201,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-w"
  },
  {
    "path": "12-Numbers-Dates-Timers-Bankist/starter/script.js",
    "chars": 6963,
    "preview": "'use strict';\n\n/////////////////////////////////////////////////\n/////////////////////////////////////////////////\n// BA"
  },
  {
    "path": "12-Numbers-Dates-Timers-Bankist/starter/style.css",
    "chars": 4679,
    "preview": "/*\n * Use this CSS to learn some intersting techniques,\n * in case you're wondering how I built the UI.\n * Have fun! 😁\n "
  },
  {
    "path": "13-Advanced-DOM-Bankist/final/.prettierrc",
    "chars": 52,
    "preview": "{\n  \"singleQuote\": true,\n  \"arrowParens\": \"avoid\"\n}\n"
  },
  {
    "path": "13-Advanced-DOM-Bankist/final/index.html",
    "chars": 12890,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-w"
  },
  {
    "path": "13-Advanced-DOM-Bankist/final/script.js",
    "chars": 13760,
    "preview": "'use strict';\n\nconst modal = document.querySelector('.modal');\nconst overlay = document.querySelector('.overlay');\nconst"
  },
  {
    "path": "13-Advanced-DOM-Bankist/final/style.css",
    "chars": 10902,
    "preview": "/* The page is NOT responsive. You can implement responsiveness yourself if you wanna have some fun 😃 */\n\n:root {\n  --co"
  },
  {
    "path": "13-Advanced-DOM-Bankist/starter/.prettierrc",
    "chars": 52,
    "preview": "{\n  \"singleQuote\": true,\n  \"arrowParens\": \"avoid\"\n}\n"
  },
  {
    "path": "13-Advanced-DOM-Bankist/starter/index.html",
    "chars": 13057,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-w"
  },
  {
    "path": "13-Advanced-DOM-Bankist/starter/script.js",
    "chars": 875,
    "preview": "'use strict';\n\n///////////////////////////////////////\n// Modal window\n\nconst modal = document.querySelector('.modal');\n"
  },
  {
    "path": "13-Advanced-DOM-Bankist/starter/style.css",
    "chars": 10902,
    "preview": "/* The page is NOT responsive. You can implement responsiveness yourself if you wanna have some fun 😃 */\n\n:root {\n  --co"
  },
  {
    "path": "14-OOP/final/.prettierrc",
    "chars": 52,
    "preview": "{\n  \"singleQuote\": true,\n  \"arrowParens\": \"avoid\"\n}\n"
  },
  {
    "path": "14-OOP/final/index.html",
    "chars": 807,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-w"
  },
  {
    "path": "14-OOP/final/script.js",
    "chars": 14987,
    "preview": "'use strict';\n\n/*\n///////////////////////////////////////\n// Constructor Functions and the new Operator\nconst Person = f"
  },
  {
    "path": "14-OOP/starter/.prettierrc",
    "chars": 52,
    "preview": "{\n  \"singleQuote\": true,\n  \"arrowParens\": \"avoid\"\n}\n"
  },
  {
    "path": "14-OOP/starter/index.html",
    "chars": 807,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-w"
  },
  {
    "path": "14-OOP/starter/script.js",
    "chars": 14,
    "preview": "'use strict';\n"
  },
  {
    "path": "15-Mapty/final/.prettierrc",
    "chars": 52,
    "preview": "{\n  \"singleQuote\": true,\n  \"arrowParens\": \"avoid\"\n}\n"
  },
  {
    "path": "15-Mapty/final/index.html",
    "chars": 4866,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-w"
  },
  {
    "path": "15-Mapty/final/other.js",
    "chars": 48,
    "preview": "const firstName = 'Jonas';\nconsole.log(months);\n"
  },
  {
    "path": "15-Mapty/final/script.js",
    "chars": 8904,
    "preview": "'use strict';\n\nclass Workout {\n  date = new Date();\n  id = (Date.now() + '').slice(-10);\n  clicks = 0;\n\n  constructor(co"
  },
  {
    "path": "15-Mapty/final/style.css",
    "chars": 3659,
    "preview": ":root {\n  --color-brand--1: #ffb545;\n  --color-brand--2: #00c46a;\n\n  --color-dark--1: #2d3439;\n  --color-dark--2: #42484"
  },
  {
    "path": "15-Mapty/starter/.prettierrc",
    "chars": 52,
    "preview": "{\n  \"singleQuote\": true,\n  \"arrowParens\": \"avoid\"\n}\n"
  },
  {
    "path": "15-Mapty/starter/index.html",
    "chars": 4341,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-w"
  },
  {
    "path": "15-Mapty/starter/script.js",
    "chars": 635,
    "preview": "'use strict';\n\n// prettier-ignore\nconst months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'Augus"
  },
  {
    "path": "15-Mapty/starter/style.css",
    "chars": 3659,
    "preview": ":root {\n  --color-brand--1: #ffb545;\n  --color-brand--2: #00c46a;\n\n  --color-dark--1: #2d3439;\n  --color-dark--2: #42484"
  },
  {
    "path": "16-Asynchronous/final/.prettierrc",
    "chars": 52,
    "preview": "{\n  \"singleQuote\": true,\n  \"arrowParens\": \"avoid\"\n}\n"
  },
  {
    "path": "16-Asynchronous/final/index.html",
    "chars": 1025,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-w"
  },
  {
    "path": "16-Asynchronous/final/script.js",
    "chars": 22393,
    "preview": "'use strict';\n\nconst btn = document.querySelector('.btn-country');\nconst countriesContainer = document.querySelector('.c"
  },
  {
    "path": "16-Asynchronous/final/style.css",
    "chars": 1925,
    "preview": "* {\n  margin: 0;\n  padding: 0;\n  box-sizing: inherit;\n}\n\nhtml {\n  font-size: 62.5%;\n  box-sizing: border-box;\n}\n\nbody {\n"
  },
  {
    "path": "16-Asynchronous/starter/.prettierrc",
    "chars": 52,
    "preview": "{\n  \"singleQuote\": true,\n  \"arrowParens\": \"avoid\"\n}\n"
  },
  {
    "path": "16-Asynchronous/starter/index.html",
    "chars": 1025,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-w"
  },
  {
    "path": "16-Asynchronous/starter/script.js",
    "chars": 456,
    "preview": "'use strict';\n\nconst btn = document.querySelector('.btn-country');\nconst countriesContainer = document.querySelector('.c"
  },
  {
    "path": "16-Asynchronous/starter/style.css",
    "chars": 1925,
    "preview": "* {\n  margin: 0;\n  padding: 0;\n  box-sizing: inherit;\n}\n\nhtml {\n  font-size: 62.5%;\n  box-sizing: border-box;\n}\n\nbody {\n"
  },
  {
    "path": "17-Modern-JS-Modules-Tooling/final/.prettierrc",
    "chars": 52,
    "preview": "{\n  \"singleQuote\": true,\n  \"arrowParens\": \"avoid\"\n}\n"
  },
  {
    "path": "17-Modern-JS-Modules-Tooling/final/clean.js",
    "chars": 2493,
    "preview": "'use strict';\n\nconst budget = Object.freeze([\n  { value: 250, description: 'Sold old TV 📺', user: 'jonas' },\n  { value: "
  },
  {
    "path": "17-Modern-JS-Modules-Tooling/final/dist/index.html",
    "chars": 872,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-wid"
  },
  {
    "path": "17-Modern-JS-Modules-Tooling/final/dist/index.js",
    "chars": 10667,
    "preview": "// modules are defined as an array\n// [ module function, map of requires ]\n//\n// map of requires is short require name -"
  },
  {
    "path": "17-Modern-JS-Modules-Tooling/final/dist/script.0b6e4fd3.js",
    "chars": 428331,
    "preview": "parcelRequire=function(e,r,t,n){var i,o=\"function\"==typeof parcelRequire&&parcelRequire,u=\"function\"==typeof require&&re"
  },
  {
    "path": "17-Modern-JS-Modules-Tooling/final/dist/script.75da7f30.js",
    "chars": 1679949,
    "preview": "// modules are defined as an array\n// [ module function, map of requires ]\n//\n// map of requires is short require name -"
  },
  {
    "path": "17-Modern-JS-Modules-Tooling/final/index.html",
    "chars": 929,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-w"
  },
  {
    "path": "17-Modern-JS-Modules-Tooling/final/package.json",
    "chars": 438,
    "preview": "{\n  \"name\": \"17-modern-js-modules-tooling\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"script.js\",\n  \"scripts"
  },
  {
    "path": "17-Modern-JS-Modules-Tooling/final/script.js",
    "chars": 3390,
    "preview": "///////////////////////////////////////\n// Exporting and Importing in ES6 Modules\n\n// Importing module\n// import { addTo"
  },
  {
    "path": "17-Modern-JS-Modules-Tooling/final/shoppingCart.js",
    "chars": 651,
    "preview": "// Exporting module\nconsole.log('Exporting module');\n\n// Blocking code\n// console.log('Start fetching users');\n// await "
  },
  {
    "path": "17-Modern-JS-Modules-Tooling/starter/.prettierrc",
    "chars": 52,
    "preview": "{\n  \"singleQuote\": true,\n  \"arrowParens\": \"avoid\"\n}\n"
  },
  {
    "path": "17-Modern-JS-Modules-Tooling/starter/clean.js",
    "chars": 1506,
    "preview": "var budget = [\n  { value: 250, description: 'Sold old TV 📺', user: 'jonas' },\n  { value: -45, description: 'Groceries 🥑'"
  },
  {
    "path": "17-Modern-JS-Modules-Tooling/starter/index.html",
    "chars": 809,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-w"
  },
  {
    "path": "17-Modern-JS-Modules-Tooling/starter/script.js",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "18-forkify/final/.gitignore",
    "chars": 42,
    "preview": "node_modules\ndist\n.parcel-cache\n.DS_Store\n"
  },
  {
    "path": "18-forkify/final/.prettierrc",
    "chars": 52,
    "preview": "{\n  \"singleQuote\": true,\n  \"arrowParens\": \"avoid\"\n}\n"
  },
  {
    "path": "18-forkify/final/README.md",
    "chars": 66,
    "preview": "# forkify Project\n\nRecipe application with custom recipe uploads.\n"
  },
  {
    "path": "18-forkify/final/index.html",
    "chars": 11268,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-w"
  },
  {
    "path": "18-forkify/final/package.json",
    "chars": 472,
    "preview": "{\n  \"name\": \"forkify\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Recipe application\",\n  \"default\": \"index.html\",\n  \"script"
  },
  {
    "path": "18-forkify/final/src/js/config.js",
    "chars": 203,
    "preview": "export const API_URL = 'https://forkify-api.jonas.io/api/v2/recipes/';\nexport const TIMEOUT_SEC = 10;\nexport const RES_P"
  },
  {
    "path": "18-forkify/final/src/js/controller.js",
    "chars": 3563,
    "preview": "import * as model from './model.js';\nimport { MODAL_CLOSE_SEC } from './config.js';\nimport recipeView from './views/reci"
  },
  {
    "path": "18-forkify/final/src/js/helpers.js",
    "chars": 1643,
    "preview": "import { async } from 'regenerator-runtime';\nimport { TIMEOUT_SEC } from './config.js';\n\nconst timeout = function (s) {\n"
  },
  {
    "path": "18-forkify/final/src/js/model.js",
    "chars": 4238,
    "preview": "import { async } from 'regenerator-runtime';\nimport { API_URL, RES_PER_PAGE, KEY } from './config.js';\n// import { getJS"
  },
  {
    "path": "18-forkify/final/src/js/views/View.js",
    "chars": 2731,
    "preview": "import icons from 'url:../../img/icons.svg'; // Parcel 2\n\nexport default class View {\n  _data;\n\n  /**\n   * Render the re"
  },
  {
    "path": "18-forkify/final/src/js/views/addRecipeView.js",
    "chars": 1283,
    "preview": "import View from './View.js';\nimport icons from 'url:../../img/icons.svg'; // Parcel 2\n\nclass AddRecipeView extends View"
  },
  {
    "path": "18-forkify/final/src/js/views/bookmarksView.js",
    "chars": 570,
    "preview": "import View from './View.js';\nimport previewView from './previewView.js';\nimport icons from 'url:../../img/icons.svg'; /"
  },
  {
    "path": "18-forkify/final/src/js/views/paginationView.js",
    "chars": 2094,
    "preview": "import View from './View.js';\nimport icons from 'url:../../img/icons.svg'; // Parcel 2\n\nclass PaginationView extends Vie"
  },
  {
    "path": "18-forkify/final/src/js/views/previewView.js",
    "chars": 1006,
    "preview": "import View from './View.js';\nimport icons from 'url:../../img/icons.svg'; // Parcel 2\n\nclass PreviewView extends View {"
  },
  {
    "path": "18-forkify/final/src/js/views/recipeView.js",
    "chars": 4343,
    "preview": "import View from './View.js';\n\n// import icons from '../img/icons.svg'; // Parcel 1\nimport icons from 'url:../../img/ico"
  },
  {
    "path": "18-forkify/final/src/js/views/resultsView.js",
    "chars": 456,
    "preview": "import View from './View.js';\nimport previewView from './previewView.js';\nimport icons from 'url:../../img/icons.svg'; /"
  },
  {
    "path": "18-forkify/final/src/js/views/searchView.js",
    "chars": 471,
    "preview": "class SearchView {\n  _parentEl = document.querySelector('.search');\n\n  getQuery() {\n    const query = this._parentEl.que"
  },
  {
    "path": "18-forkify/final/src/sass/_base.scss",
    "chars": 1489,
    "preview": "// $color-primary: #f59a83;\n$color-primary: #f38e82;\n$color-grad-1: #fbdb89;\n$color-grad-2: #f48982;\n\n$color-grey-light-"
  },
  {
    "path": "18-forkify/final/src/sass/_components.scss",
    "chars": 2990,
    "preview": "%btn {\n  background-image: $gradient;\n  border-radius: 10rem;\n  border: none;\n  text-transform: uppercase;\n  color: #fff"
  },
  {
    "path": "18-forkify/final/src/sass/_header.scss",
    "chars": 2307,
    "preview": ".header {\n  grid-area: head;\n  background-color: $color-grey-light-1;\n  display: flex;\n  align-items: center;\n  justify-"
  },
  {
    "path": "18-forkify/final/src/sass/_preview.scss",
    "chars": 1922,
    "preview": ".preview {\n  &__link {\n    &:link,\n    &:visited {\n      display: flex;\n      align-items: center;\n      padding: 1.5rem"
  },
  {
    "path": "18-forkify/final/src/sass/_recipe.scss",
    "chars": 3133,
    "preview": ".recipe {\n  background-color: $color-grey-light-1;\n\n  ///////////\n  // FIGURE\n  &__fig {\n    height: 32rem;\n    position"
  },
  {
    "path": "18-forkify/final/src/sass/_searchResults.scss",
    "chars": 555,
    "preview": ".search-results {\n  padding: 3rem 0;\n  display: flex;\n  flex-direction: column;\n}\n\n.results {\n  list-style: none;\n  marg"
  },
  {
    "path": "18-forkify/final/src/sass/_upload.scss",
    "chars": 1716,
    "preview": ".add-recipe-window {\n  position: fixed;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n  width: 100rem;\n  "
  },
  {
    "path": "18-forkify/final/src/sass/main.scss",
    "chars": 136,
    "preview": "@import 'base';\n@import 'components';\n@import 'header';\n@import 'preview';\n@import 'searchResults';\n@import 'recipe';\n@i"
  },
  {
    "path": "18-forkify/starter/.prettierrc",
    "chars": 52,
    "preview": "{\n  \"singleQuote\": true,\n  \"arrowParens\": \"avoid\"\n}\n"
  },
  {
    "path": "18-forkify/starter/index.html",
    "chars": 11263,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-w"
  },
  {
    "path": "18-forkify/starter/src/js/controller.js",
    "chars": 397,
    "preview": "const recipeContainer = document.querySelector('.recipe');\n\nconst timeout = function (s) {\n  return new Promise(function"
  },
  {
    "path": "18-forkify/starter/src/sass/_base.scss",
    "chars": 1489,
    "preview": "// $color-primary: #f59a83;\n$color-primary: #f38e82;\n$color-grad-1: #fbdb89;\n$color-grad-2: #f48982;\n\n$color-grey-light-"
  },
  {
    "path": "18-forkify/starter/src/sass/_components.scss",
    "chars": 2990,
    "preview": "%btn {\n  background-image: $gradient;\n  border-radius: 10rem;\n  border: none;\n  text-transform: uppercase;\n  color: #fff"
  },
  {
    "path": "18-forkify/starter/src/sass/_header.scss",
    "chars": 2307,
    "preview": ".header {\n  grid-area: head;\n  background-color: $color-grey-light-1;\n  display: flex;\n  align-items: center;\n  justify-"
  },
  {
    "path": "18-forkify/starter/src/sass/_preview.scss",
    "chars": 1922,
    "preview": ".preview {\n  &__link {\n    &:link,\n    &:visited {\n      display: flex;\n      align-items: center;\n      padding: 1.5rem"
  },
  {
    "path": "18-forkify/starter/src/sass/_recipe.scss",
    "chars": 3133,
    "preview": ".recipe {\n  background-color: $color-grey-light-1;\n\n  ///////////\n  // FIGURE\n  &__fig {\n    height: 32rem;\n    position"
  },
  {
    "path": "18-forkify/starter/src/sass/_searchResults.scss",
    "chars": 555,
    "preview": ".search-results {\n  padding: 3rem 0;\n  display: flex;\n  flex-direction: column;\n}\n\n.results {\n  list-style: none;\n  marg"
  },
  {
    "path": "18-forkify/starter/src/sass/_upload.scss",
    "chars": 1716,
    "preview": ".add-recipe-window {\n  position: fixed;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n  width: 100rem;\n  "
  },
  {
    "path": "18-forkify/starter/src/sass/main.scss",
    "chars": 136,
    "preview": "@import 'base';\n@import 'components';\n@import 'header';\n@import 'preview';\n@import 'searchResults';\n@import 'recipe';\n@i"
  },
  {
    "path": "README.md",
    "chars": 5006,
    "preview": "# Course Material and FAQ for my Complete JavaScript Course\n\nThis branch of the repo contains starter files and final co"
  }
]

About this extraction

This page contains the full source code of the jonasschmedtmann/complete-javascript-course GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 154 files (2.4 MB), approximately 645.0k tokens, and a symbol index with 2117 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!