From bc42ffe25d00b61b13dfb97a2100fe0369e6efc7 Mon Sep 17 00:00:00 2001 From: BlueCODER108 <118447091+BlueCODER108@users.noreply.github.com> Date: Wed, 7 Dec 2022 23:48:27 +0000 Subject: [PATCH 1/2] Code updated --- exercises/arraysorting.js | 2 +- exercises/converthourstoseconds.js | 2 +- exercises/daysinamonth.js | 2 +- exercises/findMax.js | 4 +- exercises/palindromechecker.js | 4 +- exercises/savingsstrategy.js | 2 +- index.html | 9 +- playground.js | 262 ++++---- .../advanced-weather-app/exercise/index.html | 144 +++++ .../advanced-weather-app/exercise/script.js | 228 +++++++ .../advanced-weather-app/exercise/style.css | 256 ++++++++ .../advanced-weather-app/solution/index.html | 143 +++++ .../advanced-weather-app/solution/script.js | 228 +++++++ .../advanced-weather-app/solution/style.css | 256 ++++++++ .../exercise}/index.html | 24 +- projects/create-netflix/exercise/script.js | 118 ++++ .../exercise}/style.css | 0 projects/create-netflix/solution/index.html | 105 ++++ projects/create-netflix/solution/script.js | 153 +++++ projects/create-netflix/solution/style.css | 188 ++++++ projects/fetchmovies/solution/script.js | 247 -------- projects/fightingGame/exercise/index.html | 98 ++- projects/fightingGame/exercise/script.js | 204 ++++-- .../fightingGame/exercise/sounds/fastheal.mp3 | Bin 0 -> 18059 bytes .../exercise/sounds/fastpunch.mp3 | Bin 0 -> 9915 bytes .../exercise/sounds/quickheal.mp3 | Bin 0 -> 13833 bytes .../fightingGame/exercise/sounds/quickhit.mp3 | Bin 0 -> 6820 bytes .../fightingGame/exercise/sounds/victory.mp3 | Bin 0 -> 30092 bytes projects/fightingGame/exercise/style.css | 144 ++++- projects/fightingGame/solution/index.html | 85 ++- projects/fightingGame/solution/solution.js | 99 +-- .../fightingGame/solution/sounds/victory.mp3 | Bin 0 -> 30092 bytes projects/fightingGame/solution/style.css | 103 +++- .../rockpaperscissors/solution/index.html | 24 +- projects/rockpaperscissors/solution/script.js | 3 +- projects/tip-calculator/exercise/script.js | 36 +- projects/weather-app/exercise/script.js | 12 +- projects/weather-app/solution/script.js | 5 +- yourPlayground.js | 579 ++++++++++++++++++ 39 files changed, 3203 insertions(+), 566 deletions(-) create mode 100644 projects/advanced-weather-app/exercise/index.html create mode 100644 projects/advanced-weather-app/exercise/script.js create mode 100644 projects/advanced-weather-app/exercise/style.css create mode 100644 projects/advanced-weather-app/solution/index.html create mode 100644 projects/advanced-weather-app/solution/script.js create mode 100644 projects/advanced-weather-app/solution/style.css rename projects/{fetchmovies/solution => create-netflix/exercise}/index.html (84%) create mode 100644 projects/create-netflix/exercise/script.js rename projects/{fetchmovies/solution => create-netflix/exercise}/style.css (100%) create mode 100644 projects/create-netflix/solution/index.html create mode 100644 projects/create-netflix/solution/script.js create mode 100644 projects/create-netflix/solution/style.css delete mode 100644 projects/fetchmovies/solution/script.js create mode 100644 projects/fightingGame/exercise/sounds/fastheal.mp3 create mode 100644 projects/fightingGame/exercise/sounds/fastpunch.mp3 create mode 100644 projects/fightingGame/exercise/sounds/quickheal.mp3 create mode 100644 projects/fightingGame/exercise/sounds/quickhit.mp3 create mode 100644 projects/fightingGame/exercise/sounds/victory.mp3 create mode 100644 projects/fightingGame/solution/sounds/victory.mp3 diff --git a/exercises/arraysorting.js b/exercises/arraysorting.js index d40d935..6d46d01 100644 --- a/exercises/arraysorting.js +++ b/exercises/arraysorting.js @@ -1,5 +1,5 @@ // Test you code by forking this repl: -// 👉 +// 👉 COMMING SOON! // Write a function that takes in an array and sort the numbers inside from least to greatest diff --git a/exercises/converthourstoseconds.js b/exercises/converthourstoseconds.js index 99198c8..c04ad32 100644 --- a/exercises/converthourstoseconds.js +++ b/exercises/converthourstoseconds.js @@ -1,7 +1,7 @@ // Test you code by forking this repl: // 👉 https://replit.com/@CleverLance/ConvertHoursToSeconds#solution.js -// https://www.loom.com/share/3de1aa5d007047ef82652530f04600b1 +// Solution 👉 https://www.loom.com/share/3de1aa5d007047ef82652530f04600b1 // Write a function that takes a parameter (hours) and converts // it to seconds diff --git a/exercises/daysinamonth.js b/exercises/daysinamonth.js index a888624..45dcf19 100644 --- a/exercises/daysinamonth.js +++ b/exercises/daysinamonth.js @@ -1,5 +1,5 @@ // Test you code by forking this repl: -// 👉 +// 👉 COMMING SOON! // Create a function that takes the month and year (as integers) // and returns the number of DAYS in that month diff --git a/exercises/findMax.js b/exercises/findMax.js index 78c0cbc..b4be88e 100644 --- a/exercises/findMax.js +++ b/exercises/findMax.js @@ -1,5 +1,7 @@ // Test you code by forking this repl: -// 👉 +// 👉 https://replit.com/@CleverLance/FindMax-Solution#index.js + +// Solution 👉 https://www.loom.com/share/cc0efcb5211b48dcb23637b6dae4c56f // Write a function that takes in an array of numbers and returns the largest number diff --git a/exercises/palindromechecker.js b/exercises/palindromechecker.js index 84ea8e2..c0107c1 100644 --- a/exercises/palindromechecker.js +++ b/exercises/palindromechecker.js @@ -1,5 +1,7 @@ // Test you code by forking this repl: -// 👉 +// 👉 https://replit.com/@CleverLance/PalindromChecker-Solution#index.js + +// Solution 👉 https://www.loom.com/share/2dd2d840dc5f4576a369524bdc3e8336 // Write a function that takes in string and checks if it is a Palindrome diff --git a/exercises/savingsstrategy.js b/exercises/savingsstrategy.js index 220a432..f59cd73 100644 --- a/exercises/savingsstrategy.js +++ b/exercises/savingsstrategy.js @@ -1,5 +1,5 @@ // Test you code by forking this repl: -// 👉 +// 👉 COMMING SOON! // The 50-30-20 strategy is a simple way to budget diff --git a/index.html b/index.html index a0d6899..32410c1 100644 --- a/index.html +++ b/index.html @@ -35,7 +35,9 @@

Project Exercises

Figthing Game
Tip Calculator
- Weather App + Weather App
+ Advanced Weather App
+ Create Netflix

Project Solutions

Stopwatch
@@ -43,9 +45,10 @@

Project Solutions

Fighting Game
Tip Calculator
- Weather App + Weather App
+ Advanced Weather App
- Create Netflix + Create Netflix diff --git a/playground.js b/playground.js index 3795cf8..fb1ca0f 100644 --- a/playground.js +++ b/playground.js @@ -1,3 +1,7 @@ +/* ***** DO NOT CODE HERE!!! ***** +CODE in the file yourPlayground.js +*/ + // console.log('hello world') // console.log('Rafeh Qazi') @@ -90,33 +94,33 @@ function greeting(name) { // greeting('Johnny Depp') -function sum(a, b) { - // return - return a + b -} +// function sum(a, b) { +// // return +// return a + b +// } // num1 = sum(1, 2) // console.log(num1) -function calculateFoodTotal(food, tip) { - const tipPercentage = tip / 100 - const tipAmount = food * tipPercentage - const total = sum(food, tipAmount) - return total -} +// function calculateFoodTotal(food, tip) { +// const tipPercentage = tip / 100 +// const tipAmount = food * tipPercentage +// const total = sum(food, tipAmount) +// return total +// } // console.log(calculateFoodTotal(300, 20)) // ES6 // Arrow Functions => // arrow function with explicit return -const sumArrow = (a, b) => { - return a + b -} +// const sumArrow = (a, b) => { +// return a + b +// } // arrow function with implicit return // IMPORTANT: For implicit return, remove curly braces -const sumArrow2 = (a, b) => a + b +// const sumArrow2 = (a, b) => a + b // console.log(sumArrow2(10, 50)) @@ -178,26 +182,26 @@ const sumArrow2 = (a, b) => a + b // object // template literals // methods Math.floor() -const introducer = (name, shirt) => { - const person = { - name: name, - shirt: shirt, - assets: 100000, - liabilities: 50000, - netWorth: function() { - return this.assets - this.liabilities - } - } - - const intro = `Hi, my name is ${person.name} and the color of my shirt is ${person.shirt} and my net worth is $${person.netWorth()} USD` - - return intro -} +// const introducer = (name, shirt) => { +// const person = { +// name: name, +// shirt: shirt, +// assets: 100000, +// liabilities: 50000, +// netWorth: function() { +// return this.assets - this.liabilities +// } +// } + +// const intro = `Hi, my name is ${person.name} and the color of my shirt is ${person.shirt} and my net worth is $${person.netWorth()} USD` + +// return intro +// } // console.log(introducer('Qazi', 'black')) // console.log(introducer('Leonardo', 'white')) -let fruits = ['🍌', '🍎', '🍊', '🍐', '🍌', '🍎', '🍊', '🍐', '🍌', '🍎', '🍊', '🍐', '🍌', '🍎', '🍊', '🍐', '🍌', '🍎', '🍊', '🍐'] +// let fruits = ['🍌', '🍎', '🍊', '🍐', '🍌', '🍎', '🍊', '🍐', '🍌', '🍎', '🍊', '🍐', '🍌', '🍎', '🍊', '🍐', '🍌', '🍎', '🍊', '🍐'] // console.log(fruits[0]) // console.log(fruits[1]) @@ -212,35 +216,35 @@ let fruits = ['🍌', '🍎', '🍊', '🍐', '🍌', '🍎', '🍊', '🍐', ' // console.log(fruit) // } -const numbers = [1, 2, 3, 4, 5, 6] -// for (let i=0; i < numbers.length; i++) { -// console.log(numbers[i]) -// } +// const numbers = [1, 2, 3, 4, 5, 6] +// // for (let i=0; i < numbers.length; i++) { +// // console.log(numbers[i]) +// // } -const double = (numbers) => { - let result = [] - for (const number of numbers) { - result.push(number * 2) - } +// const double = (numbers) => { +// let result = [] +// for (const number of numbers) { +// result.push(number * 2) +// } - return result -} +// return result +// } // console.log(double([1, 2, 3, 4, 5, 6])) // [2, 4, 6, 8, 10, 12] -const howManyLetters = (phrase) => { - // counter - let result = 0; +// const howManyLetters = (phrase) => { +// // counter +// let result = 0; - for (const index in phrase) { - console.log(Number(index) + 1) - result = Number(index) + 1 - } +// for (const index in phrase) { +// console.log(Number(index) + 1) +// result = Number(index) + 1 +// } - return { result } -} +// return { result } +// } // const phrase = prompt('write your phrase') @@ -253,60 +257,60 @@ const howManyLetters = (phrase) => { // result = 6 // result = 10 -const sumArray = (numbers) => { - let result = 0; - // for loop - for (const number of numbers) { - console.log(number) - result += number - } - return { result } -} +// const sumArray = (numbers) => { +// let result = 0; +// // for loop +// for (const number of numbers) { +// console.log(number) +// result += number +// } +// return { result } +// } // const nums = [1, 2, 3, 4, 5] // console.log(sumArray(nums)) // sum up all numbers in array -const max = (numbers) => { - let result = numbers[0] +// const max = (numbers) => { +// let result = numbers[0] - // loop - for (const number of numbers) { - if (number > result) { - result = number - } - } +// // loop +// for (const number of numbers) { +// if (number > result) { +// result = number +// } +// } - return { result } -} +// return { result } +// } // console.log(max([1, 2, 3, 4, 5])) -const letterFrequency = (phrase) => { - // letterFrequency('haha') 👉 {'h': 2, 'a': 2} - console.log(phrase) - // make a `frequency` object {} - let frequency = {} - for (const letter of phrase) { - // check if letter exists in frequency - if (letter in frequency) { - // increment the value by +1 - frequency[letter] += 1 - // otherwise, set the value to 1 - } else { - frequency[letter] = 1 - } - } - return frequency -} +// const letterFrequency = (phrase) => { +// // letterFrequency('haha') 👉 {'h': 2, 'a': 2} +// console.log(phrase) +// // make a `frequency` object {} +// let frequency = {} +// for (const letter of phrase) { +// // check if letter exists in frequency +// if (letter in frequency) { +// // increment the value by +1 +// frequency[letter] += 1 +// // otherwise, set the value to 1 +// } else { +// frequency[letter] = 1 +// } +// } +// return frequency +// } // console.log(letterFrequency('lol, what are you doing later tonight lol, haha!')) // wordFrequency('lol what lol') 👉 {'lol': 2, 'what': 1} -const wordFrequency = (phrase) => { - const words = phrase.split(' ') - return letterFrequency(words) -} +// const wordFrequency = (phrase) => { +// const words = phrase.split(' ') +// return letterFrequency(words) +// } // const userInput = prompt('Write your sentence') // console.log(wordFrequency(userInput)) @@ -319,34 +323,34 @@ const wordFrequency = (phrase) => { // reduce // MAP -const doubleMap = (numbers) => { - return numbers.map(number => number * 2) -} +// const doubleMap = (numbers) => { +// return numbers.map(number => number * 2) +// } // console.log(doubleMap([1, 2, 3])) // filter([1,2,3,4,5,6], 3) 👉 [4, 5, 6] -const filter = (numbers, greaterThan) => { - let result = [] - for (const number of numbers) { - if (number > greaterThan) { - result.push(number) - } - } - return result -} +// const filter = (numbers, greaterThan) => { +// let result = [] +// for (const number of numbers) { +// if (number > greaterThan) { +// result.push(number) +// } +// } +// return result +// } // console.log(filter([1, 2, 3, 4, 5, 6], 2)) // const nums = [1, 2, 3, 4, 5, 6] // console.log(nums.filter(num => num > 4 || num < 2)) -const actors = [ - { name: 'johnny', netWorth: 2000000 }, - { name: 'amber', netWorth: 10 }, - { name: 'matt', netWorth: 170000000 }, - { name: 'brad', netWorth: 300000000 }, - { name: 'leonardo', netWorth: 10000000 }, -] +// const actors = [ +// { name: 'johnny', netWorth: 2000000 }, +// { name: 'amber', netWorth: 10 }, +// { name: 'matt', netWorth: 170000000 }, +// { name: 'brad', netWorth: 300000000 }, +// { name: 'leonardo', netWorth: 10000000 }, +// ] // let result = actors.filter(actor => actor.netWorth > 10) // console.log(result) @@ -363,34 +367,34 @@ const actors = [ // select a random element from an array // randomFruit([1, 2]) 👉 2 // randomFruit([1, 2]) 👉 1 -const randomFruit = (fruits) => { - const randomNumber = Math.floor(Math.random() * fruits.length) +// const randomFruit = (fruits) => { +// const randomNumber = Math.floor(Math.random() * fruits.length) - console.log(randomNumber) +// console.log(randomNumber) - return fruits[randomNumber] -} +// return fruits[randomNumber] +// } // fruits = ['🍌', '🍎', '🍊', '🍐'] // console.log(randomFruit(fruits)) // if else if else // rainy (1), sunny (-1), overcast (0) -const weatherScorer = (weather, weather2) => { - let score - - if (weather == 'rainy' && weather2 == 'overcast') { - score = 2 - } else if (weather == 'rainy') { - score = 1 - } else if (weather == 'sunny') { - score = -1 - } else { - score = 0 - } - - return score -} +// const weatherScorer = (weather, weather2) => { +// let score + +// if (weather == 'rainy' && weather2 == 'overcast') { +// score = 2 +// } else if (weather == 'rainy') { +// score = 1 +// } else if (weather == 'sunny') { +// score = -1 +// } else { +// score = 0 +// } + +// return score +// } // console.log(weatherScorer('rainy', 'sunny')) diff --git a/projects/advanced-weather-app/exercise/index.html b/projects/advanced-weather-app/exercise/index.html new file mode 100644 index 0000000..0b9fdc5 --- /dev/null +++ b/projects/advanced-weather-app/exercise/index.html @@ -0,0 +1,144 @@ + + + + + + + + Weather App + + + + + +
+
+
+
+
+ +
+
+
Today Overview
+
+
+
+ +
+
+
Wind
+
+ + + mph + + +
+
+
+
+
+ +
+
+
Lowest / Highest
+
+ + + ˚F + / + + ˚F + +
+
+
+
+
+
+
+ +
+
+
Pressure
+
+ + + hpa + +
+
+
+ +
+
+ +
+
+
Humidity
+
+ + + % + +
+
+
+
+
+
+
Temperature Forecast
+
+
+
+
+
+
+
+
+
+
+
+
+ weather icon +
+
+ + ˚F +
+
+
+
Sunrise & Sunset
+
+
+
+
Sunrise
+
+
+
+
+
+
+
+
Sunset
+
+
+
+
+
+
+
+ + + + + diff --git a/projects/advanced-weather-app/exercise/script.js b/projects/advanced-weather-app/exercise/script.js new file mode 100644 index 0000000..0a05aee --- /dev/null +++ b/projects/advanced-weather-app/exercise/script.js @@ -0,0 +1,228 @@ +/* + 🔥 APP: Weather App + + These are the promises you'll need to create + ============================================= + 1. currentWeather - Gets the current weather + 2. forecast - Gets 5 day forecast + +These are all the functions you'll need to build +================================================ + 1. getWeatherData() - Runs both promises then updates the DOM by running updateDom(). + 2. updateDom() - Updates the DOM with the data from the promises and runs the renderChart() function. + 3. renderChart() - Renders the chart with the data from the promises. + + 4. getDirection() - Returns a cardinal direction based on the degree passed in + - this will be a helper function only + */ + +// Get DOM Elements +// Hint: All required elements have an ID attribute in the HTML file (a total of 17 elements) +const currentTemperature = document.getElementById('currentTemp') +const weatherIcon = document.getElementById('weatherIcon') +const weatherDescription = document.getElementById('weatherDescription') +const windSpeed = document.getElementById('wind') +const windDirection = document.getElementById('windDir') +const lowestToday = document.getElementById('lowestToday') +const highestToday = document.getElementById('highestToday') +const pressure = document.getElementById('pressure') +const humidity = document.getElementById('humidity') +const sunrise = document.getElementById('sunrise') +const sunset = document.getElementById('sunset') +const sunriseRelative = document.getElementById('sunriseRelative') +const sunsetRelative = document.getElementById('sunsetRelative') +const userLocation = document.getElementById('location') +const time = document.getElementById('time') +const date = document.getElementById('date') +const searchInput = document.getElementById('searchInput') + +// Create an array of month names +const monthNames = [ + 'January', + 'February', + 'March', + 'April', + 'May', + 'June', + 'July', + 'August', + 'September', + 'October', + 'November', + 'December', +] + +const getWeatherData = async () => { + // Use the try-catch block to handle errors + try { + // Create a const that stores the user input from the searchbar or defaults back to 'Los Angeles' if left blank + const city = searchInput.value || 'Los Angeles' + + // Create 2 promises that call the APIs and pass in the city name + // If the user haven't typed anything, use Los Angeles as default + const currentWeather = new Promise(async (resolve, reject) => { + try { + const weatherApiData = await fetch( + `https://api.openweathermap.org/data/2.5/weather?q=${city}&appid=8109965e7254a469d08a746e8b210e1e&units=imperial`, + ) + + resolve(await weatherApiData.json()) + } catch (error) { + reject() + } + }) + + const forecast = new Promise(async (resolve, reject) => { + try { + const forecastApiData = await fetch( + `https://api.openweathermap.org/data/2.5/forecast?q=${city}&appid=8109965e7254a469d08a746e8b210e1e&units=imperial&cnt=10`, + ) + + resolve(await forecastApiData.json()) + } catch (error) { + reject() + } + }) + + // Using the Promise.all method, wait for both promises to resolve, and save the returned data in a variable + const data = await Promise.all([currentWeather, forecast]) + + // Now pass that data into the updateDom() function + updateDom(data) + } catch (error) { + console.log(error) + } +} + +// Create a function that returns a cardinal direction based on the degree passed in +// Hint: Draw a Circle and Visualize each Direction First. It will help... A ton! +const getDirection = deg => { + switch (true) { + case deg < 22.5: + return 'N' + case deg < 67.5: + return 'NE' + case deg < 112.5: + return 'E' + case deg < 157.5: + return 'SE' + case deg < 202.5: + return 'S' + case deg < 247.5: + return 'SW' + case deg < 292.5: + return 'W' + case deg < 337.5: + return 'NW' + } +} + +/** + * Update each DOM element with the API data + */ +const updateDom = data => { + console.log('🔥 updating', data) + // Current temperature + currentTemperature.innerText = data[0].main.temp.toFixed(1) + + // Weather Icon + // Use template literals to insert the in the below link, then set it as image source: + // https://openweathermap.org/img/wn/API_RESPONSE_DATA@2x.png + weatherIcon.src = `https://openweathermap.org/img/wn/${data[0].weather[0].icon}@2x.png` + + // Description of the Current Weather + weatherDescription.innerText = data[0].weather[0].main + + // Wind Speed + windSpeed.innerText = data[0].wind.speed.toFixed(1) + + // Wind Direction (Use the getDirection function) + windDirection.innerText = getDirection(data[0].wind.deg) + + // Lowest Temperature of the Day + lowestToday.innerText = Math.round(data[0].main.temp_min) + + // Highest Temperature of the Day + highestToday.innerText = Math.round(data[0].main.temp_max) + + // Pressure + pressure.innerText = data[0].main.pressure + + // Humidity + humidity.innerText = data[0].main.humidity + + // Save both Sunrise and Sunset time in a variable as Milliseconds + // Hint: the data from the API is in seconds + const sunriseTs = new Date(data[0].sys.sunrise * 1000) + const sunsetTs = new Date(data[0].sys.sunset * 1000) + + // Use the Sunrise Time in Milliseconds to get Sunrise Time + // use the .toLocaleString() method to get the time in a readable format + sunrise.innerText = sunriseTs.toLocaleTimeString('en-US', { + hour: 'numeric', + minute: 'numeric', + }) + + // Do the same for Sunset + sunset.innerText = sunsetTs.toLocaleTimeString('en-US', { + hour: 'numeric', + minute: 'numeric', + }) + + // Using timeago.js, create relative timestamps for both sunrise and sunset + sunriseRelative.innerText = timeago.format(sunriseTs) + sunsetRelative.innerText = timeago.format(sunsetTs) + + // Get the location of the user from the API (When you type, it's probably not formatted) + userLocation.innerText = data[0].name + + // Get and format Current Time + time.innerText = new Date(Date.now()).toLocaleString('en-US', { + hour: 'numeric', + minute: 'numeric', + }) + + // Get and format Current Date + date.innerText = new Date(Date.now()).toLocaleString('en-US', { + weekday: 'long', + month: 'short', + day: 'numeric', + year: 'numeric', + }) + + // Call the renderChart function and pass in the list array of the 2nd object in the data array + renderChart(data[1].list) +} + +// Create a function that renders the chart +const renderChart = data => { + // Store the DOM element that will hold the chart + const myChart = echarts.init(document.getElementById('chart')) + + const option = { + legend: { + data: ['temperature'], + }, + tooltip: {}, + xAxis: { + data: data.map(item => item.dt_txt), + }, + yAxis: {}, + series: [ + { + type: 'line', + smooth: true, + areaStyle: { + opacity: 0.5, + }, + data: data.map(item => item.main.temp), + }, + ], + } + + // Using the given function from the documentation, generate the chart using the options above + myChart.setOption(option) +} + +// Call the getWeatherData function +getWeatherData() diff --git a/projects/advanced-weather-app/exercise/style.css b/projects/advanced-weather-app/exercise/style.css new file mode 100644 index 0000000..4ef376b --- /dev/null +++ b/projects/advanced-weather-app/exercise/style.css @@ -0,0 +1,256 @@ +* { + font-family: Avenir Next; + padding: 0; + margin: 0; +} + +.wrapper { + display: flex; + width: 100vw; + height: 100vh; + overflow: hidden; +} + +.left { + flex: 1; + color: #091f39; + font-weight: 600; + padding: 1.6rem 2.4rem; + display: flex; + justify-content: center; + height: 100vh; + overflow: scroll; +} + +/* Hide scrollbar for Chrome, Safari and Opera */ +.left::-webkit-scrollbar { + display: none; +} + +/* Hide scrollbar for IE, Edge and Firefox */ +.left { + -ms-overflow-style: none; /* IE and Edge */ + scrollbar-width: none; /* Firefox */ +} + +.container { + flex: 1; + max-width: 44rem; +} + +.header { + display: flex; + align-items: center; +} + +.date { + font-size: 1.6rem; +} + +.searchBar { + flex: 1; + background-color: #eef3f3; + border-radius: 0.5rem; + display: flex; + align-items: center; + padding: 0.8rem 1.2rem; + margin-left: 4.6rem; +} + +.searchInput { + background: none; + outline: none; + border: none; + flex: 1; + margin-left: 0.6rem; +} + +.searchButton { + border: none; + background-color: #a8b7e2; + padding: 0.4rem 0.8rem; + border-radius: 0.5rem; + margin: -0.4rem 0; + cursor: pointer; +} + +.searchButton:hover { + background-color: #8e9dd3; +} + +.sectionTitle { + font-size: 1.2rem; + font-weight: 500; + margin-top: 3rem; + margin-bottom: 1.6rem; +} + +.row { + display: flex; + justify-content: space-between; + width: 100%; +} + +.overviewProp { + height: 6rem; + min-width: 16rem; + width: 100%; + margin: 0.4rem 1.4rem; + background-color: #eef3f3; + display: flex; + align-items: center; + border-radius: 0.6rem; + padding: 0 1rem; +} + +.propIconContainer { + padding-right: 1rem; +} + +.propIcon { + color: #4771da; +} + +.propValueContainer { + width: 100%; +} + +.propTitle { + color: #98989b; + font-weight: 400; + font-size: 1.1rem; +} + +.propMain { + display: flex; + align-items: flex-end; + width: 100%; +} + +.primaryData { + flex: 3; +} + +.propValue { + font-weight: 500; + font-size: 1.4rem; +} + +.secondaryData { + flex: 1; + font-weight: 400; + color: #98989b; +} + +.right { + width: 28rem; + background-color: #112b50; + background-size: 200% 400%; + color: #fafcfe; +} + +.rightContainer { + padding: 1.6rem 1.4rem; +} + +.top { + display: flex; + justify-content: space-between; +} + +.location { + font-size: 1.8rem; + font-weight: 500; +} + +.time { + font-size: 1.4rem; + font-weight: 400; +} + +.currentWeather { + display: flex; + align-items: center; + margin-top: 2.6rem; +} + +.weatherIconContainer { + height: 5.4rem; + width: 5.4rem; + margin-right: 1rem; +} + +.weatherIconContainer > img { + height: 100%; + width: 100%; +} + +.currentTemperatureValueContainer { + flex: 1; +} + +.currentTemperature { + margin: 0.4rem 1.2rem; +} + +.currentTemperature { + display: flex; + justify-content: space-between; + align-items: center; +} + +.currentTemperatureValue { + font-size: 3rem; + font-weight: 400; +} + +.currentTemperatureMetric { + font-size: 2rem; + font-weight: 400; +} + +.temperatureDescription { + font-size: 1.4rem; + font-weight: 400; +} + +.horizontalLine { + width: 100%; + height: 1px; + background-color: #445977; + margin: 1.6rem 0; +} + +.sunStageContainer { + display: flex; + align-items: center; + margin-top: 1.6rem; + background-color: #294269; + padding: 1rem 1.2rem; + border-radius: 0.6rem; + border: 1px #6180b9 solid; +} + +.sunIcon { + margin-right: 1.2rem; + font-size: 1.2rem; +} + +.col { + flex: 1; +} + +.sunStageTitle { + color: #98989b; + font-weight: 400; + font-size: 0.8rem; +} + +.sunTime { + font-weight: 500; +} + +.sunTimeRelative { + font-size: 0.8rem; + font-weight: 400; +} diff --git a/projects/advanced-weather-app/solution/index.html b/projects/advanced-weather-app/solution/index.html new file mode 100644 index 0000000..291bf44 --- /dev/null +++ b/projects/advanced-weather-app/solution/index.html @@ -0,0 +1,143 @@ + + + + + + + + Weather App + + + + + +
+
+
+
+
+ +
+
+
Today Overview
+
+
+
+ +
+
+
Wind
+
+ + + mph + + +
+
+
+
+
+ +
+
+
Lowest / Highest
+
+ + + ˚F + / + + ˚F + +
+
+
+
+
+
+
+ +
+
+
Pressure
+
+ + + hpa + +
+
+
+ +
+
+ +
+
+
Humidity
+
+ + + % + +
+
+
+
+
+
+
Temperature Forecast
+
+
+
+
+
+
+
+
+
+
+
+
+ weather icon +
+
+ + ˚F +
+
+
+
Sunrise & Sunset
+
+
+
+
Sunrise
+
+
+
+
+
+
+
+
Sunset
+
+
+
+
+
+
+
+ + + + diff --git a/projects/advanced-weather-app/solution/script.js b/projects/advanced-weather-app/solution/script.js new file mode 100644 index 0000000..6b22df8 --- /dev/null +++ b/projects/advanced-weather-app/solution/script.js @@ -0,0 +1,228 @@ +/* + 🔥 APP: Weather App + + These are the promises you'll need to create + ============================================= + 1. currentWeather - Gets the current weather + 2. forecast - Gets 5 day forecast + +These are all the functions you'll need to build +================================================ + 1. getWeatherData() - Runs both promises then updates the DOM by running... + 2. updateDom() - Updates the DOM with the data from the promises and runs the... + 3. renderChart() - Renders the chart with the data from the promises + + 4. getDirection() - Returns a cardinal direction based on the degree passed in + - this will be a helper function only + */ + +// Get DOM Elements +// Hint: All required elements have an ID attribute in the HTML file (a total of 17 elements) +const currentTemperature = document.getElementById('currentTemp') +const weatherIcon = document.getElementById('weatherIcon') +const weatherDescription = document.getElementById('weatherDescription') +const windSpeed = document.getElementById('wind') +const windDirection = document.getElementById('windDir') +const lowestToday = document.getElementById('lowestToday') +const highestToday = document.getElementById('highestToday') +const pressure = document.getElementById('pressure') +const humidity = document.getElementById('humidity') +const sunrise = document.getElementById('sunrise') +const sunset = document.getElementById('sunset') +const sunriseRelative = document.getElementById('sunriseRelative') +const sunsetRelative = document.getElementById('sunsetRelative') +const userLocation = document.getElementById('location') +const time = document.getElementById('time') +const date = document.getElementById('date') +const searchInput = document.getElementById('searchInput') + +// Create an array of month names +const monthNames = [ + 'January', + 'February', + 'March', + 'April', + 'May', + 'June', + 'July', + 'August', + 'September', + 'October', + 'November', + 'December', +] + +const getWeatherData = async () => { + // Use the try-catch block to handle errors + try { + // Create a const that stores the user input from the searchbar or defaults back to 'Los Angeles' if left blank + const city = searchInput.value || 'Los Angeles' + + // Create 2 promises that call the APIs and pass in the city name + // If the user haven't typed anything, use Los Angeles as default + const currentWeather = new Promise(async (resolve, reject) => { + try { + const weatherApiData = await fetch( + `https://api.openweathermap.org/data/2.5/weather?q=${city}&appid=8109965e7254a469d08a746e8b210e1e&units=imperial`, + ) + + resolve(await weatherApiData.json()) + } catch (error) { + reject() + } + }) + + const forecast = new Promise(async (resolve, reject) => { + try { + const forecastApiData = await fetch( + `https://api.openweathermap.org/data/2.5/forecast?q=${city}&appid=8109965e7254a469d08a746e8b210e1e&units=imperial&cnt=10`, + ) + + resolve(await forecastApiData.json()) + } catch (error) { + reject() + } + }) + + // Using the Promise.all method, wait for both promises to resolve, and save the returned data in a variable + const data = await Promise.all([currentWeather, forecast]) + + // Now pass that data into the updateDom() function + updateDom(data) + } catch (error) { + console.log(error) + } +} + +// Create a function that returns a cardinal direction based on the degree passed in +// Hint: Draw a Circle and Visualize each Direction First. It will help... A ton! +const getDirection = deg => { + switch (true) { + case deg < 22.5: + return 'N' + case deg < 67.5: + return 'NE' + case deg < 112.5: + return 'E' + case deg < 157.5: + return 'SE' + case deg < 202.5: + return 'S' + case deg < 247.5: + return 'SW' + case deg < 292.5: + return 'W' + case deg < 337.5: + return 'NW' + } +} + +/** + * Update each DOM element with the API data + */ +const updateDom = data => { + console.log('🔥 updating', data) + // Current temperature + currentTemperature.innerText = data[0].main.temp.toFixed(1) + + // Weather Icon + // Use template literals to insert the in the below link, then set it as image source: + // https://openweathermap.org/img/wn/API_RESPONSE_DATA@2x.png + weatherIcon.src = `https://openweathermap.org/img/wn/${data[0].weather[0].icon}@2x.png` + + // Description of the Current Weather + weatherDescription.innerText = data[0].weather[0].main + + // Wind Speed + windSpeed.innerText = data[0].wind.speed.toFixed(1) + + // Wind Direction (Use the getDirection function) + windDirection.innerText = getDirection(data[0].wind.deg) + + // Lowest Temperature of the Day + lowestToday.innerText = Math.round(data[0].main.temp_min) + + // Highest Temperature of the Day + highestToday.innerText = Math.round(data[0].main.temp_max) + + // Pressure + pressure.innerText = data[0].main.pressure + + // Humidity + humidity.innerText = data[0].main.humidity + + // Save both Sunrise and Sunset time in a variable as Milliseconds + // Hint: the data from the API is in seconds + const sunriseTs = new Date(data[0].sys.sunrise * 1000) + const sunsetTs = new Date(data[0].sys.sunset * 1000) + + // Use the Sunrise Time in Milliseconds to get Sunrise Time + // use the .toLocaleString() method to get the time in a readable format + sunrise.innerText = sunriseTs.toLocaleTimeString('en-US', { + hour: 'numeric', + minute: 'numeric', + }) + + // Do the same for Sunset + sunset.innerText = sunsetTs.toLocaleTimeString('en-US', { + hour: 'numeric', + minute: 'numeric', + }) + + // Using timeago.js, create relative timestamps for both sunrise and sunset + sunriseRelative.innerText = timeago.format(sunriseTs) + sunsetRelative.innerText = timeago.format(sunsetTs) + + // Get the location of the user from the API (When you type, it's probably not formatted) + userLocation.innerText = data[0].name + + // Get and format Current Time + time.innerText = new Date(Date.now()).toLocaleString('en-US', { + hour: 'numeric', + minute: 'numeric', + }) + + // Get and format Current Date + date.innerText = new Date(Date.now()).toLocaleString('en-US', { + weekday: 'long', + month: 'short', + day: 'numeric', + year: 'numeric', + }) + + // Call the renderChart function and pass in the list array of the 2nd object in the data array + renderChart(data[1].list) +} + +// Create a function that renders the chart +const renderChart = data => { + // Store the DOM element that will hold the chart + const myChart = echarts.init(document.getElementById('chart')) + + const option = { + legend: { + data: ['temperature'], + }, + tooltip: {}, + xAxis: { + data: data.map(item => item.dt_txt), + }, + yAxis: {}, + series: [ + { + type: 'line', + smooth: true, + areaStyle: { + opacity: 0.5, + }, + data: data.map(item => item.main.temp), + }, + ], + } + + // Using the given function from the documentation, generate the chart using the options above + myChart.setOption(option) +} + +// Call the getWeatherData function +getWeatherData() diff --git a/projects/advanced-weather-app/solution/style.css b/projects/advanced-weather-app/solution/style.css new file mode 100644 index 0000000..4ef376b --- /dev/null +++ b/projects/advanced-weather-app/solution/style.css @@ -0,0 +1,256 @@ +* { + font-family: Avenir Next; + padding: 0; + margin: 0; +} + +.wrapper { + display: flex; + width: 100vw; + height: 100vh; + overflow: hidden; +} + +.left { + flex: 1; + color: #091f39; + font-weight: 600; + padding: 1.6rem 2.4rem; + display: flex; + justify-content: center; + height: 100vh; + overflow: scroll; +} + +/* Hide scrollbar for Chrome, Safari and Opera */ +.left::-webkit-scrollbar { + display: none; +} + +/* Hide scrollbar for IE, Edge and Firefox */ +.left { + -ms-overflow-style: none; /* IE and Edge */ + scrollbar-width: none; /* Firefox */ +} + +.container { + flex: 1; + max-width: 44rem; +} + +.header { + display: flex; + align-items: center; +} + +.date { + font-size: 1.6rem; +} + +.searchBar { + flex: 1; + background-color: #eef3f3; + border-radius: 0.5rem; + display: flex; + align-items: center; + padding: 0.8rem 1.2rem; + margin-left: 4.6rem; +} + +.searchInput { + background: none; + outline: none; + border: none; + flex: 1; + margin-left: 0.6rem; +} + +.searchButton { + border: none; + background-color: #a8b7e2; + padding: 0.4rem 0.8rem; + border-radius: 0.5rem; + margin: -0.4rem 0; + cursor: pointer; +} + +.searchButton:hover { + background-color: #8e9dd3; +} + +.sectionTitle { + font-size: 1.2rem; + font-weight: 500; + margin-top: 3rem; + margin-bottom: 1.6rem; +} + +.row { + display: flex; + justify-content: space-between; + width: 100%; +} + +.overviewProp { + height: 6rem; + min-width: 16rem; + width: 100%; + margin: 0.4rem 1.4rem; + background-color: #eef3f3; + display: flex; + align-items: center; + border-radius: 0.6rem; + padding: 0 1rem; +} + +.propIconContainer { + padding-right: 1rem; +} + +.propIcon { + color: #4771da; +} + +.propValueContainer { + width: 100%; +} + +.propTitle { + color: #98989b; + font-weight: 400; + font-size: 1.1rem; +} + +.propMain { + display: flex; + align-items: flex-end; + width: 100%; +} + +.primaryData { + flex: 3; +} + +.propValue { + font-weight: 500; + font-size: 1.4rem; +} + +.secondaryData { + flex: 1; + font-weight: 400; + color: #98989b; +} + +.right { + width: 28rem; + background-color: #112b50; + background-size: 200% 400%; + color: #fafcfe; +} + +.rightContainer { + padding: 1.6rem 1.4rem; +} + +.top { + display: flex; + justify-content: space-between; +} + +.location { + font-size: 1.8rem; + font-weight: 500; +} + +.time { + font-size: 1.4rem; + font-weight: 400; +} + +.currentWeather { + display: flex; + align-items: center; + margin-top: 2.6rem; +} + +.weatherIconContainer { + height: 5.4rem; + width: 5.4rem; + margin-right: 1rem; +} + +.weatherIconContainer > img { + height: 100%; + width: 100%; +} + +.currentTemperatureValueContainer { + flex: 1; +} + +.currentTemperature { + margin: 0.4rem 1.2rem; +} + +.currentTemperature { + display: flex; + justify-content: space-between; + align-items: center; +} + +.currentTemperatureValue { + font-size: 3rem; + font-weight: 400; +} + +.currentTemperatureMetric { + font-size: 2rem; + font-weight: 400; +} + +.temperatureDescription { + font-size: 1.4rem; + font-weight: 400; +} + +.horizontalLine { + width: 100%; + height: 1px; + background-color: #445977; + margin: 1.6rem 0; +} + +.sunStageContainer { + display: flex; + align-items: center; + margin-top: 1.6rem; + background-color: #294269; + padding: 1rem 1.2rem; + border-radius: 0.6rem; + border: 1px #6180b9 solid; +} + +.sunIcon { + margin-right: 1.2rem; + font-size: 1.2rem; +} + +.col { + flex: 1; +} + +.sunStageTitle { + color: #98989b; + font-weight: 400; + font-size: 0.8rem; +} + +.sunTime { + font-weight: 500; +} + +.sunTimeRelative { + font-size: 0.8rem; + font-weight: 400; +} diff --git a/projects/fetchmovies/solution/index.html b/projects/create-netflix/exercise/index.html similarity index 84% rename from projects/fetchmovies/solution/index.html rename to projects/create-netflix/exercise/index.html index f84962e..6f15727 100644 --- a/projects/fetchmovies/solution/index.html +++ b/projects/create-netflix/exercise/index.html @@ -3,7 +3,7 @@ - PWJ Netflix Clone + Netflix Clone -
- -
- - -
- +
@@ -56,11 +44,15 @@

Wishlist

Trending Now

- +

Top Rated

-
+
+ +
diff --git a/projects/create-netflix/exercise/script.js b/projects/create-netflix/exercise/script.js new file mode 100644 index 0000000..64819e9 --- /dev/null +++ b/projects/create-netflix/exercise/script.js @@ -0,0 +1,118 @@ +/* +🌟 APP: Make Netflix + +Here we have the Netflix app but it's up to you to make it work by pulling all the movies using an API! + +Create a fetchMovies() function that will make a dynamic API call to what you need 👇 +======================================== + +- fetchMovies() + +** fetchMovies takes in an URL, a div id or class from the HTML, and a path (poster or backdrop) + + + +These are the 3 main functions and their URL'S you must create 👇 +======================================== + +- getOriginals() + * URL : 'https://api.themoviedb.org/3/discover/tv?api_key=19f84e11932abbc79e6d83f82d6d1045&with_networks=213' + +- getTrendingNow() + * URL : 'https://api.themoviedb.org/3/trending/movie/week?api_key=19f84e11932abbc79e6d83f82d6d1045' + +- getTopRated() + * URL : 'https://api.themoviedb.org/3/movie/top_rated?api_key=19f84e11932abbc79e6d83f82d6d1045&language=en-US&page=1' + + +** These functions will provide the URL you need to fetch() movies of that genere ** + +These are all the DIV ID's you're gonna need access to 👇 +======================================================== +#1 CLASS 👉 'original__movies' = Div that holds Netflix Originals +#2 ID 👉 'trending' = Div that holds trending Movies +#3 ID 👉 'top_rated' = Div that holds top rated Movies +*/ + +// Call the main functions the page is loaded +window.onload = () => { + getOriginals() + getTrendingNow() + getTopRated() +} + +// ** Helper function that makes dynamic API calls ** +function fetchMovies(url, dom_element, path_type) { + // Use Fetch with the url passed down + + // Within Fetch get the response and call showMovies() with the data , dom_element, and path type +} + +// ** Function that displays the movies to the DOM ** +showMovies = (movies, dom_element, path_type) => { + + // Create a variable that grabs id or class + + + // Loop through object + + + // Within loop create an img element + + + // Set attribute + + + // Set source + + + // Add event listener to handleMovieSelection() onClick + + + // Append the imageElement to the dom_element selected + + } +} + +// ** Function that fetches Netflix Originals ** +function getOriginals() { + +} +// ** Function that fetches Trending Movies ** +function getTrendingNow() { + +} +// ** Function that fetches Top Rated Movies ** +function getTopRated() { + +} + +// ** BONUS ** + +// ** Fetches URL provided and returns response.json() +async function getMovieTrailer(id) { + //URL: `https://api.themoviedb.org/3/movie/${id}/videos?api_key=19f84e11932abbc79e6d83f82d6d1045&language=en-US` + +} + +// ** Function that adds movie data to the DOM +const setTrailer = trailers => { + // Set up iframe variable to hold id of the movieTrailer Element + const iframe + // Set up variable to select .movieNotFound element + const movieNotFound + + // If there is a trailer add the src for it + if (trailers.length > 0) { + // add d-none class to movieNotFound and remove it from iframe + + // add youtube link with trailers key to iframe.src + } else { + // Else remove d-none class to movieNotfound and ADD it to iframe + + } +} + + + + diff --git a/projects/fetchmovies/solution/style.css b/projects/create-netflix/exercise/style.css similarity index 100% rename from projects/fetchmovies/solution/style.css rename to projects/create-netflix/exercise/style.css diff --git a/projects/create-netflix/solution/index.html b/projects/create-netflix/solution/index.html new file mode 100644 index 0000000..6f15727 --- /dev/null +++ b/projects/create-netflix/solution/index.html @@ -0,0 +1,105 @@ + + + + + + Netflix Clone + + + + + +
+
+
+ +
+
+

NETFLIX ORIGINALS

+
+
+ +
+
+
+
+

Wishlist

+
+
+
+

Trending Now

+
+ +
+

Top Rated

+
+
+ +
+
+
+ + + + + + + diff --git a/projects/create-netflix/solution/script.js b/projects/create-netflix/solution/script.js new file mode 100644 index 0000000..0da527a --- /dev/null +++ b/projects/create-netflix/solution/script.js @@ -0,0 +1,153 @@ +/* +🌟 APP: Make Netflix + +Create a fetchMovies() function that will make a dynamic API call to what you need 👇 +======================================== + +- fetchMovies() + +** fetchMovies takes in an URL, a div id or class from the HTML, and a path (poster or backdrop) + + + +These are the 3 main functions you must create 👇 +======================================== + +- getOriginals() + +- getTrendingNow() + +- getTopRated() + + +** These functions will provide the URL you need to fetch movies of that genere ** + +These are all the DIV ID's you're gonna need access to 👇 +======================================================== +#1 CLASS 👉 'original__movies' = Div that holds Netflix Originals +#2 ID 👉 'trending' = Div that holds trending Movies +#3 ID 👉 'top_rated' = Div that holds top rated Movies +*/ + +// Call the main functions the page is loaded +window.onload = () => { + getOriginals() + getTrendingNow() + getTopRated() +} + +// ** Helper function that makes dynamic API calls ** +// path_type 👉 (backdrop, poster) +// dom_element 👉 (trending, top rated) +// fetchMovies('https://api.themoviedb.org/3/movie/top_rated?api_key=19f84e11932abbc79e6d83f82d6d1045&language=en-US&page=1', 'top_rated', 'backdrop_path') +function fetchMovies(url, dom_element, path_type) { + fetch(url) + .then(response => { + if (response.ok) { + return response.json() + } else { + throw new Error('something went wrong') + } + }) + .then(data => { + showMovies(data, dom_element, path_type) + }) + .catch(error_data => { + console.log(error_data) + }) +} + +// ** Function that displays the movies to the DOM ** +showMovies = (movies, dom_element, path_type) => { + + // Create a variable that grabs id or class + var moviesEl = document.querySelector(dom_element) + + // Loop through object + for (var movie of movies.results) { + + // Within loop create an img element + var imageElement = document.createElement('img') + + // Set attribute + imageElement.setAttribute('data-id', movie.id) + + // Set source + imageElement.src = `https://image.tmdb.org/t/p/original${movie[path_type]}` + + // Add event listener to handleMovieSelection() onClick + imageElement.addEventListener('click', e => { + handleMovieSelection(e) + }) + // Append the imageElement to the dom_element selected + moviesEl.appendChild(imageElement) + } +} + +// ** Function that fetches Netflix Originals ** +function getOriginals() { + var url = + 'https://api.themoviedb.org/3/discover/tv?api_key=19f84e11932abbc79e6d83f82d6d1045&with_networks=213' + fetchMovies(url, '.original__movies', 'poster_path') +} +// ** Function that fetches Trending Movies ** +function getTrendingNow() { + var url = + 'https://api.themoviedb.org/3/trending/movie/week?api_key=19f84e11932abbc79e6d83f82d6d1045' + fetchMovies(url, '#trending', 'backdrop_path') +} +// ** Function that fetches Top Rated Movies ** +function getTopRated() { + var url = + 'https://api.themoviedb.org/3/movie/top_rated?api_key=19f84e11932abbc79e6d83f82d6d1045&language=en-US&page=1' + fetchMovies(url, '#top_rated', 'backdrop_path') +} + +// ** BONUS ** + +async function getMovieTrailer(id) { + var url = `https://api.themoviedb.org/3/movie/${id}/videos?api_key=19f84e11932abbc79e6d83f82d6d1045&language=en-US` + return await fetch(url).then(response => { + if (response.ok) { + return response.json() + } else { + throw new Error('something went wrong') + } + }) +} + +const setTrailer = trailers => { + const iframe = document.getElementById('movieTrailer') + const movieNotFound = document.querySelector('.movieNotFound') + if (trailers.length > 0) { + movieNotFound.classList.add('d-none') + iframe.classList.remove('d-none') + iframe.src = `https://www.youtube.com/embed/${trailers[0].key}` + } else { + iframe.classList.add('d-none') + movieNotFound.classList.remove('d-none') + } +} + +const handleMovieSelection = e => { + const id = e.target.getAttribute('data-id') + const iframe = document.getElementById('movieTrailer') + // here we need the id of the movie + getMovieTrailer(id).then(data => { + const results = data.results + const youtubeTrailers = results.filter(result => { + if (result.site == 'YouTube' && result.type == 'Trailer') { + return true + } else { + return false + } + }) + setTrailer(youtubeTrailers) + }) + + // open modal + $('#trailerModal').modal('show') + // we need to call the api with the ID +} + + diff --git a/projects/create-netflix/solution/style.css b/projects/create-netflix/solution/style.css new file mode 100644 index 0000000..9ef9813 --- /dev/null +++ b/projects/create-netflix/solution/style.css @@ -0,0 +1,188 @@ +body { + background-color: #111; + color: white; + font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; + margin: 0; +} + +.dropdown-container { + position: absolute; + top: 100%; + right: 0; + padding-top: 3px; + display: none; +} + +.dropdown { + background-color: black; + padding: 8px; + border-radius: 4px; + width: 100px; +} + +.dropdown span { + cursor: pointer; +} + +.original__movies { + padding-top: 20px; + padding-bottom: 20px; +} + +.profile:hover .dropdown-container { + display: block; +} + +.original__movies, +.movies__container { + padding-left: 50px; + display: flex; + overflow-x: scroll; + overflow: hidden; +} + +.original__movies::-webkit-scrollbar { + display: none; +} + +.original__movies img { + margin-right: 10px; + height: 250px; + width: auto; +} + +.original__movies img, +.movies__container img { + transition: all 0.2s ease-out; + cursor: pointer; +} + +.original__movies img:hover, +.movies__container img:hover { + transform: scale(1.1); +} + +.movies__container img { + margin-right: 10px; + width: 200px; +} + +header { + display: flex; + justify-content: space-between; + align-items: center; + padding-left: 15px; + padding-right: 15px; + position: absolute; + z-index: 100; + top: 0; + left: 0; + right: 0; + padding-top: 15px; +} + +.logo > img { + width: 120px; +} + +.profile { + position: relative; +} + +.profile > img { + width: 40px; +} + +img { + width: 100px; +} + +.featured { + height: 400px; + position: relative; + background-image: url('https://image.tmdb.org/t/p/original//3lBDg3i6nn5R2NKFCJ6oKyUo2j5.jpg'); + background-size: cover; + background-position: center; + padding: 0 0 0 30px; + display: flex; + flex-direction: column; + justify-content: center; +} + +.featured::after { + content: ''; + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 7.4rem; + background-image: linear-gradient( + 180deg, + transparent, + rgba(37, 37, 37, 0.61), + #111 + ); +} + +.netflixOriginals h2, +.movies__header h2 { + padding-left: 30px; +} + +.featured h2 { + font-size: 50px; + margin: 0; + z-index: 10; +} + +.featured .featured__buttons { + z-index: 10; +} + +.featured .featured__buttons button { + font-size: 16px; + color: white; + background-color: rgba(109, 109, 110, 0.7); + border: none; + padding: 8px 24px; + border-radius: 4px; +} + +.featured::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.3); +} + +.featured .featured__buttons .button__play { + background-color: white; + color: black; +} + +.button__play i { + margin-right: 6px; +} + +.featured .featured__description { + max-width: 350px; + font-weight: 400; + text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.45); + z-index: 10; +} + +.modal-body iframe { + width: 100%; +} + +.modal-body span { + color: #333; + width: 100%; + display: flex; + height: 60px; + justify-content: center; + align-items: center; +} diff --git a/projects/fetchmovies/solution/script.js b/projects/fetchmovies/solution/script.js deleted file mode 100644 index 6f623db..0000000 --- a/projects/fetchmovies/solution/script.js +++ /dev/null @@ -1,247 +0,0 @@ -console.log("YOOO") -var firstName = 'Nazariy' -let apiUrl = 'http://localhost:3000' -if (location.href.indexOf('netlify') != -1) { - apiUrl = 'https://netflix-cp.herokuapp.com' -} - -// Called whe the page is loaded -window.onload = () => { - getOriginals() - getTrendingNow() - getTopRated() - getWishList() - getGenres() - letVarExample() -} - -function getWishList() { - fetch(`${apiUrl}/wishlist`, { - headers: { - Authorization: `${localStorage.getItem('token')}`, - }, - }) - .then(response => { - if (response.ok) { - return response.json() - } else { - throw new Error('something went wrong') - } - }) - .then(data => { - showMovies(data, '#wishlist', 'backdrop_path') - }) - .catch(error_data => { - logOut() - console.log(error_data) - }) -} - -function letVarExample(firstName = 'Nazariy') { - // Melissas Address - const address = { - street: '9879 Test rd.', - city: 'Brooklyn', - state: 'NY', - } - - // address.state = "MI"; - - // let state = address.state; - // state = "MI" - // console.log(address); - - // let address2 = address; - // address2.state = "MI"; - - // let address2 = { - // ...address, - // apartment: "MI" - // } - - // let { street, city, state } = address; - - // console.log(street + city + state); -} - -async function getMovieTrailer(id) { - var url = `https://api.themoviedb.org/3/movie/${id}/videos?api_key=19f84e11932abbc79e6d83f82d6d1045&language=en-US` - return await fetch(url).then(response => { - if (response.ok) { - return response.json() - } else { - throw new Error('something went wrong') - } - }) -} - -const setTrailer = trailers => { - const iframe = document.getElementById('movieTrailer') - const movieNotFound = document.querySelector('.movieNotFound') - if (trailers.length > 0) { - movieNotFound.classList.add('d-none') - iframe.classList.remove('d-none') - iframe.src = `https://www.youtube.com/embed/${trailers[0].key}` - } else { - iframe.classList.add('d-none') - movieNotFound.classList.remove('d-none') - } -} - -const handleMovieSelection = e => { - const id = e.target.getAttribute('data-id') - const iframe = document.getElementById('movieTrailer') - // here we need the id of the movie - getMovieTrailer(id).then(data => { - const results = data.results - const youtubeTrailers = results.filter(result => { - if (result.site == 'YouTube' && result.type == 'Trailer') { - return true - } else { - return false - } - }) - setTrailer(youtubeTrailers) - }) - - // open modal - $('#trailerModal').modal('show') - // we need to call the api with the ID -} - -showMovies = (movies, element_selector, path_type) => { - var moviesEl = document.querySelector(element_selector) - for (var movie of movies.results) { - var imageElement = document.createElement('img') - imageElement.setAttribute('data-id', movie.id) - - imageElement.src = `https://image.tmdb.org/t/p/original${movie[path_type]}` - - imageElement.addEventListener('click', e => { - handleMovieSelection(e) - }) - moviesEl.appendChild(imageElement) - } -} - -function fetchMoviesBasedOnGenre(genreId) { - var url = 'https://api.themoviedb.org/3/discover/movie?' - url += - 'api_key=19f84e11932abbc79e6d83f82d6d1045&language=en-US&sort_by=popularity.desc&include_adult=false&include_video=false&page=1' - url += `&with_genres=${genreId}` - return fetch(url).then(response => { - if (response.ok) { - return response.json() - } else { - throw new Error('something went wrong') - } - }) // returns a promise already -} - -function fetchMovies(url, element_selector, path_type) { - fetch(url) - .then(response => { - if (response.ok) { - return response.json() - } else { - throw new Error('something went wrong') - } - }) - .then(data => { - showMovies(data, element_selector, path_type) - }) - .catch(error_data => { - console.log(error_data) - }) -} - -function showMoviesGenres(genres) { - genres.genres.forEach(function (genre) { - // get list of movies - var movies = fetchMoviesBasedOnGenre(genre.id) - movies - .then(function (movies) { - showMoviesBasedOnGenre(genre.name, movies) - }) - .catch(function (error) { - console.log('BAD BAD', error) - }) - // show movies based on genre - }) -} - -function showMoviesBasedOnGenre(genreName, movies) { - let allMovies = document.querySelector('.movies') - let genreEl = document.createElement('div') - genreEl.classList.add('movies__header') - genreEl.innerHTML = ` -

${genreName}

- ` - let moviesEl = document.createElement('div') - moviesEl.classList.add('movies__container') - moviesEl.setAttribute('id', genreName) - - for (var movie of movies.results) { - var imageElement = document.createElement('img') - let { backdrop_path, id } = movie - console.log('TESTING DESCONSTRUCT:', id, backdrop_path) - imageElement.setAttribute('data-id', id) - - imageElement.src = `https://image.tmdb.org/t/p/original${backdrop_path}` - - imageElement.addEventListener('click', e => { - handleMovieSelection(e) - }) - moviesEl.appendChild(imageElement) - } - - allMovies.appendChild(genreEl) - allMovies.appendChild(moviesEl) -} - -function getGenres() { - var url = - 'https://api.themoviedb.org/3/genre/movie/list?api_key=19f84e11932abbc79e6d83f82d6d1045&language=en-US' - fetch(url) - .then(response => { - if (response.ok) { - return response.json() - } else { - throw new Error('something went wrong') - } - }) - .then(data => { - showMoviesGenres(data) - }) - .catch(error_data => { - console.log(error_data) - }) -} - -function getOriginals() { - var url = - 'https://api.themoviedb.org/3/discover/tv?api_key=19f84e11932abbc79e6d83f82d6d1045&with_networks=213' - fetchMovies(url, '.original__movies', 'poster_path') -} - -function getTrendingNow() { - var url = - 'https://api.themoviedb.org/3/trending/movie/week?api_key=19f84e11932abbc79e6d83f82d6d1045' - fetchMovies(url, '#trending', 'backdrop_path') -} - -function getTopRated() { - var url = - 'https://api.themoviedb.org/3/movie/top_rated?api_key=19f84e11932abbc79e6d83f82d6d1045&language=en-US&page=1' - fetchMovies(url, '#top_rated', 'backdrop_path') -} - -// Loop through list of genres -// Show genres in HTML -// Fetch movies based on genre fetchMovies(url, genre, classInHTML) -// Display the list of movies - -// https://api.themoviedb.org/3/discover/movie?api_key=19f84e11932abbc79e6d83f82d6d1045&language=en-US&sort_by=popularity.desc&include_adult=false&include_video=false&page=1&with_genres=28 - -// Movies genres -// https://api.themoviedb.org/3/genre/movie/list?api_key=19f84e11932abbc79e6d83f82d6d1045&language=en-US diff --git a/projects/fightingGame/exercise/index.html b/projects/fightingGame/exercise/index.html index 51df0c6..22aaa3e 100644 --- a/projects/fightingGame/exercise/index.html +++ b/projects/fightingGame/exercise/index.html @@ -9,7 +9,103 @@ - Code the Game class in script.js + +
+ + +
+ +
+
+ +
+ + + + + + + diff --git a/projects/fightingGame/exercise/script.js b/projects/fightingGame/exercise/script.js index c6bd8cb..b51f254 100644 --- a/projects/fightingGame/exercise/script.js +++ b/projects/fightingGame/exercise/script.js @@ -1,72 +1,186 @@ +/* +🌟 APP: Fighting Game + +Create an updateGame() function that will update the DOM with the state of the game 👇 +======================================== + +- updateGame() + +These are the 2 classes you must create and their methods 👇 +======================================== + +class Player { + - strike() + - heal() +} + class Game { - constructor(player1Name = 'pl1', player2Name = 'pl2') { - // Flag that indicates if the game is over or not - this.theEnd = false; - - this.player1 = { - name: player1Name, - health: 100 - }; - - this.player2 = { - name: player2Name, - health: 100 - }; - } + - play() + - checkIsOver() + - declareWinner() + - reset() +} - //Starts the game and logs out the status of players - start() { +These functions are hard coded in the HTML. So, you can't change their names. - } +These are all the DIV ID's you're gonna need access to 👇 +======================================================== +#1 ID 👉 'play' = Button to run simulation +#2 ID 👉 'result' = Div that holds the winner of the match +#3 ID 👉 'p1Name' = Div that holds player 1's Name +#4 ID 👉 'p2Name' = Div that holds player 2's Name +#5 ID 👉 'p1Health' = Div that holds player 1's health +#6 ID 👉 'p2Health' = Div that holds player 2's health +*/ - //Console log the winner of the battle - declareWinner() { +// ** Grabs elements from the DOM and stores them into variables ** +let playButton = document.getElementById('play') +let resultDiv = document.getElementById('result') +let p1NameDiv = document.getElementById('p1Name') +let p2NameDiv = document.getElementById('p2Name') +let p1HealthDiv = document.getElementById('p1Health') +let p2HealthDiv = document.getElementById('p2Health') - } +// ** Check if either players health is 0 and if it is, then update isOver to true ** +const updateGame = (p1,p2,gameState) => { + // Update the DOM with the names and the latest health of players - //If player 1 or player 2 health is below 0 - //Mark theEnd true, to stop the game - checkTheEnd() { + // Condition IF either player health is <= 0 then set isOver to true and declareWinner +} + +// ** Create the Player class which can create a player with all it's attributes and methods ** +// qazi = new Player('Qazi', 100, 7) +// qazi.name 👉 'Qazi' +// qazi.health 👉 100 +// qazi.attackDmg 👉 7 +class Player { + constructor(name, health, attackDamage) { + this.name = name; + this.health = health; + this.attackDmg = attackDamage; } + // ** Attack an enemy with a random number from 0 to YOUR attackDmg bonus ** + strike (player, enemy, attackDmg) { + + // Get random number between 1 - 10 and that is damageAmount - //Console log the name and health of both players - //Ex: Player 1: 100 | Player 2: 50 - playerStatus() { + // Subtract the enemy health with the damageAmount - } + // Update the game and DOM with updateGame() - //Reset health of player 1 and player 2 to 100 - //Reset theEnd to false - reset() { + // Return a message of 'player name attacks enemy name for damageAmount' } + // ** Heal the player for random number from 1 to 5 ** + heal (player) { + + // Get random number between 1 - 5 and store that in hpAmount - //Generate a random number between 1 and 10 using Math.random() - //Use that number to decrease health from player 2 - pl1AttackPl2() { + // Add hpAmount to players health - } + // Update the game and DOM with updateGame() - //Generate a random number between 1 and 10 using Math.random() - //Use that number to decrease health from player 1 - pl2AttackPl1() { + // Return a message of 'player name heals for hpAmount HP' } +} - //Generate a random number between 1 and 5 using Math.random() - //Use that number to increase health of player 1 - pl1Heal() { +// ** Create the Game class with all it's attributes and methods to run a match ** +// game = new Game() +// game.isOver 👉 false +class Game { + constructor() { + this.isOver = false; + } + + // ** If the game is over and a player has 0 health declare the winner! ** + declareWinner(isOver,p1, p2) { + + // Create a message variable that will hold a message based on the condition + + // If isOver is true AND p1 health is <= 0 then update message variable to 'p1 WINS!' + + // Else if isOver is true AND p2 health is <= 0 then update message variable to 'p2 WINS!' + // Play victory sound + + // Return message variable } - //Generate a random number between 1 and 5 using Math.random() - //Use that number to increase health of player 2 - pl2Heal() { + // ** Reset the players health back to it's original state and isOver to FALSE ** + reset(p1,p2) { + // set p1 health and p2 health back to 100 and isOver back to false and clear resultDiv.innerText and don't forget to updateGame() } + + // ** Simulates the whole match untill one player runs out of health ** + play(p1, p2) { + // Reset to make sure player health is back to full before starting + + // Make sure the players take turns untill isOver is TRUE + while (!this.isOver) { + //Make sure both players get strike() and heal() once each loop + } + // Once isOver is TRUE run the declareWinner() method + + } + } -// Initialize the class here -// Call the start function of the game +// ** Create 2 players using the player class ** + + +// ** Save original Player Data into a variable in order to reset ** +let p1; +let p2; + +// ** Create the game object from the Game class ** + +// ** Intialize the game by calling updateGame() ** + + +// ** Save intial isOver from the game object inside this variable ** +let gameState; + + +// ** Add a click listener to the simulate button that runs the play() method on click and pass in the players ** + + +// Add functionality where players can press a button to attack OR heal + +// ** Player 1 Controls ** +document.addEventListener('keydown', function(e) { + // if you press Q AND the enemy health is greater than 0 AND isOver is still false then strike() + + // After striking then play attack sound + +}); + +document.addEventListener('keydown', function(e) { + + // if you press a AND the player health is greater than 0 AND isOver is still false then strike() + + // After healing then play heal sound + +}); + +// ** Player 2 Controls ** +document.addEventListener('keydown', function(e) { + + // if you press p AND enemy health is greater than 0 AND isOver is still false then stike() + + // After striking then play attack sound + +}); + +document.addEventListener('keydown', function(e) { + // if you press l AND the player health is greater than 0 AND isOver is still false then heal() + + // After healing then play heal sound + +}); + + + diff --git a/projects/fightingGame/exercise/sounds/fastheal.mp3 b/projects/fightingGame/exercise/sounds/fastheal.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..d8a26512f1b2eb39fdffcd2aaafcd52a1986cf9d GIT binary patch literal 18059 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

}`05%J=$oct&{hCd#q z<{>-x6Tj7lyYfrw47yjni}HC3pd_idsMx#j>tqH3KpJB(T5ba2am+D|FdoD4 zso7_U#CrXNISMWuU^fZt%`gOzMzu?6SCnD7TC1A`%{;xKd(%Dp>R-$s8W`W_&Z$Jc z@U8GybTE~IJ-SJO>n$9`o>cUkDe2jsu2tUW4u1TI{TcON!%)yW-iC&UV-rX*fj!?1 z`FsK<{hC-wyKL(cMEz?~^~&S$i9J-3YsCadwTSDRoipl#yI3Basm5@+Mwu@D%+Xr- zNtSyYbEyn1rlP0J)0pP@=<-m(BWFK8CfR~OU_2VUF{}c<=lBcJQNTtIQrX>%!SQYNRTD(zDaH~R3?cF?dQ7v1N6(Aow3PAgi79T zp#4|Vyzz))(Kj2XLmlZd@{$Z_``o|7xnZNoxvV$ zWI#63;VQtNoEjP~$TH=HrFo!Tr!-KG{`W08=oUWikKWn(nOoj~ocR)xS^I{NGrHzl z`2I&Na9zm_)ei+ekVBWW<>q#ImtIlQ614<^>vkbKG`OXi51q$cz{L~Y# zdSP6sXMXc3-_?XR%Ij$T{zW(ufG9WKrqsDqm&sbpE;!vKc%KbNB%onzvq`r#>KoJ zL(kAWMr9kmsME1;gc0&sGsXyt6tl4XL(PH_rW|aI8ABcSPv+bu2YT~Q~1wy5~fls2au>wFvlX0E z%3S<3l#O>$sOyGHq{{9`Sn=pL<%>^Zg+IF#|64*R;0uX>d0)CT?{8yQMHPV*62vMlun@*Nh&2@#1)7u|42LysxqgQt*w2?km!)IN# zA1X>rk!ju@fqy0J*Bt4=dv?0$9OnJZyRmZj>YCzPDL#4`|E;qSKp+=@%p zsQs}TtE#$}ZAIBCUd-a1@9)m)?OpUk-;GA1(-^K8-m6WdC8EXEE`C7~uaqWu)8&)0 zLL3g_dF?UTa3R7gPtpnYki-(dqKC58DW7t+@y+~$ltgXUfJ@ZFonGP(W`8?*Ul(jR zh+Nk!1+fVtT}vZo@L$MWn?39|1g2i=Oi82H7VFp3xQdr0@lh}luWeoq9Bc=!{5_^& zQ4T~)*zhwah2fxbVs^}g6GqpT!gQ4leg@{F?ZnttGoow>F=<$ zZvtm*^V;STP@8P(PF=$|m4pBhR9Sen*H6-&Grb~{KvhR}LoD{BgpEpF)s2g&ZNld~ zP2At|$UgPX*G8qRmq;yD;ig{nTMZYyL$j*){$sS7{p-~!OOwWiE-3uh6coAhIV>80 z1Hi7aDG>>BEtUYf=BqQOABYi35;z_~ z?~|4d^%AL?s^M3XK|k>okl`lUmQ3KvZ=jjzkLx&Oxii$J4U*tgewSsY4Q$C@9H=v z`H1!x7l#1=w#mUjPcnTXTmdDM7W=%wDSF+3kryp>(afnlI|b883?WJkwW)WFVy&s(nf-xAsak}vrhU6RYst<2KOJ9_NV&u^<01HU!~KZponJT)KRwr*~JYeI`Il6+~X9yiuv;-Xh^+ znI%p1oRdbvjHX~33cs=9w~UC!m+{N;01B{t)|Z@HzJ1ly5>+wcZm%QV430Iyx6?CqovpKARGu}frBd9#kY?~^nc$rUsLQ#i% z3MC2o0&x2NU@Nc#6cv?Pdy;82~6CaqdNghTtH4?!LH=1=9v&Vv^*J1yx35 z>tm(Vi0JRyW>>Vyf~=!?J9h2yXaI|8&nj>0UORjjsnq0?5R0Ra>&rf+`6FPR($PW( z;8s?9aYQ^8Ma`bgZH9|WL#b}ur$rL;$v3!@PJQjg99_w4Aj?Dq*g}W<3iC^9o8R(y z7)V*!?bqCs*(s$_8dqPIpNl*!?sG_W2upy#;()}k@4YZawX%E9lxOxt(caYR&h|<7_#T{S2K$bC zc+B%X2l2qcBFTrxX_@3!W?@yN(@C(g%s7iaMIC7hGNSbkg)%Q=-z(MVnxe<7N^VIO zy>=e%Xdw|mOqwa6da@p~78v11C`JD=-Z{$Cp?Zgbg;Vf$WDUrGF=T#b&61ElG(E0f z9XdPG!B?>NXSIaiHLl@lI$x(MouK8}em3Rk zF(}{TBAx%NPw}e&B_47TAh^|jY*2d`&teanv`;G1BeQ!3jGKI>sI2SAt3R~PY$R%> zp2);TFRF8!6^Pxn5O9M7I_#nD*QEN zku;<$`ZtaNb@CUD5fFLfi5jDt4>q zI0Z++vL+mX*i6ltEgea&eG;8&K(Xxo+)!#%U3==GBg63jMsmwK2cjA zOIlWHf}6b`rajQCmR>pgD6>!OyqL*biJ}kay}w-@ca^uEibKWZO-3m$Ai0Nog>SX4 zDOb!l%i17Aypn_TiIXmSym9sASmWGm3{`ybSVI#U-GMrpxBl$gzv|ro87tN2oL}|T{lFE&`KDl zhcM<8R9Ae?nFUMv%eU7`%;(+SpS)AnD2fWQ%JXPn%Npml)BT~|KaIc~C`@D0E2hx+ zfwC_tV*P%cHpW5{Rq}h|+twRhmjwJ5?>11D4{@>Kr#IVF!pHfe`NgD_!n(%$t7i{d zL5_GQ?e9&6v67f*^x{U}LbOZ9EGf<^8>0yUG+=G#CGyDg)wET+D`pwhOZk`V%MF3C zoOY#o@8#@^LdqO>9-8}3kYH3(Gy0f=4DzG+HG(Vjedk;P(Z@C=FiVmZ-H8j%CG9v2%hE(txc)St+R zZJ>5xC`xciLaIM=^hO!N}Fdiczrr>Uh;~M(V^3!o$-OKc0t9Jqu7ccG776`bn~0RB212&3Jed z6Xa2@Ey;#c6J&Qq*ouCsMjPlcjV-n4Ux6H>F}g?2^$9PBS=?3rUr)*t`uLos?SwuEV;$*wK@ zqfCYiO74VABPW!tZI`p}&{9fQJQj9waY@RzzIWvV00a~Oe1QcfwRTlSfN-$D1h!Q{ zFV$}|`5~4eg58QKzs#~Hb3@f2%FrL@w}zFbEM$jIgdxRb-ZEkxtjh2=p8ZMlW%9;$ zyh{e$sE=|%o{NuWqR zi&JWpVR!{6e!Z`7*qV?~L`o^Dwi)Pd)_bzmuwf{3fPlbknP6qS#iP zKD-I_kag~=o!I0$qc8rlylOTs>qz|VE>EXC+Db3TXO2w=)s!w&q2M|IfP(Rv5v2^I zl(fVQAef)Bz@eiZqF;A&^jv&9jGL1a7gk4hmDg-7VXx7A8-{1D5-KIbeg1F#WNb^S@l!Xf9bU*<4AWVS;OWZszTTpk7}t&D-s=smZ$&cs0kS83qyRi14u*pXY<>Hzrp zNm;5j&ag=6h9y~uDEmoIsR^ta$Vr{9b_f@U%W2fok1FUdaVAy2<*=y{*G4}%Io|*LILDio3_ssd6?qk&=Bg4cc z^S3IdG9KXNuM(BcdNW&}P#i^~C_+lTU_uPpRkNorP^h1u^8e|kn=nwiPBF3Wb=cC` zDZ21|*^^$NR`ia2u+AzfF=W6z^Vtl?QG4-261&xfI=mMc3K0myi3ZsqdW4azDK+m( zBnLJ8QEjxq5OOm;=hf7AwUMRkF@oOmdJ#HTgj*VgL!~a3D*oq!w1FFIB(I1{`0j_4 zDzC`+k&}gjse?c3$TsdI_35+081x!f#MYaSb{4=cOrKP%KkgJlV#kuT;6j2~fSEvQ z*kRum!4zf>&+r%{fEeb`9h{rS&?JW%a9l))5;{x2F!YH_1J)gWKk8Ilo$I>@7W|&x zfI+F@nD)Aattf)oWU~B_=g#;`V>+#iyh8ffx>>J9+EhUFRWR>ngc1u&(YxOc?%6?| zNdz_i(is7}QR2JucMWIgS8Y;GA)NGtd<{4SaIx~!oIA$Rp4m>7w|n3aTg6G=!0}CA z@Q)A`2vyUxf9C{NydIsZu(z6qJ`FP91r(|BS5HKYt~7IE>D2UjT|ml|^0JMcNj&=JT{j2-43 z;s6qcfX7|@99cYu+pHG*KOjgPqbOoZZxTp9{+$!lil9cozRcSaXYZ@N?~Z(v7%cYq zd|A?&u$Z=GjrR$2zupdrM;lxBB2$raY~-4w=zN8TyKO)p2*AEwj#v6QsTB)qn)C|G z97`sZO`RNHuxZ&=%XROSPh`scE1Q2y91=yVGs)sJ)Di2(1%fI)HH*$?GI6(7^^&{NjZg_jtQ4N548FF+rj+>w5h{=brIsf zP_$G{aRjlB^8~t)f~%6+!vCGa3}jqWjD?{J#;tQVU>t~UP1*)K-jq0p>?(wfLtKQj zgSfkq)9RvwB{`d6AXXFQ+z8SH8t;y~-iR+;G)k5Ah~9s2RJ8*o)x%LV$Fde2?-epm zs@QZ1`Ect`LqN~RfP%h{`{BDu>wZ7AL3A&2_Xa`D=uk}X(i7TV^xW4E6N>xth1lK| z^T;^QIE25D;qX&92v;PU8#9f3-ar1U4(X;-?o63^cWfwm7ID0Q*(CGQD2tb%W;s0sX}gY{Zc{4e=}3@{%9uX(Yy!;o1^cDqzqTw;;B>KLjI&!)6u@WtcSrE{ z$%7+Cj=2spv|D_639Hk1c(-#0bi|8`PA%T|x-irVlR_@)OCGb7HykeuuzrwRmIg(A z4QZE~;n;(5Hasdi8C-w+?CTOLB()WOzk#GmN9(VlSB!C3p{DrhDq#^hMIiuMQ9}}e zz>qn{3DU`1zedhX?Uw33pq}{niQqz}Z1Iz(a>dj!u8Hj`mR_fT{_qh{bEQ+)2Q%1E zWalCa_^U02UFR`;s*Hm|{>4ols;#C$>p#bM7fe+gFnjql-MdJK7H+HdgSvlPZOYMK zNu$SAI-2*70y_K^KrxVctcM_Sgf!;jO!DCn+s|+jU80GFO-lNSKT9PLvxQUh`_X_T zGc4p{vjvchOQoBa-kj)9iJ`4vb;_3PLUs{|45fYQCgvFpu}UY1ZKEkfHyq~p=tfVD z!R_ugdQ3c_oJQ;}_RL(my39M()n_h6sWM6vFY^I% zrIK|mgHo{iHsm3J%K;M0UyHofWDNkIYa9_NWhOwA0`?R%oqT` z*gzaFEzW2d1S@^Y5$)Rd@E}ntkG1lq$&#?Lc;vhYP&v&qLm5w_ zc;+%q1a>97GOp);raOjvu=%AbV3-h(10ZjQhd`PY>6CjfHd? zCeSR=Hu&r@E$vx{DLN{CKVHydq_zmIjV>XjGt?$wnMjV!|a zq0&CThl?%Hw-tw?>d}*oP&M_I)nAcg80^lU{EvyGlKlMr!I(6-u8r4F+_HruP%1`L zWU5-jyGUKV-23-9gEj4PHO_PaQUcDaQilE@jen>t`R6A+b_wjrqsWeytQG z>+&{k1R-&?ouo_n`g%!VxZSp@pnLmqMuKd0%NeD>rftkmt}T&&s8h)o^$3VSX!0(Z zr%D=tUpTVk?MBKI`WZdba;2bA$$0$xexU>k0s$bp)MH1C z6zuLIiqH7%>>RKf@iG*pf3L<|tgpH|7}Y+kO~L@&lyXf}ba>bm%;os=++@WixPsn6 z!BJL5%0;U2`kBV^{Z%T3pVNF|65q$mKb|<2s*V`zD7(tdJQ74--}%#3VOSk9K1}o#{U;C} z>Iu=s1V)49MBO5sI0-@s=8{U!aWdT|@zr431n)U0&i-eUp-j(*m_Ws3@X3aBm$vz! zoa*=B_6T;NGqXTNOS5*1+Jsu7;6+%L-y8JX~1TzoT>xfXv8Qa?qahD;Idn}M32R* z8f{b6m>8A(Iq4rNKus~0?lik5JvT9F#)6teY|Mk5#p&1O8n6hjb^CZQkK3cEAJgOIX1IlkbG2dvJ3H|}4cRBf zfMENeOCKBF^UPHj?`IYznI<24A~LW;Vq_;8Rf2hP*M|_6@v%@Xil%xnR|;d@a--Vy z9*m6q!2Fr>U@4L8o#h{1;drC-UO`Icz`Nx=3JdbZhF9iH1s$4WO2;hz7WEajFXx=5 z)0M;oA}=0%E!Np8K|N8;0&T81>i?+&5`%KcPxq2GU-xq&t)Ok>4{DBCwW%>nrFT6p zpQCHIl~grE`@*1xiK!~qGr=#3TaJH{JsRoq<%9UXD+HL#*TC?#6k)xFV0%?HPByQ0 zm8h08E^To6|(ld40;I|d5;~4LwsNP_k}TvBK@J83MtY>g&ILG#xI`j zQO*4PgHZgha=#Bp;JPLy$*_A*E zDw1kTv(N>~Zx3k-_z0}h<)9bD)g@zF9I1av)W;CPQYr#=eXgZ!=TwS;SX7lhq`xmk z#Iq=vkg?qN#-63e+oXCm%-86>hsRER<_pyDC)8i|6_^hcfNLW9>S_?-YFmyO{%qkl z2CUi&&}UWIU=w0vXL$7;a6r`I^FWZa4nHi6mQb)vkjk&9TB+d!tjcxc+pL5vnEWH| z^QyC?;9>Tt>b-}v)4_BReB~z-axY#-UwOwLi?a#Y|T(|QQG=o+sv*8aq#m*K>N!|f#w(V zbAi^5LRHQZWw;fSw6C3w->$w4j%tg7*AHGkcMOSe)VEKS4{9)dI-WGWyVl5ZYNu4Y zg`RrX{jp^AzHJ8XUw|W?DIs9|pE~>qrsxh>ct>hHm(@TEcjTI)6WCUqa?J!?^*DFs zFgYjGkujPk$Pn`wcK!6;y`)!YHME7qQ>ZN_nx&Ee1wh5I?ocrQc$EWSAdLJw(JOt?p;ILCTg zhxvDrJK*Nv5f#}*^jeNiR*#qT-KLRzu_DX)L|53+M%X610&Zq#aj z9~1}$0QmTzae9AEKt=Q^tHru;WGqV5v~#iJ%{658K)qZ-!#5&@@vAxbuPS`cnh}ho zE)m6qb5;ok;^7vUA~814{-1F>K3NGo4Y-wGv5>rux4`O_N&>NNzx02n`f9~5sylcMWbtzuLouATq0q?PLYvk zQEc^uEibx^y1Re)sKW3vux?rkr+>{q0K42&ud4l$$)M>L;2!Fx&$?s9fsw{)W$Xtc z{eT|6_58*G{1o|$ak~h=(fTQzQ{h-&aik)4>Ii>lBNr+P#w?7}3KIA?E~_epHl_(b zyJh;iiQuDm)ICVS)i}ey^+H2ztw2<#!n>Ll(u1i(%TNhgI1O z=Cz(I*1BV02ELz2%#PbcD0kUg|ECVu!4%6LdUrJGy76&Ga9h_g+VICE^y>}iQ#bc* z+(OcRj;8?Zc?X$`V41)dTYJ%MX7dN;+bBb^3OQKf_^+*!SJPJa@m`8OUsR0Yw>eC? zL8Mq9s7TW`7}Gq38jy->x&Ie@8_KNQiJtc8B6&Wa{4!LXvExX0KV*c{GjPa0v^Jo9 z{h*zp>UI94pjqDTXITH>#$McTB|f=$)l!ucKm)|FR5VFQua)W;cYw#h6)9Cf>`W9e z&;AlsB8@(b{35RAOG6ZD)H>yyQ**KpMv#-59g>2N3{{d3Q`VwhwV>-n?JGTQ=QRrd z-XD7H<2(N5P`H90i6Y?>Bj+~Tvgm&fUHmpZn^l$5IcJL!;fCJ)+3cxQk1}atl`zlV41f7;hxnm$3s z;mtlp=e>Av7|KTHd2Y);? zUuvZ9Tz=VMr-v#6#JPp}tn?1Vw={~5XFgRYTD#X@+RYoDeF4l~9m|cP#v9IomIm~XhwKa2cO(pj=O=`)_m-Mh7 z=R!jfNUi> zc7q9^m!q&%DL)$ZO&rKBowS^20dP}2C0ng==NL=w?E+Q(U(zlFyi$$KcUKD|bVm40HXg=~HS5vfk^`e*tM`5aAB!0Pz^(*IK z;pdb{{+hmy7f(HE`5mn#SJIq-x@{)fpJ%fVR+~xa1H+#{%L$JoM#$IjS}owjd9SP1 z0`r0E1UxFwOg$*G76txkD-hTBKsoLOClyyN)%A^F8VuKxiV-CKPid3(AsO^>Mu0a{qw zsy#XmHZZn6ry&(>H9P26HZEUDkxi9tU5CA{3TE})o6XnZ1vN>41hE`=$v=lxo82j@ z{D;ZFdTNzbIb{oAhI>0QL)!7^>c3rkKbVr-XU>-BvY`8Ukwv#-aHwAf5=MMN@%%xVn%C;$P*+0i(w}4Rkaw+~sk6}FAd5W5JEU;` z#Q}jT+LV+(3ogp|Z80h4|YYjja4Rxx!UqKX2)f70@0lxh;WNa_ocw>OA zXalu#41uO@%9!NjE$U!1+1`H${Ee&7N{zWsl8J|IhbF4Qx@!*Mzm=6QtKKeTJ~)$2 zz*nn2Z0KAja^3ukgBPRLhvy8`=mGD-$t(6!Y_Q@v1!V?5yIcSA)ywAb2+aRD=ABt5 zk*;NoclA!&iq!6zzmhT=&GD<*aMQ`Bc)SzJw7PfFmhSOXgeRS3-qOF!ejYPG{X$(7 z?8+*OvA=BdlK{9Q>|w%D`rN+y=ExZ=bseMo%`j^)HFB0@zbC5WU|BMJ44#EAZc!&C zpK_4d6G1G~t4G0~+Ph;U_|fs|J*0RqONESQ_ol|2ouZF z&<%SL=C7h>^W$Yx#oxAFmWce=<|G_VzJe+hWqRSp_wxq@s$H;J!C`Y5yCUh`iAAPA zRCdnoD?OeSrV#7255H0 zgTk(qRAk7gL9A3{d#c^sL*M1O8oi`kFqK8S0AMgqlk*n?ibg^+T1SVkoOY^gFgEZG z79KAP1GI?EPmgso%!C?Y)ok5B{7!EaoNb)rPECgny4cs5TrzJr=zdCE7;qq#=i@m6)yDa-Fr z6<3l{&qLRrp>HUsHRxdgU?gtH6A6D1sn(}(JyDqQhbc}FE(SeuHY}xS;a};X8Xb;^ zcVq}o%*UaXNknGw^)M`44=gV3kYIw?WEm1tSK2|k=@DWL<-_+iD|+`e_zWnUi~mlK zDgu=s>}uUvP~N$W{w=rFOoz!k+y2=pLHRlxGaV1A!x&%a?wXW$d(n&N0~a)4t0jTwOCl7p_%>XkdJ`av!fl%oi0iucV62sIg`08 zaRzJ9y;V+p>wkZAQqnWgyT@y|X3dgUQ@tMcTy@$0$aTXp_rf1iEE~4$?YbG|vG(sy zhb;wnUHN-FK5tvU`|G{cTZ#+Lghx*~UH>fQzum0ryzL2Zwyy|3%-AHCQJTO0)zl?B zQyDg>&-{8<-!8TJ%FoVJ@#sD8c1BOl(J1}rI%(P7ud{OZ$&uN7eu=y@3R*w4^%N8?WV36&#KCr7G3VDFRh>;UwLUst)YtUy z=&{_&7I)&7(^{r0n_E;R3bevpH0SFn2rCJ^J*BX;b5YEcz>7>icIju)L0X!t`i+w!zg^+vlA6FOzYjF8J=h z|M#0VwpCmQCJ4!J0oSbXi?S`+w`$*++s1LLwyoOwYVH5Sra5PeR$V`J zMMNjZ*z`Zot#yY^^IQi<$^ZXaS~j8&RGP%;wvlGN>yw^d`@3~*Zi*v|39lCz~ZPmK70rwA^IvZzstUa}UbN#`{yU2hft-2YN*l;y{UxWf`m>0B|tzxI-&w1q4(aA4$?%5Ac%%zH!Q9F1-lYr89oaG4{=RPHhh zo*Lkxp}8ve*8%qUzeeFd$yvMJpxYebJS(z>tm6O%il$ zh5TzhAxHeLSABmYmFHIH@j)XOC;0^haB}QrxxR4UistO_7Q$|~FZ$3%1Q(6MMWY=a z>{OcQ?6uWwa0@bo1;MrG)uQO(I7Sj>v@t7bP=O=MUyJdt#mWi6E2B-6$2tX4t*oTX z>xBoX?A>Do#Kkk>Rg4*zaPeV~LhK;nTz@&3-@(DgV*l7FXr-$hq|Ok9GMVkh3^uIF z-!?iUD2+}!8|mumR903ET~c|;Ut`$Bxk6~CuW>@y2kmfL{9EyJnYKefY>#1<)-l(8 zRG*%qHf?s&Crv%clcKeKg7dMOb#oSj!Va~nRQ{m8Y~)6go4TiTB|x)^XHmLru#mS) ze*$iOMOg;JS?#}XRajA_suW7`DPM@$Un=>`Ht z!`~UWbDEPM`Vu5CDQRtlpFf0;^4FJdcoPLDKfI>%`C5I>%fB_+Y0OS}TI%OC2jynG zqWs)&*zo%C`SyjuN?%U;ULio2$|F&u&`} z;d3okLz%4ETUoaL^;17cBhi!E>NDuXo?PKnrT*U;`$r3uNjPtQT^+$uxLJtE$^uUs ziR5~lz2gyX5+a-?s&&LKHmjksv22fZBR7qZMAq6=2?!^=>!PR>pB_Nf%A#8N!=8i6 zg5^QXhh{>?$nOk9D~nJ~lJlXMx$OJKhE-SY@W{AzI4Kw5?B$?K^v>yoK3~t35Ia5< za_GASP%jXpt3}7Y42H9S-)VKheJ01bXm)$_l#;2_P?f?KFpsYJNofTOP%_~>_tlI` z#h!!osv_e|u2r&^!D;5YhMKM1G>H$VomzhhXU|KKqaR)<6{TjKuH187m0w4$(6)hu zAFca-&gS^P?FBB>l+&GY-v}RFTb_+Nmu4m1n3Et^4kqVcpzPqz>b%!O@lLGHu##6a z@Pg}ysZBSlz{VTma$Dx@`-XE&ojNqU$o~`*zzgrbDXZLe&}vtsw{$!?_xL!R$`tAD zLJ3RL_n5`1X$G)3|M?>abLX7AF~yIfF-Ibj zI%9XL4t6if0njGH-IR>bfoT!&^3c^5%WT7>6IsaZ6~u&%U6nSpBbu0t*yV?wjaklD)pDWIc_)D zb*0IrmFSCa%*F8Cq0SMm=V^VBOU7%&+vA$|-()@6-21*War^eUu2kBVpeMuAyNNv% zb?u|0dm}W2@3g=ZpK5!WYvhq0Sf-W33V$t>mM(#&Nqq+1WQ!i4r@O^2)83C!wD#b8 zb^3U&1pk>w677?~s@vl!KO`?pGcmBf%5c5UNoY3wYJU%}Tk>#yL7ypPYl*zi%#d%x zix@Mn-68&wa9V&n#)IX>QGR%~$HqDpfyPAcY>Vq0yDYgv&8@rvg={5Z-on`?`Oc_0V?OVUwYo3{@=PMYF>$Yc>J{ju9=zmokV3+wJ^$vcT;K-uS+{0A;2^ts0JqzZlU^9R3Q1>OfK2bebXcHwPyKf>N%iOVE+`cEWn- z1cvM)hdVRdfnV+Iv=c@!nNMR`S(wbqtQMA%^h`N)M^scyY(DG3cYIb> z3N4bGh=CYP8nRLlj12pX^4od7?)a)SDYY^8TB1a@v`@gh&3K-4>JEt+W1J@p-w;YA zhm>Auu0wUtk7FZH4O9&xo&4&4fYEOY+I9TF<^9daHo9DG1EJl!W7 z_H)j+)EbpPaIEBGBGk4s)^c1^sL0t^XDs!QCvAr;i8}m)ZZW+4y_GV`mq9`4ee#Eo zG2xW+Y96X`Hwq^@4O2JN4}UG$4hr5qcog<9GU8h&0PNR$--%CPB$HG@ek`k(xEjmg zES01Nk55~phf#7n4K7&O(IpP$#YjZP4s501GTTd+Wv+(hfb620^%m?Fq77c)sI>-2 zHPR?3mBo2nG6|;(xCsD)^Xv6*!8x(l$bIuhWnnR6!qxWfgJK1xtyTObh3f`3YcQ~b z9TKo+?E}=;URG4FG6J^Ha9xo|mR~SOxnwXHNa5A&rsoBZ-=pc~Cb|!&6)(@sxpjq- z<^~xR8!t@Y#+Cdq304~}#+)(suPIxv6PY$2(<{>bHngy)>mCvDv|yO>p>G@%b+vJQ zoochymcFH^zi)dg)A&v4LN32S-r~>mxF%=*59u}ze1meUt~NKCz3tGWGPgX&l_xc1JLdUmG>>_IcVO+07Ut%8#WdGLDboc-+B8 zZDQ}bheTChFAQChtV4|kN&PUx6Z z#|T$Hu_H@CIF;`hJ1vq9yhK#4n#{yp$7EK?QjOMf4nT4AiPTf&#>7IcpV1QKB@d4F z8&qf9NfWdZWn;#967OX3bFMk`&)BWfG68tJAo5Ef&3fM&D-}LdHl@!-0B1pD6hCLYh|YQdIASwtlSX1H$D4n zTwg3XdQlx@Sr`SjjbiU2<&Bifn!H8Ee~*(@BhtBRVxuFBv`W56_o);j(-1GXsc)TS z43{g{*XQj+PZ8r&IRYAFRPM3*ycyh*Rpic(EIm94Vgg6;n$-0@PCmz~Rj*WclNI>C z$3JwNG@0A$7*6A72#ZN6Vq$yzrYbfEuQA6OoY)>}9IT^~rI8#vc>~_X9Bnl&#|xlg z;q(C|o}=$YYkb$FL3ggr{;DI?XqHxjWFqX1HTFLdI?zhFG~sWkpV^ST>%b0h$@8`o zQB$}VR@M~lnvh6aMdNZ3&PXfw=PJM|Wqh6x^1+6I#r1(`&dB!f_m9wDCR%wt*Y7Bf zOz2vF)EyLyQRiyX`<7}*9?4w?ZB*hwm@DxzcXS-j-G(2&Nv{#|9e-$So-~-Y*bTHypel` ztvaggcNm&hEXO1zv)bPc(Sz|6lWB#pc&_2J8x!5rp4C^}-7KM(lQ80>3aL~FERy@M zu`k^7&hIeYAZhgfcKgxc8l>6IIb8r+hAB`IdKb#IT`FTr+KpHV#R^%?rEG?qs7}tm zHlD~CqS~q0*fsE5Q*`!aA@(mJ5gFu?tzZ^gk8d30%XQz5&d$*PZ3lW3f`15NkaLCm z&CFH>hvOK?cx5kN9dI=ONsI0HDU?~^d6a^Z(?-G-kgWbo-mxXYt4`;s*(Uz?A;e7# zXC3tj(;)AWRG>MiVEc2!5?qT~%ut}#S5%9j&wc0ijCNUd*(ZN$q1S7dI%iu=2uk|I@@O{#>pVeE!)JHC?1N~NV)a% zeDmV``NOegz`Bx_g~BhOR9J(l})c7?CCb2vf6DO_UsMb+r|#+@Pdn z>|-#0HDXdOP#ovG3>~L8butdK!cgjgezUt&9DEfeaRnW@YIo=)~H=kE3!V^o1CYle=*{Kb}_UGEl+((>$ltQPwexh0$I{Ih9!9kZ% zG09ylK1T{(vIf;kMG{VHaTjowJma~eI>Gkses_^; zKh(5fU@~Yzh*m{rREk5k97dixcym%1mM?bLZ$R;7!bjF6A_%vX1vUDlsJipRUs|pY z9u}jCj`ufN9O_G^-`ozksF50cy7Fv=viq{XAs!FH4&=WO#oNWkm0!8;ydkM-d!HJ@ z(i(Hk!n%Fv=8|(YkK2jX7go}NBcnc&C)<{4I;ehy#aWMC<7b_mxe_1c?j0TbPM%v$ zQ+Z_Hy4wW%D5AZB)n5nY{w*_zudIe4X?spGuude#NhF zVe1!Pf8O>+TpNASek=NLF}36U@f%e+#@)CN8kTiKpFe<3&qb&^HeLOWru8$b72WbY zE41xno$MlF1ntSj~`hSIAr^NOG9T2EWAIb!dwkb0?|2YpLl12xI`L!wSm0m^UP%3SMl`)3mZ8Q8!0-OWZsMlSHF|(SF@#g=X$5CM9=X6 zaLeuw#q={_T9FwO8#WF}Dm1C-_KWE?45Qb)EY(&xw|nYQL*WPLo7ziNif9_iix6bI zf=E&rn^Kf#kZ`kPF6mk^uRZdFsLl1KFcbx3YbvDk@w)O`fKmnY!EocC@S9gY-hzbv z{F+ijA<81!=KC(%P@nUNo=B+MhD#uo_mm7@&B_W-(D?Dkl;W>SN#Y&IV~kZ(;f}>a zUlGMY(eDH`wVJZAx>!}T^L!+N#QdgSpy{t&T9aWNuggyfqEpWpV!fw)&9cX*} zQOM@Zz45pX!t;DjVQW@0adPr}k*~r=CRw-7@?M@=*A`dVJGstXYMyXTkENI5s`YQd zw06#dwS^@T#2dItq0C05<5bBgRf$1h#7|8hB--_7Q|(St!DU~8yjywM`a52+x;Rr4 zQ%9tZY8hoW%t4f89bE&60j&(}rnGu8PxI2X?)EI$Q0nbCG)$b2biw0{9H|Sz@{#ap zd-!t;Jrp-`DK@O#?#mE3`hhaK%E_dF5@R;Y%2E4cl)S9RkRN6wWYxUgu)xSk8pUl7 z{_xyjDJt|(CiGJo)XO0$LUT&Kye;qaLfucEPR#8a;d>l&%1?0a=S`-j6Xvi)fN^c6 zqv@lQMwAXU_gj=4_X&yW?Mygz^!*nI8~OsN^rsvQuOEK7cbj)XRgA-7uY@O7&!+<_ znqM|Cv?!0(6Hz!p+LdESLWgOJ3zI-i26EV}vTE5|<>9>cq;_ zRL?u~h3(!jy@bh0L=PoO<0S3xV!8yzEo)C1iLh^!eaL>~6rO7$o_~9n*H=ia!C5dg zeFc=%%|=2>7kOdxfkKDr@2-wWkeaVl=nf6Bzd+sDH#Z9&3=vH>6fYB^3E*nFK_Wv%K^vqJ z+?SKXJr=F!D6`j|lNDu{>*p;ndreniK56r@SO_Xbv%2!6u0vC(Jl-bW@HOU|fcXHY zH%Fh&#{f&S;+Hjg1VT;yBL}nmN^9QGw=THd=iM4RWDT{ zRD9Kp4pq)4<#oqg@4Q2ID(?Xc$AIG{BX-~FQ1*Z@`zYO?9B#wu5Az3;@A7j5ivG!c z`DMRl3&SX}oN`0`NHXx_h5yCliGiy7mtCM`+}xeVmx6n*wg>x!eJ1SPqiwCQz$ zFe$Pa;(qJb!kEz^6Jt#OlZps`Iz^2u>c6x1RvxiaI*?$DK3>mC85eLqOyFt{Afq-9 z0Xu89s*l{? zp5MDlICpK^wtirM$)$sRJebLV|TVmE4w%{69@OQg_F+m z|0V(ls~|e*61@|_Usf6rGRO-mOW?VIiv*uaG+MMe}^|@t4Lkco#7my~$6j`km!*rqq}7 zs1~oUimB;*DKd+v7g80tE=sr6Dp91@{=}de=JQ@)g6tua>Gu49`QXy;pI#Y_=66Z8 z&a*<8f}CZ((-7A8-x0p%e>&<4AY8Z~oOv&c6nJr`eafB|war$)cA~9xgbXz=Ck~Q> zzy+b?m3O$f$LHpHW8pU*I`M~RJ2VV=kYf4xLJGOOrLK`bB_Wc; zjnigbhm<&~pOPUOpwJZ~^%y5mhKWSXVRFUN9H^i$(OGC7|5I(Drq`{G-97}1Dl{|; zFR+imk7m(&JMc1QHSjHbXe>y#snlf_Yrt(Lo0o-cQRZeQY1veu?o=zKB%I&!ij`Nb zu(J5Nsh&HqJK3i1#vW__XybI~Ap5M1kaNB-|J3YY>inmO)5&aVYU+>EmzR3^{t4mt zW%847`fZ*d_PHw^@kd9OY5poen}-8~L6_SB?G-~+5Q!0~%5n=uu~g4;?!dBu@>oF! zG}e(K76ESWa*9?C3Wa0H;W!Y&9@xUZd51mt7*0y(&`}C^U;$ZKWJba%fN;Db>^Dm{ zWPt9oJdQ6*Et9y6l?2Aj2(U6DCJ?>kQAx;AhDKcrQYY>qm7x&BAz}oEm`@0_%E8?H zO8$N`e{#T}xeYn65~&QLl_OWyv4UWGI7}>4fzD@?hda~uTj!F`Upd^p!A9q1Afxi4 z9Gj75^Il}eGNn~!wPw?@p5~+KVZU_jAeQy_X$N~yjjG|a`gJrVm1X4nF^5k+{SSAi zQ~S$HU6ANgO!|aYk?G!g@OOLkjlz=J>F;A+7DG}5BkwKMF$}wHiLJ>^UD3{zqq2Iz z^wC>M&1%7`Z=aeea64h9F2#6$Bq=ur2SyVENLp?Z(Ds+kB@ZmR8%Kx33`P*)jmRKS z6p6TbPP_6V44-+M1eD3}S6FJoQ*78z?LC4gUJMP=e8kc-?q=AZXW)fM`9+m#@x);2 zfJjx+9LX$N1-b5NPESiTit*K^*wPf4-m|jILoNyfMCtI`5w7eruPMFeHzKzK%6%3d z=h~BKriDD>W9|;F+@I9;vlo%BK>DBz3#L=a=!XFXs&5Nbk1n6?@U;+SSei zZInDnA!D=XXe?H|>u0>u+qZl2_UYd<)8|V{YSJ+}gm;6D&XaBKH_g``zBF!qKw*Q4 zL|*RbWi+(x<94LP15h<(Q#Np+R0op1lcwzLkjzo;OlXpg?c}k9TuX5 zh9%!rHOb^u#g16}W6FFIi0I6DTJv};d!(}KKYx@8Y^1Wb_~O^rC>^JgyDfU1?|!s3 z>~QPZ^QW7wcC4q*aS7&QHpoCGsnZ_`JahN9ubT93yDV=@_dX5$HQd&BkvaU+QrG!z z!~BBkbJ4eViGHT+@1u#vNkPvmD`}$uaQbG|h@Kt}*~BHFu|!^1qG|`-s()W$MW!QS zu11A~vPs>Ih}2e(=!@h!LhQ5TIh8`_ZD`B8qJ{J-GD4kA)T?vtB5fA;4sY&#!@Vd~ z-hNV~mnT@PR~G1T<|8O;`SY8ZwdaJJK@o^v%qA`2qp-KR8Y1dp#J=Ixr$umll#UzD zIJcKY1mOr@?Ll6*djn(LDRsI|X&yXp79Px}t%&;R9Baa_O;b~y?H4bK5PhQ)=_ILz zX>@jlZ8&7Jg+5Q9<7+Du3+WZk℘L2Ys>T>i2mZ9oO*s%CMuo>%BhDFIuEsfOtKZ zgu{cF$WVvqZP?*Ul5I>93AB50iF7W4*Zr&vFFQ-5-&uaECoi)7AvD&gh!^4%3o- z@G9*RBUeag+D$CrXo*A>51515(-JFmL*HI+74!YuM>jWQ+Z z3HsEo0k2JYqJSQ@cS&7td#%1ymGES>7-f113-^kCk%{h(4<+Ufj~?V2lvj)+Ivd-K z6Cr)(zFoYp#K+RiN5W*Bd3B`)u$P}5)P94AL+obn3$p)tve{yd?aHE^DZb|d^I0OV z-IWfZz7zH)6wFZG5oTg7vVY1lb^X4QiGbDNMd10{Gimb|FjK*iy%ZDC`!MbHM2!m< zzq(8ybD8^IPl*sTb7zK^mO4%U)b9{^FdvmwlJKO)ME+78+tz6b;WejY;~Htoc-jY% z%)^y9?jO0TK4S7)YneVhe*dV-`81*O-iVZAou{S4OwUo3HS_R`6PGiyQR9vp580_?=6R~-yw{FPUp9Y_y~p<4C-+>l zx8##_tKBX3$9cQ~7FJv1vp@6l_m%v9|8Dfm4?NR4x|@`x)@k-(I$1aj(w!F~5dsWEmwVjQ-}md0wBqfs9;&fwb_Wfd=#d|0rN10Z?KG6je?DQj+-^p5Vh&GaT5*aTj0qE#2{s@93isQ zu=@~g{N)gtl4BxjF`4pYn-O@}-<9@sL2Us~?5Q-fYqJ1}ESnRpx&iVI*tYylAn)O6 zbtEV)w6`Zw^i#8kFW8Zde>YlhWc5?!?95g9iv#fQJm|`&){a;LHwRnuvoOutwZ& zi@gDqUcP?9$oPrikN?0(gFr!Y^nsUtXB2EPqy1azt905GHh6(6K#)MY7PXBA(5`^h zBIdu$gGB-kAgt9i5-xt}PavEurFi;gJ*D%FvUhS=P30$stC4_;K?lSLFxck{6eI}- zc!+^!`~p!B(pO#$3&Y+b#*fk?*noup(b3V?Pb5>85thB^SXnDFtrC?ugGY)$&%7r^1zfA`+$V6Lz*W|)z6?e%~I1eXEe5x zMx^7h4$3u*kiQvxsn=5=pfsWAP7#_|3)0kX-f1Pmw9c*8{g_|aPrMq4B6F;xhyyu@ z6?;r_x$*DIN%K(a?t1=2kOE0)*nMrI%Zr->*s`&1_Z$f{_^z-=yA(wb98L{dK$2fJ z_1wRP;VCR~$g=r113*g)gyE?~pa4?dSFk?qZ%_P?OqqUt{7X&j_A9=fq$Z5cuA9&* zw$91=?@huB2AMVgA1Ai22gNOn!*RM86E6=FVNdMKSsr3$Op+Jl=go04on0>9WBr)Gn$zZ|M|NH~Uqd&2LRwib}8Wj02O=zxD3}p TC6~(>8~~&)V=LnS6OH*Fq?v8; literal 0 HcmV?d00001 diff --git a/projects/fightingGame/exercise/sounds/quickheal.mp3 b/projects/fightingGame/exercise/sounds/quickheal.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..bd07c289b8ad8ee8673dfc9729cb7ffb7a1f0120 GIT binary patch literal 13833 zcmeIZWl&r}xUM?`0}Sp2XBb=pgKJ=LcTbSPo#2u{7+iu|(BMvR4MBoC36_xH9ta*F z1epVS*WPvNoI2;%{c-EoeX3UX*X!$E-L>ki?q0pRRpbTG0gv$M8yg!x#B2|j-b*`g zKTA(rfQF;LwWp<>H$;R-2qG-_RMycOBJ1PmVgun9<44^j**uo~zhUg?X8+(Pe7MK~ z0HG-W*#q>Ca6TgXi2MWEkC;B<@QC*V$VcKH$$X^bf%->2Ju>vj%mXWr>_2k<2M+__wkLCgz4#}zXQ22nF&0j1eyof-Z3FXyYUR5?2{d^#!`8pl|f8T`Uv7jH0@#HMI=- zIWDyz6pR@SJHX2ZAYB0H2hGI; zzv6wa5D=-GFwqgt%591?F^OmbRAle&ev4_gaSSEK4?VHB{YgTSrB32zYu0F6Ne4hT zAVSE2DUGe4I3_DuacPOMCU>4}y>S!K!gs3mHazGRwn@@7w4G+|*1;J4S|s}d7UJs2 z@YAP0mQd}TVKX-O@X=C3Pur)H4#O1`e(=5N?lB!|{qD97`Q#74DzN=c!Wm-9u43Q% z8z#Wraxl_2MSa2wjTPp$8LgZPfB@XF1_Wu=OA`eun-9byFZe z9@o#tJeeP`hGWhY({wBe)D1s`z4U??QM}uUU;f16&)q2LXvl_Z)krO)zq4@GK=uC8 zE6=x5bS`P>r1mZG-(hegiQ1H4k}x=2JCd+p)AYVV(vXA&XfX#dN6C@#n;nGd*Lw^Re1FNMF|*Rr$unO4JVf_Dwz@dkKG45H0e-W z@AH?H?-|Sq_UKI1^w%?=rt5wmHJJ2#1Yn;4hSH7KINL{v9g|XAgwU(zo zyt}``#z^2N0OGU1M<=%(;>?Pe#{eYTcNzykh)Oe}s{r5yfkc?)qU_Jy`;oJtumWvP z$?)4v$wM?wUy!Yhv!t7jl6ukCaz=34^WVD4bACd@wGKWANkX%`|FIV%PJm>B2mOf$oTO(Y9335=mS`9F=nLW5iLon;|E77ym`@3c%(WQSo(W2mfEk9j^5Jqd~TTzb)eZ1 zaG54;8;MKjA^I0Peh)i!YS;r%Q&QjIkllgjauek=jD#3_ynfkJJ^$FF0{{_L#Nb8Y zCIk^+;!JSxgnbE(c?7U`DYP_(ln;l&Twr`7lzhscruI($oE?k_6eO2LICro zprg;;*JnAQbt_Z1Yei&88NvA24%;vqRg>IpE> z>gxrvVIS%VsZAn~9Lk6hG0vj9sGzcBmMT70Z;>#;K;xY4OcnYtb{a1CHCL z{vOrRO;;TJ)6%;)`!g(!M{+*al&cjNrnlR3HvqKswa-ZTML^~T$e4_lk{*K+6GX{M zLy5!&h5~xM3%Dq7Rs?_ma&|+kIb}5N>o_XqL2XjBV#hQpA=Vhvw@Ob@H@)(QNK9vG ztv7yfz*zaO!)XTq88MrD&=QiaKm3Rh1}vQvZGOfm}#xh(PRbz0B#6H*~r*jsqGf8 zEV5+*iyq3qX!q6c2W^_}+`NP1<=E6Vv6D#$$W6&8b8JJrldog+84LG28o#O_7q_#N z($^FszA3{TKJh;@gMRwGwtlwzUd%S~$k*fr!FKiXG{ZNEiHoS)GK~z9gFo-K^SL@| zyxLykq@_&poJt+y06=ML?xKG_Pxovyjp~t3;6)2^C#`M8Mr+s5GGbTFVMX5!kL&aE ziIrwi&*+o+1mpj>CDRFg1*_f};K9{A3L-XG%1W`E-SQImVKxb~K~tDBD}~m4S1Q-| zr>Z~JVzl|}-r=ke{8aCno$Iy9Ze!d*knVlAOOq!mk11PC+WKw`w?_G+po@$gZ#@9O zL#J1sGTq}0Hp`08?u}~-xgfX1p~aO9@V4Wn_MwQDwU zSHo>*!Ao8y{`=drgt`}=U9Y!EY_`vzW?3}lPYOsbhu2GU4q%YnW(|oIbaY}N0Q4|; z67h83+7yd`Yx7wa*tlvCBMu?}z#(f>4i%b5!sllp-2nWVHzlV))C ztV=Wq+WA}15vP(+oKqC?uG+nE-8Y1HJ8C+dL&6;W%g#Td+S@Vy z);YKRo0SmvBf8Fsexqi21J4QbPAFx_zR6O ziCQdnr$h*6)r?cA4gUf?`;&1g^Vq(cT(xHv!L-NNoLXh+c{HIwc<9>F15S40X$q5;<`@{r0R^q+NI?>_9B`xU%#~b_1XB`^r*Zmz;-h zwir_dnNS-vfL^OiHae6F*g;vrAINAdDx;9J^IXB$be>AtPPt{4?ly$o;@T{;`nfr` z*N<@+4p}zOdGwDf^K?!$7Dg*3Jq27@wTEX?SSw~lMlzBL@L$)%W|QV-Xx*0yJJoL9 z-&61;ucw%=emvqdVmZvOgVoDoVrBbhNTJq$;muc+7T{qJ=`S~fx~SWeE4+v)DrLgK z5xqp1X61*(;&s8#WeP%TLeKvy(XARSNo4*(WrsQHqR zN+r9X#V^JNkx}`PYWrG~Ev9Uiz>E1#BgfH7$7CT<=K^yMQV-eH7+LC8oTmf?zT)ZG z4}Rrp*bdGBkr9&%C)g{mLT7wardt{Xj?X8CozXsn0RRkNCrcrvL{NY>rthQTwm|Yf zt!Hv#=#0ZSIIUfyi}iHUwKPinILie%=$ebR>G26c;i15{Q^kdFbRsm{YOr}DibJsO zshULH4M7+j7RHq-q%v2qrX#-$Klf^-6 zP4!Cx)AM+!Qj+vd0%eE8N-JUB_!`Xqo{QZw)E-+^iw^7k>7c*9lnD`$Or7?`#KY){ zBLlNeU-J@bJ`+@=&u^9W%OOlfVc{*zvuPhHt(-g*oiaF6ro>eRQzw2SMl_R$^*fKf zhW~tB_A`?D$b9pTl#TO6tlZ@4aK%wV82yeGkLpYudbO}RWfimrgaCz_Z4jlQ5%t z;zC1xE#U(g2}8{8>&l*dgFsBq-C*mbf?WmeJX#ZUT6mj*k8GxupEQ(xUhYwGi{Tir zY-ed4g*nr>vL_v*U3Jq<^geug$thG;?UO-uh>6JqLX-#A*?YVEildGHR?8<>W>>QQ zRali8u5;paEQ%VVs=CmNKu>DK$W2zH(HyE_iPQPGrNbPb9o?0!*^75O2n-0fwhQ4pR* z3xe%ojz+|?QqKxjNes0L3vsAgYtPsZA@hG8Z*pMsp<*xEO!@iZtuq0}=UpZ;+fX}J z$2Q!;$>ES8h@BkkTqSnWcaO~6+v%4;29nSa9Lt!Pl>x6p*`!|pP~dvwCuqr+WVtZ1 zr)bRYeGQAg$dX0LRMpt|dn`{_^I}`(a8S!BuSHvkKq4LT)L+jPpmB#73xIXa;56)L zz3D={$>0P54}m$+Z<@XQGNa{{J|^^QL#>mhD$&>(3LKu9@#8{vme!IfWdcQloLC|J z39*fnOSGyNTB4eIkS66iRc}JcR_E^X4>mufjzuKrR9SnvFZxRYz_!QZ`LzANFte9r z8EEZGuyE+)!J`8E$A-Q5^hKFQL!~vZB4Q#=k{^SWdiC!N#-@n>l9nMbZ zzs>oz9Mi_4%81(Man4~R?JRRl+7j2X5AhS}2%k$)4DTyn4Gt2h zJa+x&DQX_WqI4_6q??)iC$|c=e{gNkg3`H@=uBhIE;4HnW6N^3}aG&GY8~X$Co3UyRt5`zx z;|oJ7=i0fVaOE2)1k=#1LFt8!$Ttz{#VhxaTj;?NE=W5;02^Sxm(NbEM zOVL7=&pYL>yX{_b33V$xAwCzLgsZ&EmCH)Y<6cS>!6~s2Ao8=k_9t^~p21z%-r|$x zE!~6tLP9MEDB^0Uu_PT*%~;;6W-Qr3Z?#+ANs9;I%B3s6&bvP17I3s$xv$ViY;3gc zSCN*cp7jxPU3qp@ZI>M7X337RD!3-opJt`w<#9|K#HlNXR~5Fh%D`o!mCJ}WJDkeu zV>6)y9*jW_pt&ZtaFvWe1Cdmeo%5^0bnEMZ*R+69MIwM7Np8B%udl{G3&!DnqKkqK zpF@`^O5{__6M?+hQ?V$M8 zk}j(jIn^x1Wo?OZyDSyXf_k5a+h-tUl*j64+69cr-rm(|&W4!|xyUaVbfBt-HSK!& z>4*8arJ*w`y>YS&=ba-{o8Hsn2gL7V{*n1YEEXe^XZshp%Ru$@0b#n^ zt!!=&N0rG!Xgrp5UEzDnb5`R0w{tjL#;wdTPm zaQ0<58d-vy!F8^NH%Xy);YbXL&zTu}rM4sT4;QWUQ~Q!rl>zkxC|WFSblFJ)6u6n$ zj1v-e<2^C;%wYOy@Se9OPZ_INlb8fPSkc0%GA?@RuVN?Vuw$wCY0JsMc-~7?-HMa< za8F>e3Pr5^22Szf3`1S8rniZ${?!~B5-7kTqgT8Fie(`@fB~3PbV=qKHHJMCwF<_f z(AJ0vEJLH=U1UOQ{(A6$w~Hm8$nX|E2&fvLzP>2m&RxnDS+VAbGL-0%uG_96ClZzn zU+Im`4F3n7MrAs{luK8FR_QuxCw9`JzWI%f50$2&p%XdcIZUFa)m{%ToQnytk*CDH zlS+_^mb0TvahhPSXn%X{*WUxo}k2KRw(c2IlRTJ>>UsFz&*(tzPnN z*}QC53fuMf8PWXc$qTK-5tDlm->NF78x3EcpWfZH;+3fX zhvJYR2OT44Jb}Fowbz7}tb@dZyk@^YP3{{CaJ57-b`=Hs&R$F$Z|)f7qwX`)^hu&=;(EACvN!rrQq`y2A4nay;EG-0DanrZrL<^mCeNX%E8+}q8Tbtd zWs`VqBFqfb1M4y%nJr!>W3sd7O4pzw+nr6Y=Z z;)e1z^%cu-x+@q4qbID9uwoI(+ zp8~?-&j`Ze1bICM%FUaW2w~@c-^K?8Fp?BI9Odom8SWQJj0zfmxl2X;v98-#w>`88 zi)yb_$mX>bBoo!7l?BAB@rdmSz%Ef|*WJ{N5DHE?S*vFT%Xc)S#5~^%F+$;f-f;Jb zxR4v)@8HHo&*JIy!rw*w@ngBH#ZSI9XEe~123u6!k?JwIe|0|oSz(G^26~|htVVmhxO^|YdY4%m7E094O-RgeUG1FU&)-U=T0QYODpPEKP$Ar> zSv3>@ zLqw+$zG}KtVJ~Zn8&AdB{PDGdnzpzZ$lZOR0^tUsP&bLxStT9TTupXmYLSd)b2lXE za#|tC5G1b64MyBKSMRTU}e$~FpBBiOp_$ZYr3VQjaSl5!nD{LFds;{fHO z;${ILeI274Jh>lfasN=34oy0vF)wPkeK+`F++9)ex8lH1S$m2x!03b2<2C#`160rz z2SU9)iP-UU5EKiNf0)jQWRy!a-m3QmuOZkdOyH@prf9IHgL7|=}bB*6sRWxHan_p&)c}?H1ta&GcxKM0UZP}niCwJlL?~`XAn;s&C3T81eHvF25 z`S@b-)Yl_KkdkQ+0{dF1H&)B7Oc-^@Ytb(h0+a#EQIO>%>mIyAZEMJ`a6+wW^^>iP zCzTWyDLlqbpWr)53s6in+l%LNy%2GruC;w_hWWHFkd z5H{!KII7*$X)cIz+X#JO@8*^}7a=7EQkdH3kXA}{oL`tH+1+UIxRXOs2Vt|EnNW^n z5Rq&la(7NVu_(ni$!!oY#^G6`CtCQ)SMI+dXNL3y&8yU4;AE^$(*elSg=;6G5EM%jx#PKVQGoq*L~9Y3?;fuUYJCaG|DP@ft=uJS%4Yhq{ZQi%0*gEJ@F% z+RW{|)MZprah&XND*frRg7W$?exQbO%CI;UNz1aYr2jJIhPtHAARd2yZQbUzNlbH2 zb!PkUiC|;Z;XboVr4pwKo$1O4My40BP?Adv<1|G}>4G_IFdkI^NA}NGeGvI=zva@{ zF9_c*c3;{YlS36d`*>rF_JcQ2$C%oSU z>@XEt>1&GR3=F#DPg~P316?W+q;$Q?ksv3rm*Zz=Jn8!GI@|W`Uop*(hD;L6IzZ=45+90Fdzq-X40+V>O)*J96AYPZ}!8uE5g@2XFu8W*gLMZLVrT!kzz z(s+g=4l491qH_=No)RTvCillcDE2cfOXe}kv##?|w{A+ZWq2PZ+o_{TxS_%LDyosZ zU@8n(N@d&0An@1}-y6lUU?d7uN2w;*qOY;341zBq$PLbU;Y^Dh+QO-!d#wm+GBa4IkmY7{|k?O1;(ow4NUqChJ&UgidPQl0tP6 zw=!DV@K!w3;v<)SbNl57)x1t!2J_=#lPv+Pr{yqiPhY!A%oOpf^Vib8KF&DU$0uoy z0eRD=k}+5|f3IGezYkb|({K8j{iG@8caq_PMB4ji$1u(ECGj(~UFGPXtuim##G9Zw z=HJrLwSIlV&ej2JA%Y;Wb+u+fHK;5MUZO)O4A63rFomhu(XEwXtW7lJatm`S4ViDJ z!Ud+*TUjqrXmEwP7RSlJ)+nikG^fs)CRbv90?IjL9c=ciP@-Z_oCN=gzm^+QXJ+|M zcF%^9uC8wI^OjvpD^)Vs^}QhnXYp~YA$ucpgBP*HO;-GjxQ(}AOi+$qp^oAV7#oe9 zsPDsd{U-RO@)Kq-qu*E0WL`D%J{oAL+8ldcu3X|E_3u5Mk5&QrTS3SAQ#qQcQ<5&u zEyJsq85q)~JQnhE@lee+yq((B%fGWqVxa&aPS0}>^w}=dl}noPj0|WcyIgzn_%f(_ z_}|%d{+Re58S&BF)wWIxVfzvC;~faaSHchXwhIS_Z9OmJrH-ASBPSi`rbcPgJN!-% zM|meiG{o3(Fe~gYjA$9~6rovzD<6h{7yEyt_WDW=c;Kctcs~U`#KQk!DUE>>COc{z zR4JqG*A`lfpL8VGe7u=aFZNh0*|WR*Ma{1nM}PcpqDP4J{$ z6qA?QTdz++0SsmM1saJM+DP9k?OaoZo)Yu1hSbQF>oDd+1xzzvx@fT$-@j?DVX7s{ zwS83FHWK9Ou;9!q=bv#%-DSHIM7XG8UBle4Ayi#`5y|*RPHq0I&q^}rnlldmulwFb zg`V`&{(RTmr@ND19{QqmwAVK~KZ|78lOV<%;f|FRvs4x$ePPj%{!IQUUdlUs zNil5b33vwS8(BE9;WHYtaklrN!fDCV$ff0LC0B&Nym@tO{a|8n*JVes+!A;FFzR5Y z-q=*T-Q{0Q&g$#7$xMCzz`hlaAXLt)e2jvup)kT%!^;h)&wq+{t*Gz5HotudavRxyu2P-XvKUl`T2ozVyyp;a)6I`*7g~yjjmerdDgQ!g1 z?oIy}`LRDj=3??ujt%VfL&E+ID#U0r&7j-j`%SD z<+J7Gak|wj1`fC}dLX(qTlhp*Zd~-OE+P#+vsbx6;j?i}O= zf3lDR6az7O5ti`3LC4yAWN;}6`|5pyT=gGci7So(dHLu$y;6HIRb~$n+n|&vNG?|J zUu|_U^xVanKnQ=*l* zYlqPA;~BZia*~d{^Sx`F{e>TQpuu3UTSf~xwc7v?%P9$64#5W~)^wc*^V@#XwYG{N z;OYGvV7L$5kk#?ap$kCMY;HE$dkOQvtl=IAd7$EqI9+aBB)JV&S! zJ@a_c>rIEQ1Nf{ETvB`B6DtPU2)AZ>LZ1w6CV0=EQg(b9pRGtB<{8jg63n)O@2ASbjTIw8}H$DPe>3!u+ zO|KQ#{o?XZo4rnxECkT#d#JqV57G02>d-{>=O4P{2al?R6khrqi+d+gg^2CH+2=tS z;c)}0YKXWc$mW!jYNGW~>)DuO&9iBZW5Fn@Y8!YUM|81t|r$ z=WTo5PLkYDjojV}hybb`H> z7s8xn(Vv#b^70||c&W8|--0jXs~{&5tn;R<_a_P!*%bc_NQfZ|Z^Irh(s-hmW1Sf$ zS_mG6*r9VqhsfbE!%AGA>IW2;H|?T{u=m&b4iQaUnqBJA=F+^1%`OU;CJ99Ez4g05 zBYFcrntR+la)|`RTQA(;$*acHj7?fv2kU$Ydl*%TirAYDTGDX3j9H&Zb=!x<0*GEQ zw8g(h-RorQfI>!+Xku}2+^V0Y$XMQt<2$&q8m6Vuzf~C?t}g#x+U7DXz#TPL`weAP zEPL;cS54Ihc7HDlfvm(85_rKv~dU5Bf0M~g!faN zSeWj{cir>(J4Rp6Nm6XcoQaH~MS+*mRlMI%z|aVhNI*x=eIzgpIKm0#qz484@!?3* zfp31DpP#vK7Nfe3tF)+{*ncXyMJl?(Cd*CSjAT%*aorpaudHk=(olKBiAIYXJ@lo8 zN}NsxtcrQGtnHqgYNOf`k%`jlEfN{`Av8dY|@10{O^%``ME@uOb{OK7v`F!D20pIC-3S@L1h#*{`Nd&7e?L1iHbl2SK_C;QJn|TK8@0sEv?_LWAAMaEIY7LL2XN$2E;x0 z*Ctk!dyjq37XXOQz|fhHb3gW=YT0tnf;dL!MGcEbl{ve!(7U2%F^(S_d(ho^-Vy^! zzT@t^8)DzCi_+04VSe!v(D{x!AF59Mp+JBOTAgQmn5Lv!_d4*OI{OC#zx2?)MQ={l z?!%lJCDEJ}=lH>HR7+FM4r`&Lp*)Db9^ z_HQ}weZ>)hkb+;G=|?-bmcc}KQ^8h+U|t1YKh!_#bSDxrxd>vQ9*5cxJnTFD9T1`SOUbx4`u*&?p`p%d=WWX8m%I?4A5S6N@% zuIAJ7_ot>H<()A)88{i_@HD~YLcJomy>h>

8iU|-RkE`!$l@i?%$Qji0(Iwb;w}oeX{r{Gw*81^;QD05`Xb) z2GPBfI9?L+I_sT)40?LzMC)na!d0iBbb;tDx2R`(&iN{(72=r2oT5nPk@2o{G&rNP zFmayD0P<0BOGpsHWZ^Y7_rDn2A6=GAiMn+8dNr_fPLl?whjp^MqWZmfEB*-C<9g~_rFvf(5LTb?S8N@ELKlUC&(%@NdMFP{>xv|;7xkozV+n^~#H{Hs;kOq)4XHfj9Uzytl@DH(A>oLNI+4eCc87 zLA)*<(}Q}e(#pO`G?q@u6cuTK`dw5ab&^XCN;72`RQ6^N07F4OUW26SJHZD{FNnGC zmT{m6IHw|jxy&{Jjhx-FVw|x) zRQBaaC4^!rr$f$hJ|l%)IY!s^#VQI43fsCtmB6cYT2wl^4HByI*y{2(7B|YK=v{5V z@Cspk?3edeqZFd53d4r3yb?uzm|qP!nJEPP?);Dcq0)^VyYy7IYu{)$)Q514AOR`Q zbG<`sB{qo3DE&9We0Ng|`BBo<4oiIH9GZ*RP*9*X zH6N^6Cq>oO6b-<&*%2{QEuQm}cSd&ux^wuY(ziI-!LNUdwM-gX(g8r>X$KIF830lx zijs%~{Xb^(5C8BC<__@WKc=|is>3)F-_y3|Uu~I5$Jz;8iKRREXNN3ngc{0U9pg_B}XL^?8y!tngq30S}&l@~& zDn1uS^0sAoxci(VKuPs2mTc{BFAn*)ZUnEbRm+*U9d<#-&37UI#tUy{ z^hODp>Ng_yl1i=!nSR~dGA=1C#M)$M^XVCh4d<{)M`&FrC(Kpfn;yJIEu&aVl4k@7 z&R(yQqn6cBD8&^0O-|wV?O;?ti7*!vK@&r`9r+oe5d-J=gWjlj^s4p*Arvl*}1$3UHsZCz36aW$T-RTc|jhKu#_Q&@UJ4KG9Sh*UI$O{EH1L}TUQoR=gO@_HhCKuSby7;PDodFY@ z5eEaq8i>Hg0(f*KkWimi_`55Cd*QwHIO+f-?NI%{I95e=Y7lb)CW0NX14MvrIe9P@ zANB(FzVf8x24t}D?`A>65y+5`At)SFr_nqD%b)w1L;8vI%N8TB&X=UvrNx%wa}LdJo4Aef(r&^!2$RtlX&HP>m|MNGJx+RNZFBswE_$ST@L?G z#75~qA2;mpKJ;-$^RAW%aAMWJ4>jCC_bEo5>m#B;g8qu&XGO#~5%Pd09Dq8#I7}2l zjsEKQTM+O3eyKJ_I(qZvU9QAIG9rnV4C9@U6G#1LplktH`la4Q>woGEUvzU9#A5hQno0Hw>o<4j$bV`IJyzM zH7Va-C-Swe_|}^4nk>-(WzC1Wx1_#I5TbV`(KO!4xZ_q;O>&Be2_AFfs>I4I2M41b zxOfa6x!t*VC(#uw5%r%*R9#s*uCJqI*{i)i6MZ2%K)o2qoeik1pof_%i~&asxR^~) zh5|mflTDDyB&~_?;-}9Jz`6x0h$P9;2H!1Q^iaL z)(;3MVii1zaHSUSZGiKZfitOQe3)hh_>^>73NQvRv2;mDDKWXsMLW|fzonwfKRJb` zQ*jAisDC@sY^55@0%L`tRU%UVaKIbn2G2I#%q5{@Y!?h z5I#QvnFG@%MT{_ITuFN8$V@8xNB``WS9{xWXKc*}ZtCm2YW1A2)Oh}N4y3C>hr8%0 z__4snw07NITy;^%m|Dj0(&XjyF+Glc{os|$NnW9kxx2Gh#^>VM!$AwDhk+g+G6HX_ zHYa*$Jy&|#PFAlT76$)=+sE+U?>`f$`yI34S1Z@XAO8Emi^2a2q&9Z+|Lpx=bN~P8 v|ChZ1)D4l%YT^k!U;yjk5YNL=s*|;c=>-5-@~}%90ssgi0RYhd6HWdf4J(n- literal 0 HcmV?d00001 diff --git a/projects/fightingGame/exercise/sounds/quickhit.mp3 b/projects/fightingGame/exercise/sounds/quickhit.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..90bfc53aed3970ee301d2dedc2ebdf035df71ef2 GIT binary patch literal 6820 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 se*D^;I88~wRvAEV$@@Ib7F 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 T{}%_2|Lw%_|L6Y~JMcdMcE5Gt literal 0 HcmV?d00001 diff --git a/projects/fightingGame/exercise/style.css b/projects/fightingGame/exercise/style.css index 97119ef..e994a6c 100644 --- a/projects/fightingGame/exercise/style.css +++ b/projects/fightingGame/exercise/style.css @@ -1,7 +1,147 @@ +@import url('https://fonts.googleapis.com/css2?family=VT323&display=swap'); + + body { - background: 'red'; + background:'blue'; + width: 100%; + height: 100vh; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + font-family: 'VT323', monospace; +} + +.menu { + width: 50%; + display: flex; + justify-content: space-between; + align-items: center; +} + +#p1 { + width:100px; + height:100px; +} + +.p1Info { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + height: 300px; + width: 300px; +/* background: red; */ +} + +#p1Name { + font-size: 30px; +} + +#p1Health { + font-size: 50px; +} + +#p2{ + width:100px; + height:100px; +} + + +.p2Info { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + height: 300px; + width: 300px; +/* background: red; */ +} + +#p2Name { + font-size: 30px; +} + +#p2Health { + font-size: 50px; +} + +.playerControls { + display: flex; + flex-direction: column; + justify-content: space-around; + +} + +.AttackDiv{ + display: flex; + align-items:center; + justify-content: space-around; + height: 40px; + width: 100px; +/* background: blue; */ +} + +.HealDiv { + display: flex; + align-items:center; + justify-content: space-around; + height: 40px; + width: 100px; +/* background: yellow; */ +} + +#attack { + height: 30px; + width: 60px; + border-radius: 50px; + border:none; + background: #FFFF01; + outline: none; + +} + +#heal { + height: 30px; + width: 60px; + border-radius: 50px; + border:none; + background: #7DFFFF; + outline: none; + +} + +#play { + height: 50px; + width: 120px; + border-radius: 20px; +/* border:none; */ + background: #02cf02; + outline: none; + color: white; } #result { - background:'blue'; + font-size: 50px; + color : #3dff3d; +} + +#reset { + margin-top: 20px; + height: 50px; + width: 100px; + border-radius: 20px; +/* border:none; */ + background: #FF8800; + outline: none; + color: white; +} + +.resultContainer { + display: flex; + flex-direction: column; + justify-content: space-around; + align-items: center; + height:150px; + width: 300px; } \ No newline at end of file diff --git a/projects/fightingGame/solution/index.html b/projects/fightingGame/solution/index.html index 678aeeb..63a95b6 100644 --- a/projects/fightingGame/solution/index.html +++ b/projects/fightingGame/solution/index.html @@ -10,51 +10,75 @@ -

The solution for Fighting Game