diff --git a/exercises/anagram.livemd b/exercises/anagram.livemd
index 99d40a44d..af3db1a5c 100644
--- a/exercises/anagram.livemd
+++ b/exercises/anagram.livemd
@@ -67,6 +67,7 @@ defmodule Anagram do
true
"""
def anagram?(string1, string2) do
+ String.to_charlist(string1) |> Enum.sort() == String.to_charlist(string2) |> Enum.sort()
end
@doc """
@@ -84,6 +85,7 @@ defmodule Anagram do
[]
"""
def filter_anagrams(word_list, anagram) do
+ Enum.filter(word_list, fn word -> anagram?(word, anagram) end)
end
end
```
diff --git a/exercises/animal_generator.livemd b/exercises/animal_generator.livemd
index 81d96f88c..12d9cc543 100644
--- a/exercises/animal_generator.livemd
+++ b/exercises/animal_generator.livemd
@@ -57,7 +57,13 @@ end
Enter your solution below.
```elixir
+names = ["Clifford", "Zoboomafoo", "Leonardo"]
+animal_types = ["dog", "lemur", "turtle"]
+ages = 1..14
+for name <- names, animal_type <- animal_types, age <- ages do
+ %{name: name, animal_type: animal_type, age: age}
+end
```
## Mark As Completed
diff --git a/exercises/battle_map.livemd b/exercises/battle_map.livemd
index 2a1b783fc..cfd4781cc 100644
--- a/exercises/battle_map.livemd
+++ b/exercises/battle_map.livemd
@@ -130,6 +130,22 @@ defprotocol Character do
def can_attack?(character, origin, target)
end
+defimpl Character, for: Barbarian do
+ def can_attack?(_character, {x1, y1}, {x2, y2}) do
+ # can move +/- 2 spaces along the x axis -> horizontal
+ # can move +/- 2 spaces along the y axis -> vertical
+ # horizontal # vertical
+ abs(x2 - x1) <= 2 or abs(y2 - y1) <= 2
+ end
+end
+
+defimpl Character, for: Wizard do
+ def can_attack?(_character, {x1, y1}, {x2, y2}) do
+ # vertical/horizontal # diagonal
+ x1 == x2 || y1 == y2 || abs(x2 - x1) == abs(y2 - y1)
+ end
+end
+
ExUnit.start(auto_run: false)
defmodule CharacterTests do
@@ -198,7 +214,22 @@ true
Implement your custom character below.
```elixir
+defmodule Archer do
+ defstruct []
+end
+```
+
+```elixir
+defimpl Character, for: Archer do
+ def can_attack?(_character, {x1, y1}, {x2, y2}) do
+ # can move +/- 3 spaces along the x axis -> horizontal
+ # can move +/- 3 spaces along the y axis -> vertical
+ # horizontal # vertical
+ abs(x2 - x1) == 3 or abs(y2 - y1) == 3
+ end
+end
+Character.can_attack?(%Archer{}, {4, 4}, {8, 8})
```
## Mark As Completed
diff --git a/exercises/book_search.livemd b/exercises/book_search.livemd
index a63beca18..9c76e8eaa 100644
--- a/exercises/book_search.livemd
+++ b/exercises/book_search.livemd
@@ -30,6 +30,7 @@ defmodule Book do
iex> %Book{title: "My Book Title"}
%Book{title: "My Book Title"}
"""
+ defstruct [:title]
@doc """
Search a list of Book structs. Search should match any book that includes the
@@ -38,6 +39,7 @@ defmodule Book do
## Examples
Include books that exactly match the search query.
+ # Map.get(map, :title) == query
iex> book1 = %Book{title: "A"}
iex> book2 = %Book{title: "B"}
@@ -46,6 +48,8 @@ defmodule Book do
[%Book{title: "A"}]
Include books that partially match the search query.
+ # does the query match any letter of the title?
+ # use String.contains(book, query)
iex> Book.search([%Book{title: "ABC"}], "A")
[%Book{title: "ABC"}]
@@ -54,15 +58,36 @@ defmodule Book do
[%Book{title: "BAC"}]
Search should be case insensitive.
+ # lowercase the input and title
iex> Book.search([%Book{title: "ABC"}], "a")
[%Book{title: "ABC"}]
"""
+
+ # def fuzzy_match(string, char) do
+ # mysplit = String.split(string, "", trim: true)
+ # Enum.filter(mysplit, fn element -> element == char end) && string
+ # end
+
def search(books, query) do
+ # books that match one letter
+ Enum.filter(books, fn book -> String.contains?(book, query) end)
+
+ # books that exactly match
+ Enum.filter(books, fn book -> Map.get(book, :title) end)
end
end
```
+```elixir
+book = "ABC"
+query = "D"
+String.contains?(book, query)
+
+test = %{mybook: "mytitle"}
+Map.get(test, )
+```
+
## Mark As Completed
diff --git a/exercises/caesar_cypher.livemd b/exercises/caesar_cypher.livemd
index 91df9252d..2066ca8fc 100644
--- a/exercises/caesar_cypher.livemd
+++ b/exercises/caesar_cypher.livemd
@@ -82,13 +82,13 @@ defmodule CaesarCypher do
## Examples
- iex> CaesarCypher.encode("abcdefghijklmnopqrstuvwxyz")
- "bcdefghijklmnopqrstuvwxyza"
+ # iex> CaesarCypher.encode("abcdefghijklmnopqrstuvwxyz")
+ # "bcdefghijklmnopqrstuvwxyza"
- Encoding should work on any string
+ # Encoding should work on any string
- iex> CaesarCypher.encode("hello")
- "ifmmp"
+ # iex> CaesarCypher.encode("hello")
+ # "ifmmp"
"""
def encode(string) do
end
@@ -99,14 +99,14 @@ defmodule CaesarCypher do
## Examples
- iex> CaesarCypher.encode("abcdefghijklmnopqrstuvwxyz", 1)
- "bcdefghijklmnopqrstuvwxyza"
+ # iex> CaesarCypher.encode("abcdefghijklmnopqrstuvwxyz", 1)
+ # "bcdefghijklmnopqrstuvwxyza"
- iex> CaesarCypher.encode("abcdefghijklmnopqrstuvwxyz", 2)
- "cdefghijklmnopqrstuvwxyzab"
+ # iex> CaesarCypher.encode("abcdefghijklmnopqrstuvwxyz", 2)
+ # "cdefghijklmnopqrstuvwxyzab"
- iex> CaesarCypher.encode("abcdefghijklmnopqrstuvwxyz", 14)
- "opqrstuvwxyzabcdefghijklmn"
+ # iex> CaesarCypher.encode("abcdefghijklmnopqrstuvwxyz", 14)
+ # "opqrstuvwxyzabcdefghijklmn"
Encoding should work on any string.
@@ -118,6 +118,25 @@ defmodule CaesarCypher do
end
```
+```elixir
+string = "abcdefghijklmnopqrstuvwxyz"
+offset = 2
+
+chars = String.to_charlist(string)
+
+Enum.map(chars, fn char -> char + 2 end)
+
+?z - offset
+
+# Enum.map(chars, fn char ->
+# if char < 'z' - offset do
+# 'z'
+# else
+# char + 2
+# end
+# end)
+```
+
## Mark As Completed
diff --git a/exercises/counting_votes.livemd b/exercises/counting_votes.livemd
index b7ca899b0..cb1e0c25e 100644
--- a/exercises/counting_votes.livemd
+++ b/exercises/counting_votes.livemd
@@ -80,6 +80,7 @@ defmodule Votes do
0
"""
def count(votes, vote) do
+ Enum.count(Enum.filter(votes, fn item -> item == vote end))
end
end
```
@@ -120,6 +121,10 @@ defmodule VoterTally do
%{dog: 2, cat: 3, bird: 1}
"""
def tally(votes) do
+ dogs = Enum.count(Enum.filter(votes, fn item -> item == :dog end))
+ cats = Enum.count(Enum.filter(votes, fn item -> item == :cat end))
+ birds = Enum.count(Enum.filter(votes, fn item -> item == :bird end))
+ %{dog: dogs, cat: cats, bird: birds}
end
end
```
diff --git a/exercises/custom_enum_with_reduce.livemd b/exercises/custom_enum_with_reduce.livemd
index 108de363c..7bdee0bad 100644
--- a/exercises/custom_enum_with_reduce.livemd
+++ b/exercises/custom_enum_with_reduce.livemd
@@ -78,6 +78,11 @@ defmodule CustomEnum do
[7, 6, 5, 4]
"""
def reverse(list) do
+ # put first element on head of new list
+ Enum.reduce(list, [], fn element, acc ->
+ # IO.inspect(binding())
+ [element | acc]
+ end)
end
@doc """
@@ -92,6 +97,11 @@ defmodule CustomEnum do
[true, true, true]
"""
def map(list, callback_function) do
+ # while list not empty apply fn to element
+ Enum.reduce(list, [], fn element, acc ->
+ [callback_function.(element) | acc]
+ end)
+ |> reverse()
end
@doc """
@@ -107,6 +117,15 @@ defmodule CustomEnum do
["2", "3"]
"""
def filter(list, callback_function) do
+ # add element to new list if callback_function(element) returns true
+ Enum.reduce(list, [], fn element, acc ->
+ if callback_function.(element) do
+ [element | acc]
+ else
+ acc
+ end
+ end)
+ |> reverse()
end
@doc """
@@ -117,10 +136,12 @@ defmodule CustomEnum do
iex> CustomEnum.sum([1, 2, 3])
6
- iex> CustomEnum.sum([1, 1, 1])
- 3
+ # iex> CustomEnum.sum([1, 1, 1])
+ # 3
"""
def sum(list_of_integers) do
+ # add each int to accumulator and return accumulator
+ Enum.reduce(list_of_integers, 0, fn int, acc -> int + acc end)
end
@doc """
@@ -135,6 +156,8 @@ defmodule CustomEnum do
"Hello, World!"
"""
def join(list_of_strings) do
+ # concat each string to acc string
+ Enum.reduce(list_of_strings, "", fn string, acc -> acc <> string end)
end
end
```
diff --git a/exercises/dominoes.livemd b/exercises/dominoes.livemd
index aa3337209..ac4cc4f8c 100644
--- a/exercises/dominoes.livemd
+++ b/exercises/dominoes.livemd
@@ -97,7 +97,22 @@ Supervisor.start_link(children, strategy: :rest_for_one)
Keep in mind, if you have already started a named process, the supervisor might crash when you attempt to start it again. Re-evaluate the cell after the livebook crashes to resolve this issue.
```elixir
+children = [
+ %{
+ id: D1,
+ start: {Domino, :start_link, [[name: D1]]}
+ },
+ %{
+ id: D2,
+ start: {Domino, :start_link, [[name: D2]]}
+ },
+ %{
+ id: D3,
+ start: {Domino, :start_link, [[name: D3]]}
+ }
+]
+{:ok, pid} = Supervisor.start_link(children, strategy: :rest_for_one)
```
Send your dominos messages to ensure they are crashing in the correct order. They will log a message that demonstrates the `Domino.start_link/1` function was called again.
@@ -116,7 +131,7 @@ Process.send(:domino_name, :fall, [])
Test sending each `Domino` process a message individually.
```elixir
-
+Process.send(D3, :fall, [])
```
## Mark As Completed
diff --git a/exercises/drill-patternmatching-replace-nils.livemd b/exercises/drill-patternmatching-replace-nils.livemd
index 3ae0a4a58..e34dcb7a3 100644
--- a/exercises/drill-patternmatching-replace-nils.livemd
+++ b/exercises/drill-patternmatching-replace-nils.livemd
@@ -63,9 +63,39 @@ defmodule ReplaceNils do
@doc """
replace nil values in the first list with values from the second list in the same position.
+
+ iex> input1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
+ iex> input2 = [nil, nil, nil, nil, nil, nil, nil, nil, nil, nil]
+ iex> ReplaceNils.replace(input1, input2)
+ [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
+
+ iex> input1 = [nil, nil, nil, nil, nil, nil, nil, nil, nil, nil]
+ iex> input2 = [:a, :b, :c, :d, :e, :f, :g, :h, :i, :j]
+ iex> ReplaceNils.replace(input1, input2)
+ [:a, :b, :c, :d, :e, :f, :g, :h, :i, :j]
+
+ iex> input1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
+ iex> input2 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
+ iex> ReplaceNils.replace(input1, input2)
+ [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
+
+ iex> input1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
+ iex> input2 = [:a, :b, :c, :d, :e, :f, :g, :h, :i, :j]
+ iex> ReplaceNils.replace(input1, input2)
+ [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
+
+ iex> input1 = [1, 2, 3, nil, nil, 6, 7, nil, 9, 10]
+ iex> input2 = [:a, :b, :c, :d, :e, :f, :g, :h, :i, :j]
+ iex> ReplaceNils.replace(input1, input2)
+ [1, 2, 3, :d, :e, 6, 7, :h, 9, 10]
+
+
"""
def replace(input1, input2) do
- nil
+ Enum.zip_with(input1, input2, fn
+ nil, y -> y
+ x, _ -> x
+ end)
end
end
```
diff --git a/exercises/email_validation.livemd b/exercises/email_validation.livemd
index b885a48c8..002175697 100644
--- a/exercises/email_validation.livemd
+++ b/exercises/email_validation.livemd
@@ -82,17 +82,59 @@ defmodule Email do
iex> Email.valid?("string.string")
false
- iex> Email.valid?("string@string")
- false
+ # iex> Email.valid?("string@string")
+ # false
- iex> Email.valid?("string@string.")
- false
+ # iex> Email.valid?("string@string.")
+ # false
"""
def valid?(email) do
+ email_regex = ~r/
+ \w+ # user
+ @ # @
+ \w+ # host
+ [.] # .
+ \w+ # domain
+ /x
+
+ Regex.match?(email_regex, email)
end
end
```
+```elixir
+good_string = "mail@mail.com"
+bad_string = "mail.com"
+
+email_regex = ~r/
+ \w+ # user
+ @ # @
+ \w+ # host
+ [.] # .
+ \w+ # domain
+ /x
+
+Regex.scan(email_regex, good_string)
+
+IO.puts(Regex.source(email_regex))
+```
+
+```elixir
+good_number = "1-123-123-1234"
+
+number_regex = ~r/
+\d{1} # country code
+- # dash
+\d{3} # area code
+- # dash
+\d{3} # exchange
+- # dash
+\d{4} # circuit number
+/x
+
+Regex.scan(number_regex, good_number)
+```
+
## Mark As Completed
diff --git a/exercises/fibonacci.livemd b/exercises/fibonacci.livemd
index 47b39202c..5453ed3a5 100644
--- a/exercises/fibonacci.livemd
+++ b/exercises/fibonacci.livemd
@@ -89,7 +89,11 @@ defmodule Fibonacci do
iex> Fibonacci.of(20)
6765
"""
+ def of(0), do: 0
+ def of(1), do: 1
+
def of(n) do
+ of(n - 1) + of(n - 2)
end
end
```
diff --git a/exercises/file_drills.livemd b/exercises/file_drills.livemd
index f2857625f..c57322cd9 100644
--- a/exercises/file_drills.livemd
+++ b/exercises/file_drills.livemd
@@ -25,67 +25,72 @@ This set of drills is for the [File](../reading/file.livemd) module. Follow the
Use [File.ls/1](https://hexdocs.pm/elixir/File.html#ls/1) to list all of the files/folders in the current path.
```elixir
-
+File.ls()
```
Use [File.ls/1](https://hexdocs.pm/elixir/File.html#ls/1) to list all of the files/folders in the parent directory of the current path.
```elixir
-
+File.ls("../")
```
Use [File.mkdir/1](https://hexdocs.pm/elixir/File.html#mkdir/1) to create a directory called `drills`.
```elixir
-
+File.cd("/Users/lotek/Desktop")
+File.ls()
+File.mkdir("drills")
+File.ls()
```
Use [File.dir?/2](https://hexdocs.pm/elixir/File.html#dir?/2) to check that `drills` is a folder.
```elixir
-
+File.dir?("drills")
```
Use [File.write/3](https://hexdocs.pm/elixir/File.html#write/3) to create an empty file called `drills.txt`.
```elixir
-
+File.write("drills.txt", "")
```
Use [File.exists?/2](https://hexdocs.pm/elixir/File.html#exists?/2) to check that the `drills.txt` file exists.
```elixir
-
+File.exists?("drills.txt")
```
Use [File.dir?/2](https://hexdocs.pm/elixir/File.html#dir?/2) to check that `drills.txt` is not a folder.
```elixir
-
+File.dir?("drills.txt")
```
Use [File.write/3](https://hexdocs.pm/elixir/File.html#write/3) to create a filed called `hello.txt` with the content `"world"`.
```elixir
-
+File.write("hello.txt", "world")
```
Use [File.read/1](https://hexdocs.pm/elixir/File.html#read/1) to read the content of the `hello.txt` file.
```elixir
-
+File.read("hello.txt")
```
Use [File.write/3](https://hexdocs.pm/elixir/File.html#write/3) to create an empty file in the `drills` folder you previously created.
```elixir
-
+File.cd("drills")
+File.ls()
+File.write("empty.txt", "")
```
Use [File.write/3](https://hexdocs.pm/elixir/File.html#write/3) to create an `error/no_entity.txt` file that should return `{:error, :enoent}` because the `error` folder does not exist.
```elixir
-
+{:error, :enoent} = File.write("error/no_entity.txt", "")
```
Use [File.write/3](https://hexdocs.pm/elixir/File.html#write/3) to create a file `multi-line.txt` with a multi-line string.
@@ -103,19 +108,29 @@ line 5
```
```elixir
+multiline_string = """
+line 1
+line 2
+line 3
+line 4
+line 5
+"""
+File.rm("multi-line.txt")
+File.ls()
+File.write("multi-line.txt", multiline_string)
```
Use [File.read/1](https://hexdocs.pm/elixir/File.html#read/1) to read `multi-line.txt`.
```elixir
-
+File.read("multi-line.txt")
```
Use [File.stream!/3](https://hexdocs.pm/elixir/File.html#stream!/3) to read each line of `multi-line.txt` and convert it to a list of lines using [Enum.to_list/1](https://hexdocs.pm/elixir/Enum.html#to_list/1).
```elixir
-
+File.stream!("multi-line.txt") |> Enum.to_list()
```
Use [File.stream!/3](https://hexdocs.pm/elixir/File.html#stream!/3) and [Stream.filter/2](https://hexdocs.pm/elixir/Stream.html#filter/2) to filter in lines from `multi-line.txt` that contain numbers less than or equal to `3`.
@@ -133,13 +148,18 @@ line 3
```
```elixir
+file = "multi-line.txt"
+# bah filter sucks
+File.stream!(file) |> Stream.take(3) |> Enum.to_list()
```
Use [File.open/2](https://hexdocs.pm/elixir/File.html#open/2), [IO.binread/2](https://hexdocs.pm/elixir/IO.html#binread/2), and [File.close/1](https://hexdocs.pm/elixir/File.html#close/1) to read the first line of `multi-line.txt`. Print the value.
```elixir
-
+File.open("multi-line.txt")
+|> IO.binread()
+|> IO.puts()
```
Use [File.mkdir_p/1](https://hexdocs.pm/elixir/File.html#mkdir_p/1) to create:
@@ -149,7 +169,10 @@ Use [File.mkdir_p/1](https://hexdocs.pm/elixir/File.html#mkdir_p/1) to create:
* `"parent/sub_c"`
```elixir
-
+File.ls()
+File.mkdir_p("parent/sub_a/")
+File.mkdir_p("parent/sub_b/")
+File.mkdir_p("parent/sub_c/")
```
Use [File.write!/3](https://hexdocs.pm/elixir/File.html#write!/3) to create six empty files:
@@ -162,13 +185,21 @@ Use [File.write!/3](https://hexdocs.pm/elixir/File.html#write!/3) to create six
* `"parent/sub_c/file"`
```elixir
-
+File.write!("parent/sub_a/file.txt", "")
+File.write!("parent/sub_a/file", "")
+File.write!("parent/sub_b/file.txt", "")
+File.write!("parent/sub_b/file", "")
+File.write!("parent/sub_c/file.txt", "")
+File.write!("parent/sub_c/file", "")
```
Use [File.ls!/1](https://hexdocs.pm/elixir/File.html#ls!/1) to find all of the files/folders inside of the `parent` folder.
```elixir
-
+File.ls("parent")
+File.ls("parent/sub_a")
+File.ls("parent/sub_b")
+File.ls("parent/sub_c")
```
## Path
@@ -176,43 +207,46 @@ Use [File.ls!/1](https://hexdocs.pm/elixir/File.html#ls!/1) to find all of the f
Use [Path.join/2](https://hexdocs.pm/elixir/Path.html#join/2) to join `"/parent/"` and `"/child/"`
```elixir
-
+File.ls()
+File.mkdir("child")
+File.ls()
+Path.join("/parent/", "/child/")
```
Use [Path.join/2](https://hexdocs.pm/elixir/Path.html#join/2) to join `"parent"` and `"child"`
```elixir
-
+Path.join("parent", "child")
```
Use [Path.join/2](https://hexdocs.pm/elixir/Path.html#join/2) to join `"folder"` and `"file.txt"`.
```elixir
-
+Path.join("folder", "file.txt")
```
Use [Path.absname/1](https://hexdocs.pm/elixir/Path.html#absname/1) to convert the current path `"."` to an absolute path.
```elixir
-
+Path.absname(".")
```
Use [Path.dirname/1](https://hexdocs.pm/elixir/Path.html#dirname/1) to find the directory name of `"folder/subfolder/file.txt"`
```elixir
-
+Path.dirname("folder/subfolder/file.txt")
```
Use [Path.dirname/1](https://hexdocs.pm/elixir/Path.html#dirname/1) to find the directory name of `"file.txt"`.
```elixir
-
+Path.dirname("file.txt")
```
Use [Path.wildcard/2](https://hexdocs.pm/elixir/Path.html#wildcard/2) to find all files in a nested folder `"parent/*"` that end in a `.txt` extension. You should see your three `file.txt` files created earlier.
```elixir
-
+Path.wildcard("parent/*/*.txt")
```
Use [File.rm_rf/1](https://hexdocs.pm/elixir/File.html#rm_rf/1) to delete all folders created by this exercise.
@@ -222,7 +256,11 @@ CAUTION: DO NOT DELETE IMPORTANT FILES ON YOUR COMPUTER.
```elixir
-
+File.ls()
+File.rm_rf("parent")
+File.ls()
+File.rm_rf("child")
+File.ls()
```
Use [File.rm/1](https://hexdocs.pm/elixir/File.html#rm/1) to delete any remaining files created by this exercise.
@@ -232,7 +270,9 @@ CAUTION: DO NOT DELETE IMPORTANT FILES ON YOUR COMPUTER.
```elixir
-
+File.rm("empty.txt")
+File.rm("multi-line.txt")
+File.ls()
```
## Mark As Completed
diff --git a/exercises/filter_values_by_type.livemd b/exercises/filter_values_by_type.livemd
index 2b9025019..1092bfeb9 100644
--- a/exercises/filter_values_by_type.livemd
+++ b/exercises/filter_values_by_type.livemd
@@ -82,7 +82,10 @@ defmodule Filter do
iex> Filter.integers([1, 2, %{}, {}, []])
[1, 2]
"""
+
+ # filter list using is_integer
def integers(list) do
+ Enum.filter(list, fn element -> is_integer(element) end)
end
@doc """
@@ -94,6 +97,7 @@ defmodule Filter do
[1.2, 3.2]
"""
def floats(list) do
+ Enum.filter(list, fn element -> is_float(element) end)
end
@doc """
@@ -105,6 +109,7 @@ defmodule Filter do
[1, 2, 1.2, 3.2]
"""
def numbers(list) do
+ Enum.filter(list, fn element -> is_integer(element) or is_float(element) end)
end
@doc """
@@ -116,6 +121,7 @@ defmodule Filter do
[:first_atom, :second_atom]
"""
def atoms(list) do
+ Enum.filter(list, fn element -> is_atom(element) end)
end
@doc """
@@ -127,6 +133,7 @@ defmodule Filter do
[[1, 2], [4, 5, 6]]
"""
def lists(list) do
+ Enum.filter(list, fn element -> is_list(element) && element != [] end)
end
@doc """
@@ -138,6 +145,7 @@ defmodule Filter do
[%{}, %{key: "value"}]
"""
def maps(list) do
+ Enum.filter(list, fn element -> is_map(element) end)
end
@doc """
@@ -149,6 +157,7 @@ defmodule Filter do
[[], [key: "value"]]
"""
def keyword_lists(list) do
+ Enum.filter(list, fn element -> Keyword.keyword?(element) end)
end
end
```
diff --git a/exercises/fizzbuzz.livemd b/exercises/fizzbuzz.livemd
index 179fe2c17..a1393a308 100644
--- a/exercises/fizzbuzz.livemd
+++ b/exercises/fizzbuzz.livemd
@@ -77,8 +77,18 @@ defmodule FizzBuzz do
["buzz", 11, "fizz", 13, 14, "fizzbuzz"]
"""
def run(range) do
+ Enum.map(range, fn int ->
+ cond do
+ rem(int, 15) == 0 -> "fizzbuzz"
+ rem(int, 3) == 0 -> "fizz"
+ rem(int, 5) == 0 -> "buzz"
+ true -> int
+ end
+ end)
end
end
+
+FizzBuzz.run(1..15)
```
## Mark As Completed
diff --git a/exercises/itinerary.livemd b/exercises/itinerary.livemd
index ae7a980ca..396207755 100644
--- a/exercises/itinerary.livemd
+++ b/exercises/itinerary.livemd
@@ -58,10 +58,21 @@ defmodule Itinerary do
"""
def has_time?(start, finish, minutes) do
+ start = DateTime.to_unix(start)
+ finish = DateTime.to_unix(finish)
+
+ available_time = finish - start
+ task_time = minutes * 60
+
+ task_time <= available_time
end
end
```
+```elixir
+DateTime.utc_now() |> DateTime.to_unix()
+```
+
## Mark As Completed
diff --git a/exercises/lucas_numbers.livemd b/exercises/lucas_numbers.livemd
index 658be16ab..b19d965f8 100644
--- a/exercises/lucas_numbers.livemd
+++ b/exercises/lucas_numbers.livemd
@@ -117,7 +117,11 @@ defmodule Lucas do
iex> Lucas.number(20)
15127
"""
+ def number(0), do: 2
+ def number(1), do: 1
+
def number(n) do
+ number(n - 1) + number(n - 2)
end
@doc """
@@ -142,10 +146,16 @@ defmodule Lucas do
"""
def sequence(length) do
+ Enum.map(0..(length - 1), fn elem -> number(elem) end)
end
end
```
+```elixir
+# [2, 1, 3, 4]
+[]
+```
+
## Mark As Completed
diff --git a/exercises/mailbox_server.livemd b/exercises/mailbox_server.livemd
index bc5c0bb81..42feb40aa 100644
--- a/exercises/mailbox_server.livemd
+++ b/exercises/mailbox_server.livemd
@@ -96,7 +96,11 @@ defmodule Mailbox do
iex> :sys.get_state(pid)
["Welcome to your mailbox!"]
"""
- def start_link(_opts) do
+
+ ##### CLIENT #####
+
+ def start_link(opts) do
+ GenServer.start_link(__MODULE__, opts)
end
@doc """
@@ -110,7 +114,8 @@ defmodule Mailbox do
iex> :sys.get_state(pid)
["Message 2", "Message 1"]
"""
- def send(mailbox_pid, message) do
+ def send(pid, message) do
+ GenServer.cast(pid, {:mail, message})
end
@doc """
@@ -122,7 +127,8 @@ defmodule Mailbox do
iex> Mailbox.all_messages(pid)
[]
"""
- def all_messages(mailbox_pid) do
+ def all_messages(pid) do
+ GenServer.call(pid, :all_messages)
end
@doc """
@@ -132,8 +138,12 @@ defmodule Mailbox do
iex> {:ok, _pid} = GenServer.start_link(Mailbox, [])
"""
+
+ ##### SERVER #####
+
@impl true
- def init(state) do
+ def init(args) do
+ {:ok, args}
end
@doc """
@@ -145,8 +155,10 @@ defmodule Mailbox do
iex> GenServer.call(pid, :all_messages)
["Welcome"]
"""
+
@impl true
def handle_call(:all_messages, _from, state) do
+ {:reply, state, state}
end
@doc """
@@ -160,8 +172,10 @@ defmodule Mailbox do
iex> :sys.get_state(pid)
["Message 2", "Message 1"]
"""
+
@impl true
def handle_cast({:mail, mail}, state) do
+ {:noreply, [mail | state]}
end
@doc """
@@ -175,8 +189,10 @@ defmodule Mailbox do
iex> :sys.get_state(pid)
["Message 2", "Message 1"]
"""
+
@impl true
def handle_info({:mail, mail}, state) do
+ {:noreply, [mail | state]}
end
end
```
diff --git a/exercises/math_with_guards.livemd b/exercises/math_with_guards.livemd
index 901a3f2f8..4ffd85a57 100644
--- a/exercises/math_with_guards.livemd
+++ b/exercises/math_with_guards.livemd
@@ -122,7 +122,16 @@ defmodule Math do
iex> Math.add(%{}, %{})
** (FunctionClauseError) no function clause matching in Math.add/2
"""
- def add(value1, value2) do
+ def add(value1, value2) when is_integer(value1) and is_integer(value2) do
+ value1 + value2
+ end
+
+ def add(value1, value2) when is_binary(value1) and is_binary(value2) do
+ value1 <> value2
+ end
+
+ def add(value1, value2) when is_list(value1) and is_list(value2) do
+ value1 ++ value2
end
@doc """
@@ -161,12 +170,26 @@ defmodule Math do
iex> Math.subtract(%{}, %{})
** (FunctionClauseError) no function clause matching in Math.subtract/2
"""
- def subtract(value1, value2) do
+ def subtract(value1, value2) when is_integer(value1) and is_integer(value2) do
+ value1 - value2
+ end
+
+ def subtract(value1, value2) when is_binary(value1) and is_binary(value2) do
+ (String.split(value1, "", trim: true) -- String.split(value2, "", trim: true))
+ |> List.to_string()
+ end
+
+ def subtract(value1, value2) when is_list(value1) and is_list(value2) do
+ value1 -- value2
end
end
```
-## Mark As Completed
+```elixir
+string1 = String.split("abcd", "", trim: true)
+string2 = String.split("abc", "", trim: true)
+List.to_string(string1 -- string2)
+```
diff --git a/exercises/math_with_protocols.livemd b/exercises/math_with_protocols.livemd
index 68e4b771d..2ac0eb158 100644
--- a/exercises/math_with_protocols.livemd
+++ b/exercises/math_with_protocols.livemd
@@ -116,9 +116,9 @@ defprotocol Math do
iex> Math.add(4, 4)
8
- Math.add([1, 2], [3, 4])
+ iex> Math.add([1, 2], [3, 4])
[1, 2, 3, 4]
- Math.add([1, 2, 3], [4, 5, 6])
+ iex> Math.add([1, 2, 3], [4, 5, 6])
[1, 2, 3, 4, 5, 6]
iex> Math.add("abc", "def")
@@ -132,6 +132,7 @@ defprotocol Math do
iex> Math.add({}, {})
** (Protocol.UndefinedError) protocol Math not implemented for {} of type Tuple
"""
+
def add(value1, value2)
@doc """
@@ -162,10 +163,45 @@ defprotocol Math do
"""
def subtract(value1, value2)
end
+
+defimpl Math, for: Integer do
+ def add(value1, value2) do
+ value1 + value2
+ end
+
+ def subtract(value1, value2) do
+ value1 - value2
+ end
+end
+
+defimpl Math, for: List do
+ def add(value1, value2) do
+ value1 ++ value2
+ end
+
+ def subtract(value1, value2) do
+ value1 -- value2
+ end
+end
+
+defimpl Math, for: BitString do
+ def add(value1, value2) do
+ value1 <> value2
+ end
+
+ def subtract(value1, value2) do
+ (String.graphemes(value1) -- String.graphemes(value2))
+ |> List.to_string()
+ end
+end
```
## Mark As Completed
+```elixir
+String.graphemes("abc")
+```
+
```elixir
diff --git a/exercises/message_validation.livemd b/exercises/message_validation.livemd
index bf26498b1..dddb82fdc 100644
--- a/exercises/message_validation.livemd
+++ b/exercises/message_validation.livemd
@@ -93,13 +93,13 @@ defmodule Message do
iex> %Message{}
%Message{body: nil}
"""
- defstruct []
+ defstruct [:body]
@doc """
Send messages between users.
Returns a string of the message if provided valid input.
- ## Examples
+ ## Examples
iex> Message.send("hello!")
"hello!"
@@ -116,19 +116,31 @@ defmodule Message do
iex> Message.send(123)
** (FunctionClauseError) no function clause matching in Message.send/1
+
iex> Message.send(%{})
** (FunctionClauseError) no function clause matching in Message.send/1
+
iex> Message.send({})
** (FunctionClauseError) no function clause matching in Message.send/1
+
iex> Message.send(%Message{body: nil})
** (FunctionClauseError) no function clause matching in Message.send/1
-
+
+
iex> Message.send(%Message{body: {}})
** (FunctionClauseError) no function clause matching in Message.send/1
+
"""
- def send(message) do
+ # sender sends message
+ def send(message) when is_binary(message) do
+ message
+ end
+
+ # receiver sends back message body
+ def send(message) when is_binary(message.body) do
+ message.body
end
end
```
diff --git a/exercises/monster_spawner.livemd b/exercises/monster_spawner.livemd
index 8dc7d564c..f8beb8f5d 100644
--- a/exercises/monster_spawner.livemd
+++ b/exercises/monster_spawner.livemd
@@ -5,7 +5,7 @@ Mix.install([
{:jason, "~> 1.4"},
{:kino, "~> 0.8.0", override: true},
{:youtube, github: "brooklinjazz/youtube"},
- {:hidden_cell, github: "brooklinjazz/hidden_cell"},
+ {:hidden_cell, github: "brooklinjazz/hidden_cell"}
])
```
@@ -104,6 +104,8 @@ Implement the `Monster` process as documented below.
defmodule Monster do
use GenServer
+ ##### CLIENT #####
+
@doc """
Start the `Monster` process.
@@ -111,9 +113,11 @@ defmodule Monster do
iex> {:ok, pid} = Monster.start_link([])
"""
+
def start_link(opts) do
# IO.inspect/2 to observe when a `Monster` process starts.
IO.inspect(opts, label: "Monster Started")
+ GenServer.start_link(__MODULE__, opts)
end
@doc """
@@ -121,13 +125,14 @@ defmodule Monster do
## Examples
- iex> {:ok, pid} = Monster.start_link([])
- iex> :sys.get_state(pid)
- %{health: 100}
- iex> Monster.attack(pid, 30)
- iex> :sys.get_state(pid)
- %{health: 70}
+ # iex> {:ok, pid} = Monster.start_link([])
+ # iex> :sys.get_state(pid)
+ # %{health: 100}
+ # iex> Monster.attack(pid, 30)
+ # iex> :sys.get_state(pid)
+ # %{health: 70}
"""
+
def attack(monster_pid, amount) do
end
@@ -140,9 +145,13 @@ defmodule Monster do
iex> Monster.health(pid)
100
"""
+
def health(monster_pid) do
+ GenServer.call(monster_pid, :health)
end
+ ##### SERVER #####
+
@doc """
Callback function to start the `Monster` process.
Monsters should start with a `:health` value in a map.
@@ -153,8 +162,10 @@ defmodule Monster do
iex> :sys.get_state(pid)
%{health: 100}
"""
+
@impl true
def init(_opts) do
+ {:ok, %{health: 100}}
end
@doc """
@@ -164,14 +175,14 @@ defmodule Monster do
## Examples
- iex> {:ok, pid} = GenServer.start_link(Monster, [])
- iex> :sys.get_state(pid)
- %{health: 100}
- iex> GenServer.cast(pid, {:attack, 20})
- iex> :sys.get_state(pid)
- %{health: 80}
- iex> GenServer.cast(pid, {:attack, 80})
- ** (RuntimeError) dying!
+ # iex> {:ok, pid} = GenServer.start_link(Monster, [])
+ # iex> :sys.get_state(pid)
+ # %{health: 100}
+ # iex> GenServer.cast(pid, {:attack, 20})
+ # iex> :sys.get_state(pid)
+ # %{health: 80}
+ # iex> GenServer.cast(pid, {:attack, 80})
+ # ** (RuntimeError) dying!
"""
@impl true
def handle_cast({:attack, damage}, state) do
@@ -188,10 +199,18 @@ defmodule Monster do
"""
@impl true
def handle_call(:health, _from, state) do
+ # IO.inspect(state)
+ health = Map.get(state, :health)
+ {:reply, health, state}
end
end
```
+```elixir
+test = %{health: 100}
+Map.get(test, :health)
+```
+
## Supervisor
Create three named `Monster` processes under a single supervisor. When one `Monster` process dies after its health reaches zero, another should be restarted in it's place.
diff --git a/exercises/named_number_lists.livemd b/exercises/named_number_lists.livemd
index 7b1f06cba..ac6e70d07 100644
--- a/exercises/named_number_lists.livemd
+++ b/exercises/named_number_lists.livemd
@@ -75,7 +75,22 @@ flowchart
Enter your solution below.
```elixir
-
+rando = Enum.map(1..10, fn _ -> Enum.random(0..9) end)
+
+Enum.map(rando, fn int ->
+ case int do
+ 0 -> "zero"
+ 1 -> "one"
+ 2 -> "two"
+ 3 -> "three"
+ 4 -> "four"
+ 5 -> "five"
+ 6 -> "six"
+ 7 -> "seven"
+ 8 -> "eight"
+ 9 -> "nine"
+ end
+end)
```
## Mark As Completed
diff --git a/exercises/naming_numbers.livemd b/exercises/naming_numbers.livemd
index df121b16f..24319112b 100644
--- a/exercises/naming_numbers.livemd
+++ b/exercises/naming_numbers.livemd
@@ -72,7 +72,22 @@ naming_numbers.(1)
Enter your solution below.
```elixir
+naming_numbers = fn integer ->
+ case integer do
+ 0 -> "zero"
+ 1 -> "one"
+ 2 -> "two"
+ 3 -> "three"
+ 4 -> "four"
+ 5 -> "five"
+ 6 -> "six"
+ 7 -> "seven"
+ 8 -> "eight"
+ 9 -> "nine"
+ end
+end
+naming_numbers.(1)
```
## Numbering Names
@@ -169,7 +184,22 @@ flowchart
```elixir
+numbering_names = fn int_str ->
+ case String.downcase(int_str) do
+ "zero" -> 0
+ "one" -> 1
+ "two" -> 2
+ "three" -> 3
+ "four" -> 4
+ "five" -> 5
+ "six" -> 6
+ "seven" -> 7
+ "eight" -> 8
+ "nine" -> 9
+ end
+end
+numbering_names.("Nine")
```
## Mark As Completed
diff --git a/exercises/number_finder.livemd b/exercises/number_finder.livemd
index 8a9a5a859..05f9cb9d0 100644
--- a/exercises/number_finder.livemd
+++ b/exercises/number_finder.livemd
@@ -37,12 +37,21 @@ defmodule NumberFinder do
iex> NumberFinder.smallest([2, 3, 1])
1
+
iex> NumberFinder.smallest([2, 2, 3, 4])
2
+
iex> NumberFinder.smallest([2, 2, 3, 4, 10, 20, -3])
-3
"""
def smallest(number_list) do
+ Enum.reduce(number_list, fn elem, acc ->
+ if acc < elem do
+ acc
+ else
+ elem
+ end
+ end)
end
@doc """
@@ -52,12 +61,21 @@ defmodule NumberFinder do
iex> NumberFinder.largest([2, 3, 1])
3
+
iex> NumberFinder.largest([2, 2, 3, 4, 4])
4
+
iex> NumberFinder.largest([2, 2, 3, 4, 10, 20, -3])
20
"""
def largest(number_list) do
+ Enum.reduce(number_list, fn elem, acc ->
+ if acc > elem do
+ acc
+ else
+ elem
+ end
+ end)
end
end
```
diff --git a/exercises/palindrome.livemd b/exercises/palindrome.livemd
index a6137c0ba..7a3b1c845 100644
--- a/exercises/palindrome.livemd
+++ b/exercises/palindrome.livemd
@@ -70,6 +70,7 @@ defmodule Palindrome do
false
"""
def palindrome?(string) do
+ string == String.reverse(string)
end
end
```
diff --git a/exercises/pokemon_api.livemd b/exercises/pokemon_api.livemd
index c34a9f5dd..8c61c1004 100644
--- a/exercises/pokemon_api.livemd
+++ b/exercises/pokemon_api.livemd
@@ -7,7 +7,7 @@ Mix.install([
{:youtube, github: "brooklinjazz/youtube"},
{:hidden_cell, github: "brooklinjazz/hidden_cell"},
{:httpoison, "~> 1.8"},
- {:poison, "~> 5.0"}
+ {:exconstructor, "~> 1.2"}
])
```
@@ -38,6 +38,44 @@ mix new pokelixir
Ensure you add [HTTPoison](https://github.com/edgurgel/httpoison) and [Poison](https://github.com/devinus/poison) as dependencies.
+```elixir
+defmodule Pokelixir do
+ defstruct [
+ :id,
+ :name,
+ :hp,
+ :attack,
+ :defense,
+ :special_attack,
+ :special_defense,
+ :speed,
+ :weight,
+ :height,
+ :types
+ ]
+
+ use ExConstructor
+
+ def get(name) do
+ {:ok, response} = HTTPoison.get("https://pokeapi.co/api/v2/pokemon/#{name}")
+ {_head, body} = Jason.decode(response.body)
+
+ ExConstructor.populate_struct(%__MODULE__{}, body)
+ end
+
+ def all() do
+ {:ok, response} = HTTPoison.get("https://pokeapi.co/api/v2/pokemon/?limit=1500")
+ Jason.decode(response.body)
+ end
+end
+
+# get a pokemon
+Pokelixir.get("charizard")
+
+# get all pokemons
+# Pokelixir.all()
+```
+
## Pokemon Structs
A `Pokemon` struct should have the following (required) keys. You do not need to implement data validation.
@@ -79,6 +117,12 @@ Here's that data represented as a `Pokemon` struct.
}
```
+```elixir
+{:ok, response} = HTTPoison.get("https://pokeapi.co/api/v2/pokemon/charizard")
+
+Jason.decode(response.body)
+```
+
## Get A Pokemon
We can request information about Pokemon using the [Pokemon API](https://pokeapi.co/).
@@ -117,6 +161,24 @@ response = Poison.decode!(response.body)
## Get All Pokemon
+```elixir
+{:ok, response} = HTTPoison.get("https://pokeapi.co/api/v2/pokemon")
+
+Jason.decode(response.body)
+```
+
+```elixir
+{:ok, response} = HTTPoison.get("https://pokeapi.co/api/v2/pokemon?offset=20&limit=20")
+
+Jason.decode(response.body)
+```
+
+```elixir
+{:ok, response} = HTTPoison.get("https://pokeapi.co/api/v2/pokemon/6")
+
+Jason.decode(response.body)
+```
+
You can retrieve a list of pokemon using the following URL.
```
diff --git a/exercises/process_drills.livemd b/exercises/process_drills.livemd
index f39a778ce..b0085a09d 100644
--- a/exercises/process_drills.livemd
+++ b/exercises/process_drills.livemd
@@ -25,13 +25,21 @@ This set of drills is for the [Process](https://hexdocs.pm/elixir/Process.html)
Use [Process.send/3](https://hexdocs.pm/elixir/Process.html#send/3) and `self()` to send the process for the Elixir cell below a `:message` message. Use [receive](https://hexdocs.pm/elixir/Kernel.SpecialForms.html#receive/1) to receive the message in the same cell.
```elixir
+send(self(), "message")
+receive do
+ "message" -> "received"
+end
```
Use [Process.send/3](https://hexdocs.pm/elixir/Process.html#send/3) and `self()` to send the process for the Elixir cell below a message with a value i.e. `{:message, "value"}`. Use [receive](https://hexdocs.pm/elixir/Kernel.SpecialForms.html#receive/1) to receive the message in the same cell and return the value.
```elixir
+send(self(), {:message, "value"})
+receive do
+ {:message, "value"} -> "value"
+end
```
## Process.spawn/2
@@ -39,31 +47,47 @@ Use [Process.send/3](https://hexdocs.pm/elixir/Process.html#send/3) and `self()`
Use [Process.spawn/2](https://hexdocs.pm/elixir/Process.html#spawn/2) to spawn a new process which adds two integers together.
```elixir
-
+spawn(fn -> 1 + 2 end)
```
Use [Process.spawn/2](https://hexdocs.pm/elixir/Process.html#spawn/2) and [Process.sleep/1](https://hexdocs.pm/elixir/Process.html#sleep/1) to spawn a process that sleeps for five seconds, then prints "Finished!".
```elixir
-
+pid = spawn(fn -> 1 + 2 end)
+Process.sleep(5000)
+Process.alive?(pid) || IO.puts("Finished!")
```
Use [Process.spawn/2](https://hexdocs.pm/elixir/Process.html#spawn/2) and [receive](https://hexdocs.pm/elixir/Kernel.SpecialForms.html#receive/1) to spawn a process that receives a `:message` message. Use [Process.send/3](https://hexdocs.pm/elixir/Process.html#send/3) to send the spawned process a `:message` message. The spawned process should print `"received a message!"`.
```elixir
+pid1 =
+ spawn(fn ->
+ receive do
+ :message -> IO.puts("received a message!")
+ end
+ end)
+send(pid1, :message)
```
Use [Process.spawn/2](https://hexdocs.pm/elixir/Process.html#spawn/2) and [receive](https://hexdocs.pm/elixir/Kernel.SpecialForms.html#receive/1) to spawn a process that receives a message with a value i.e. `{:message, "value"}`. Use [Process.send/3](https://hexdocs.pm/elixir/Process.html#send/3) to send the spawned process a message with a value. The spawned process should print the received value.
```elixir
+pid2 =
+ spawn(fn ->
+ receive do
+ {:message, value} -> IO.puts("#{value}")
+ end
+ end)
+send(pid2, "Hello World!")
```
Use [Process.spawn/2](https://hexdocs.pm/elixir/Process.html#spawn/2) to spawn a process that raises an error. Notice it does not crash the Livebook, because it is an **unlinked** process.
```elixir
-
+pid3 = spawn(fn -> raise "oops" end)
```
Use [Process.spawn/3](https://hexdocs.pm/elixir/Process.html#spawn/3) and [Process.sleep/1](https://hexdocs.pm/elixir/Process.html#sleep/1) to spawn a process which raises an error after one second. Use [Process.link/1](https://hexdocs.pm/elixir/Process.html#link/1) to link the process.
@@ -71,7 +95,8 @@ Use [Process.spawn/3](https://hexdocs.pm/elixir/Process.html#spawn/3) and [Proce
Livebook should crash. Comment out your solution so that you can move on.
```elixir
-
+pid4 = spawn(fn -> raise "oops" end)
+Process.sleep(1000)
```
## Process.alive?/1
@@ -79,7 +104,11 @@ Livebook should crash. Comment out your solution so that you can move on.
Use [Process.spawn/2](https://hexdocs.pm/elixir/Process.html#spawn/2) and [Process.sleep/1](https://hexdocs.pm/elixir/Process.html#sleep/1) to spawn a process that sleeps for five seconds. Use [Process.alive?/1](https://hexdocs.pm/elixir/Process.html#alive?/1) and [Process.sleep/1](https://hexdocs.pm/elixir/Process.html#sleep/1) to check if the process is alive after two seconds. [Process.alive?/1](https://hexdocs.pm/elixir/Process.html#alive?/1) should return `true`.
```elixir
-
+pid4 = spawn(fn -> true end)
+Process.sleep(2000)
+Process.alive?(pid4) || "still alive"
+Process.sleep(3000)
+Process.alive?(pid4) || "it's dead, Jim"
```
Use [Process.spawn/2](https://hexdocs.pm/elixir/Process.html#spawn/2) and [Process.sleep/1](https://hexdocs.pm/elixir/Process.html#sleep/1) to spawn a process that sleeps for five seconds. Use [Process.alive?/1](https://hexdocs.pm/elixir/Process.html#alive?/1) and [Process.sleep/1](https://hexdocs.pm/elixir/Process.html#sleep/1) to check if the process is alive after six seconds. [Process.alive?/1](https://hexdocs.pm/elixir/Process.html#alive?/1) should return `false`.
diff --git a/exercises/rock_paper_scissors.livemd b/exercises/rock_paper_scissors.livemd
index 0cfd2820c..7b8073b0d 100644
--- a/exercises/rock_paper_scissors.livemd
+++ b/exercises/rock_paper_scissors.livemd
@@ -54,7 +54,15 @@ Then, return the winning choice of either `:rock`, `:paper`, or `:scissors` that
Enter your solution below.
```elixir
+player_choice = Enum.random([:rock, :paper, :scissors])
+
+IO.puts(player_choice)
+case player_choice do
+ :rock -> :paper
+ :paper -> :scissors
+ :scissors -> :rock
+end
```
## Create Two Player Rock Paper Scissors
@@ -107,7 +115,21 @@ Bind a `player1_choice` and `player2_choice` variable to `:rock`, `:paper`, or `
Enter your solution below.
```elixir
-
+player1 = Enum.random([:rock, :paper, :scissors])
+IO.inspect(player1: player1)
+
+player2 = Enum.random([:rock, :paper, :scissors])
+IO.inspect(player2: player2)
+
+case {player1, player2} do
+ {:rock, :scissors} -> "Player 1 Wins!"
+ {:paper, :rock} -> "Player 1 Wins!"
+ {:scissors, :paper} -> "Player 1 Wins!"
+ {:rock, :paper} -> "Player 2 Wins!"
+ {:paper, :scissors} -> "Player 2 Wins!"
+ {:scissors, :rock} -> "Player 2 Wins!"
+ {same, same} -> "Draw"
+end
```
## Mark As Completed
diff --git a/exercises/rock_paper_scissors_lizard_spock.livemd b/exercises/rock_paper_scissors_lizard_spock.livemd
index 400a7af02..e924cdd3f 100644
--- a/exercises/rock_paper_scissors_lizard_spock.livemd
+++ b/exercises/rock_paper_scissors_lizard_spock.livemd
@@ -83,6 +83,17 @@ defmodule RockPaperScissorsLizardSpock do
false
"""
def beats?(guess1, guess2) do
+ {guess1, guess2} in [
+ {:rock, :scissors},
+ {:rock, :lizard},
+ {:paper, :rock},
+ {:paper, :spock},
+ {:scissors, :paper},
+ {:scissors, :lizards},
+ {:lizard, :paper},
+ {:lizard, :spock},
+ {:spock, :scissors}
+ ]
end
@doc """
@@ -99,9 +110,20 @@ defmodule RockPaperScissorsLizardSpock do
iex> RockPaperScissorsLizardSpock.play(:lizard, :lizard)
"Player 2 Wins!"
"""
+
def play(player1, player2) do
+ cond do
+ beats?(player1, player2) -> "Player 1 Wins!"
+ not beats?(player1, player2) -> "Player 2 Wins!"
+ end
end
end
+
+RockPaperScissorsLizardSpock.play(:rock, :paper)
+```
+
+```elixir
+
```
## Mark As Completed
diff --git a/exercises/rpg_dialogue.livemd b/exercises/rpg_dialogue.livemd
index dd17f3caf..7006b4ffd 100644
--- a/exercises/rpg_dialogue.livemd
+++ b/exercises/rpg_dialogue.livemd
@@ -82,7 +82,9 @@ defmodule Character do
iex> %Character{name: "Frodo"}
** (ArgumentError) the following keys must also be given when building struct Character: [:name]
"""
- defstruct []
+ @enforced_key [:name]
+
+ defstruct @enforced_key ++ [:class, :weapon]
@doc """
Introduce the character by name.
@@ -95,7 +97,8 @@ defmodule Character do
iex> Character.introduce(%Character{name: "Aragorn"})
"My name is Aragorn."
"""
- def introduce(character) do
+ def introduce(char) do
+ "My name is #{char.name}."
end
@doc """
@@ -109,7 +112,8 @@ defmodule Character do
iex> Character.attack(%Character{name: "Aragorn", weapon: "sword"})
"I attack with my sword!"
"""
- def attack(character) do
+ def attack(char) do
+ "I attack with my #{char.weapon}!"
end
@doc """
@@ -123,7 +127,8 @@ defmodule Character do
iex> Character.class(%Character{name: "Aragorn", class: "ranger"})
"I am a ranger."
"""
- def class(character) do
+ def class(char) do
+ "I am a #{char.class}."
end
@doc """
@@ -137,9 +142,14 @@ defmodule Character do
iex> Character.war_cry(%Character{name: "Aragorn", class: "ranger"})
"My name is Aragorn and I am a ranger!"
"""
- def war_cry(character) do
+ def war_cry(char) do
+ "My name is #{char.name} and I am a #{char.class}!"
end
+ # def war_cry2(name, class) do
+ # "My name is #{name} and I am a #{class}"
+ # end
+
@doc """
Declare that one character has defeated another.
@@ -151,9 +161,31 @@ defmodule Character do
iex> Character.defeat(%Character{name: "Aragorn"}, %Character{name: "Gimli", class: "warrior"})
"My name is Aragorn and I have defeated the warrior Gimli!"
"""
- def defeat(character1, character2) do
+ def defeat(char1, char2) do
+ "My name is #{char1.name} and I have defeated the #{char2.class} #{char2.name}!"
end
end
+
+# defmodule Test do
+# import Character
+
+# def test do
+# aragorn = %Character{name: "Aragorn", class: "ranger", weapon: "sword"}
+# gandalf = %Character{name: "Gandalf", class: "wizard", weapon: "staff"}
+# Character.introduce(aragorn)
+# Character.attack(aragorn)
+# Character.class(aragorn)
+# Character.war_cry(aragorn)
+# Character.war_cry2(aragorn.name, aragorn.class)
+# Character.defeat(aragorn, gandalf)
+# end
+# end
+
+# Test.test
+```
+
+```elixir
+
```
### Bonus: Character Instances
diff --git a/exercises/save_game.livemd b/exercises/save_game.livemd
index 3c0c5c5e5..bcce80873 100644
--- a/exercises/save_game.livemd
+++ b/exercises/save_game.livemd
@@ -58,12 +58,14 @@ defmodule Game do
Save an elixir term into a given file name.
"""
def save(data, filename) do
+ File.write!(filename, :erlang.term_to_binary(data))
end
@doc """
Retrieve an elixir term from a given file name.
"""
def load(filename) do
+ File.read!(filename) |> :erlang.binary_to_term()
end
end
```
diff --git a/exercises/score_tracker.livemd b/exercises/score_tracker.livemd
index 83ecbf897..11b84bf46 100644
--- a/exercises/score_tracker.livemd
+++ b/exercises/score_tracker.livemd
@@ -87,7 +87,11 @@ defmodule ScoreTracker do
iex> {:ok, pid} = ScoreTracker.start_link([])
"""
- def start_link(_opts) do
+
+ ##### CLIENT #####
+
+ def start_link(opts) do
+ GenServer.start_link(__MODULE__, opts)
end
@doc """
@@ -99,7 +103,9 @@ defmodule ScoreTracker do
iex> ScoreTracker.score(pid, 10)
:ok
"""
- def score(score_tracker_pid, amount) do
+
+ def score(pid, amount) do
+ GenServer.cast(pid, {:score, amount})
end
@doc """
@@ -111,7 +117,26 @@ defmodule ScoreTracker do
iex> ScoreTracker.get_score(pid)
0
"""
- def get_score(score_tracker_pid) do
+
+ def get_score(pid) do
+ GenServer.call(pid, :get_score)
+ end
+
+ ##### SERVER #####
+
+ @impl true
+ def init(_args) do
+ {:ok, 0}
+ end
+
+ @impl true
+ def handle_cast({:score, amount}, state) do
+ {:noreply, state + amount}
+ end
+
+ @impl true
+ def handle_call(:get_score, _from, state) do
+ {:reply, state, state}
end
end
```
@@ -183,7 +208,11 @@ defmodule MultiplayerScoreTracker do
iex> {:ok, pid} = MultiplayerScoreTracker.start_link([])
"""
+
+ ##### CLIENT #####
+
def start_link(_opts) do
+ GenServer.start_link(__MODULE__, [])
end
@doc """
@@ -199,7 +228,8 @@ defmodule MultiplayerScoreTracker do
iex> MultiplayerScoreTracker.score(pid, :abc, 10)
:ok
"""
- def score(multiplayer_score_tracker_pid, player_name, amount) do
+ def score(pid, player_name, amount) do
+ GenServer.cast(pid, {:score, player_name, amount})
end
@doc """
@@ -229,7 +259,8 @@ defmodule MultiplayerScoreTracker do
iex> MultiplayerScoreTracker.all_scores(pid)
%{player1: 10, player2: 10}
"""
- def all_scores(multiplayer_score_tracker_pid) do
+ def all_scores(pid) do
+ GenServer.call(pid, :all_scores)
end
@doc """
@@ -239,18 +270,41 @@ defmodule MultiplayerScoreTracker do
Player does not exist.
- iex> {:ok, pid} = MultiplayerScoreTracker.start_link([])
- iex> MultiplayerScoreTracker.get_score(pid, :player1)
- nil
+ iex> {:ok, pid} = MultiplayerScoreTracker.start_link([])
+ iex> MultiplayerScoreTracker.get_score(pid, :player1)
+ nil
- Player exists.
+ Player exists.
- iex> {:ok, pid} = MultiplayerScoreTracker.start_link([])
- iex> MultiplayerScoreTracker.score(pid, :abc, 10)
- iex> MultiplayerScoreTracker.get_score(pid, :abc)
- 10
+ iex> {:ok, pid} = MultiplayerScoreTracker.start_link([])
+ iex> MultiplayerScoreTracker.score(pid, :abc, 10)
+ iex> MultiplayerScoreTracker.get_score(pid, :abc)
+ 10
"""
- def get_score(multiplayer_score_tracker_pid, player_name) do
+ def get_score(pid, player_name) do
+ GenServer.call(pid, {:get_score, player_name})
+ end
+
+ ##### SERVER #####
+
+ @impl true
+ def init(_args) do
+ {:ok, %{}}
+ end
+
+ @impl true
+ def handle_cast({:score, player_name, amount}, state) do
+ {:noreply, Map.update(state, player_name, amount, fn state -> state + amount end)}
+ end
+
+ @impl true
+ def handle_call(:all_scores, _from, state) do
+ {:reply, state, state}
+ end
+
+ @impl true
+ def handle_call({:get_score, player_name}, _from, state) do
+ {:reply, state[player_name], state}
end
end
```
diff --git a/exercises/spoonacular_recipe_api.livemd b/exercises/spoonacular_recipe_api.livemd
index 7e208a76d..54bd2fb18 100644
--- a/exercises/spoonacular_recipe_api.livemd
+++ b/exercises/spoonacular_recipe_api.livemd
@@ -31,7 +31,12 @@ Use your API to visit the `https://api.spoonacular.com/recipes/complexSearch?api
Use [HTTPoison](https://hexdocs.pm/httpoison/HTTPoison.html) to retrieve the same JSON data from the `https://api.spoonacular.com/recipes/complexSearch?apiKey=API_KEY` URL you visited in the browser. Then use [Poison](https://hexdocs.pm/poison/Poison.html) to decode the JSON response into an Elixir data structure.
```elixir
+api_key = "235ecefcc30147279ffd925e41a3178e"
+{:ok, response} =
+ HTTPoison.get("https://api.spoonacular.com/recipes/complexSearch?apiKey=#{api_key}")
+
+Jason.decode(response.body)
```
## Mark As Completed
diff --git a/exercises/stack.livemd b/exercises/stack.livemd
index 994c997c7..a1f54438b 100644
--- a/exercises/stack.livemd
+++ b/exercises/stack.livemd
@@ -58,13 +58,34 @@ Copy the code below into your `Stack` module.
defmodule Stack do
use GenServer
- def start_link(_opts) do
+ # client functions
+ def start_link(opts) do
+ GenServer.start_link(__MODULE__, opts)
end
def push(pid, element) do
+ GenServer.call(pid, {:push, element})
end
def pop(pid) do
+ GenServer.call(pid, :pop)
+ end
+
+ # server functions
+ def init(opts) do
+ {:ok, opts}
+ end
+
+ def handle_call({:push, element}, _from, state) do
+ {:reply, [element | state], [element | state]}
+ end
+
+ def handle_call(:pop, _from, state) do
+ if Enum.empty?(state) do
+ {:reply, nil, nil}
+ else
+ {:reply, hd(state), tl(state)}
+ end
end
end
```
@@ -72,26 +93,65 @@ end
Then copy the following code into the associated test file for the `Stack` module.
```elixir
+ExUnit.start(auto_run: false)
+
defmodule StackTest do
use ExUnit.Case
describe "start_link/1" do
- test "with no configuration"
- test "with a default state"
+ test "initial state with no configuration" do
+ {:ok, pid} = Stack.start_link([])
+ assert :sys.get_state(pid) == []
+ end
+
+ test "initial state with a default state" do
+ {:ok, pid} = Stack.start_link([1])
+ assert :sys.get_state(pid) == [1]
+ end
end
describe "push/2" do
- test "an element onto an empty stack"
- test "an element onto a stack with one element"
- test "an element onto a stack with multiple elements"
+ test "push an element onto an empty stack" do
+ {:ok, pid} = Stack.start_link([])
+ Stack.push(pid, 3)
+ assert :sys.get_state(pid) == [3]
+ end
+
+ test "push an element onto a stack with one element" do
+ {:ok, pid} = Stack.start_link([1])
+ Stack.push(pid, 2)
+ assert :sys.get_state(pid) == [2, 1]
+ end
+
+ test "push an element onto a stack with multiple elements" do
+ {:ok, pid} = Stack.start_link([2, 1])
+ Stack.push(pid, 3)
+ assert :sys.get_state(pid) == [3, 2, 1]
+ end
end
describe "pop/1" do
- test "an empty stack"
- test "a stack with one element"
- test "a stack with multiple elements"
+ test "pop an empty stack" do
+ {:ok, pid} = Stack.start_link([])
+ assert Stack.pop(pid) == nil
+ assert :sys.get_state(pid) == nil
+ end
+
+ test "pop a stack with one element" do
+ {:ok, pid} = Stack.start_link([1])
+ assert Stack.pop(pid) == 1
+ assert :sys.get_state(pid) == []
+ end
+
+ test "pop a stack with multiple elements" do
+ {:ok, pid} = Stack.start_link([3, 2, 1])
+ assert Stack.pop(pid) == 3
+ assert :sys.get_state(pid) == [2, 1]
+ end
end
end
+
+ExUnit.run()
```
## Bonus: GitHub Repository
diff --git a/exercises/stack_server.livemd b/exercises/stack_server.livemd
index 8eee8346f..d4a6fc09c 100644
--- a/exercises/stack_server.livemd
+++ b/exercises/stack_server.livemd
@@ -93,95 +93,44 @@ Consider starting with the `handle_call/3` callback functions, then implement th
defmodule Stack do
use GenServer
- @doc """
- Start the `Stack` process.
-
- ## Examples
-
- iex> {:ok, pid} = Stack.start_link([])
- """
- def start_link(_opts) do
+ # Client API (Behaviour)
+ def start_link(opts) do
+ # IO.inspect("start_link", label: "Client")
+ # Note: second arg (opts) is what's passed to init
+ GenServer.start_link(__MODULE__, opts)
end
- @doc """
- Synchronously push an element onto the top of the `Stack`. Return the current stack.
-
- ## Examples
-
- iex> {:ok, pid} = Stack.start_link([])
- iex> Stack.push(pid, 1)
- [1]
- iex> Stack.push(pid, 2)
- [2, 1]
- iex> Stack.push(pid, 3)
- [3, 2, 1]
- """
- def push(stack_pid, element) do
+ def push(pid, element) do
+ # IO.inspect("push #{element}", label: "Client")
+ GenServer.call(pid, {:push, element})
end
- @doc """
- Pop an element from the top of the `Stack`.
-
- ## Examples
-
- iex> {:ok, pid} = Stack.start_link([])
- iex> Stack.push(pid, 1)
- iex> Stack.push(pid, 2)
- iex> Stack.push(pid, 3)
- iex> Stack.pop(pid)
- 3
- iex> Stack.pop(pid)
- 2
- iex> Stack.pop(pid)
- 1
- """
- def pop(stack_pid) do
+ def pop(pid) do
+ # IO.inspect("pop", label: "Client")
+ GenServer.call(pid, :pop)
end
- @doc """
- Necessary callback function to start the `Stack` process.
-
- ## Examples
-
- iex> {:ok, pid} = GenServer.start_link(Stack, [])
- """
- def init(_opts) do
+ # Server API (Implementation)
+ @impl true
+ def init(init_args) do
+ # IO.inspect("init", label: "Server")
+ {:ok, init_args}
end
- @doc """
- Callback function to add an element onto the top of the `Stack`.
-
- ## Examples
-
- iex> {:ok, pid} = GenServer.start_link(Stack, [])
- iex> GenServer.call(pid, {:push, 1})
- [1]
- iex> GenServer.call(pid, {:push, 2})
- [2, 1]
- iex> GenServer.call(pid, {:push, 3})
- [3, 2, 1]
- """
+ @impl true
def handle_call({:push, element}, _from, state) do
+ # IO.inspect("handle_call :push #{element}", label: "Server")
+ new_state = [element | state]
+ response = new_state
+ {:reply, response, new_state}
end
- @doc """
- Callback function to pop an element off of the top of the `Stack`.
- You do not need to handle popping when a stack is empty.
-
- ## Examples
-
- iex> {:ok, pid} = GenServer.start_link(Stack, [])
- iex> GenServer.call(pid, {:push, 1})
- iex> GenServer.call(pid, {:push, 2})
- iex> GenServer.call(pid, {:push, 3})
- iex> GenServer.call(pid, :pop)
- 3
- iex> GenServer.call(pid, :pop)
- 2
- iex> GenServer.call(pid, :pop)
- 1
- """
+ @impl true
def handle_call(:pop, _from, state) do
+ # IO.inspect("handle_call :pop", label: "Server")
+ new_state = tl(state)
+ response = new_state
+ {:reply, response, new_state}
end
end
```
diff --git a/exercises/supervised_stack.livemd b/exercises/supervised_stack.livemd
index b6db113b5..59fe5303a 100644
--- a/exercises/supervised_stack.livemd
+++ b/exercises/supervised_stack.livemd
@@ -104,7 +104,14 @@ children = [
Keep in mind, if you have already started a supervisor with the `Stack` process, your livebook may crash. You can resolve this issue by simply re-running the cell below to start the supervisor again.
```elixir
+children = [
+ %{
+ id: Stack,
+ start: {Stack, :start_link, [[]]}
+ }
+]
+{:ok, pid} = Supervisor.start_link(children, strategy: :one_for_one)
```
You should be able to send a `:pop` message to the `Stack` process and the [Supervisor](https://hexdocs.pm/elixir/Supervisor.html) will restart the `Stack` process.
@@ -112,7 +119,7 @@ You should be able to send a `:pop` message to the `Stack` process and the [Supe
Uncomment and evaluate the code below to test your supervisor.
```elixir
-# GenServer.call(Stack, :pop)
+GenServer.call(Stack, :pop)
```
## Mark As Completed
diff --git a/exercises/task_drills.livemd b/exercises/task_drills.livemd
index 900020104..fc9340b52 100644
--- a/exercises/task_drills.livemd
+++ b/exercises/task_drills.livemd
@@ -25,19 +25,27 @@ This set of drills is for [Tasks](../reading/task.livemd). Follow the instructio
Use [Task.async/1](https://hexdocs.pm/elixir/Task.html#async/1) and [Task.await/2](https://hexdocs.pm/elixir/Task.html#await/2) to spawn a task process that returns any response.
```elixir
+Kino.Process.render_seq_trace(fn ->
+ Process.sleep(2000)
+ Task.async(fn -> IO.puts("hello world!") end)
+end)
+# task = Task.async(fn -> Process.sleep(2000) end)
+# Task.await(task)
```
Use [Task.async/1](https://hexdocs.pm/elixir/Task.html#async/1) and [Task.await/2](https://hexdocs.pm/elixir/Task.html#await/2) to spawn a task process that sleeps for six seconds. It should cause a timeout error.
```elixir
-
+task = Task.async(fn -> Process.sleep(6000) end)
+Task.await(task)
```
Use [Task.async/1](https://hexdocs.pm/elixir/Task.html#async/1) and [Task.await/2](https://hexdocs.pm/elixir/Task.html#await/2) to spawn a task process that sleeps for six seconds. Provide a timeout value to [Task.await/2](https://hexdocs.pm/elixir/Task.html#await/2) so that it properly awaits the response.
```elixir
-
+task = Task.async(fn -> Process.sleep(2000) end)
+Task.await(task, 7000)
```
## Task.yield/2
@@ -55,7 +63,7 @@ time
```
```elixir
-{time, _result} =
+Kino.Process.render_seq_trace(fn ->
:timer.tc(fn ->
# 1000 tasks
# 1000 operations -> parallel
@@ -69,9 +77,25 @@ time
Task.await_many(tasks)
end)
+end)
-10_009_225
-1_001_494
+# {time, _result} =
+# :timer.tc(fn ->
+# # 1000 tasks
+# # 1000 operations -> parallel
+# tasks =
+# Enum.map(1..10, fn int ->
+# Task.async(fn ->
+# IO.puts("starting task #{int}")
+# Process.sleep(1000)
+# end)
+# end)
+
+# Task.await_many(tasks)
+# end)
+
+# 10_009_225
+# 1_001_494
```
### Fast Operation
@@ -83,31 +107,55 @@ time
```
```elixir
-{time, _result} =
+Kino.Process.render_seq_trace(fn ->
:timer.tc(fn ->
# 1000 tasks
# 1000 operations -> parallel
tasks = Enum.map(1..10, fn int -> Task.async(fn -> int * 2 end) end)
Task.await_many(tasks)
end)
+end)
+
+# {time, _result} =
+# :timer.tc(fn ->
+# # 1000 tasks
+# # 1000 operations -> parallel
+# tasks = Enum.map(1..10, fn int -> Task.async(fn -> int * 2 end) end)
+# Task.await_many(tasks)
+# end)
```
Use [Task.async/1](https://hexdocs.pm/elixir/Task.html#async/1) and [Task.yield/2](https://hexdocs.pm/elixir/Task.html#yield/2) to spawn a task process that sleeps for six seconds and returns any response. Notice that the yield is `nil`.
```elixir
+task =
+ Task.async(fn ->
+ Process.sleep(6000)
+ IO.puts("howdy!")
+ end)
+Task.yield(task)
```
Use [Task.async/1](https://hexdocs.pm/elixir/Task.html#async/1) and [Task.yield/2](https://hexdocs.pm/elixir/Task.html#yield/2) to spawn a task process that sleeps for six seconds and returns any response. Provide a timeout value to [Task.yield/2](https://hexdocs.pm/elixir/Task.html#yield/2) so that it properly returns the response.
```elixir
+task =
+ Task.async(fn ->
+ Process.sleep(6000)
+ IO.puts("howdy!")
+ end)
+Task.yield(task, 7000)
```
Use [Task.async/1](https://hexdocs.pm/elixir/Task.html#async/1), [Task.yield/2](https://hexdocs.pm/elixir/Task.html#yield/2), and [Task.shutdown/2](https://hexdocs.pm/elixir/Task.html#shutdown/2) to spawn a task process that sleeps for six seconds. Shutdown the task process if it does not yield any value.
```elixir
-
+Kino.Process.render_seq_trace(fn ->
+ task = Task.async(fn -> Process.sleep(6000) end)
+ Task.yield(task) || Task.shutdown(task)
+end)
```
## Task.await_many/2
@@ -115,25 +163,37 @@ Use [Task.async/1](https://hexdocs.pm/elixir/Task.html#async/1), [Task.yield/2](
Use [Task.async/1](https://hexdocs.pm/elixir/Task.html#async/1) and [Task.await_many/2](https://hexdocs.pm/elixir/Task.html#await_many/2) to spawn two task processes that both return a random number from `1..10`.
```elixir
+tasks = [
+ Task.async(fn -> :rand.uniform(10) end),
+ Task.async(fn -> :rand.uniform(10) end)
+]
+Task.await_many(tasks)
```
Use [Enum.map/2](https://hexdocs.pm/elixir/Enum.html#map/2), [Task.async/1](https://hexdocs.pm/elixir/Task.html#async/1), and [Task.await_many/2](https://hexdocs.pm/elixir/Task.html#await_many/2) to spawn one hundred task processes that all return a random integer from `1..100`.
```elixir
-
+tasks = Enum.map(1..100, fn _num -> Task.async(fn -> :rand.uniform(100) end) end)
+Task.await_many(tasks)
```
Use [Enum.map/2](https://hexdocs.pm/elixir/Enum.html#map/2), [Task.async/1](https://hexdocs.pm/elixir/Task.html#async/1), and [Task.await_many/2](https://hexdocs.pm/elixir/Task.html#await_many/2) to spawn one hundred task processes that return a list doubled numbers from one to one hundred. i.e. `[2, 4, 6, 8, ..., 198, 200]`.
```elixir
-
+tasks = Enum.map(1..100, fn int -> Task.async(fn -> int * 2 end) end)
+Task.await_many(tasks)
```
Use [Enum.map/2](https://hexdocs.pm/elixir/Enum.html#map/2), [Task.async/1](https://hexdocs.pm/elixir/Task.html#async/1), [String.upcase/2](https://hexdocs.pm/elixir/String.html#upcase/2), and [Task.await_many/2](https://hexdocs.pm/elixir/Task.html#await_many/2) to concurrently capitalize every string in the list `["apple", "pear", "peaches"]`
```elixir
+tasks =
+ Enum.map(["apple", "pear", "peaches"], fn string ->
+ Task.async(fn -> String.capitalize(string) end)
+ end)
+Task.await_many(tasks)
```
## Task.Supervisor
diff --git a/exercises/tic-tac-toe.livemd b/exercises/tic-tac-toe.livemd
index 08c12950f..bafb9544f 100644
--- a/exercises/tic-tac-toe.livemd
+++ b/exercises/tic-tac-toe.livemd
@@ -153,7 +153,13 @@ defmodule TicTacToe do
iex> TicTacToe.at(board, {2, 2})
"C"
"""
+
def at(board, coordinate) do
+ {x, y} = coordinate
+
+ Enum.reverse(board)
+ |> Enum.at(y)
+ |> Enum.at(x)
end
@doc """
@@ -177,6 +183,15 @@ defmodule TicTacToe do
[[nil, "X", "O"], [nil, "X", "O"],[nil, nil, "X"]]
"""
def fill(board, coordinate, symbol) do
+ {x, y} = coordinate
+
+ row_index = 2 - y
+
+ row = Enum.at(board, row_index)
+
+ new_row = List.replace_at(row, x, symbol)
+
+ List.replace_at(board, row_index, new_row)
end
end
```
diff --git a/exercises/time_converting.livemd b/exercises/time_converting.livemd
index 5346dbbf2..578aeae68 100644
--- a/exercises/time_converting.livemd
+++ b/exercises/time_converting.livemd
@@ -74,6 +74,12 @@ defmodule TimeConverter do
"""
def to_seconds(amount, unit) do
+ case unit do
+ :seconds -> amount
+ :minutes -> amount * 60
+ :hours -> amount * 3600
+ :days -> amount * 86400
+ end
end
@doc """
@@ -82,8 +88,8 @@ defmodule TimeConverter do
## Examples
- iex> TimeConverter.from_seconds(1, :seconds)
- 1.0
+ iex> TimeConverter.from_seconds(2, :seconds)
+ 2.0
iex> TimeConverter.from_seconds(60, :minutes)
1.0
@@ -96,6 +102,12 @@ defmodule TimeConverter do
"""
def from_seconds(amount, unit) do
+ case unit do
+ :seconds -> amount / 1.0
+ :minutes -> amount / 60
+ :hours -> amount / 3600
+ :days -> amount / 86400
+ end
end
end
```
diff --git a/exercises/timeline.livemd b/exercises/timeline.livemd
index 5bb45c981..6cafbd278 100644
--- a/exercises/timeline.livemd
+++ b/exercises/timeline.livemd
@@ -96,6 +96,14 @@ defmodule Timeline do
[9, 12, 2]
"""
def from_dates(dates) do
+ # chunk the date list into pairs with offset = 1
+ # map over the chunked pairs with Date.diff
+
+ pairs = Enum.chunk_every(dates, 2, 1, :discard)
+
+ Enum.map(pairs, fn [date1, date2] ->
+ Date.diff(date2, date1)
+ end)
end
@doc """
@@ -113,11 +121,31 @@ defmodule Timeline do
iex> Timeline.from_strings(["2020-01-01", "2020-01-10", "2020-01-22", "2020-01-24"])
[9, 12, 2]
"""
+
+ def make_date_from_string(string) do
+ [year, month, day] = String.split(string, "-", trim: true)
+ Date.new!(String.to_integer(year), String.to_integer(month), String.to_integer(day))
+ end
+
def from_strings(date_strings) do
+ # convert list of strings to new list of dates
+ # call from_dates with new list of dates
+
+ new_list = Enum.map(date_strings, fn string -> make_date_from_string(string) end)
+ from_dates(new_list)
end
end
```
+```elixir
+test_string = ["2020-01-01", "2020-01-10", "2020-01-22", "2020-01-24"]
+
+Enum.map(test_string, fn string ->
+ [year, month, day] = String.split(string, "-", trim: true)
+ Date.new!(String.to_integer(year), String.to_integer(month), String.to_integer(day))
+end)
+```
+
## Mark As Completed
diff --git a/exercises/timer.livemd b/exercises/timer.livemd
index c51b45286..e823abdda 100644
--- a/exercises/timer.livemd
+++ b/exercises/timer.livemd
@@ -76,37 +76,66 @@ end
Implement the `Timer` module as documented below. You will also have to implement the necessary [GenServer](https://hexdocs.pm/elixir/GenServer.html) callback functions such as [GenServer.init/1](https://hexdocs.pm/elixir/GenServer.html#init/1), [GenServer.handle_info/2](https://hexdocs.pm/elixir/GenServer.html#handle_info/2), and [GenServer.handle_call/3](https://hexdocs.pm/elixir/GenServer.html#handle_call/3).
```elixir
- defmodule Timer do
- @moduledoc """
- Documentation for `Timer`
- """
- use GenServer
-
- @doc """
- Start the `Timer` process.
-
- ## Examples
-
- iex> {:ok, pid} = Timer.start_link([])
- """
- def start_link(_opts) do
- end
-
- @doc """
- Get the number of seconds that have elapsed since the `Timer` was started.
-
- ## Examples
-
- iex> {:ok, pid} = Timer.start_link([])
- iex> Timer.seconds(pid)
- 0
- iex> Process.sleep(1200)
- iex> Timer.seconds(pid)
- 1
- """
- def seconds(timer_pid) do
- end
- end
+defmodule Timer do
+ @moduledoc """
+ Documentation for `Timer`
+ """
+ use GenServer
+
+ @doc """
+ Start the `Timer` process.
+
+ ## Examples
+
+ iex> {:ok, pid} = Timer.start_link([])
+ """
+
+ ##### CLIENT #####
+
+ def start_link(_opts) do
+ GenServer.start_link(__MODULE__, [])
+ end
+
+ @doc """
+ Get the number of seconds that have elapsed since the `Timer` was started.
+
+ ## Examples
+
+ iex> {:ok, pid} = Timer.start_link([])
+ iex> Timer.seconds(pid)
+ 0
+ iex> Process.sleep(1200)
+ iex> Timer.seconds(pid)
+ 1
+ """
+ def seconds(pid) do
+ GenServer.call(pid, :seconds)
+ end
+
+ ##### SERVER #####
+
+ @impl true
+ def init(_opts) do
+ increment_timer()
+ {:ok, 0}
+ end
+
+ @impl true
+ def handle_call(:seconds, _from, state) do
+ {:reply, state, state}
+ end
+
+ @impl true
+ def handle_info(:increment, state) do
+ increment_timer()
+ {:noreply, state + 1}
+ end
+
+ defp increment_timer do
+ # add one second
+ Process.send_after(self(), :increment, 1000)
+ end
+end
```
## Bonus :timer
@@ -157,16 +186,58 @@ defmodule AlternateTimer do
@doc """
Start the `Timer` process.
+
+ ## Examples
+
+ iex> {:ok, pid} = Timer.start_link([])
"""
+
+ ##### CLIENT #####
+
def start_link(_opts) do
GenServer.start_link(__MODULE__, [])
end
@doc """
Get the number of seconds that have elapsed since the `Timer` was started.
+
+ ## Examples
+
+ iex> {:ok, pid} = Timer.start_link([])
+ iex> Timer.seconds(pid)
+ 0
+ iex> Process.sleep(1200)
+ iex> Timer.seconds(pid)
+ 1
+
"""
- def seconds(timer_pid) do
- GenServer.call(timer_pid, :seconds)
+
+ def seconds(pid) do
+ GenServer.call(pid, :seconds)
+ end
+
+ ##### SERVER #####
+
+ @impl true
+ def init(_opts) do
+ increment_timer()
+ {:ok, 0}
+ end
+
+ @impl true
+ def handle_call(:seconds, _from, state) do
+ {:reply, state, state}
+ end
+
+ @impl true
+ def handle_info(:increment, state) do
+ increment_timer()
+ {:noreply, state + 1}
+ end
+
+ defp increment_timer do
+ # add one second
+ :timer.send_interval(1000, self(), :increment)
end
end
```
diff --git a/exercises/treasure_matching.livemd b/exercises/treasure_matching.livemd
index 8995e1bf2..854e2a4aa 100644
--- a/exercises/treasure_matching.livemd
+++ b/exercises/treasure_matching.livemd
@@ -27,79 +27,98 @@ jewel
Use pattern matching to bind a `jewel` variable to the `"jewel"` string.
```elixir
-[1, 2, 3, "jewel"]
+[_, _, _, jewel] = [1, 2, 3, "jewel"]
+jewel
```
```elixir
-%{key1: "value", key2: "jewel"}
+%{key1: value, key2: jewel} = %{key1: "value", key2: "jewel"}
+jewel
```
```elixir
-%{1 => "jewel"}
+%{1 => jewel} = %{1 => "jewel"}
+jewel
```
```elixir
-%{%{key: [1, 2, 3, 4, 5, {}]} => "jewel"}
+%{%{key: [1, 2, 3, 4, 5, {}]} => jewel} = %{%{key: [1, 2, 3, 4, 5, {}]} => "jewel"}
+jewel
```
```elixir
-%{north: %{south: %{west: %{east: "jewel"}}}}
+%{north: %{south: %{west: %{east: jewel}}}} = %{north: %{south: %{west: %{east: "jewel"}}}}
+jewel
```
```elixir
-[2, "jewel"]
+[_, jewel] = [2, "jewel"]
+jewel
```
```elixir
-["jewel", 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
+[jewel | tail] = ["jewel", 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
+jewel
```
```elixir
-[1, "jewel", 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
+[_, jewel | tail] = [1, "jewel", 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
+jewel
```
```elixir
-[1, 2, "jewel", 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
+[_, _, jewel | tail] = [1, 2, "jewel", 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
+jewel
```
```elixir
-[[], [1, [2, "jewel"]]]
+[_, [_, [_ | jewel]]] = [[], [1, [2, "jewel"]]]
+jewel
```
```elixir
-"here is the jewel"
+"here is the " <> jewel = "here is the jewel"
+jewel
```
```elixir
-{"jewel"}
+{jewel} = {"jewel"}
+jewel
```
```elixir
-{"jewel", 1}
+{jewel, _} = {"jewel", 1}
+jewel
```
```elixir
-{1, 2, "jewel"}
+{_, _, jewel} = {1, 2, "jewel"}
+jewel
```
```elixir
-["jewel"] ++ Enum.to_list(1..100)
+[jewel | tail] = ["jewel"] ++ Enum.to_list(1..100)
+jewel
```
```elixir
-[key: "jewel"]
+[key: jewel] = [key: "jewel"]
+jewel
```
```elixir
-[south: "jewel", east: {1, 2}]
+[{:south, jewel} | tail] = [south: "jewel", east: {1, 2}, north: "two"]
+jewel
```
```elixir
-Enum.map(1..4, fn each -> (each == 2 && "jewel") || each end)
+[_, jewel | tail] = Enum.map(1..4, fn each -> (each == 2 && "jewel") || each end)
+jewel
```
```elixir
-Enum.map(1..4, &((&1 > 3 && "jewel") || &1))
+[_, _, _, jewel] = Enum.map(1..4, &((&1 > 3 && "jewel") || &1))
+jewel
```
## Mark As Completed
diff --git a/exercises/typespec_drills.livemd b/exercises/typespec_drills.livemd
index 3ed091780..faaa46eee 100644
--- a/exercises/typespec_drills.livemd
+++ b/exercises/typespec_drills.livemd
@@ -157,72 +157,89 @@ end
```elixir
defmodule FunctionSpecs do
+ @spec do_nothing :: nil
def do_nothing do
nil
end
+ @spec accept_and_return_anything(any()) :: any()
def accept_and_return_anything(anything) do
anything
end
+ @spec double(float()) :: float()
def double(float) when is_float(float) do
float * 2.0
end
+ @spec double(integer()) :: integer()
def double(integer) when is_integer(integer) do
integer * 2
end
+ @spec double(number()) :: number()
def double(number) do
number * 2
end
+ @spec add(integer(), integer()) :: integer()
def add(integer1, integer2) do
integer1 + integer2
end
+ @spec multiply(integer(), integer()) :: integer()
def multiply(integer1, integer2) do
integer1 * integer2
end
+ @spec divide(integer(), integer()) :: float()
def divide(integer1, integer2) do
integer1 / integer2
end
+ @spec rounded_divide(integer(), integer()) :: integer()
def rounded_divide(integer1, integer2) do
div(integer1, integer2)
end
+ @spec concat(String.t(), String.t()) :: String.t()
def concat(string1, string2) do
string1 <> string2
end
+ @spec to_string(integer()) :: String.t()
def to_string(integer) do
Integer.to_string(integer)
end
+ @spec merge(map(), map()) :: map()
def merge(map1, map2) do
Map.merge(map1, map2)
end
+ @spec get_or_empty(Keyword.t(), atom()) :: any()
def get_or_empty(keyword_list, atom_key) do
Keyword.get(keyword_list, atom_key, "")
end
+ @spec split_and_lowercase(String.t()) :: [String.t()]
def split_and_lowercase(string) do
string
|> String.downcase()
|> String.split("", trim: true)
end
+ @spec string_to_int(String.t()) :: integer()
def string_to_int(string) do
String.to_integer(string)
end
+ @spec integers_to_strings([integer()]) :: [String.t()]
def integers_to_strings(integers) do
Enum.map(integers, fn int -> Integer.to_string(int) end)
end
+ @spec one_to_two(1) :: 2
def one_to_two(1) do
2
end
@@ -254,13 +271,13 @@ end
```elixir
defmodule CustomTypes do
# a string or number
- @type unparsed_number
+ @type unparsed_number :: String.t() | number()
# a list of strings
- @type strings
+ @type strings :: [String.t()]
# a map with :title (string) and :content (string) keys.
- @type book
+ @type book :: %{title: String.t(), content: String.t()}
# A map with :name (string) and `:books` (a list of books) keys.
- @type author
+ @type author :: %{name: String.t(), books: [book()]}
end
```
diff --git a/exercises/weighted_voting.livemd b/exercises/weighted_voting.livemd
index 96eb35039..166bb852c 100644
--- a/exercises/weighted_voting.livemd
+++ b/exercises/weighted_voting.livemd
@@ -82,12 +82,21 @@ defmodule WeightedVoting do
iex> WeightedVoting.count([dogs: 20, dogs: 10], :dogs)
30
+
iex> WeightedVoting.count([cats: 10, dogs: 20, dogs: 30], :dogs)
50
+
iex> WeightedVoting.count([cats: 10, dogs: 20, dogs: 10, cats: 30], :cats)
40
"""
def count(votes, vote_to_count) do
+ Enum.reduce(votes, 0, fn {key, value}, acc ->
+ if key == vote_to_count do
+ acc + value
+ else
+ acc
+ end
+ end)
end
@doc """
@@ -100,16 +109,35 @@ defmodule WeightedVoting do
iex> WeightedVoting.tally([dogs: 20, dogs: 10])
[dogs: 30]
+
iex> WeightedVoting.tally([cats: 10, dogs: 20, dogs: 10])
[cats: 10, dogs: 30]
+
iex> WeightedVoting.tally([cats: 10, dogs: 20, cats: 20, dogs: 10, birds: 20])
[birds: 20, cats: 30, dogs: 30]
"""
def tally(votes) do
+ Enum.reduce(votes, [], fn {animal, value}, acc ->
+ Keyword.update(acc, animal, value, fn existing_value ->
+ value + existing_value
+ end)
+ end)
+ |> Enum.sort()
end
end
```
+```elixir
+votes = [cats: 10, dogs: 20, cats: 20, dogs: 10, birds: 20]
+vote_to_count = :birds
+
+def count(votes, vote_to_count) do
+ Enum.reduce(votes, fn acc, vote_to_count ->
+ IO.inspect(binding())
+ end)
+end
+```
+
### Bonus: Tally Map
Create a `WeightedVoting.tally_map/1` function which returns a map instead of a keyword list.
diff --git a/exercises/with_points.livemd b/exercises/with_points.livemd
index a6cf47a66..86a33af07 100644
--- a/exercises/with_points.livemd
+++ b/exercises/with_points.livemd
@@ -73,6 +73,13 @@ end
Enter your solution below.
+```elixir
+%{team1_name: team1, team2_name: team2}
+%{round1: %{team1: team1r1, team2: team2r1}}
+%{round2: %{team1: team1r2, team2: team2r2}}
+%{round3: %{team1: team1r3, team2: team2r3}}
+```
+
```elixir
defmodule Points do
@doc """
@@ -96,15 +103,15 @@ defmodule Points do
"""
def tally(game) do
with %{team1_name: team1, team2_name: team2} <- game,
- %{round1: %{team1: t1r1, team2: t2r1}} <- game,
- %{round2: %{team1: t1r2, team2: t2r2}} <- game,
- %{round3: %{team1: t1r3, team2: t2r3}} <- game do
+ %{round1: %{team1: team1r1, team2: team2r1}} <- game,
+ %{round2: %{team1: team1r2, team2: team2r2}} <- game,
+ %{round3: %{team1: team1r3, team2: team2r3}} <- game do
%{}
- |> Map.put(team1, t1r1 + t1r2 + t1r3)
- |> Map.put(team2, t2r1 + t2r2 + t2r3)
+ # IO.inspect(binding())
+ |> Map.put(team1, team1r1 + team1r2 + team1r3)
+ |> Map.put(team2, team2r1 + team2r2 + team2r3)
else
- error ->
- {:error, :invalid}
+ _error -> {:error, :invalid}
end
end
end
diff --git a/phoenix-1.6/counter/.formatter.exs b/phoenix-1.6/counter/.formatter.exs
new file mode 100644
index 000000000..47616780b
--- /dev/null
+++ b/phoenix-1.6/counter/.formatter.exs
@@ -0,0 +1,4 @@
+[
+ import_deps: [:phoenix],
+ inputs: ["*.{ex,exs}", "{config,lib,test}/**/*.{ex,exs}"]
+]
diff --git a/phoenix-1.6/counter/.gitignore b/phoenix-1.6/counter/.gitignore
new file mode 100644
index 000000000..80a831f9e
--- /dev/null
+++ b/phoenix-1.6/counter/.gitignore
@@ -0,0 +1,34 @@
+# The directory Mix will write compiled artifacts to.
+/_build/
+
+# If you run "mix test --cover", coverage assets end up here.
+/cover/
+
+# The directory Mix downloads your dependencies sources to.
+/deps/
+
+# Where 3rd-party dependencies like ExDoc output generated docs.
+/doc/
+
+# Ignore .fetch files in case you like to edit your project deps locally.
+/.fetch
+
+# If the VM crashes, it generates a dump, let's ignore it too.
+erl_crash.dump
+
+# Also ignore archive artifacts (built via "mix archive.build").
+*.ez
+
+# Ignore package tarball (built via "mix hex.build").
+counter-*.tar
+
+# Ignore assets that are produced by build tools.
+/priv/static/assets/
+
+# Ignore digested assets cache.
+/priv/static/cache_manifest.json
+
+# In case you use Node.js/npm, you want to ignore these.
+npm-debug.log
+/assets/node_modules/
+
diff --git a/phoenix-1.6/counter/README.md b/phoenix-1.6/counter/README.md
new file mode 100644
index 000000000..e5ab794d8
--- /dev/null
+++ b/phoenix-1.6/counter/README.md
@@ -0,0 +1,18 @@
+# Counter
+
+To start your Phoenix server:
+
+ * Install dependencies with `mix deps.get`
+ * Start Phoenix endpoint with `mix phx.server` or inside IEx with `iex -S mix phx.server`
+
+Now you can visit [`localhost:4000`](http://localhost:4000) from your browser.
+
+Ready to run in production? Please [check our deployment guides](https://hexdocs.pm/phoenix/deployment.html).
+
+## Learn more
+
+ * Official website: https://www.phoenixframework.org/
+ * Guides: https://hexdocs.pm/phoenix/overview.html
+ * Docs: https://hexdocs.pm/phoenix
+ * Forum: https://elixirforum.com/c/phoenix-forum
+ * Source: https://github.com/phoenixframework/phoenix
diff --git a/phoenix-1.6/counter/assets/css/app.css b/phoenix-1.6/counter/assets/css/app.css
new file mode 100644
index 000000000..19c2e51ed
--- /dev/null
+++ b/phoenix-1.6/counter/assets/css/app.css
@@ -0,0 +1,120 @@
+/* This file is for your main application CSS */
+@import "./phoenix.css";
+
+/* Alerts and form errors used by phx.new */
+.alert {
+ padding: 15px;
+ margin-bottom: 20px;
+ border: 1px solid transparent;
+ border-radius: 4px;
+}
+.alert-info {
+ color: #31708f;
+ background-color: #d9edf7;
+ border-color: #bce8f1;
+}
+.alert-warning {
+ color: #8a6d3b;
+ background-color: #fcf8e3;
+ border-color: #faebcc;
+}
+.alert-danger {
+ color: #a94442;
+ background-color: #f2dede;
+ border-color: #ebccd1;
+}
+.alert p {
+ margin-bottom: 0;
+}
+.alert:empty {
+ display: none;
+}
+.invalid-feedback {
+ color: #a94442;
+ display: block;
+ margin: -1rem 0 2rem;
+}
+
+/* LiveView specific classes for your customization */
+.phx-no-feedback.invalid-feedback,
+.phx-no-feedback .invalid-feedback {
+ display: none;
+}
+
+.phx-click-loading {
+ opacity: 0.5;
+ transition: opacity 1s ease-out;
+}
+
+.phx-loading{
+ cursor: wait;
+}
+
+.phx-modal {
+ opacity: 1!important;
+ position: fixed;
+ z-index: 1;
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 100%;
+ overflow: auto;
+ background-color: rgba(0,0,0,0.4);
+}
+
+.phx-modal-content {
+ background-color: #fefefe;
+ margin: 15vh auto;
+ padding: 20px;
+ border: 1px solid #888;
+ width: 80%;
+}
+
+.phx-modal-close {
+ color: #aaa;
+ float: right;
+ font-size: 28px;
+ font-weight: bold;
+}
+
+.phx-modal-close:hover,
+.phx-modal-close:focus {
+ color: black;
+ text-decoration: none;
+ cursor: pointer;
+}
+
+.fade-in-scale {
+ animation: 0.2s ease-in 0s normal forwards 1 fade-in-scale-keys;
+}
+
+.fade-out-scale {
+ animation: 0.2s ease-out 0s normal forwards 1 fade-out-scale-keys;
+}
+
+.fade-in {
+ animation: 0.2s ease-out 0s normal forwards 1 fade-in-keys;
+}
+.fade-out {
+ animation: 0.2s ease-out 0s normal forwards 1 fade-out-keys;
+}
+
+@keyframes fade-in-scale-keys{
+ 0% { scale: 0.95; opacity: 0; }
+ 100% { scale: 1.0; opacity: 1; }
+}
+
+@keyframes fade-out-scale-keys{
+ 0% { scale: 1.0; opacity: 1; }
+ 100% { scale: 0.95; opacity: 0; }
+}
+
+@keyframes fade-in-keys{
+ 0% { opacity: 0; }
+ 100% { opacity: 1; }
+}
+
+@keyframes fade-out-keys{
+ 0% { opacity: 1; }
+ 100% { opacity: 0; }
+}
diff --git a/phoenix-1.6/counter/assets/css/phoenix.css b/phoenix-1.6/counter/assets/css/phoenix.css
new file mode 100644
index 000000000..0d59050f8
--- /dev/null
+++ b/phoenix-1.6/counter/assets/css/phoenix.css
@@ -0,0 +1,101 @@
+/* Includes some default style for the starter application.
+ * This can be safely deleted to start fresh.
+ */
+
+/* Milligram v1.4.1 https://milligram.github.io
+ * Copyright (c) 2020 CJ Patoilo Licensed under the MIT license
+ */
+
+*,*:after,*:before{box-sizing:inherit}html{box-sizing:border-box;font-size:62.5%}body{color:#000000;font-family:'Helvetica Neue', 'Helvetica', 'Arial', sans-serif;font-size:1.6em;font-weight:300;letter-spacing:.01em;line-height:1.6}blockquote{border-left:0.3rem solid #d1d1d1;margin-left:0;margin-right:0;padding:1rem 1.5rem}blockquote *:last-child{margin-bottom:0}.button,button,input[type='button'],input[type='reset'],input[type='submit']{background-color:#0069d9;border:0.1rem solid #0069d9;border-radius:.4rem;color:#fff;cursor:pointer;display:inline-block;font-size:1.1rem;font-weight:700;height:3.8rem;letter-spacing:.1rem;line-height:3.8rem;padding:0 3.0rem;text-align:center;text-decoration:none;text-transform:uppercase;white-space:nowrap}.button:focus,.button:hover,button:focus,button:hover,input[type='button']:focus,input[type='button']:hover,input[type='reset']:focus,input[type='reset']:hover,input[type='submit']:focus,input[type='submit']:hover{background-color:#606c76;border-color:#606c76;color:#fff;outline:0}.button[disabled],button[disabled],input[type='button'][disabled],input[type='reset'][disabled],input[type='submit'][disabled]{cursor:default;opacity:.5}.button[disabled]:focus,.button[disabled]:hover,button[disabled]:focus,button[disabled]:hover,input[type='button'][disabled]:focus,input[type='button'][disabled]:hover,input[type='reset'][disabled]:focus,input[type='reset'][disabled]:hover,input[type='submit'][disabled]:focus,input[type='submit'][disabled]:hover{background-color:#0069d9;border-color:#0069d9}.button.button-outline,button.button-outline,input[type='button'].button-outline,input[type='reset'].button-outline,input[type='submit'].button-outline{background-color:transparent;color:#0069d9}.button.button-outline:focus,.button.button-outline:hover,button.button-outline:focus,button.button-outline:hover,input[type='button'].button-outline:focus,input[type='button'].button-outline:hover,input[type='reset'].button-outline:focus,input[type='reset'].button-outline:hover,input[type='submit'].button-outline:focus,input[type='submit'].button-outline:hover{background-color:transparent;border-color:#606c76;color:#606c76}.button.button-outline[disabled]:focus,.button.button-outline[disabled]:hover,button.button-outline[disabled]:focus,button.button-outline[disabled]:hover,input[type='button'].button-outline[disabled]:focus,input[type='button'].button-outline[disabled]:hover,input[type='reset'].button-outline[disabled]:focus,input[type='reset'].button-outline[disabled]:hover,input[type='submit'].button-outline[disabled]:focus,input[type='submit'].button-outline[disabled]:hover{border-color:inherit;color:#0069d9}.button.button-clear,button.button-clear,input[type='button'].button-clear,input[type='reset'].button-clear,input[type='submit'].button-clear{background-color:transparent;border-color:transparent;color:#0069d9}.button.button-clear:focus,.button.button-clear:hover,button.button-clear:focus,button.button-clear:hover,input[type='button'].button-clear:focus,input[type='button'].button-clear:hover,input[type='reset'].button-clear:focus,input[type='reset'].button-clear:hover,input[type='submit'].button-clear:focus,input[type='submit'].button-clear:hover{background-color:transparent;border-color:transparent;color:#606c76}.button.button-clear[disabled]:focus,.button.button-clear[disabled]:hover,button.button-clear[disabled]:focus,button.button-clear[disabled]:hover,input[type='button'].button-clear[disabled]:focus,input[type='button'].button-clear[disabled]:hover,input[type='reset'].button-clear[disabled]:focus,input[type='reset'].button-clear[disabled]:hover,input[type='submit'].button-clear[disabled]:focus,input[type='submit'].button-clear[disabled]:hover{color:#0069d9}code{background:#f4f5f6;border-radius:.4rem;font-size:86%;margin:0 .2rem;padding:.2rem .5rem;white-space:nowrap}pre{background:#f4f5f6;border-left:0.3rem solid #0069d9;overflow-y:hidden}pre>code{border-radius:0;display:block;padding:1rem 1.5rem;white-space:pre}hr{border:0;border-top:0.1rem solid #f4f5f6;margin:3.0rem 0}input[type='color'],input[type='date'],input[type='datetime'],input[type='datetime-local'],input[type='email'],input[type='month'],input[type='number'],input[type='password'],input[type='search'],input[type='tel'],input[type='text'],input[type='url'],input[type='week'],input:not([type]),textarea,select{-webkit-appearance:none;background-color:transparent;border:0.1rem solid #d1d1d1;border-radius:.4rem;box-shadow:none;box-sizing:inherit;height:3.8rem;padding:.6rem 1.0rem .7rem;width:100%}input[type='color']:focus,input[type='date']:focus,input[type='datetime']:focus,input[type='datetime-local']:focus,input[type='email']:focus,input[type='month']:focus,input[type='number']:focus,input[type='password']:focus,input[type='search']:focus,input[type='tel']:focus,input[type='text']:focus,input[type='url']:focus,input[type='week']:focus,input:not([type]):focus,textarea:focus,select:focus{border-color:#0069d9;outline:0}select{background:url('data:image/svg+xml;utf8, ') center right no-repeat;padding-right:3.0rem}select:focus{background-image:url('data:image/svg+xml;utf8, ')}select[multiple]{background:none;height:auto}textarea{min-height:6.5rem}label,legend{display:block;font-size:1.6rem;font-weight:700;margin-bottom:.5rem}fieldset{border-width:0;padding:0}input[type='checkbox'],input[type='radio']{display:inline}.label-inline{display:inline-block;font-weight:normal;margin-left:.5rem}.container{margin:0 auto;max-width:112.0rem;padding:0 2.0rem;position:relative;width:100%}.row{display:flex;flex-direction:column;padding:0;width:100%}.row.row-no-padding{padding:0}.row.row-no-padding>.column{padding:0}.row.row-wrap{flex-wrap:wrap}.row.row-top{align-items:flex-start}.row.row-bottom{align-items:flex-end}.row.row-center{align-items:center}.row.row-stretch{align-items:stretch}.row.row-baseline{align-items:baseline}.row .column{display:block;flex:1 1 auto;margin-left:0;max-width:100%;width:100%}.row .column.column-offset-10{margin-left:10%}.row .column.column-offset-20{margin-left:20%}.row .column.column-offset-25{margin-left:25%}.row .column.column-offset-33,.row .column.column-offset-34{margin-left:33.3333%}.row .column.column-offset-40{margin-left:40%}.row .column.column-offset-50{margin-left:50%}.row .column.column-offset-60{margin-left:60%}.row .column.column-offset-66,.row .column.column-offset-67{margin-left:66.6666%}.row .column.column-offset-75{margin-left:75%}.row .column.column-offset-80{margin-left:80%}.row .column.column-offset-90{margin-left:90%}.row .column.column-10{flex:0 0 10%;max-width:10%}.row .column.column-20{flex:0 0 20%;max-width:20%}.row .column.column-25{flex:0 0 25%;max-width:25%}.row .column.column-33,.row .column.column-34{flex:0 0 33.3333%;max-width:33.3333%}.row .column.column-40{flex:0 0 40%;max-width:40%}.row .column.column-50{flex:0 0 50%;max-width:50%}.row .column.column-60{flex:0 0 60%;max-width:60%}.row .column.column-66,.row .column.column-67{flex:0 0 66.6666%;max-width:66.6666%}.row .column.column-75{flex:0 0 75%;max-width:75%}.row .column.column-80{flex:0 0 80%;max-width:80%}.row .column.column-90{flex:0 0 90%;max-width:90%}.row .column .column-top{align-self:flex-start}.row .column .column-bottom{align-self:flex-end}.row .column .column-center{align-self:center}@media (min-width: 40rem){.row{flex-direction:row;margin-left:-1.0rem;width:calc(100% + 2.0rem)}.row .column{margin-bottom:inherit;padding:0 1.0rem}}a{color:#0069d9;text-decoration:none}a:focus,a:hover{color:#606c76}dl,ol,ul{list-style:none;margin-top:0;padding-left:0}dl dl,dl ol,dl ul,ol dl,ol ol,ol ul,ul dl,ul ol,ul ul{font-size:90%;margin:1.5rem 0 1.5rem 3.0rem}ol{list-style:decimal inside}ul{list-style:circle inside}.button,button,dd,dt,li{margin-bottom:1.0rem}fieldset,input,select,textarea{margin-bottom:1.5rem}blockquote,dl,figure,form,ol,p,pre,table,ul{margin-bottom:2.5rem}table{border-spacing:0;display:block;overflow-x:auto;text-align:left;width:100%}td,th{border-bottom:0.1rem solid #e1e1e1;padding:1.2rem 1.5rem}td:first-child,th:first-child{padding-left:0}td:last-child,th:last-child{padding-right:0}@media (min-width: 40rem){table{display:table;overflow-x:initial}}b,strong{font-weight:bold}p{margin-top:0}h1,h2,h3,h4,h5,h6{font-weight:300;letter-spacing:-.1rem;margin-bottom:2.0rem;margin-top:0}h1{font-size:4.6rem;line-height:1.2}h2{font-size:3.6rem;line-height:1.25}h3{font-size:2.8rem;line-height:1.3}h4{font-size:2.2rem;letter-spacing:-.08rem;line-height:1.35}h5{font-size:1.8rem;letter-spacing:-.05rem;line-height:1.5}h6{font-size:1.6rem;letter-spacing:0;line-height:1.4}img{max-width:100%}.clearfix:after{clear:both;content:' ';display:table}.float-left{float:left}.float-right{float:right}
+
+/* General style */
+h1{font-size: 3.6rem; line-height: 1.25}
+h2{font-size: 2.8rem; line-height: 1.3}
+h3{font-size: 2.2rem; letter-spacing: -.08rem; line-height: 1.35}
+h4{font-size: 1.8rem; letter-spacing: -.05rem; line-height: 1.5}
+h5{font-size: 1.6rem; letter-spacing: 0; line-height: 1.4}
+h6{font-size: 1.4rem; letter-spacing: 0; line-height: 1.2}
+pre{padding: 1em;}
+
+.container{
+ margin: 0 auto;
+ max-width: 80.0rem;
+ padding: 0 2.0rem;
+ position: relative;
+ width: 100%
+}
+select {
+ width: auto;
+}
+
+/* Phoenix promo and logo */
+.phx-hero {
+ text-align: center;
+ border-bottom: 1px solid #e3e3e3;
+ background: #eee;
+ border-radius: 6px;
+ padding: 3em 3em 1em;
+ margin-bottom: 3rem;
+ font-weight: 200;
+ font-size: 120%;
+}
+.phx-hero input {
+ background: #ffffff;
+}
+.phx-logo {
+ min-width: 300px;
+ margin: 1rem;
+ display: block;
+}
+.phx-logo img {
+ width: auto;
+ display: block;
+}
+
+/* Headers */
+header {
+ width: 100%;
+ background: #fdfdfd;
+ border-bottom: 1px solid #eaeaea;
+ margin-bottom: 2rem;
+}
+header section {
+ align-items: center;
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+}
+header section :first-child {
+ order: 2;
+}
+header section :last-child {
+ order: 1;
+}
+header nav ul,
+header nav li {
+ margin: 0;
+ padding: 0;
+ display: block;
+ text-align: right;
+ white-space: nowrap;
+}
+header nav ul {
+ margin: 1rem;
+ margin-top: 0;
+}
+header nav a {
+ display: block;
+}
+
+@media (min-width: 40.0rem) { /* Small devices (landscape phones, 576px and up) */
+ header section {
+ flex-direction: row;
+ }
+ header nav ul {
+ margin: 1rem;
+ }
+ .phx-logo {
+ flex-basis: 527px;
+ margin: 2rem 1rem;
+ }
+}
diff --git a/phoenix-1.6/counter/assets/js/app.js b/phoenix-1.6/counter/assets/js/app.js
new file mode 100644
index 000000000..2ca06a566
--- /dev/null
+++ b/phoenix-1.6/counter/assets/js/app.js
@@ -0,0 +1,45 @@
+// We import the CSS which is extracted to its own file by esbuild.
+// Remove this line if you add a your own CSS build pipeline (e.g postcss).
+import "../css/app.css"
+
+// If you want to use Phoenix channels, run `mix help phx.gen.channel`
+// to get started and then uncomment the line below.
+// import "./user_socket.js"
+
+// You can include dependencies in two ways.
+//
+// The simplest option is to put them in assets/vendor and
+// import them using relative paths:
+//
+// import "../vendor/some-package.js"
+//
+// Alternatively, you can `npm install some-package --prefix assets` and import
+// them using a path starting with the package name:
+//
+// import "some-package"
+//
+
+// Include phoenix_html to handle method=PUT/DELETE in forms and buttons.
+import "phoenix_html"
+// Establish Phoenix Socket and LiveView configuration.
+import {Socket} from "phoenix"
+import {LiveSocket} from "phoenix_live_view"
+import topbar from "../vendor/topbar"
+
+let csrfToken = document.querySelector("meta[name='csrf-token']").getAttribute("content")
+let liveSocket = new LiveSocket("/live", Socket, {params: {_csrf_token: csrfToken}})
+
+// Show progress bar on live navigation and form submits
+topbar.config({barColors: {0: "#29d"}, shadowColor: "rgba(0, 0, 0, .3)"})
+window.addEventListener("phx:page-loading-start", info => topbar.show())
+window.addEventListener("phx:page-loading-stop", info => topbar.hide())
+
+// connect if there are any LiveViews on the page
+liveSocket.connect()
+
+// expose liveSocket on window for web console debug logs and latency simulation:
+// >> liveSocket.enableDebug()
+// >> liveSocket.enableLatencySim(1000) // enabled for duration of browser session
+// >> liveSocket.disableLatencySim()
+window.liveSocket = liveSocket
+
diff --git a/phoenix-1.6/counter/assets/vendor/topbar.js b/phoenix-1.6/counter/assets/vendor/topbar.js
new file mode 100644
index 000000000..1f6220974
--- /dev/null
+++ b/phoenix-1.6/counter/assets/vendor/topbar.js
@@ -0,0 +1,157 @@
+/**
+ * @license MIT
+ * topbar 1.0.0, 2021-01-06
+ * https://buunguyen.github.io/topbar
+ * Copyright (c) 2021 Buu Nguyen
+ */
+(function (window, document) {
+ "use strict";
+
+ // https://gist.github.com/paulirish/1579671
+ (function () {
+ var lastTime = 0;
+ var vendors = ["ms", "moz", "webkit", "o"];
+ for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
+ window.requestAnimationFrame =
+ window[vendors[x] + "RequestAnimationFrame"];
+ window.cancelAnimationFrame =
+ window[vendors[x] + "CancelAnimationFrame"] ||
+ window[vendors[x] + "CancelRequestAnimationFrame"];
+ }
+ if (!window.requestAnimationFrame)
+ window.requestAnimationFrame = function (callback, element) {
+ var currTime = new Date().getTime();
+ var timeToCall = Math.max(0, 16 - (currTime - lastTime));
+ var id = window.setTimeout(function () {
+ callback(currTime + timeToCall);
+ }, timeToCall);
+ lastTime = currTime + timeToCall;
+ return id;
+ };
+ if (!window.cancelAnimationFrame)
+ window.cancelAnimationFrame = function (id) {
+ clearTimeout(id);
+ };
+ })();
+
+ var canvas,
+ progressTimerId,
+ fadeTimerId,
+ currentProgress,
+ showing,
+ addEvent = function (elem, type, handler) {
+ if (elem.addEventListener) elem.addEventListener(type, handler, false);
+ else if (elem.attachEvent) elem.attachEvent("on" + type, handler);
+ else elem["on" + type] = handler;
+ },
+ options = {
+ autoRun: true,
+ barThickness: 3,
+ barColors: {
+ 0: "rgba(26, 188, 156, .9)",
+ ".25": "rgba(52, 152, 219, .9)",
+ ".50": "rgba(241, 196, 15, .9)",
+ ".75": "rgba(230, 126, 34, .9)",
+ "1.0": "rgba(211, 84, 0, .9)",
+ },
+ shadowBlur: 10,
+ shadowColor: "rgba(0, 0, 0, .6)",
+ className: null,
+ },
+ repaint = function () {
+ canvas.width = window.innerWidth;
+ canvas.height = options.barThickness * 5; // need space for shadow
+
+ var ctx = canvas.getContext("2d");
+ ctx.shadowBlur = options.shadowBlur;
+ ctx.shadowColor = options.shadowColor;
+
+ var lineGradient = ctx.createLinearGradient(0, 0, canvas.width, 0);
+ for (var stop in options.barColors)
+ lineGradient.addColorStop(stop, options.barColors[stop]);
+ ctx.lineWidth = options.barThickness;
+ ctx.beginPath();
+ ctx.moveTo(0, options.barThickness / 2);
+ ctx.lineTo(
+ Math.ceil(currentProgress * canvas.width),
+ options.barThickness / 2
+ );
+ ctx.strokeStyle = lineGradient;
+ ctx.stroke();
+ },
+ createCanvas = function () {
+ canvas = document.createElement("canvas");
+ var style = canvas.style;
+ style.position = "fixed";
+ style.top = style.left = style.right = style.margin = style.padding = 0;
+ style.zIndex = 100001;
+ style.display = "none";
+ if (options.className) canvas.classList.add(options.className);
+ document.body.appendChild(canvas);
+ addEvent(window, "resize", repaint);
+ },
+ topbar = {
+ config: function (opts) {
+ for (var key in opts)
+ if (options.hasOwnProperty(key)) options[key] = opts[key];
+ },
+ show: function () {
+ if (showing) return;
+ showing = true;
+ if (fadeTimerId !== null) window.cancelAnimationFrame(fadeTimerId);
+ if (!canvas) createCanvas();
+ canvas.style.opacity = 1;
+ canvas.style.display = "block";
+ topbar.progress(0);
+ if (options.autoRun) {
+ (function loop() {
+ progressTimerId = window.requestAnimationFrame(loop);
+ topbar.progress(
+ "+" + 0.05 * Math.pow(1 - Math.sqrt(currentProgress), 2)
+ );
+ })();
+ }
+ },
+ progress: function (to) {
+ if (typeof to === "undefined") return currentProgress;
+ if (typeof to === "string") {
+ to =
+ (to.indexOf("+") >= 0 || to.indexOf("-") >= 0
+ ? currentProgress
+ : 0) + parseFloat(to);
+ }
+ currentProgress = to > 1 ? 1 : to;
+ repaint();
+ return currentProgress;
+ },
+ hide: function () {
+ if (!showing) return;
+ showing = false;
+ if (progressTimerId != null) {
+ window.cancelAnimationFrame(progressTimerId);
+ progressTimerId = null;
+ }
+ (function loop() {
+ if (topbar.progress("+.1") >= 1) {
+ canvas.style.opacity -= 0.05;
+ if (canvas.style.opacity <= 0.05) {
+ canvas.style.display = "none";
+ fadeTimerId = null;
+ return;
+ }
+ }
+ fadeTimerId = window.requestAnimationFrame(loop);
+ })();
+ },
+ };
+
+ if (typeof module === "object" && typeof module.exports === "object") {
+ module.exports = topbar;
+ } else if (typeof define === "function" && define.amd) {
+ define(function () {
+ return topbar;
+ });
+ } else {
+ this.topbar = topbar;
+ }
+}.call(this, window, document));
diff --git a/phoenix-1.6/counter/config/config.exs b/phoenix-1.6/counter/config/config.exs
new file mode 100644
index 000000000..1f394a0da
--- /dev/null
+++ b/phoenix-1.6/counter/config/config.exs
@@ -0,0 +1,49 @@
+# This file is responsible for configuring your application
+# and its dependencies with the aid of the Config module.
+#
+# This configuration file is loaded before any dependency and
+# is restricted to this project.
+
+# General application configuration
+import Config
+
+# Configures the endpoint
+config :counter, CounterWeb.Endpoint,
+ url: [host: "localhost"],
+ render_errors: [view: CounterWeb.ErrorView, accepts: ~w(html json), layout: false],
+ pubsub_server: Counter.PubSub,
+ live_view: [signing_salt: "rKAUFyvf"]
+
+# Configures the mailer
+#
+# By default it uses the "Local" adapter which stores the emails
+# locally. You can see the emails in your browser, at "/dev/mailbox".
+#
+# For production it's recommended to configure a different adapter
+# at the `config/runtime.exs`.
+config :counter, Counter.Mailer, adapter: Swoosh.Adapters.Local
+
+# Swoosh API client is needed for adapters other than SMTP.
+config :swoosh, :api_client, false
+
+# Configure esbuild (the version is required)
+config :esbuild,
+ version: "0.14.29",
+ default: [
+ args:
+ ~w(js/app.js --bundle --target=es2017 --outdir=../priv/static/assets --external:/fonts/* --external:/images/*),
+ cd: Path.expand("../assets", __DIR__),
+ env: %{"NODE_PATH" => Path.expand("../deps", __DIR__)}
+ ]
+
+# Configures Elixir's Logger
+config :logger, :console,
+ format: "$time $metadata[$level] $message\n",
+ metadata: [:request_id]
+
+# Use Jason for JSON parsing in Phoenix
+config :phoenix, :json_library, Jason
+
+# Import environment specific config. This must remain at the bottom
+# of this file so it overrides the configuration defined above.
+import_config "#{config_env()}.exs"
diff --git a/phoenix-1.6/counter/config/dev.exs b/phoenix-1.6/counter/config/dev.exs
new file mode 100644
index 000000000..205c62996
--- /dev/null
+++ b/phoenix-1.6/counter/config/dev.exs
@@ -0,0 +1,65 @@
+import Config
+
+# For development, we disable any cache and enable
+# debugging and code reloading.
+#
+# The watchers configuration can be used to run external
+# watchers to your application. For example, we use it
+# with esbuild to bundle .js and .css sources.
+config :counter, CounterWeb.Endpoint,
+ # Binding to loopback ipv4 address prevents access from other machines.
+ # Change to `ip: {0, 0, 0, 0}` to allow access from other machines.
+ http: [ip: {127, 0, 0, 1}, port: 4000],
+ check_origin: false,
+ code_reloader: true,
+ debug_errors: true,
+ secret_key_base: "KqEXpYgmN4n1J96fDa1WBaYTpLCk2ujKcoFEl9ykCvbPinJZ00n7f9prtjyNPsEK",
+ watchers: [
+ # Start the esbuild watcher by calling Esbuild.install_and_run(:default, args)
+ esbuild: {Esbuild, :install_and_run, [:default, ~w(--sourcemap=inline --watch)]}
+ ]
+
+# ## SSL Support
+#
+# In order to use HTTPS in development, a self-signed
+# certificate can be generated by running the following
+# Mix task:
+#
+# mix phx.gen.cert
+#
+# Note that this task requires Erlang/OTP 20 or later.
+# Run `mix help phx.gen.cert` for more information.
+#
+# The `http:` config above can be replaced with:
+#
+# https: [
+# port: 4001,
+# cipher_suite: :strong,
+# keyfile: "priv/cert/selfsigned_key.pem",
+# certfile: "priv/cert/selfsigned.pem"
+# ],
+#
+# If desired, both `http:` and `https:` keys can be
+# configured to run both http and https servers on
+# different ports.
+
+# Watch static and templates for browser reloading.
+config :counter, CounterWeb.Endpoint,
+ live_reload: [
+ patterns: [
+ ~r"priv/static/.*(js|css|png|jpeg|jpg|gif|svg)$",
+ ~r"priv/gettext/.*(po)$",
+ ~r"lib/counter_web/(live|views)/.*(ex)$",
+ ~r"lib/counter_web/templates/.*(eex)$"
+ ]
+ ]
+
+# Do not include metadata nor timestamps in development logs
+config :logger, :console, format: "[$level] $message\n"
+
+# Set a higher stacktrace during development. Avoid configuring such
+# in production as building large stacktraces may be expensive.
+config :phoenix, :stacktrace_depth, 20
+
+# Initialize plugs at runtime for faster development compilation
+config :phoenix, :plug_init_mode, :runtime
diff --git a/phoenix-1.6/counter/config/prod.exs b/phoenix-1.6/counter/config/prod.exs
new file mode 100644
index 000000000..ceab72203
--- /dev/null
+++ b/phoenix-1.6/counter/config/prod.exs
@@ -0,0 +1,49 @@
+import Config
+
+# For production, don't forget to configure the url host
+# to something meaningful, Phoenix uses this information
+# when generating URLs.
+#
+# Note we also include the path to a cache manifest
+# containing the digested version of static files. This
+# manifest is generated by the `mix phx.digest` task,
+# which you should run after static files are built and
+# before starting your production server.
+config :counter, CounterWeb.Endpoint, cache_static_manifest: "priv/static/cache_manifest.json"
+
+# Do not print debug messages in production
+config :logger, level: :info
+
+# ## SSL Support
+#
+# To get SSL working, you will need to add the `https` key
+# to the previous section and set your `:url` port to 443:
+#
+# config :counter, CounterWeb.Endpoint,
+# ...,
+# url: [host: "example.com", port: 443],
+# https: [
+# ...,
+# port: 443,
+# cipher_suite: :strong,
+# keyfile: System.get_env("SOME_APP_SSL_KEY_PATH"),
+# certfile: System.get_env("SOME_APP_SSL_CERT_PATH")
+# ]
+#
+# The `cipher_suite` is set to `:strong` to support only the
+# latest and more secure SSL ciphers. This means old browsers
+# and clients may not be supported. You can set it to
+# `:compatible` for wider support.
+#
+# `:keyfile` and `:certfile` expect an absolute path to the key
+# and cert in disk or a relative path inside priv, for example
+# "priv/ssl/server.key". For all supported SSL configuration
+# options, see https://hexdocs.pm/plug/Plug.SSL.html#configure/1
+#
+# We also recommend setting `force_ssl` in your endpoint, ensuring
+# no data is ever sent via http, always redirecting to https:
+#
+# config :counter, CounterWeb.Endpoint,
+# force_ssl: [hsts: true]
+#
+# Check `Plug.SSL` for all available options in `force_ssl`.
diff --git a/phoenix-1.6/counter/config/runtime.exs b/phoenix-1.6/counter/config/runtime.exs
new file mode 100644
index 000000000..5bb04b9be
--- /dev/null
+++ b/phoenix-1.6/counter/config/runtime.exs
@@ -0,0 +1,68 @@
+import Config
+
+# config/runtime.exs is executed for all environments, including
+# during releases. It is executed after compilation and before the
+# system starts, so it is typically used to load production configuration
+# and secrets from environment variables or elsewhere. Do not define
+# any compile-time configuration in here, as it won't be applied.
+# The block below contains prod specific runtime configuration.
+
+# ## Using releases
+#
+# If you use `mix release`, you need to explicitly enable the server
+# by passing the PHX_SERVER=true when you start it:
+#
+# PHX_SERVER=true bin/counter start
+#
+# Alternatively, you can use `mix phx.gen.release` to generate a `bin/server`
+# script that automatically sets the env var above.
+if System.get_env("PHX_SERVER") do
+ config :counter, CounterWeb.Endpoint, server: true
+end
+
+if config_env() == :prod do
+ # The secret key base is used to sign/encrypt cookies and other secrets.
+ # A default value is used in config/dev.exs and config/test.exs but you
+ # want to use a different value for prod and you most likely don't want
+ # to check this value into version control, so we use an environment
+ # variable instead.
+ secret_key_base =
+ System.get_env("SECRET_KEY_BASE") ||
+ raise """
+ environment variable SECRET_KEY_BASE is missing.
+ You can generate one by calling: mix phx.gen.secret
+ """
+
+ host = System.get_env("PHX_HOST") || "example.com"
+ port = String.to_integer(System.get_env("PORT") || "4000")
+
+ config :counter, CounterWeb.Endpoint,
+ url: [host: host, port: 443, scheme: "https"],
+ http: [
+ # Enable IPv6 and bind on all interfaces.
+ # Set it to {0, 0, 0, 0, 0, 0, 0, 1} for local network only access.
+ # See the documentation on https://hexdocs.pm/plug_cowboy/Plug.Cowboy.html
+ # for details about using IPv6 vs IPv4 and loopback vs public addresses.
+ ip: {0, 0, 0, 0, 0, 0, 0, 0},
+ port: port
+ ],
+ secret_key_base: secret_key_base
+
+ # ## Configuring the mailer
+ #
+ # In production you need to configure the mailer to use a different adapter.
+ # Also, you may need to configure the Swoosh API client of your choice if you
+ # are not using SMTP. Here is an example of the configuration:
+ #
+ # config :counter, Counter.Mailer,
+ # adapter: Swoosh.Adapters.Mailgun,
+ # api_key: System.get_env("MAILGUN_API_KEY"),
+ # domain: System.get_env("MAILGUN_DOMAIN")
+ #
+ # For this example you need include a HTTP client required by Swoosh API client.
+ # Swoosh supports Hackney and Finch out of the box:
+ #
+ # config :swoosh, :api_client, Swoosh.ApiClient.Hackney
+ #
+ # See https://hexdocs.pm/swoosh/Swoosh.html#module-installation for details.
+end
diff --git a/phoenix-1.6/counter/config/test.exs b/phoenix-1.6/counter/config/test.exs
new file mode 100644
index 000000000..8ea329711
--- /dev/null
+++ b/phoenix-1.6/counter/config/test.exs
@@ -0,0 +1,18 @@
+import Config
+
+# We don't run a server during test. If one is required,
+# you can enable the server option below.
+config :counter, CounterWeb.Endpoint,
+ http: [ip: {127, 0, 0, 1}, port: 4002],
+ secret_key_base: "fRABlWiExUUFpX89Pgs1MNiWNvtvAmXWRfDUf0RuV0nq05DqfFjkw0Kf7nwBHmXS",
+ server: false
+
+# In test we don't send emails.
+config :counter, Counter.Mailer,
+ adapter: Swoosh.Adapters.Test
+
+# Print only warnings and errors during test
+config :logger, level: :warn
+
+# Initialize plugs at runtime for faster test compilation
+config :phoenix, :plug_init_mode, :runtime
diff --git a/phoenix-1.6/counter/lib/counter.ex b/phoenix-1.6/counter/lib/counter.ex
new file mode 100644
index 000000000..9151b8a24
--- /dev/null
+++ b/phoenix-1.6/counter/lib/counter.ex
@@ -0,0 +1,36 @@
+defmodule Counter do
+ @moduledoc """
+ Counter keeps the contexts that define your domain
+ and business logic.
+
+ Contexts are also responsible for managing your data, regardless
+ if it comes from the database, an external API or others.
+ """
+
+ use GenServer
+
+ ##### CLIENT #####
+
+ def start_link(opts) do
+ GenServer.start_link(__MODULE__, opts)
+ end
+
+ def increment(pid) do
+ GenServer.call(pid, :increment)
+ end
+
+
+ ##### SERVER #####
+
+ @impl true
+ def init(init_args) do
+ {:ok, init_args}
+ end
+
+ @impl true
+ def handle_call(:increment, _from, state) do
+ response = state + 1
+ {:reply, response, state}
+ end
+
+end
diff --git a/phoenix-1.6/counter/lib/counter/application.ex b/phoenix-1.6/counter/lib/counter/application.ex
new file mode 100644
index 000000000..2dc9e0dc6
--- /dev/null
+++ b/phoenix-1.6/counter/lib/counter/application.ex
@@ -0,0 +1,34 @@
+defmodule Counter.Application do
+ # See https://hexdocs.pm/elixir/Application.html
+ # for more information on OTP Applications
+ @moduledoc false
+
+ use Application
+
+ @impl true
+ def start(_type, _args) do
+ children = [
+ # Start the Telemetry supervisor
+ CounterWeb.Telemetry,
+ # Start the PubSub system
+ {Phoenix.PubSub, name: Counter.PubSub},
+ # Start the Endpoint (http/https)
+ CounterWeb.Endpoint,
+ # Start a worker by calling: Counter.Worker.start_link(arg)
+ # {Counter.Worker, arg}
+ ]
+
+ # See https://hexdocs.pm/elixir/Supervisor.html
+ # for other strategies and supported options
+ opts = [strategy: :one_for_one, name: Counter.Supervisor]
+ Supervisor.start_link(children, opts)
+ end
+
+ # Tell Phoenix to update the endpoint configuration
+ # whenever the application is updated.
+ @impl true
+ def config_change(changed, _new, removed) do
+ CounterWeb.Endpoint.config_change(changed, removed)
+ :ok
+ end
+end
diff --git a/phoenix-1.6/counter/lib/counter/mailer.ex b/phoenix-1.6/counter/lib/counter/mailer.ex
new file mode 100644
index 000000000..fa6f9cda4
--- /dev/null
+++ b/phoenix-1.6/counter/lib/counter/mailer.ex
@@ -0,0 +1,3 @@
+defmodule Counter.Mailer do
+ use Swoosh.Mailer, otp_app: :counter
+end
diff --git a/phoenix-1.6/counter/lib/counter_web.ex b/phoenix-1.6/counter/lib/counter_web.ex
new file mode 100644
index 000000000..4717d1a01
--- /dev/null
+++ b/phoenix-1.6/counter/lib/counter_web.ex
@@ -0,0 +1,110 @@
+defmodule CounterWeb do
+ @moduledoc """
+ The entrypoint for defining your web interface, such
+ as controllers, views, channels and so on.
+
+ This can be used in your application as:
+
+ use CounterWeb, :controller
+ use CounterWeb, :view
+
+ The definitions below will be executed for every view,
+ controller, etc, so keep them short and clean, focused
+ on imports, uses and aliases.
+
+ Do NOT define functions inside the quoted expressions
+ below. Instead, define any helper function in modules
+ and import those modules here.
+ """
+
+ def controller do
+ quote do
+ use Phoenix.Controller, namespace: CounterWeb
+
+ import Plug.Conn
+ import CounterWeb.Gettext
+ alias CounterWeb.Router.Helpers, as: Routes
+ end
+ end
+
+ def view do
+ quote do
+ use Phoenix.View,
+ root: "lib/counter_web/templates",
+ namespace: CounterWeb
+
+ # Import convenience functions from controllers
+ import Phoenix.Controller,
+ only: [get_flash: 1, get_flash: 2, view_module: 1, view_template: 1]
+
+ # Include shared imports and aliases for views
+ unquote(view_helpers())
+ end
+ end
+
+ def live_view do
+ quote do
+ use Phoenix.LiveView,
+ layout: {CounterWeb.LayoutView, "live.html"}
+
+ unquote(view_helpers())
+ end
+ end
+
+ def live_component do
+ quote do
+ use Phoenix.LiveComponent
+
+ unquote(view_helpers())
+ end
+ end
+
+ def component do
+ quote do
+ use Phoenix.Component
+
+ unquote(view_helpers())
+ end
+ end
+
+ def router do
+ quote do
+ use Phoenix.Router
+
+ import Plug.Conn
+ import Phoenix.Controller
+ import Phoenix.LiveView.Router
+ end
+ end
+
+ def channel do
+ quote do
+ use Phoenix.Channel
+ import CounterWeb.Gettext
+ end
+ end
+
+ defp view_helpers do
+ quote do
+ # Use all HTML functionality (forms, tags, etc)
+ use Phoenix.HTML
+
+ # Import LiveView and .heex helpers (live_render, live_patch, <.form>, etc)
+ import Phoenix.LiveView.Helpers
+
+ # Import basic rendering functionality (render, render_layout, etc)
+ import Phoenix.View
+
+ import CounterWeb.ErrorHelpers
+ import CounterWeb.Gettext
+ alias CounterWeb.Router.Helpers, as: Routes
+ end
+ end
+
+ @doc """
+ When used, dispatch to the appropriate controller/view/etc.
+ """
+ defmacro __using__(which) when is_atom(which) do
+ apply(__MODULE__, which, [])
+ end
+end
diff --git a/phoenix-1.6/counter/lib/counter_web/controllers/count_controller.ex b/phoenix-1.6/counter/lib/counter_web/controllers/count_controller.ex
new file mode 100644
index 000000000..22ed1e013
--- /dev/null
+++ b/phoenix-1.6/counter/lib/counter_web/controllers/count_controller.ex
@@ -0,0 +1,7 @@
+defmodule CounterWeb.CountController do
+ use CounterWeb, :controller
+
+ def count(conn, _params) do
+ render(conn, "count.html")
+ end
+end
diff --git a/phoenix-1.6/counter/lib/counter_web/controllers/page_controller.ex b/phoenix-1.6/counter/lib/counter_web/controllers/page_controller.ex
new file mode 100644
index 000000000..da318d019
--- /dev/null
+++ b/phoenix-1.6/counter/lib/counter_web/controllers/page_controller.ex
@@ -0,0 +1,7 @@
+defmodule CounterWeb.PageController do
+ use CounterWeb, :controller
+
+ def index(conn, _params) do
+ render(conn, "index.html")
+ end
+end
diff --git a/phoenix-1.6/counter/lib/counter_web/endpoint.ex b/phoenix-1.6/counter/lib/counter_web/endpoint.ex
new file mode 100644
index 000000000..86eb5acce
--- /dev/null
+++ b/phoenix-1.6/counter/lib/counter_web/endpoint.ex
@@ -0,0 +1,49 @@
+defmodule CounterWeb.Endpoint do
+ use Phoenix.Endpoint, otp_app: :counter
+
+ # The session will be stored in the cookie and signed,
+ # this means its contents can be read but not tampered with.
+ # Set :encryption_salt if you would also like to encrypt it.
+ @session_options [
+ store: :cookie,
+ key: "_counter_key",
+ signing_salt: "ZPVJIBdR"
+ ]
+
+ socket "/live", Phoenix.LiveView.Socket, websocket: [connect_info: [session: @session_options]]
+
+ # Serve at "/" the static files from "priv/static" directory.
+ #
+ # You should set gzip to true if you are running phx.digest
+ # when deploying your static files in production.
+ plug Plug.Static,
+ at: "/",
+ from: :counter,
+ gzip: false,
+ only: ~w(assets fonts images favicon.ico robots.txt)
+
+ # Code reloading can be explicitly enabled under the
+ # :code_reloader configuration of your endpoint.
+ if code_reloading? do
+ socket "/phoenix/live_reload/socket", Phoenix.LiveReloader.Socket
+ plug Phoenix.LiveReloader
+ plug Phoenix.CodeReloader
+ end
+
+ plug Phoenix.LiveDashboard.RequestLogger,
+ param_key: "request_logger",
+ cookie_key: "request_logger"
+
+ plug Plug.RequestId
+ plug Plug.Telemetry, event_prefix: [:phoenix, :endpoint]
+
+ plug Plug.Parsers,
+ parsers: [:urlencoded, :multipart, :json],
+ pass: ["*/*"],
+ json_decoder: Phoenix.json_library()
+
+ plug Plug.MethodOverride
+ plug Plug.Head
+ plug Plug.Session, @session_options
+ plug CounterWeb.Router
+end
diff --git a/phoenix-1.6/counter/lib/counter_web/gettext.ex b/phoenix-1.6/counter/lib/counter_web/gettext.ex
new file mode 100644
index 000000000..041b3cf02
--- /dev/null
+++ b/phoenix-1.6/counter/lib/counter_web/gettext.ex
@@ -0,0 +1,24 @@
+defmodule CounterWeb.Gettext do
+ @moduledoc """
+ A module providing Internationalization with a gettext-based API.
+
+ By using [Gettext](https://hexdocs.pm/gettext),
+ your module gains a set of macros for translations, for example:
+
+ import CounterWeb.Gettext
+
+ # Simple translation
+ gettext("Here is the string to translate")
+
+ # Plural translation
+ ngettext("Here is the string to translate",
+ "Here are the strings to translate",
+ 3)
+
+ # Domain-based translation
+ dgettext("errors", "Here is the error message to translate")
+
+ See the [Gettext Docs](https://hexdocs.pm/gettext) for detailed usage.
+ """
+ use Gettext, otp_app: :counter
+end
diff --git a/phoenix-1.6/counter/lib/counter_web/router.ex b/phoenix-1.6/counter/lib/counter_web/router.ex
new file mode 100644
index 000000000..8c7acc537
--- /dev/null
+++ b/phoenix-1.6/counter/lib/counter_web/router.ex
@@ -0,0 +1,57 @@
+defmodule CounterWeb.Router do
+ use CounterWeb, :router
+
+ pipeline :browser do
+ plug :accepts, ["html"]
+ plug :fetch_session
+ plug :fetch_live_flash
+ plug :put_root_layout, {CounterWeb.LayoutView, :root}
+ plug :protect_from_forgery
+ plug :put_secure_browser_headers
+ end
+
+ pipeline :api do
+ plug :accepts, ["json"]
+ end
+
+ scope "/", CounterWeb do
+ pipe_through :browser
+
+ get "/", PageController, :index
+ get "/count", CountController, :count
+ end
+
+ # Other scopes may use custom stacks.
+ # scope "/api", CounterWeb do
+ # pipe_through :api
+ # end
+
+ # Enables LiveDashboard only for development
+ #
+ # If you want to use the LiveDashboard in production, you should put
+ # it behind authentication and allow only admins to access it.
+ # If your application does not have an admins-only section yet,
+ # you can use Plug.BasicAuth to set up some basic authentication
+ # as long as you are also using SSL (which you should anyway).
+ if Mix.env() in [:dev, :test] do
+ import Phoenix.LiveDashboard.Router
+
+ scope "/" do
+ pipe_through :browser
+
+ live_dashboard "/dashboard", metrics: CounterWeb.Telemetry
+ end
+ end
+
+ # Enables the Swoosh mailbox preview in development.
+ #
+ # Note that preview only shows emails that were sent by the same
+ # node running the Phoenix server.
+ if Mix.env() == :dev do
+ scope "/dev" do
+ pipe_through :browser
+
+ forward "/mailbox", Plug.Swoosh.MailboxPreview
+ end
+ end
+end
diff --git a/phoenix-1.6/counter/lib/counter_web/telemetry.ex b/phoenix-1.6/counter/lib/counter_web/telemetry.ex
new file mode 100644
index 000000000..3157ba46c
--- /dev/null
+++ b/phoenix-1.6/counter/lib/counter_web/telemetry.ex
@@ -0,0 +1,48 @@
+defmodule CounterWeb.Telemetry do
+ use Supervisor
+ import Telemetry.Metrics
+
+ def start_link(arg) do
+ Supervisor.start_link(__MODULE__, arg, name: __MODULE__)
+ end
+
+ @impl true
+ def init(_arg) do
+ children = [
+ # Telemetry poller will execute the given period measurements
+ # every 10_000ms. Learn more here: https://hexdocs.pm/telemetry_metrics
+ {:telemetry_poller, measurements: periodic_measurements(), period: 10_000}
+ # Add reporters as children of your supervision tree.
+ # {Telemetry.Metrics.ConsoleReporter, metrics: metrics()}
+ ]
+
+ Supervisor.init(children, strategy: :one_for_one)
+ end
+
+ def metrics do
+ [
+ # Phoenix Metrics
+ summary("phoenix.endpoint.stop.duration",
+ unit: {:native, :millisecond}
+ ),
+ summary("phoenix.router_dispatch.stop.duration",
+ tags: [:route],
+ unit: {:native, :millisecond}
+ ),
+
+ # VM Metrics
+ summary("vm.memory.total", unit: {:byte, :kilobyte}),
+ summary("vm.total_run_queue_lengths.total"),
+ summary("vm.total_run_queue_lengths.cpu"),
+ summary("vm.total_run_queue_lengths.io")
+ ]
+ end
+
+ defp periodic_measurements do
+ [
+ # A module, function and arguments to be invoked periodically.
+ # This function must call :telemetry.execute/3 and a metric must be added above.
+ # {CounterWeb, :count_users, []}
+ ]
+ end
+end
diff --git a/phoenix-1.6/counter/lib/counter_web/templates/count/count.html.heex b/phoenix-1.6/counter/lib/counter_web/templates/count/count.html.heex
new file mode 100644
index 000000000..a3c5dce3a
--- /dev/null
+++ b/phoenix-1.6/counter/lib/counter_web/templates/count/count.html.heex
@@ -0,0 +1,2 @@
+Hello World
+
+ //
+ plugin(({addVariant}) => addVariant("phx-no-feedback", [".phx-no-feedback&", ".phx-no-feedback &"])),
+ plugin(({addVariant}) => addVariant("phx-click-loading", [".phx-click-loading&", ".phx-click-loading &"])),
+ plugin(({addVariant}) => addVariant("phx-submit-loading", [".phx-submit-loading&", ".phx-submit-loading &"])),
+ plugin(({addVariant}) => addVariant("phx-change-loading", [".phx-change-loading&", ".phx-change-loading &"])),
+
+ // Embeds Hero Icons (https://heroicons.com) into your app.css bundle
+ // See your `CoreComponents.icon/1` for more information.
+ //
+ plugin(function({matchComponents, theme}) {
+ let iconsDir = path.join(__dirname, "../priv/hero_icons/optimized")
+ let values = {}
+ let icons = [
+ ["", "/24/outline"],
+ ["-solid", "/24/solid"],
+ ["-mini", "/20/solid"]
+ ]
+ icons.forEach(([suffix, dir]) => {
+ fs.readdirSync(path.join(iconsDir, dir)).map(file => {
+ let name = path.basename(file, ".svg") + suffix
+ values[name] = {name, fullPath: path.join(iconsDir, dir, file)}
+ })
+ })
+ matchComponents({
+ "hero": ({name, fullPath}) => {
+ let content = fs.readFileSync(fullPath).toString().replace(/\r?\n|\r/g, "")
+ return {
+ [`--hero-${name}`]: `url('data:image/svg+xml;utf8,${content}')`,
+ "-webkit-mask": `var(--hero-${name})`,
+ "mask": `var(--hero-${name})`,
+ "background-color": "currentColor",
+ "vertical-align": "middle",
+ "display": "inline-block",
+ "width": theme("spacing.5"),
+ "height": theme("spacing.5")
+ }
+ }
+ }, {values})
+ })
+ ]
+}
diff --git a/phoenix-1.7/counter/assets/vendor/topbar.js b/phoenix-1.7/counter/assets/vendor/topbar.js
new file mode 100644
index 000000000..41957274d
--- /dev/null
+++ b/phoenix-1.7/counter/assets/vendor/topbar.js
@@ -0,0 +1,165 @@
+/**
+ * @license MIT
+ * topbar 2.0.0, 2023-02-04
+ * https://buunguyen.github.io/topbar
+ * Copyright (c) 2021 Buu Nguyen
+ */
+(function (window, document) {
+ "use strict";
+
+ // https://gist.github.com/paulirish/1579671
+ (function () {
+ var lastTime = 0;
+ var vendors = ["ms", "moz", "webkit", "o"];
+ for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
+ window.requestAnimationFrame =
+ window[vendors[x] + "RequestAnimationFrame"];
+ window.cancelAnimationFrame =
+ window[vendors[x] + "CancelAnimationFrame"] ||
+ window[vendors[x] + "CancelRequestAnimationFrame"];
+ }
+ if (!window.requestAnimationFrame)
+ window.requestAnimationFrame = function (callback, element) {
+ var currTime = new Date().getTime();
+ var timeToCall = Math.max(0, 16 - (currTime - lastTime));
+ var id = window.setTimeout(function () {
+ callback(currTime + timeToCall);
+ }, timeToCall);
+ lastTime = currTime + timeToCall;
+ return id;
+ };
+ if (!window.cancelAnimationFrame)
+ window.cancelAnimationFrame = function (id) {
+ clearTimeout(id);
+ };
+ })();
+
+ var canvas,
+ currentProgress,
+ showing,
+ progressTimerId = null,
+ fadeTimerId = null,
+ delayTimerId = null,
+ addEvent = function (elem, type, handler) {
+ if (elem.addEventListener) elem.addEventListener(type, handler, false);
+ else if (elem.attachEvent) elem.attachEvent("on" + type, handler);
+ else elem["on" + type] = handler;
+ },
+ options = {
+ autoRun: true,
+ barThickness: 3,
+ barColors: {
+ 0: "rgba(26, 188, 156, .9)",
+ ".25": "rgba(52, 152, 219, .9)",
+ ".50": "rgba(241, 196, 15, .9)",
+ ".75": "rgba(230, 126, 34, .9)",
+ "1.0": "rgba(211, 84, 0, .9)",
+ },
+ shadowBlur: 10,
+ shadowColor: "rgba(0, 0, 0, .6)",
+ className: null,
+ },
+ repaint = function () {
+ canvas.width = window.innerWidth;
+ canvas.height = options.barThickness * 5; // need space for shadow
+
+ var ctx = canvas.getContext("2d");
+ ctx.shadowBlur = options.shadowBlur;
+ ctx.shadowColor = options.shadowColor;
+
+ var lineGradient = ctx.createLinearGradient(0, 0, canvas.width, 0);
+ for (var stop in options.barColors)
+ lineGradient.addColorStop(stop, options.barColors[stop]);
+ ctx.lineWidth = options.barThickness;
+ ctx.beginPath();
+ ctx.moveTo(0, options.barThickness / 2);
+ ctx.lineTo(
+ Math.ceil(currentProgress * canvas.width),
+ options.barThickness / 2
+ );
+ ctx.strokeStyle = lineGradient;
+ ctx.stroke();
+ },
+ createCanvas = function () {
+ canvas = document.createElement("canvas");
+ var style = canvas.style;
+ style.position = "fixed";
+ style.top = style.left = style.right = style.margin = style.padding = 0;
+ style.zIndex = 100001;
+ style.display = "none";
+ if (options.className) canvas.classList.add(options.className);
+ document.body.appendChild(canvas);
+ addEvent(window, "resize", repaint);
+ },
+ topbar = {
+ config: function (opts) {
+ for (var key in opts)
+ if (options.hasOwnProperty(key)) options[key] = opts[key];
+ },
+ show: function (delay) {
+ if (showing) return;
+ if (delay) {
+ if (delayTimerId) return;
+ delayTimerId = setTimeout(() => topbar.show(), delay);
+ } else {
+ showing = true;
+ if (fadeTimerId !== null) window.cancelAnimationFrame(fadeTimerId);
+ if (!canvas) createCanvas();
+ canvas.style.opacity = 1;
+ canvas.style.display = "block";
+ topbar.progress(0);
+ if (options.autoRun) {
+ (function loop() {
+ progressTimerId = window.requestAnimationFrame(loop);
+ topbar.progress(
+ "+" + 0.05 * Math.pow(1 - Math.sqrt(currentProgress), 2)
+ );
+ })();
+ }
+ }
+ },
+ progress: function (to) {
+ if (typeof to === "undefined") return currentProgress;
+ if (typeof to === "string") {
+ to =
+ (to.indexOf("+") >= 0 || to.indexOf("-") >= 0
+ ? currentProgress
+ : 0) + parseFloat(to);
+ }
+ currentProgress = to > 1 ? 1 : to;
+ repaint();
+ return currentProgress;
+ },
+ hide: function () {
+ clearTimeout(delayTimerId);
+ delayTimerId = null;
+ if (!showing) return;
+ showing = false;
+ if (progressTimerId != null) {
+ window.cancelAnimationFrame(progressTimerId);
+ progressTimerId = null;
+ }
+ (function loop() {
+ if (topbar.progress("+.1") >= 1) {
+ canvas.style.opacity -= 0.05;
+ if (canvas.style.opacity <= 0.05) {
+ canvas.style.display = "none";
+ fadeTimerId = null;
+ return;
+ }
+ }
+ fadeTimerId = window.requestAnimationFrame(loop);
+ })();
+ },
+ };
+
+ if (typeof module === "object" && typeof module.exports === "object") {
+ module.exports = topbar;
+ } else if (typeof define === "function" && define.amd) {
+ define(function () {
+ return topbar;
+ });
+ } else {
+ this.topbar = topbar;
+ }
+}.call(this, window, document));
diff --git a/phoenix-1.7/counter/config/config.exs b/phoenix-1.7/counter/config/config.exs
new file mode 100644
index 000000000..2708337d6
--- /dev/null
+++ b/phoenix-1.7/counter/config/config.exs
@@ -0,0 +1,61 @@
+# This file is responsible for configuring your application
+# and its dependencies with the aid of the Config module.
+#
+# This configuration file is loaded before any dependency and
+# is restricted to this project.
+
+# General application configuration
+import Config
+
+# Configures the endpoint
+config :counter, CounterWeb.Endpoint,
+ url: [host: "localhost"],
+ render_errors: [
+ formats: [html: CounterWeb.ErrorHTML, json: CounterWeb.ErrorJSON],
+ layout: false
+ ],
+ pubsub_server: Counter.PubSub,
+ live_view: [signing_salt: "DB1nH+Sn"]
+
+# Configures the mailer
+#
+# By default it uses the "Local" adapter which stores the emails
+# locally. You can see the emails in your browser, at "/dev/mailbox".
+#
+# For production it's recommended to configure a different adapter
+# at the `config/runtime.exs`.
+config :counter, Counter.Mailer, adapter: Swoosh.Adapters.Local
+
+# Configure esbuild (the version is required)
+config :esbuild,
+ version: "0.14.41",
+ default: [
+ args:
+ ~w(js/app.js --bundle --target=es2017 --outdir=../priv/static/assets --external:/fonts/* --external:/images/*),
+ cd: Path.expand("../assets", __DIR__),
+ env: %{"NODE_PATH" => Path.expand("../deps", __DIR__)}
+ ]
+
+# Configure tailwind (the version is required)
+config :tailwind,
+ version: "3.2.4",
+ default: [
+ args: ~w(
+ --config=tailwind.config.js
+ --input=css/app.css
+ --output=../priv/static/assets/app.css
+ ),
+ cd: Path.expand("../assets", __DIR__)
+ ]
+
+# Configures Elixir's Logger
+config :logger, :console,
+ format: "$time $metadata[$level] $message\n",
+ metadata: [:request_id]
+
+# Use Jason for JSON parsing in Phoenix
+config :phoenix, :json_library, Jason
+
+# Import environment specific config. This must remain at the bottom
+# of this file so it overrides the configuration defined above.
+import_config "#{config_env()}.exs"
diff --git a/phoenix-1.7/counter/config/dev.exs b/phoenix-1.7/counter/config/dev.exs
new file mode 100644
index 000000000..3768bba41
--- /dev/null
+++ b/phoenix-1.7/counter/config/dev.exs
@@ -0,0 +1,69 @@
+import Config
+
+# For development, we disable any cache and enable
+# debugging and code reloading.
+#
+# The watchers configuration can be used to run external
+# watchers to your application. For example, we use it
+# with esbuild to bundle .js and .css sources.
+config :counter, CounterWeb.Endpoint,
+ # Binding to loopback ipv4 address prevents access from other machines.
+ # Change to `ip: {0, 0, 0, 0}` to allow access from other machines.
+ http: [ip: {127, 0, 0, 1}, port: 4000],
+ check_origin: false,
+ code_reloader: true,
+ debug_errors: true,
+ secret_key_base: "KmPkbfiVqpsyJHpm+RlNHgX85D1Fhj5vXUpdASRh2JBWNcQDWa7h8Fb6ft59rCW8",
+ watchers: [
+ esbuild: {Esbuild, :install_and_run, [:default, ~w(--sourcemap=inline --watch)]},
+ tailwind: {Tailwind, :install_and_run, [:default, ~w(--watch)]}
+ ]
+
+# ## SSL Support
+#
+# In order to use HTTPS in development, a self-signed
+# certificate can be generated by running the following
+# Mix task:
+#
+# mix phx.gen.cert
+#
+# Run `mix help phx.gen.cert` for more information.
+#
+# The `http:` config above can be replaced with:
+#
+# https: [
+# port: 4001,
+# cipher_suite: :strong,
+# keyfile: "priv/cert/selfsigned_key.pem",
+# certfile: "priv/cert/selfsigned.pem"
+# ],
+#
+# If desired, both `http:` and `https:` keys can be
+# configured to run both http and https servers on
+# different ports.
+
+# Watch static and templates for browser reloading.
+config :counter, CounterWeb.Endpoint,
+ live_reload: [
+ patterns: [
+ ~r"priv/static/.*(js|css|png|jpeg|jpg|gif|svg)$",
+ ~r"priv/gettext/.*(po)$",
+ ~r"lib/counter_web/(controllers|live|components)/.*(ex|heex)$"
+ ]
+ ]
+
+# Enable dev routes for dashboard and mailbox
+config :counter, dev_routes: true
+
+# Do not include metadata nor timestamps in development logs
+config :logger, :console, format: "[$level] $message\n"
+
+# Set a higher stacktrace during development. Avoid configuring such
+# in production as building large stacktraces may be expensive.
+config :phoenix, :stacktrace_depth, 20
+
+# Initialize plugs at runtime for faster development compilation
+config :phoenix, :plug_init_mode, :runtime
+
+# Disable swoosh api client as it is only required for production adapters.
+config :swoosh, :api_client, false
diff --git a/phoenix-1.7/counter/config/prod.exs b/phoenix-1.7/counter/config/prod.exs
new file mode 100644
index 000000000..a713ea1be
--- /dev/null
+++ b/phoenix-1.7/counter/config/prod.exs
@@ -0,0 +1,21 @@
+import Config
+
+# For production, don't forget to configure the url host
+# to something meaningful, Phoenix uses this information
+# when generating URLs.
+
+# Note we also include the path to a cache manifest
+# containing the digested version of static files. This
+# manifest is generated by the `mix phx.digest` task,
+# which you should run after static files are built and
+# before starting your production server.
+config :counter, CounterWeb.Endpoint, cache_static_manifest: "priv/static/cache_manifest.json"
+
+# Configures Swoosh API Client
+config :swoosh, api_client: Swoosh.ApiClient.Finch, finch_name: Counter.Finch
+
+# Do not print debug messages in production
+config :logger, level: :info
+
+# Runtime production configuration, including reading
+# of environment variables, is done on config/runtime.exs.
diff --git a/phoenix-1.7/counter/config/runtime.exs b/phoenix-1.7/counter/config/runtime.exs
new file mode 100644
index 000000000..dcd5a8f93
--- /dev/null
+++ b/phoenix-1.7/counter/config/runtime.exs
@@ -0,0 +1,100 @@
+import Config
+
+# config/runtime.exs is executed for all environments, including
+# during releases. It is executed after compilation and before the
+# system starts, so it is typically used to load production configuration
+# and secrets from environment variables or elsewhere. Do not define
+# any compile-time configuration in here, as it won't be applied.
+# The block below contains prod specific runtime configuration.
+
+# ## Using releases
+#
+# If you use `mix release`, you need to explicitly enable the server
+# by passing the PHX_SERVER=true when you start it:
+#
+# PHX_SERVER=true bin/counter start
+#
+# Alternatively, you can use `mix phx.gen.release` to generate a `bin/server`
+# script that automatically sets the env var above.
+if System.get_env("PHX_SERVER") do
+ config :counter, CounterWeb.Endpoint, server: true
+end
+
+if config_env() == :prod do
+ # The secret key base is used to sign/encrypt cookies and other secrets.
+ # A default value is used in config/dev.exs and config/test.exs but you
+ # want to use a different value for prod and you most likely don't want
+ # to check this value into version control, so we use an environment
+ # variable instead.
+ secret_key_base =
+ System.get_env("SECRET_KEY_BASE") ||
+ raise """
+ environment variable SECRET_KEY_BASE is missing.
+ You can generate one by calling: mix phx.gen.secret
+ """
+
+ host = System.get_env("PHX_HOST") || "example.com"
+ port = String.to_integer(System.get_env("PORT") || "4000")
+
+ config :counter, CounterWeb.Endpoint,
+ url: [host: host, port: 443, scheme: "https"],
+ http: [
+ # Enable IPv6 and bind on all interfaces.
+ # Set it to {0, 0, 0, 0, 0, 0, 0, 1} for local network only access.
+ # See the documentation on https://hexdocs.pm/plug_cowboy/Plug.Cowboy.html
+ # for details about using IPv6 vs IPv4 and loopback vs public addresses.
+ ip: {0, 0, 0, 0, 0, 0, 0, 0},
+ port: port
+ ],
+ secret_key_base: secret_key_base
+
+ # ## SSL Support
+ #
+ # To get SSL working, you will need to add the `https` key
+ # to your endpoint configuration:
+ #
+ # config :counter, CounterWeb.Endpoint,
+ # https: [
+ # ...,
+ # port: 443,
+ # cipher_suite: :strong,
+ # keyfile: System.get_env("SOME_APP_SSL_KEY_PATH"),
+ # certfile: System.get_env("SOME_APP_SSL_CERT_PATH")
+ # ]
+ #
+ # The `cipher_suite` is set to `:strong` to support only the
+ # latest and more secure SSL ciphers. This means old browsers
+ # and clients may not be supported. You can set it to
+ # `:compatible` for wider support.
+ #
+ # `:keyfile` and `:certfile` expect an absolute path to the key
+ # and cert in disk or a relative path inside priv, for example
+ # "priv/ssl/server.key". For all supported SSL configuration
+ # options, see https://hexdocs.pm/plug/Plug.SSL.html#configure/1
+ #
+ # We also recommend setting `force_ssl` in your endpoint, ensuring
+ # no data is ever sent via http, always redirecting to https:
+ #
+ # config :counter, CounterWeb.Endpoint,
+ # force_ssl: [hsts: true]
+ #
+ # Check `Plug.SSL` for all available options in `force_ssl`.
+
+ # ## Configuring the mailer
+ #
+ # In production you need to configure the mailer to use a different adapter.
+ # Also, you may need to configure the Swoosh API client of your choice if you
+ # are not using SMTP. Here is an example of the configuration:
+ #
+ # config :counter, Counter.Mailer,
+ # adapter: Swoosh.Adapters.Mailgun,
+ # api_key: System.get_env("MAILGUN_API_KEY"),
+ # domain: System.get_env("MAILGUN_DOMAIN")
+ #
+ # For this example you need include a HTTP client required by Swoosh API client.
+ # Swoosh supports Hackney and Finch out of the box:
+ #
+ # config :swoosh, :api_client, Swoosh.ApiClient.Hackney
+ #
+ # See https://hexdocs.pm/swoosh/Swoosh.html#module-installation for details.
+end
diff --git a/phoenix-1.7/counter/config/test.exs b/phoenix-1.7/counter/config/test.exs
new file mode 100644
index 000000000..412f6fd6e
--- /dev/null
+++ b/phoenix-1.7/counter/config/test.exs
@@ -0,0 +1,21 @@
+import Config
+
+# We don't run a server during test. If one is required,
+# you can enable the server option below.
+config :counter, CounterWeb.Endpoint,
+ http: [ip: {127, 0, 0, 1}, port: 4002],
+ secret_key_base: "C0EAAkvHuDfPxDguT8F8Ck8IQLBBSuOhu1hyJ1KPxapR+obidRpl5fxMqJFWusvA",
+ server: false
+
+# In test we don't send emails.
+config :counter, Counter.Mailer,
+ adapter: Swoosh.Adapters.Test
+
+# Disable swoosh api client as it is only required for production adapters.
+config :swoosh, :api_client, false
+
+# Print only warnings and errors during test
+config :logger, level: :warning
+
+# Initialize plugs at runtime for faster test compilation
+config :phoenix, :plug_init_mode, :runtime
diff --git a/phoenix-1.7/counter/lib/counter.ex b/phoenix-1.7/counter/lib/counter.ex
new file mode 100644
index 000000000..bf4261567
--- /dev/null
+++ b/phoenix-1.7/counter/lib/counter.ex
@@ -0,0 +1,9 @@
+defmodule Counter do
+ @moduledoc """
+ Counter keeps the contexts that define your domain
+ and business logic.
+
+ Contexts are also responsible for managing your data, regardless
+ if it comes from the database, an external API or others.
+ """
+end
diff --git a/phoenix-1.7/counter/lib/counter/application.ex b/phoenix-1.7/counter/lib/counter/application.ex
new file mode 100644
index 000000000..7e6b37691
--- /dev/null
+++ b/phoenix-1.7/counter/lib/counter/application.ex
@@ -0,0 +1,36 @@
+defmodule Counter.Application do
+ # See https://hexdocs.pm/elixir/Application.html
+ # for more information on OTP Applications
+ @moduledoc false
+
+ use Application
+
+ @impl true
+ def start(_type, _args) do
+ children = [
+ # Start the Telemetry supervisor
+ CounterWeb.Telemetry,
+ # Start the PubSub system
+ {Phoenix.PubSub, name: Counter.PubSub},
+ # Start Finch
+ {Finch, name: Counter.Finch},
+ # Start the Endpoint (http/https)
+ CounterWeb.Endpoint
+ # Start a worker by calling: Counter.Worker.start_link(arg)
+ # {Counter.Worker, arg}
+ ]
+
+ # See https://hexdocs.pm/elixir/Supervisor.html
+ # for other strategies and supported options
+ opts = [strategy: :one_for_one, name: Counter.Supervisor]
+ Supervisor.start_link(children, opts)
+ end
+
+ # Tell Phoenix to update the endpoint configuration
+ # whenever the application is updated.
+ @impl true
+ def config_change(changed, _new, removed) do
+ CounterWeb.Endpoint.config_change(changed, removed)
+ :ok
+ end
+end
diff --git a/phoenix-1.7/counter/lib/counter/mailer.ex b/phoenix-1.7/counter/lib/counter/mailer.ex
new file mode 100644
index 000000000..fa6f9cda4
--- /dev/null
+++ b/phoenix-1.7/counter/lib/counter/mailer.ex
@@ -0,0 +1,3 @@
+defmodule Counter.Mailer do
+ use Swoosh.Mailer, otp_app: :counter
+end
diff --git a/phoenix-1.7/counter/lib/counter_web.ex b/phoenix-1.7/counter/lib/counter_web.ex
new file mode 100644
index 000000000..2f231711e
--- /dev/null
+++ b/phoenix-1.7/counter/lib/counter_web.ex
@@ -0,0 +1,113 @@
+defmodule CounterWeb do
+ @moduledoc """
+ The entrypoint for defining your web interface, such
+ as controllers, components, channels, and so on.
+
+ This can be used in your application as:
+
+ use CounterWeb, :controller
+ use CounterWeb, :html
+
+ The definitions below will be executed for every controller,
+ component, etc, so keep them short and clean, focused
+ on imports, uses and aliases.
+
+ Do NOT define functions inside the quoted expressions
+ below. Instead, define additional modules and import
+ those modules here.
+ """
+
+ def static_paths, do: ~w(assets fonts images favicon.ico robots.txt)
+
+ def router do
+ quote do
+ use Phoenix.Router, helpers: false
+
+ # Import common connection and controller functions to use in pipelines
+ import Plug.Conn
+ import Phoenix.Controller
+ import Phoenix.LiveView.Router
+ end
+ end
+
+ def channel do
+ quote do
+ use Phoenix.Channel
+ end
+ end
+
+ def controller do
+ quote do
+ use Phoenix.Controller,
+ formats: [:html, :json],
+ layouts: [html: CounterWeb.Layouts]
+
+ import Plug.Conn
+ import CounterWeb.Gettext
+
+ unquote(verified_routes())
+ end
+ end
+
+ def live_view do
+ quote do
+ use Phoenix.LiveView,
+ layout: {CounterWeb.Layouts, :app}
+
+ unquote(html_helpers())
+ end
+ end
+
+ def live_component do
+ quote do
+ use Phoenix.LiveComponent
+
+ unquote(html_helpers())
+ end
+ end
+
+ def html do
+ quote do
+ use Phoenix.Component
+
+ # Import convenience functions from controllers
+ import Phoenix.Controller,
+ only: [get_csrf_token: 0, view_module: 1, view_template: 1]
+
+ # Include general helpers for rendering HTML
+ unquote(html_helpers())
+ end
+ end
+
+ defp html_helpers do
+ quote do
+ # HTML escaping functionality
+ import Phoenix.HTML
+ # Core UI components and translation
+ import CounterWeb.CoreComponents
+ import CounterWeb.Gettext
+
+ # Shortcut for generating JS commands
+ alias Phoenix.LiveView.JS
+
+ # Routes generation with the ~p sigil
+ unquote(verified_routes())
+ end
+ end
+
+ def verified_routes do
+ quote do
+ use Phoenix.VerifiedRoutes,
+ endpoint: CounterWeb.Endpoint,
+ router: CounterWeb.Router,
+ statics: CounterWeb.static_paths()
+ end
+ end
+
+ @doc """
+ When used, dispatch to the appropriate controller/view/etc.
+ """
+ defmacro __using__(which) when is_atom(which) do
+ apply(__MODULE__, which, [])
+ end
+end
diff --git a/phoenix-1.7/counter/lib/counter_web/components/core_components.ex b/phoenix-1.7/counter/lib/counter_web/components/core_components.ex
new file mode 100644
index 000000000..1d9ef1466
--- /dev/null
+++ b/phoenix-1.7/counter/lib/counter_web/components/core_components.ex
@@ -0,0 +1,689 @@
+defmodule CounterWeb.CoreComponents do
+ @moduledoc """
+ Provides core UI components.
+
+ The components in this module use Tailwind CSS, a utility-first CSS framework.
+ See the [Tailwind CSS documentation](https://tailwindcss.com) to learn how to
+ customize the generated components in this module.
+
+ Icons are provided by [heroicons](https://heroicons.com). See `icon/1` for usage.
+ """
+ use Phoenix.Component
+
+ alias Phoenix.LiveView.JS
+ import CounterWeb.Gettext
+
+ @doc """
+ Renders a modal.
+
+ ## Examples
+
+ <.modal id="confirm-modal">
+ Are you sure?
+ <:confirm>OK
+ <:cancel>Cancel
+
+
+ JS commands may be passed to the `:on_cancel` and `on_confirm` attributes
+ for the caller to react to each button press, for example:
+
+ <.modal id="confirm" on_confirm={JS.push("delete")} on_cancel={JS.navigate(~p"/posts")}>
+ Are you sure you?
+ <:confirm>OK
+ <:cancel>Cancel
+
+ """
+ attr :id, :string, required: true
+ attr :show, :boolean, default: false
+ attr :on_cancel, JS, default: %JS{}
+ attr :on_confirm, JS, default: %JS{}
+
+ slot :inner_block, required: true
+ slot :title
+ slot :subtitle
+ slot :confirm
+ slot :cancel
+
+ def modal(assigns) do
+ ~H"""
+
+
+
+
+
+ <.focus_wrap
+ id={"#{@id}-container"}
+ phx-mounted={@show && show_modal(@id)}
+ phx-window-keydown={hide_modal(@on_cancel, @id)}
+ phx-key="escape"
+ phx-click-away={hide_modal(@on_cancel, @id)}
+ class="hidden relative rounded-2xl bg-white p-14 shadow-lg shadow-zinc-700/10 ring-1 ring-zinc-700/10 transition"
+ >
+
+
+ <.icon name="hero-x-mark-solid" class="w-5 h-5" />
+
+
+
+
+ <%= render_slot(@inner_block) %>
+
+ <.button
+ :for={confirm <- @confirm}
+ id={"#{@id}-confirm"}
+ phx-click={@on_confirm}
+ phx-disable-with
+ class="py-2 px-3"
+ >
+ <%= render_slot(confirm) %>
+
+ <.link
+ :for={cancel <- @cancel}
+ phx-click={hide_modal(@on_cancel, @id)}
+ class="text-sm font-semibold leading-6 text-zinc-900 hover:text-zinc-700"
+ >
+ <%= render_slot(cancel) %>
+
+
+
+
+
+
+
+
+ """
+ end
+
+ @doc """
+ Renders flash notices.
+
+ ## Examples
+
+ <.flash kind={:info} flash={@flash} />
+ <.flash kind={:info} phx-mounted={show("#flash")}>Welcome Back!
+ """
+ attr :id, :string, default: "flash", doc: "the optional id of flash container"
+ attr :flash, :map, default: %{}, doc: "the map of flash messages to display"
+ attr :title, :string, default: nil
+ attr :kind, :atom, values: [:info, :error], doc: "used for styling and flash lookup"
+ attr :autoshow, :boolean, default: true, doc: "whether to auto show the flash on mount"
+ attr :close, :boolean, default: true, doc: "whether the flash can be closed"
+ attr :rest, :global, doc: "the arbitrary HTML attributes to add to the flash container"
+
+ slot :inner_block, doc: "the optional inner block that renders the flash message"
+
+ def flash(assigns) do
+ ~H"""
+
hide("##{@id}")}
+ role="alert"
+ class={[
+ "fixed hidden top-2 right-2 w-80 sm:w-96 z-50 rounded-lg p-3 shadow-md shadow-zinc-900/5 ring-1",
+ @kind == :info && "bg-emerald-50 text-emerald-800 ring-emerald-500 fill-cyan-900",
+ @kind == :error && "bg-rose-50 p-3 text-rose-900 shadow-md ring-rose-500 fill-rose-900"
+ ]}
+ {@rest}
+ >
+
+ <.icon :if={@kind == :info} name="hero-information-circle-mini" class="w-4 h-4" />
+ <.icon :if={@kind == :error} name="hero-exclamation-circle-mini" class="w-4 h-4" />
+ <%= @title %>
+
+
<%= msg %>
+
+ <.icon name="hero-x-mark-solid" class="w-5 h-5 opacity-40 group-hover:opacity-70" />
+
+
+ """
+ end
+
+ @doc """
+ Shows the flash group with standard titles and content.
+
+ ## Examples
+
+ <.flash_group flash={@flash} />
+ """
+ attr :flash, :map, required: true, doc: "the map of flash messages"
+
+ def flash_group(assigns) do
+ ~H"""
+ <.flash kind={:info} title="Success!" flash={@flash} />
+ <.flash kind={:error} title="Error!" flash={@flash} />
+ <.flash
+ id="disconnected"
+ kind={:error}
+ title="We can't find the internet"
+ close={false}
+ autoshow={false}
+ phx-disconnected={show("#disconnected")}
+ phx-connected={hide("#disconnected")}
+ >
+ Attempting to reconnect <.icon name="hero-arrow-path" class="ml-1 w-3 h-3 animate-spin" />
+
+ """
+ end
+
+ @doc """
+ Renders a simple form.
+
+ ## Examples
+
+ <.simple_form for={@form} phx-change="validate" phx-submit="save">
+ <.input field={@form[:email]} label="Email"/>
+ <.input field={@form[:username]} label="Username" />
+ <:actions>
+ <.button>Save
+
+
+ """
+ attr :for, :any, required: true, doc: "the datastructure for the form"
+ attr :as, :any, default: nil, doc: "the server side parameter to collect all input under"
+
+ attr :rest, :global,
+ include: ~w(autocomplete name rel action enctype method novalidate target),
+ doc: "the arbitrary HTML attributes to apply to the form tag"
+
+ slot :inner_block, required: true
+ slot :actions, doc: "the slot for form actions, such as a submit button"
+
+ def simple_form(assigns) do
+ ~H"""
+ <.form :let={f} for={@for} as={@as} {@rest}>
+
+ <%= render_slot(@inner_block, f) %>
+
+ <%= render_slot(action, f) %>
+
+
+
+ """
+ end
+
+ @doc """
+ Renders a button.
+
+ ## Examples
+
+ <.button>Send!
+ <.button phx-click="go" class="ml-2">Send!
+ """
+ attr :type, :string, default: nil
+ attr :class, :string, default: nil
+ attr :rest, :global, include: ~w(disabled form name value)
+
+ slot :inner_block, required: true
+
+ def button(assigns) do
+ ~H"""
+
+ <%= render_slot(@inner_block) %>
+
+ """
+ end
+
+ @doc """
+ Renders an input with label and error messages.
+
+ A `%Phoenix.HTML.Form{}` and field name may be passed to the input
+ to build input names and error messages, or all the attributes and
+ errors may be passed explicitly.
+
+ ## Examples
+
+ <.input field={@form[:email]} type="email" />
+ <.input name="my-input" errors={["oh no!"]} />
+ """
+ attr :id, :any, default: nil
+ attr :name, :any
+ attr :label, :string, default: nil
+ attr :value, :any
+
+ attr :type, :string,
+ default: "text",
+ values: ~w(checkbox color date datetime-local email file hidden month number password
+ range radio search select tel text textarea time url week)
+
+ attr :field, Phoenix.HTML.FormField,
+ doc: "a form field struct retrieved from the form, for example: @form[:email]"
+
+ attr :errors, :list, default: []
+ attr :checked, :boolean, doc: "the checked flag for checkbox inputs"
+ attr :prompt, :string, default: nil, doc: "the prompt for select inputs"
+ attr :options, :list, doc: "the options to pass to Phoenix.HTML.Form.options_for_select/2"
+ attr :multiple, :boolean, default: false, doc: "the multiple flag for select inputs"
+ attr :rest, :global, include: ~w(autocomplete cols disabled form max maxlength min minlength
+ pattern placeholder readonly required rows size step)
+ slot :inner_block
+
+ def input(%{field: %Phoenix.HTML.FormField{} = field} = assigns) do
+ assigns
+ |> assign(field: nil, id: assigns.id || field.id)
+ |> assign(:errors, Enum.map(field.errors, &translate_error(&1)))
+ |> assign_new(:name, fn -> if assigns.multiple, do: field.name <> "[]", else: field.name end)
+ |> assign_new(:value, fn -> field.value end)
+ |> input()
+ end
+
+ def input(%{type: "checkbox", value: value} = assigns) do
+ assigns =
+ assign_new(assigns, :checked, fn -> Phoenix.HTML.Form.normalize_value("checkbox", value) end)
+
+ ~H"""
+
+
+
+
+ <%= @label %>
+
+ <.error :for={msg <- @errors}><%= msg %>
+
+ """
+ end
+
+ def input(%{type: "select"} = assigns) do
+ ~H"""
+
+ <.label for={@id}><%= @label %>
+
+ <%= @prompt %>
+ <%= Phoenix.HTML.Form.options_for_select(@options, @value) %>
+
+ <.error :for={msg <- @errors}><%= msg %>
+
+ """
+ end
+
+ def input(%{type: "textarea"} = assigns) do
+ ~H"""
+
+ <.label for={@id}><%= @label %>
+
+ <.error :for={msg <- @errors}><%= msg %>
+
+ """
+ end
+
+ def input(assigns) do
+ ~H"""
+
+ <.label for={@id}><%= @label %>
+
+ <.error :for={msg <- @errors}><%= msg %>
+
+ """
+ end
+
+ @doc """
+ Renders a label.
+ """
+ attr :for, :string, default: nil
+ slot :inner_block, required: true
+
+ def label(assigns) do
+ ~H"""
+
+ <%= render_slot(@inner_block) %>
+
+ """
+ end
+
+ @doc """
+ Generates a generic error message.
+ """
+ slot :inner_block, required: true
+
+ def error(assigns) do
+ ~H"""
+
+ <.icon name="hero-exclamation-circle-mini" class="mt-0.5 w-5 h-5 flex-none" />
+ <%= render_slot(@inner_block) %>
+
+ """
+ end
+
+ @doc """
+ Renders a header with title.
+ """
+ attr :class, :string, default: nil
+
+ slot :inner_block, required: true
+ slot :subtitle
+ slot :actions
+
+ def header(assigns) do
+ ~H"""
+
+ """
+ end
+
+ @doc ~S"""
+ Renders a table with generic styling.
+
+ ## Examples
+
+ <.table id="users" rows={@users}>
+ <:col :let={user} label="id"><%= user.id %>
+ <:col :let={user} label="username"><%= user.username %>
+
+ """
+ attr :id, :string, required: true
+ attr :rows, :list, required: true
+ attr :row_id, :any, default: nil, doc: "the function for generating the row id"
+ attr :row_click, :any, default: nil, doc: "the function for handling phx-click on each row"
+
+ attr :row_item, :any,
+ default: &Function.identity/1,
+ doc: "the function for mapping each row before calling the :col and :action slots"
+
+ slot :col, required: true do
+ attr :label, :string
+ end
+
+ slot :action, doc: "the slot for showing user actions in the last table column"
+
+ def table(assigns) do
+ assigns =
+ with %{rows: %Phoenix.LiveView.LiveStream{}} <- assigns do
+ assign(assigns, row_id: assigns.row_id || fn {id, _item} -> id end)
+ end
+
+ ~H"""
+
+
+
+
+ <%= col[:label] %>
+ <%= gettext("Actions") %>
+
+
+
+
+
+
+
+
+ <%= render_slot(col, @row_item.(row)) %>
+
+
+
+
+
+
+
+ <%= render_slot(action, @row_item.(row)) %>
+
+
+
+
+
+
+
+ """
+ end
+
+ @doc """
+ Renders a data list.
+
+ ## Examples
+
+ <.list>
+ <:item title="Title"><%= @post.title %>
+ <:item title="Views"><%= @post.views %>
+
+ """
+ slot :item, required: true do
+ attr :title, :string, required: true
+ end
+
+ def list(assigns) do
+ ~H"""
+
+
+
+
<%= item.title %>
+ <%= render_slot(item) %>
+
+
+
+ """
+ end
+
+ @doc """
+ Renders a back navigation link.
+
+ ## Examples
+
+ <.back navigate={~p"/posts"}>Back to posts
+ """
+ attr :navigate, :any, required: true
+ slot :inner_block, required: true
+
+ def back(assigns) do
+ ~H"""
+
+ <.link
+ navigate={@navigate}
+ class="text-sm font-semibold leading-6 text-zinc-900 hover:text-zinc-700"
+ >
+ <.icon name="hero-arrow-left-solid" class="w-3 h-3" />
+ <%= render_slot(@inner_block) %>
+
+
+ """
+ end
+
+ @doc """
+ Renders a [Hero Icon](https://heroicons.com).
+
+ Hero icons come in three styles ā outline, solid, and mini.
+ By default, the outline style is used, but solid an mini may
+ be applied by using the `-solid` and `-mini` suffix.
+
+ You can customize the size and colors of the icons by setting
+ width, height, and background color classes.
+
+ Icons are extracted from your `priv/hero_icons` directory and bundled
+ within your compiled app.css by the plugin in your `assets/tailwind.config.js`.
+
+ ## Examples
+
+ <.icon name="hero-cake" />
+ <.icon name="hero-cake-solid" />
+ <.icon name="hero-cake-mini" />
+ <.icon name="hero-bolt" class="bg-blue-500 w-10 h-10" />
+ """
+ attr :name, :string, required: true
+ attr :class, :string, default: nil
+
+ def icon(%{name: "hero-" <> _} = assigns) do
+ ~H"""
+
+ """
+ end
+
+ ## JS Commands
+
+ def show(js \\ %JS{}, selector) do
+ JS.show(js,
+ to: selector,
+ transition:
+ {"transition-all transform ease-out duration-300",
+ "opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95",
+ "opacity-100 translate-y-0 sm:scale-100"}
+ )
+ end
+
+ def hide(js \\ %JS{}, selector) do
+ JS.hide(js,
+ to: selector,
+ time: 200,
+ transition:
+ {"transition-all transform ease-in duration-200",
+ "opacity-100 translate-y-0 sm:scale-100",
+ "opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95"}
+ )
+ end
+
+ def show_modal(js \\ %JS{}, id) when is_binary(id) do
+ js
+ |> JS.show(to: "##{id}")
+ |> JS.show(
+ to: "##{id}-bg",
+ transition: {"transition-all transform ease-out duration-300", "opacity-0", "opacity-100"}
+ )
+ |> show("##{id}-container")
+ |> JS.add_class("overflow-hidden", to: "body")
+ |> JS.focus_first(to: "##{id}-content")
+ end
+
+ def hide_modal(js \\ %JS{}, id) do
+ js
+ |> JS.hide(
+ to: "##{id}-bg",
+ transition: {"transition-all transform ease-in duration-200", "opacity-100", "opacity-0"}
+ )
+ |> hide("##{id}-container")
+ |> JS.hide(to: "##{id}", transition: {"block", "block", "hidden"})
+ |> JS.remove_class("overflow-hidden", to: "body")
+ |> JS.pop_focus()
+ end
+
+ @doc """
+ Translates an error message using gettext.
+ """
+ def translate_error({msg, opts}) do
+ # When using gettext, we typically pass the strings we want
+ # to translate as a static argument:
+ #
+ # # Translate "is invalid" in the "errors" domain
+ # dgettext("errors", "is invalid")
+ #
+ # # Translate the number of files with plural rules
+ # dngettext("errors", "1 file", "%{count} files", count)
+ #
+ # Because the error messages we show in our forms and APIs
+ # are defined inside Ecto, we need to translate them dynamically.
+ # This requires us to call the Gettext module passing our gettext
+ # backend as first argument.
+ #
+ # Note we use the "errors" domain, which means translations
+ # should be written to the errors.po file. The :count option is
+ # set by Ecto and indicates we should also apply plural rules.
+ if count = opts[:count] do
+ Gettext.dngettext(CounterWeb.Gettext, "errors", msg, msg, count, opts)
+ else
+ Gettext.dgettext(CounterWeb.Gettext, "errors", msg, opts)
+ end
+ end
+
+ @doc """
+ Translates the errors for a field from a keyword list of errors.
+ """
+ def translate_errors(errors, field) when is_list(errors) do
+ for {^field, {msg, opts}} <- errors, do: translate_error({msg, opts})
+ end
+end
diff --git a/phoenix-1.7/counter/lib/counter_web/components/layouts.ex b/phoenix-1.7/counter/lib/counter_web/components/layouts.ex
new file mode 100644
index 000000000..628edbd75
--- /dev/null
+++ b/phoenix-1.7/counter/lib/counter_web/components/layouts.ex
@@ -0,0 +1,5 @@
+defmodule CounterWeb.Layouts do
+ use CounterWeb, :html
+
+ embed_templates "layouts/*"
+end
diff --git a/phoenix-1.7/counter/lib/counter_web/components/layouts/app.html.heex b/phoenix-1.7/counter/lib/counter_web/components/layouts/app.html.heex
new file mode 100644
index 000000000..605db46c4
--- /dev/null
+++ b/phoenix-1.7/counter/lib/counter_web/components/layouts/app.html.heex
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+ v<%= Application.spec(:phoenix, :vsn) %>
+
+
+
+
+
+
+
+ <.flash_group flash={@flash} />
+ <%= @inner_content %>
+
+
diff --git a/phoenix-1.7/counter/lib/counter_web/components/layouts/root.html.heex b/phoenix-1.7/counter/lib/counter_web/components/layouts/root.html.heex
new file mode 100644
index 000000000..b27100f95
--- /dev/null
+++ b/phoenix-1.7/counter/lib/counter_web/components/layouts/root.html.heex
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+ <.live_title suffix=" Ā· Phoenix Framework">
+ <%= assigns[:page_title] || "Counter" %>
+
+
+
+
+
+ <%= @inner_content %>
+
+
diff --git a/phoenix-1.7/counter/lib/counter_web/controllers/error_html.ex b/phoenix-1.7/counter/lib/counter_web/controllers/error_html.ex
new file mode 100644
index 000000000..e4896ad48
--- /dev/null
+++ b/phoenix-1.7/counter/lib/counter_web/controllers/error_html.ex
@@ -0,0 +1,19 @@
+defmodule CounterWeb.ErrorHTML do
+ use CounterWeb, :html
+
+ # If you want to customize your error pages,
+ # uncomment the embed_templates/1 call below
+ # and add pages to the error directory:
+ #
+ # * lib/counter_web/controllers/error_html/404.html.heex
+ # * lib/counter_web/controllers/error_html/500.html.heex
+ #
+ # embed_templates "error_html/*"
+
+ # The default is to render a plain text page based on
+ # the template name. For example, "404.html" becomes
+ # "Not Found".
+ def render(template, _assigns) do
+ Phoenix.Controller.status_message_from_template(template)
+ end
+end
diff --git a/phoenix-1.7/counter/lib/counter_web/controllers/error_json.ex b/phoenix-1.7/counter/lib/counter_web/controllers/error_json.ex
new file mode 100644
index 000000000..5787eae77
--- /dev/null
+++ b/phoenix-1.7/counter/lib/counter_web/controllers/error_json.ex
@@ -0,0 +1,15 @@
+defmodule CounterWeb.ErrorJSON do
+ # If you want to customize a particular status code,
+ # you may add your own clauses, such as:
+ #
+ # def render("500.json", _assigns) do
+ # %{errors: %{detail: "Internal Server Error"}}
+ # end
+
+ # By default, Phoenix returns the status message from
+ # the template name. For example, "404.json" becomes
+ # "Not Found".
+ def render(template, _assigns) do
+ %{errors: %{detail: Phoenix.Controller.status_message_from_template(template)}}
+ end
+end
diff --git a/phoenix-1.7/counter/lib/counter_web/controllers/page_controller.ex b/phoenix-1.7/counter/lib/counter_web/controllers/page_controller.ex
new file mode 100644
index 000000000..ac906fc1b
--- /dev/null
+++ b/phoenix-1.7/counter/lib/counter_web/controllers/page_controller.ex
@@ -0,0 +1,9 @@
+defmodule CounterWeb.PageController do
+ use CounterWeb, :controller
+
+ def home(conn, _params) do
+ # The home page is often custom made,
+ # so skip the default app layout.
+ render(conn, :home, layout: false)
+ end
+end
diff --git a/phoenix-1.7/counter/lib/counter_web/controllers/page_html.ex b/phoenix-1.7/counter/lib/counter_web/controllers/page_html.ex
new file mode 100644
index 000000000..9437ae235
--- /dev/null
+++ b/phoenix-1.7/counter/lib/counter_web/controllers/page_html.ex
@@ -0,0 +1,5 @@
+defmodule CounterWeb.PageHTML do
+ use CounterWeb, :html
+
+ embed_templates "page_html/*"
+end
diff --git a/phoenix-1.7/counter/lib/counter_web/controllers/page_html/home.html.heex b/phoenix-1.7/counter/lib/counter_web/controllers/page_html/home.html.heex
new file mode 100644
index 000000000..975e83a69
--- /dev/null
+++ b/phoenix-1.7/counter/lib/counter_web/controllers/page_html/home.html.heex
@@ -0,0 +1,237 @@
+<.flash_group flash={@flash} />
+
+
+
+
+
+
+
+ Phoenix Framework
+
+ v<%= Application.spec(:phoenix, :vsn) %>
+
+
+
+ Peace of mind from prototype to production.
+
+
+ Build rich, interactive web applications quickly, with less code and fewer moving parts. Join our growing community of developers using Phoenix to craft APIs, HTML5 apps and more, for fun or at scale.
+
+
+
+
diff --git a/phoenix-1.7/counter/lib/counter_web/endpoint.ex b/phoenix-1.7/counter/lib/counter_web/endpoint.ex
new file mode 100644
index 000000000..c32465417
--- /dev/null
+++ b/phoenix-1.7/counter/lib/counter_web/endpoint.ex
@@ -0,0 +1,50 @@
+defmodule CounterWeb.Endpoint do
+ use Phoenix.Endpoint, otp_app: :counter
+
+ # The session will be stored in the cookie and signed,
+ # this means its contents can be read but not tampered with.
+ # Set :encryption_salt if you would also like to encrypt it.
+ @session_options [
+ store: :cookie,
+ key: "_counter_key",
+ signing_salt: "ijONbWFg",
+ same_site: "Lax"
+ ]
+
+ socket "/live", Phoenix.LiveView.Socket, websocket: [connect_info: [session: @session_options]]
+
+ # Serve at "/" the static files from "priv/static" directory.
+ #
+ # You should set gzip to true if you are running phx.digest
+ # when deploying your static files in production.
+ plug Plug.Static,
+ at: "/",
+ from: :counter,
+ gzip: false,
+ only: CounterWeb.static_paths()
+
+ # Code reloading can be explicitly enabled under the
+ # :code_reloader configuration of your endpoint.
+ if code_reloading? do
+ socket "/phoenix/live_reload/socket", Phoenix.LiveReloader.Socket
+ plug Phoenix.LiveReloader
+ plug Phoenix.CodeReloader
+ end
+
+ plug Phoenix.LiveDashboard.RequestLogger,
+ param_key: "request_logger",
+ cookie_key: "request_logger"
+
+ plug Plug.RequestId
+ plug Plug.Telemetry, event_prefix: [:phoenix, :endpoint]
+
+ plug Plug.Parsers,
+ parsers: [:urlencoded, :multipart, :json],
+ pass: ["*/*"],
+ json_decoder: Phoenix.json_library()
+
+ plug Plug.MethodOverride
+ plug Plug.Head
+ plug Plug.Session, @session_options
+ plug CounterWeb.Router
+end
diff --git a/phoenix-1.7/counter/lib/counter_web/gettext.ex b/phoenix-1.7/counter/lib/counter_web/gettext.ex
new file mode 100644
index 000000000..041b3cf02
--- /dev/null
+++ b/phoenix-1.7/counter/lib/counter_web/gettext.ex
@@ -0,0 +1,24 @@
+defmodule CounterWeb.Gettext do
+ @moduledoc """
+ A module providing Internationalization with a gettext-based API.
+
+ By using [Gettext](https://hexdocs.pm/gettext),
+ your module gains a set of macros for translations, for example:
+
+ import CounterWeb.Gettext
+
+ # Simple translation
+ gettext("Here is the string to translate")
+
+ # Plural translation
+ ngettext("Here is the string to translate",
+ "Here are the strings to translate",
+ 3)
+
+ # Domain-based translation
+ dgettext("errors", "Here is the error message to translate")
+
+ See the [Gettext Docs](https://hexdocs.pm/gettext) for detailed usage.
+ """
+ use Gettext, otp_app: :counter
+end
diff --git a/phoenix-1.7/counter/lib/counter_web/router.ex b/phoenix-1.7/counter/lib/counter_web/router.ex
new file mode 100644
index 000000000..1f19ed599
--- /dev/null
+++ b/phoenix-1.7/counter/lib/counter_web/router.ex
@@ -0,0 +1,44 @@
+defmodule CounterWeb.Router do
+ use CounterWeb, :router
+
+ pipeline :browser do
+ plug :accepts, ["html"]
+ plug :fetch_session
+ plug :fetch_live_flash
+ plug :put_root_layout, {CounterWeb.Layouts, :root}
+ plug :protect_from_forgery
+ plug :put_secure_browser_headers
+ end
+
+ pipeline :api do
+ plug :accepts, ["json"]
+ end
+
+ scope "/", CounterWeb do
+ pipe_through :browser
+
+ get "/", PageController, :home
+ end
+
+ # Other scopes may use custom stacks.
+ # scope "/api", CounterWeb do
+ # pipe_through :api
+ # end
+
+ # Enable LiveDashboard and Swoosh mailbox preview in development
+ if Application.compile_env(:counter, :dev_routes) do
+ # If you want to use the LiveDashboard in production, you should put
+ # it behind authentication and allow only admins to access it.
+ # If your application does not have an admins-only section yet,
+ # you can use Plug.BasicAuth to set up some basic authentication
+ # as long as you are also using SSL (which you should anyway).
+ import Phoenix.LiveDashboard.Router
+
+ scope "/dev" do
+ pipe_through :browser
+
+ live_dashboard "/dashboard", metrics: CounterWeb.Telemetry
+ forward "/mailbox", Plug.Swoosh.MailboxPreview
+ end
+ end
+end
diff --git a/phoenix-1.7/counter/lib/counter_web/telemetry.ex b/phoenix-1.7/counter/lib/counter_web/telemetry.ex
new file mode 100644
index 000000000..637b024d7
--- /dev/null
+++ b/phoenix-1.7/counter/lib/counter_web/telemetry.ex
@@ -0,0 +1,69 @@
+defmodule CounterWeb.Telemetry do
+ use Supervisor
+ import Telemetry.Metrics
+
+ def start_link(arg) do
+ Supervisor.start_link(__MODULE__, arg, name: __MODULE__)
+ end
+
+ @impl true
+ def init(_arg) do
+ children = [
+ # Telemetry poller will execute the given period measurements
+ # every 10_000ms. Learn more here: https://hexdocs.pm/telemetry_metrics
+ {:telemetry_poller, measurements: periodic_measurements(), period: 10_000}
+ # Add reporters as children of your supervision tree.
+ # {Telemetry.Metrics.ConsoleReporter, metrics: metrics()}
+ ]
+
+ Supervisor.init(children, strategy: :one_for_one)
+ end
+
+ def metrics do
+ [
+ # Phoenix Metrics
+ summary("phoenix.endpoint.start.system_time",
+ unit: {:native, :millisecond}
+ ),
+ summary("phoenix.endpoint.stop.duration",
+ unit: {:native, :millisecond}
+ ),
+ summary("phoenix.router_dispatch.start.system_time",
+ tags: [:route],
+ unit: {:native, :millisecond}
+ ),
+ summary("phoenix.router_dispatch.exception.duration",
+ tags: [:route],
+ unit: {:native, :millisecond}
+ ),
+ summary("phoenix.router_dispatch.stop.duration",
+ tags: [:route],
+ unit: {:native, :millisecond}
+ ),
+ summary("phoenix.socket_connected.duration",
+ unit: {:native, :millisecond}
+ ),
+ summary("phoenix.channel_join.duration",
+ unit: {:native, :millisecond}
+ ),
+ summary("phoenix.channel_handled_in.duration",
+ tags: [:event],
+ unit: {:native, :millisecond}
+ ),
+
+ # VM Metrics
+ summary("vm.memory.total", unit: {:byte, :kilobyte}),
+ summary("vm.total_run_queue_lengths.total"),
+ summary("vm.total_run_queue_lengths.cpu"),
+ summary("vm.total_run_queue_lengths.io")
+ ]
+ end
+
+ defp periodic_measurements do
+ [
+ # A module, function and arguments to be invoked periodically.
+ # This function must call :telemetry.execute/3 and a metric must be added above.
+ # {CounterWeb, :count_users, []}
+ ]
+ end
+end
diff --git a/phoenix-1.7/counter/mix.exs b/phoenix-1.7/counter/mix.exs
new file mode 100644
index 000000000..f11bb0487
--- /dev/null
+++ b/phoenix-1.7/counter/mix.exs
@@ -0,0 +1,67 @@
+defmodule Counter.MixProject do
+ use Mix.Project
+
+ def project do
+ [
+ app: :counter,
+ version: "0.1.0",
+ elixir: "~> 1.14",
+ elixirc_paths: elixirc_paths(Mix.env()),
+ start_permanent: Mix.env() == :prod,
+ aliases: aliases(),
+ deps: deps()
+ ]
+ end
+
+ # Configuration for the OTP application.
+ #
+ # Type `mix help compile.app` for more information.
+ def application do
+ [
+ mod: {Counter.Application, []},
+ extra_applications: [:logger, :runtime_tools]
+ ]
+ end
+
+ # Specifies which paths to compile per environment.
+ defp elixirc_paths(:test), do: ["lib", "test/support"]
+ defp elixirc_paths(_), do: ["lib"]
+
+ # Specifies your project dependencies.
+ #
+ # Type `mix help deps` for examples and options.
+ defp deps do
+ [
+ {:phoenix, "~> 1.7.1"},
+ {:phoenix_html, "~> 3.3"},
+ {:phoenix_live_reload, "~> 1.2", only: :dev},
+ {:phoenix_live_view, "~> 0.18.16"},
+ {:floki, ">= 0.30.0", only: :test},
+ {:phoenix_live_dashboard, "~> 0.7.2"},
+ {:esbuild, "~> 0.5", runtime: Mix.env() == :dev},
+ {:tailwind, "~> 0.1.8", runtime: Mix.env() == :dev},
+ {:swoosh, "~> 1.3"},
+ {:finch, "~> 0.13"},
+ {:telemetry_metrics, "~> 0.6"},
+ {:telemetry_poller, "~> 1.0"},
+ {:gettext, "~> 0.20"},
+ {:jason, "~> 1.2"},
+ {:plug_cowboy, "~> 2.5"}
+ ]
+ end
+
+ # Aliases are shortcuts or tasks specific to the current project.
+ # For example, to install project dependencies and perform other setup tasks, run:
+ #
+ # $ mix setup
+ #
+ # See the documentation for `Mix` for more info on aliases.
+ defp aliases do
+ [
+ setup: ["deps.get", "assets.setup", "assets.build"],
+ "assets.setup": ["tailwind.install --if-missing", "esbuild.install --if-missing"],
+ "assets.build": ["tailwind default", "esbuild default"],
+ "assets.deploy": ["tailwind default --minify", "esbuild default --minify", "phx.digest"]
+ ]
+ end
+end
diff --git a/phoenix-1.7/counter/mix.lock b/phoenix-1.7/counter/mix.lock
new file mode 100644
index 000000000..8a6667703
--- /dev/null
+++ b/phoenix-1.7/counter/mix.lock
@@ -0,0 +1,36 @@
+%{
+ "castore": {:hex, :castore, "0.1.22", "4127549e411bedd012ca3a308dede574f43819fe9394254ca55ab4895abfa1a2", [:mix], [], "hexpm", "c17576df47eb5aa1ee40cc4134316a99f5cad3e215d5c77b8dd3cfef12a22cac"},
+ "cowboy": {:hex, :cowboy, "2.9.0", "865dd8b6607e14cf03282e10e934023a1bd8be6f6bacf921a7e2a96d800cd452", [:make, :rebar3], [{:cowlib, "2.11.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "2c729f934b4e1aa149aff882f57c6372c15399a20d54f65c8d67bef583021bde"},
+ "cowboy_telemetry": {:hex, :cowboy_telemetry, "0.4.0", "f239f68b588efa7707abce16a84d0d2acf3a0f50571f8bb7f56a15865aae820c", [:rebar3], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7d98bac1ee4565d31b62d59f8823dfd8356a169e7fcbb83831b8a5397404c9de"},
+ "cowlib": {:hex, :cowlib, "2.11.0", "0b9ff9c346629256c42ebe1eeb769a83c6cb771a6ee5960bd110ab0b9b872063", [:make, :rebar3], [], "hexpm", "2b3e9da0b21c4565751a6d4901c20d1b4cc25cbb7fd50d91d2ab6dd287bc86a9"},
+ "esbuild": {:hex, :esbuild, "0.6.1", "a774bfa7b4512a1211bf15880b462be12a4c48ed753a170c68c63b2c95888150", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}], "hexpm", "569f7409fb5a932211573fc20e2a930a0d5cf3377c5b4f6506c651b1783a1678"},
+ "expo": {:hex, :expo, "0.4.0", "bbe4bf455e2eb2ebd2f1e7d83530ce50fb9990eb88fc47855c515bfdf1c6626f", [:mix], [], "hexpm", "a8ed1683ec8b7c7fa53fd7a41b2c6935f539168a6bb0616d7fd6b58a36f3abf2"},
+ "file_system": {:hex, :file_system, "0.2.10", "fb082005a9cd1711c05b5248710f8826b02d7d1784e7c3451f9c1231d4fc162d", [:mix], [], "hexpm", "41195edbfb562a593726eda3b3e8b103a309b733ad25f3d642ba49696bf715dc"},
+ "finch": {:hex, :finch, "0.14.0", "619bfdee18fc135190bf590356c4bf5d5f71f916adb12aec94caa3fa9267a4bc", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: false]}, {:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.3", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.4", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 0.2.6", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "5459acaf18c4fdb47a8c22fb3baff5d8173106217c8e56c5ba0b93e66501a8dd"},
+ "floki": {:hex, :floki, "0.34.2", "5fad07ef153b3b8ec110b6b155ec3780c4b2c4906297d0b4be1a7162d04a7e02", [:mix], [], "hexpm", "26b9d50f0f01796bc6be611ca815c5e0de034d2128e39cc9702eee6b66a4d1c8"},
+ "gettext": {:hex, :gettext, "0.22.1", "e7942988383c3d9eed4bdc22fc63e712b655ae94a672a27e4900e3d4a2c43581", [:mix], [{:expo, "~> 0.4.0", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "ad105b8dab668ee3f90c0d3d94ba75e9aead27a62495c101d94f2657a190ac5d"},
+ "hpax": {:hex, :hpax, "0.1.2", "09a75600d9d8bbd064cdd741f21fc06fc1f4cf3d0fcc335e5aa19be1a7235c84", [:mix], [], "hexpm", "2c87843d5a23f5f16748ebe77969880e29809580efdaccd615cd3bed628a8c13"},
+ "jason": {:hex, :jason, "1.4.0", "e855647bc964a44e2f67df589ccf49105ae039d4179db7f6271dfd3843dc27e6", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "79a3791085b2a0f743ca04cec0f7be26443738779d09302e01318f97bdb82121"},
+ "mime": {:hex, :mime, "2.0.3", "3676436d3d1f7b81b5a2d2bd8405f412c677558c81b1c92be58c00562bb59095", [:mix], [], "hexpm", "27a30bf0db44d25eecba73755acf4068cbfe26a4372f9eb3e4ea3a45956bff6b"},
+ "mint": {:hex, :mint, "1.5.1", "8db5239e56738552d85af398798c80648db0e90f343c8469f6c6d8898944fb6f", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "4a63e1e76a7c3956abd2c72f370a0d0aecddc3976dea5c27eccbecfa5e7d5b1e"},
+ "nimble_options": {:hex, :nimble_options, "0.5.2", "42703307b924880f8c08d97719da7472673391905f528259915782bb346e0a1b", [:mix], [], "hexpm", "4da7f904b915fd71db549bcdc25f8d56f378ef7ae07dc1d372cbe72ba950dce0"},
+ "nimble_pool": {:hex, :nimble_pool, "0.2.6", "91f2f4c357da4c4a0a548286c84a3a28004f68f05609b4534526871a22053cde", [:mix], [], "hexpm", "1c715055095d3f2705c4e236c18b618420a35490da94149ff8b580a2144f653f"},
+ "phoenix": {:hex, :phoenix, "1.7.1", "a029bde19d9c3b559e5c3d06c78b76e81396bedd456a6acedb42f9c7b2e535a9", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.4", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "ea9d4a85c3592e37efa07d0dc013254fda445885facaefddcbf646375c116457"},
+ "phoenix_html": {:hex, :phoenix_html, "3.3.1", "4788757e804a30baac6b3fc9695bf5562465dd3f1da8eb8460ad5b404d9a2178", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "bed1906edd4906a15fd7b412b85b05e521e1f67c9a85418c55999277e553d0d3"},
+ "phoenix_live_dashboard": {:hex, :phoenix_live_dashboard, "0.7.2", "97cc4ff2dba1ebe504db72cb45098cb8e91f11160528b980bd282cc45c73b29c", [:mix], [{:ecto, "~> 3.6.2 or ~> 3.7", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_mysql_extras, "~> 0.5", [hex: :ecto_mysql_extras, repo: "hexpm", optional: true]}, {:ecto_psql_extras, "~> 0.7", [hex: :ecto_psql_extras, repo: "hexpm", optional: true]}, {:mime, "~> 1.6 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.18.3", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6 or ~> 1.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "0e5fdf063c7a3b620c566a30fcf68b7ee02e5e46fe48ee46a6ec3ba382dc05b7"},
+ "phoenix_live_reload": {:hex, :phoenix_live_reload, "1.4.1", "2aff698f5e47369decde4357ba91fc9c37c6487a512b41732818f2204a8ef1d3", [:mix], [{:file_system, "~> 0.2.1 or ~> 0.3", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "9bffb834e7ddf08467fe54ae58b5785507aaba6255568ae22b4d46e2bb3615ab"},
+ "phoenix_live_view": {:hex, :phoenix_live_view, "0.18.17", "74938b02f3c531bed3f87fe1ea39af6b5b2d26ab1405e77e76b8ef5df9ffa8a1", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.15 or ~> 1.7.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.3", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "f4b5710e19a29b8dc93b7af4bab4739c067a3cb759af01ffc3057165453dce38"},
+ "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.1", "ba04e489ef03763bf28a17eb2eaddc2c20c6d217e2150a61e3298b0f4c2012b5", [:mix], [], "hexpm", "81367c6d1eea5878ad726be80808eb5a787a23dee699f96e72b1109c57cdd8d9"},
+ "phoenix_template": {:hex, :phoenix_template, "1.0.1", "85f79e3ad1b0180abb43f9725973e3b8c2c3354a87245f91431eec60553ed3ef", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "157dc078f6226334c91cb32c1865bf3911686f8bcd6bcff86736f6253e6993ee"},
+ "plug": {:hex, :plug, "1.14.0", "ba4f558468f69cbd9f6b356d25443d0b796fbdc887e03fa89001384a9cac638f", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "bf020432c7d4feb7b3af16a0c2701455cbbbb95e5b6866132cb09eb0c29adc14"},
+ "plug_cowboy": {:hex, :plug_cowboy, "2.6.0", "d1cf12ff96a1ca4f52207c5271a6c351a4733f413803488d75b70ccf44aebec2", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "073cf20b753ce6682ed72905cd62a2d4bd9bad1bf9f7feb02a1b8e525bd94fa6"},
+ "plug_crypto": {:hex, :plug_crypto, "1.2.5", "918772575e48e81e455818229bf719d4ab4181fcbf7f85b68a35620f78d89ced", [:mix], [], "hexpm", "26549a1d6345e2172eb1c233866756ae44a9609bd33ee6f99147ab3fd87fd842"},
+ "ranch": {:hex, :ranch, "1.8.0", "8c7a100a139fd57f17327b6413e4167ac559fbc04ca7448e9be9057311597a1d", [:make, :rebar3], [], "hexpm", "49fbcfd3682fab1f5d109351b61257676da1a2fdbe295904176d5e521a2ddfe5"},
+ "swoosh": {:hex, :swoosh, "1.9.1", "0a5d7bf9954eb41d7e55525bc0940379982b090abbaef67cd8e1fd2ed7f8ca1a", [:mix], [{:cowboy, "~> 1.1 or ~> 2.4", [hex: :cowboy, repo: "hexpm", optional: true]}, {:ex_aws, "~> 2.1", [hex: :ex_aws, repo: "hexpm", optional: true]}, {:finch, "~> 0.6", [hex: :finch, repo: "hexpm", optional: true]}, {:gen_smtp, "~> 0.13 or ~> 1.0", [hex: :gen_smtp, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mail, "~> 0.2", [hex: :mail, repo: "hexpm", optional: true]}, {:mime, "~> 1.1 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_cowboy, ">= 1.0.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "76dffff3ffcab80f249d5937a592eaef7cc49ac6f4cdd27e622868326ed6371e"},
+ "tailwind": {:hex, :tailwind, "0.1.10", "21ed80ae1f411f747ee513470578acaaa1d0eb40170005350c5b0b6d07e2d624", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}], "hexpm", "e0fc474dfa8ed7a4573851ac69c5fd3ca70fbb0a5bada574d1d657ebc6f2f1f1"},
+ "telemetry": {:hex, :telemetry, "1.2.1", "68fdfe8d8f05a8428483a97d7aab2f268aaff24b49e0f599faa091f1d4e7f61c", [:rebar3], [], "hexpm", "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5"},
+ "telemetry_metrics": {:hex, :telemetry_metrics, "0.6.1", "315d9163a1d4660aedc3fee73f33f1d355dcc76c5c3ab3d59e76e3edf80eef1f", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7be9e0871c41732c233be71e4be11b96e56177bf15dde64a8ac9ce72ac9834c6"},
+ "telemetry_poller": {:hex, :telemetry_poller, "1.0.0", "db91bb424e07f2bb6e73926fcafbfcbcb295f0193e0a00e825e589a0a47e8453", [:rebar3], [{:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "b3a24eafd66c3f42da30fc3ca7dda1e9d546c12250a2d60d7b81d264fbec4f6e"},
+ "websock": {:hex, :websock, "0.5.0", "f6bbce90226121d62a0715bca7c986c5e43de0ccc9475d79c55381d1796368cc", [:mix], [], "hexpm", "b51ac706df8a7a48a2c622ee02d09d68be8c40418698ffa909d73ae207eb5fb8"},
+ "websock_adapter": {:hex, :websock_adapter, "0.5.0", "cea35d8bbf1a6964e32d4b02ceb561dfb769c04f16d60d743885587e7d2ca55b", [:mix], [{:bandit, "~> 0.6", [hex: :bandit, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "16318b124effab8209b1eb7906c636374f623dc9511a8278ad09c083cea5bb83"},
+}
diff --git a/phoenix-1.7/counter/priv/gettext/en/LC_MESSAGES/errors.po b/phoenix-1.7/counter/priv/gettext/en/LC_MESSAGES/errors.po
new file mode 100644
index 000000000..cdec3a113
--- /dev/null
+++ b/phoenix-1.7/counter/priv/gettext/en/LC_MESSAGES/errors.po
@@ -0,0 +1,11 @@
+## `msgid`s in this file come from POT (.pot) files.
+##
+## Do not add, change, or remove `msgid`s manually here as
+## they're tied to the ones in the corresponding POT file
+## (with the same domain).
+##
+## Use `mix gettext.extract --merge` or `mix gettext.merge`
+## to merge POT files into PO files.
+msgid ""
+msgstr ""
+"Language: en\n"
diff --git a/phoenix-1.7/counter/priv/gettext/errors.pot b/phoenix-1.7/counter/priv/gettext/errors.pot
new file mode 100644
index 000000000..d6f47fa87
--- /dev/null
+++ b/phoenix-1.7/counter/priv/gettext/errors.pot
@@ -0,0 +1,10 @@
+## This is a PO Template file.
+##
+## `msgid`s here are often extracted from source code.
+## Add new translations manually only if they're dynamic
+## translations that can't be statically extracted.
+##
+## Run `mix gettext.extract` to bring this file up to
+## date. Leave `msgstr`s empty as changing them here has no
+## effect: edit them in PO (`.po`) files instead.
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/LICENSE.md b/phoenix-1.7/counter/priv/hero_icons/LICENSE.md
new file mode 100644
index 000000000..1ac3e409b
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/LICENSE.md
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 Refactoring UI Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/phoenix-1.7/counter/priv/hero_icons/UPGRADE.md b/phoenix-1.7/counter/priv/hero_icons/UPGRADE.md
new file mode 100644
index 000000000..7daa80e85
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/UPGRADE.md
@@ -0,0 +1,7 @@
+You are running heroicons v2.0.16. To upgrade in place, you can run the following command,
+where your `HERO_VSN` export is your desired version:
+
+ export HERO_VSN="2.0.16" ; \
+ curl -L -o optimized.zip "https://github.com/tailwindlabs/heroicons/archive/refs/tags/v${HERO_VSN}.zip" ; \
+ tar --strip-components=1 -xvf optimized.zip heroicons-${HERO_VSN}/optimized ; \
+ rm optimized.zip
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/academic-cap.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/academic-cap.svg
new file mode 100644
index 000000000..bb980e6a8
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/academic-cap.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/adjustments-horizontal.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/adjustments-horizontal.svg
new file mode 100644
index 000000000..13f925105
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/adjustments-horizontal.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/adjustments-vertical.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/adjustments-vertical.svg
new file mode 100644
index 000000000..6f75b6c00
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/adjustments-vertical.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/archive-box-arrow-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/archive-box-arrow-down.svg
new file mode 100644
index 000000000..5ccef9d53
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/archive-box-arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/archive-box-x-mark.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/archive-box-x-mark.svg
new file mode 100644
index 000000000..73acbef10
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/archive-box-x-mark.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/archive-box.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/archive-box.svg
new file mode 100644
index 000000000..2205ae8df
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/archive-box.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-down-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-down-circle.svg
new file mode 100644
index 000000000..bb21a8946
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-down-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-down-left.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-down-left.svg
new file mode 100644
index 000000000..f0c36246c
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-down-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-down-on-square-stack.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-down-on-square-stack.svg
new file mode 100644
index 000000000..d9c4db030
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-down-on-square-stack.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-down-on-square.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-down-on-square.svg
new file mode 100644
index 000000000..4e8ee0f8c
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-down-on-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-down-right.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-down-right.svg
new file mode 100644
index 000000000..65cdada0e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-down-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-down-tray.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-down-tray.svg
new file mode 100644
index 000000000..5c3589d95
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-down-tray.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-down.svg
new file mode 100644
index 000000000..8d577b1e8
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-left-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-left-circle.svg
new file mode 100644
index 000000000..8cce243be
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-left-circle.svg
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-left-on-rectangle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-left-on-rectangle.svg
new file mode 100644
index 000000000..74d0699a5
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-left-on-rectangle.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-left.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-left.svg
new file mode 100644
index 000000000..c7efd3073
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-long-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-long-down.svg
new file mode 100644
index 000000000..d2630615f
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-long-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-long-left.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-long-left.svg
new file mode 100644
index 000000000..297553c97
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-long-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-long-right.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-long-right.svg
new file mode 100644
index 000000000..eea945e0e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-long-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-long-up.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-long-up.svg
new file mode 100644
index 000000000..193ff978b
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-long-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-path-rounded-square.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-path-rounded-square.svg
new file mode 100644
index 000000000..7d3deb580
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-path-rounded-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-path.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-path.svg
new file mode 100644
index 000000000..1a31b4c04
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-path.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-right-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-right-circle.svg
new file mode 100644
index 000000000..4178da9a0
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-right-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-right-on-rectangle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-right-on-rectangle.svg
new file mode 100644
index 000000000..27c4dffd2
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-right-on-rectangle.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-right.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-right.svg
new file mode 100644
index 000000000..95cc517ad
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-small-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-small-down.svg
new file mode 100644
index 000000000..b986c6cd5
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-small-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-small-left.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-small-left.svg
new file mode 100644
index 000000000..0cb7e71a5
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-small-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-small-right.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-small-right.svg
new file mode 100644
index 000000000..16beb5e38
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-small-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-small-up.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-small-up.svg
new file mode 100644
index 000000000..7fda0e594
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-small-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-top-right-on-square.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-top-right-on-square.svg
new file mode 100644
index 000000000..c93df5486
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-top-right-on-square.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-trending-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-trending-down.svg
new file mode 100644
index 000000000..5ec7c0371
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-trending-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-trending-up.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-trending-up.svg
new file mode 100644
index 000000000..67af2cc8a
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-trending-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-up-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-up-circle.svg
new file mode 100644
index 000000000..21d87f2eb
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-up-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-up-left.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-up-left.svg
new file mode 100644
index 000000000..fb5003871
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-up-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-up-on-square-stack.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-up-on-square-stack.svg
new file mode 100644
index 000000000..0df0ed2a6
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-up-on-square-stack.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-up-on-square.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-up-on-square.svg
new file mode 100644
index 000000000..01f18a8df
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-up-on-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-up-right.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-up-right.svg
new file mode 100644
index 000000000..4841916de
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-up-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-up-tray.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-up-tray.svg
new file mode 100644
index 000000000..832afe55c
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-up-tray.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-up.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-up.svg
new file mode 100644
index 000000000..24b12b78b
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-uturn-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-uturn-down.svg
new file mode 100644
index 000000000..6839676d9
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-uturn-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-uturn-left.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-uturn-left.svg
new file mode 100644
index 000000000..6691aa4da
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-uturn-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-uturn-right.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-uturn-right.svg
new file mode 100644
index 000000000..9a6e23bff
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-uturn-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-uturn-up.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-uturn-up.svg
new file mode 100644
index 000000000..8e65bf8fb
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrow-uturn-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrows-pointing-in.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrows-pointing-in.svg
new file mode 100644
index 000000000..627580775
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrows-pointing-in.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrows-pointing-out.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrows-pointing-out.svg
new file mode 100644
index 000000000..14e1bcd1c
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrows-pointing-out.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrows-right-left.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrows-right-left.svg
new file mode 100644
index 000000000..87616d336
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrows-right-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrows-up-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrows-up-down.svg
new file mode 100644
index 000000000..b9c43d94e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/arrows-up-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/at-symbol.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/at-symbol.svg
new file mode 100644
index 000000000..a9e960de7
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/at-symbol.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/backspace.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/backspace.svg
new file mode 100644
index 000000000..d3c168600
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/backspace.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/backward.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/backward.svg
new file mode 100644
index 000000000..8d341b28b
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/backward.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/banknotes.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/banknotes.svg
new file mode 100644
index 000000000..979c5864b
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/banknotes.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bars-2.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bars-2.svg
new file mode 100644
index 000000000..4ce1e1939
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bars-2.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bars-3-bottom-left.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bars-3-bottom-left.svg
new file mode 100644
index 000000000..ebf785dad
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bars-3-bottom-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bars-3-bottom-right.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bars-3-bottom-right.svg
new file mode 100644
index 000000000..af69c3d26
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bars-3-bottom-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bars-3-center-left.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bars-3-center-left.svg
new file mode 100644
index 000000000..ee8a526ee
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bars-3-center-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bars-3.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bars-3.svg
new file mode 100644
index 000000000..d164cfd36
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bars-3.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bars-4.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bars-4.svg
new file mode 100644
index 000000000..8e3f650c2
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bars-4.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bars-arrow-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bars-arrow-down.svg
new file mode 100644
index 000000000..fd8f98d1e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bars-arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bars-arrow-up.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bars-arrow-up.svg
new file mode 100644
index 000000000..ba77dbea9
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bars-arrow-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/battery-0.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/battery-0.svg
new file mode 100644
index 000000000..2320f7ee7
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/battery-0.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/battery-100.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/battery-100.svg
new file mode 100644
index 000000000..e04408fb0
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/battery-100.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/battery-50.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/battery-50.svg
new file mode 100644
index 000000000..e5e84984d
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/battery-50.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/beaker.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/beaker.svg
new file mode 100644
index 000000000..025c46ba8
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/beaker.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bell-alert.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bell-alert.svg
new file mode 100644
index 000000000..c84dc7c5d
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bell-alert.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bell-slash.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bell-slash.svg
new file mode 100644
index 000000000..a4296ac59
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bell-slash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bell-snooze.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bell-snooze.svg
new file mode 100644
index 000000000..ad4f8c5f5
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bell-snooze.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bell.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bell.svg
new file mode 100644
index 000000000..2a81bba75
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bell.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bolt-slash.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bolt-slash.svg
new file mode 100644
index 000000000..e4c2499c7
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bolt-slash.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bolt.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bolt.svg
new file mode 100644
index 000000000..53f4fb957
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bolt.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/book-open.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/book-open.svg
new file mode 100644
index 000000000..99cf0d4d0
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/book-open.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bookmark-slash.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bookmark-slash.svg
new file mode 100644
index 000000000..1442fd445
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bookmark-slash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bookmark-square.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bookmark-square.svg
new file mode 100644
index 000000000..849c425e7
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bookmark-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bookmark.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bookmark.svg
new file mode 100644
index 000000000..a3e68dece
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bookmark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/briefcase.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/briefcase.svg
new file mode 100644
index 000000000..275f4b3f9
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/briefcase.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bug-ant.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bug-ant.svg
new file mode 100644
index 000000000..bc866155e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/bug-ant.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/building-library.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/building-library.svg
new file mode 100644
index 000000000..610bce7eb
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/building-library.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/building-office-2.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/building-office-2.svg
new file mode 100644
index 000000000..b25c33dda
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/building-office-2.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/building-office.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/building-office.svg
new file mode 100644
index 000000000..8fb3fabeb
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/building-office.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/building-storefront.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/building-storefront.svg
new file mode 100644
index 000000000..0d7da7cbf
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/building-storefront.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/cake.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/cake.svg
new file mode 100644
index 000000000..c58d3b96a
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/cake.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/calculator.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/calculator.svg
new file mode 100644
index 000000000..cc2616095
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/calculator.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/calendar-days.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/calendar-days.svg
new file mode 100644
index 000000000..ded231856
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/calendar-days.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/calendar.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/calendar.svg
new file mode 100644
index 000000000..dea374d2e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/calendar.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/camera.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/camera.svg
new file mode 100644
index 000000000..17356aef3
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/camera.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chart-bar-square.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chart-bar-square.svg
new file mode 100644
index 000000000..6d5b97687
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chart-bar-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chart-bar.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chart-bar.svg
new file mode 100644
index 000000000..c496112a1
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chart-bar.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chart-pie.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chart-pie.svg
new file mode 100644
index 000000000..37d18c9af
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chart-pie.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chat-bubble-bottom-center-text.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chat-bubble-bottom-center-text.svg
new file mode 100644
index 000000000..fee91bec2
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chat-bubble-bottom-center-text.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chat-bubble-bottom-center.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chat-bubble-bottom-center.svg
new file mode 100644
index 000000000..24de840b5
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chat-bubble-bottom-center.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chat-bubble-left-ellipsis.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chat-bubble-left-ellipsis.svg
new file mode 100644
index 000000000..7e2b06cd1
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chat-bubble-left-ellipsis.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chat-bubble-left-right.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chat-bubble-left-right.svg
new file mode 100644
index 000000000..fceca7fbb
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chat-bubble-left-right.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chat-bubble-left.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chat-bubble-left.svg
new file mode 100644
index 000000000..cd706f943
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chat-bubble-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chat-bubble-oval-left-ellipsis.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chat-bubble-oval-left-ellipsis.svg
new file mode 100644
index 000000000..88d9c32fd
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chat-bubble-oval-left-ellipsis.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chat-bubble-oval-left.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chat-bubble-oval-left.svg
new file mode 100644
index 000000000..f3b3883f2
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chat-bubble-oval-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/check-badge.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/check-badge.svg
new file mode 100644
index 000000000..b13190c1f
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/check-badge.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/check-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/check-circle.svg
new file mode 100644
index 000000000..dbbc90576
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/check-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/check.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/check.svg
new file mode 100644
index 000000000..d1956aa49
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/check.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chevron-double-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chevron-double-down.svg
new file mode 100644
index 000000000..3c6519323
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chevron-double-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chevron-double-left.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chevron-double-left.svg
new file mode 100644
index 000000000..a41e61595
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chevron-double-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chevron-double-right.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chevron-double-right.svg
new file mode 100644
index 000000000..d78c9326c
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chevron-double-right.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chevron-double-up.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chevron-double-up.svg
new file mode 100644
index 000000000..f7ac6684b
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chevron-double-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chevron-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chevron-down.svg
new file mode 100644
index 000000000..6b63dfb55
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chevron-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chevron-left.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chevron-left.svg
new file mode 100644
index 000000000..b484a40e2
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chevron-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chevron-right.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chevron-right.svg
new file mode 100644
index 000000000..9ce374595
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chevron-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chevron-up-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chevron-up-down.svg
new file mode 100644
index 000000000..2499bb1fa
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chevron-up-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chevron-up.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chevron-up.svg
new file mode 100644
index 000000000..8aaaa1f7c
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/chevron-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/circle-stack.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/circle-stack.svg
new file mode 100644
index 000000000..fae20900e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/circle-stack.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/clipboard-document-check.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/clipboard-document-check.svg
new file mode 100644
index 000000000..24470123f
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/clipboard-document-check.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/clipboard-document-list.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/clipboard-document-list.svg
new file mode 100644
index 000000000..a78b24cbb
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/clipboard-document-list.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/clipboard-document.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/clipboard-document.svg
new file mode 100644
index 000000000..f29a43368
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/clipboard-document.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/clipboard.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/clipboard.svg
new file mode 100644
index 000000000..3b2a7ff2e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/clipboard.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/clock.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/clock.svg
new file mode 100644
index 000000000..d72dd622f
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/clock.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/cloud-arrow-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/cloud-arrow-down.svg
new file mode 100644
index 000000000..cb32c04ea
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/cloud-arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/cloud-arrow-up.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/cloud-arrow-up.svg
new file mode 100644
index 000000000..06b2c4ad4
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/cloud-arrow-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/cloud.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/cloud.svg
new file mode 100644
index 000000000..c5eb0c883
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/cloud.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/code-bracket-square.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/code-bracket-square.svg
new file mode 100644
index 000000000..e4e353074
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/code-bracket-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/code-bracket.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/code-bracket.svg
new file mode 100644
index 000000000..4adfd32fb
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/code-bracket.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/cog-6-tooth.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/cog-6-tooth.svg
new file mode 100644
index 000000000..435032f46
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/cog-6-tooth.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/cog-8-tooth.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/cog-8-tooth.svg
new file mode 100644
index 000000000..0450feb1f
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/cog-8-tooth.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/cog.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/cog.svg
new file mode 100644
index 000000000..10f43b589
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/cog.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/command-line.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/command-line.svg
new file mode 100644
index 000000000..59cf34c9d
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/command-line.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/computer-desktop.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/computer-desktop.svg
new file mode 100644
index 000000000..4eeac1bd9
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/computer-desktop.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/cpu-chip.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/cpu-chip.svg
new file mode 100644
index 000000000..f7c49b417
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/cpu-chip.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/credit-card.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/credit-card.svg
new file mode 100644
index 000000000..d650fea61
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/credit-card.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/cube-transparent.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/cube-transparent.svg
new file mode 100644
index 000000000..bfe9daee3
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/cube-transparent.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/cube.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/cube.svg
new file mode 100644
index 000000000..c3436edd0
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/cube.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/currency-bangladeshi.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/currency-bangladeshi.svg
new file mode 100644
index 000000000..2a2726039
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/currency-bangladeshi.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/currency-dollar.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/currency-dollar.svg
new file mode 100644
index 000000000..1b00de7d5
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/currency-dollar.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/currency-euro.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/currency-euro.svg
new file mode 100644
index 000000000..43fda8e55
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/currency-euro.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/currency-pound.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/currency-pound.svg
new file mode 100644
index 000000000..9bc57fe34
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/currency-pound.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/currency-rupee.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/currency-rupee.svg
new file mode 100644
index 000000000..67da528d7
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/currency-rupee.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/currency-yen.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/currency-yen.svg
new file mode 100644
index 000000000..68fca0674
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/currency-yen.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/cursor-arrow-rays.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/cursor-arrow-rays.svg
new file mode 100644
index 000000000..d2d36a787
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/cursor-arrow-rays.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/cursor-arrow-ripple.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/cursor-arrow-ripple.svg
new file mode 100644
index 000000000..89ccfda49
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/cursor-arrow-ripple.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/device-phone-mobile.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/device-phone-mobile.svg
new file mode 100644
index 000000000..68fac4fd4
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/device-phone-mobile.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/device-tablet.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/device-tablet.svg
new file mode 100644
index 000000000..2490e1f0f
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/device-tablet.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/document-arrow-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/document-arrow-down.svg
new file mode 100644
index 000000000..a51461d86
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/document-arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/document-arrow-up.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/document-arrow-up.svg
new file mode 100644
index 000000000..d55aacdb0
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/document-arrow-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/document-chart-bar.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/document-chart-bar.svg
new file mode 100644
index 000000000..8d5f60a7a
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/document-chart-bar.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/document-check.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/document-check.svg
new file mode 100644
index 000000000..b28da1474
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/document-check.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/document-duplicate.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/document-duplicate.svg
new file mode 100644
index 000000000..64768cfd6
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/document-duplicate.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/document-magnifying-glass.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/document-magnifying-glass.svg
new file mode 100644
index 000000000..0dc8ebaf8
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/document-magnifying-glass.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/document-minus.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/document-minus.svg
new file mode 100644
index 000000000..bf7af0655
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/document-minus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/document-plus.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/document-plus.svg
new file mode 100644
index 000000000..133cc82b4
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/document-plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/document-text.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/document-text.svg
new file mode 100644
index 000000000..f7d91ba7b
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/document-text.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/document.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/document.svg
new file mode 100644
index 000000000..aa7070c81
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/document.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/ellipsis-horizontal-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/ellipsis-horizontal-circle.svg
new file mode 100644
index 000000000..799cf88d8
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/ellipsis-horizontal-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/ellipsis-horizontal.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/ellipsis-horizontal.svg
new file mode 100644
index 000000000..a82211c6f
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/ellipsis-horizontal.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/ellipsis-vertical.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/ellipsis-vertical.svg
new file mode 100644
index 000000000..ac9c83f66
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/ellipsis-vertical.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/envelope-open.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/envelope-open.svg
new file mode 100644
index 000000000..a60035bc4
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/envelope-open.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/envelope.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/envelope.svg
new file mode 100644
index 000000000..b582b8f63
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/envelope.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/exclamation-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/exclamation-circle.svg
new file mode 100644
index 000000000..3cf5b5962
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/exclamation-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/exclamation-triangle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/exclamation-triangle.svg
new file mode 100644
index 000000000..a6cc02fd2
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/exclamation-triangle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/eye-dropper.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/eye-dropper.svg
new file mode 100644
index 000000000..cce083309
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/eye-dropper.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/eye-slash.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/eye-slash.svg
new file mode 100644
index 000000000..cc2e22253
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/eye-slash.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/eye.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/eye.svg
new file mode 100644
index 000000000..b17cec9d7
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/eye.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/face-frown.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/face-frown.svg
new file mode 100644
index 000000000..8cbb3b32c
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/face-frown.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/face-smile.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/face-smile.svg
new file mode 100644
index 000000000..434c83e61
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/face-smile.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/film.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/film.svg
new file mode 100644
index 000000000..95734456c
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/film.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/finger-print.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/finger-print.svg
new file mode 100644
index 000000000..409d67e4e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/finger-print.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/fire.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/fire.svg
new file mode 100644
index 000000000..88fb85ed9
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/fire.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/flag.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/flag.svg
new file mode 100644
index 000000000..b790f05e3
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/flag.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/folder-arrow-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/folder-arrow-down.svg
new file mode 100644
index 000000000..4c2a9152f
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/folder-arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/folder-minus.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/folder-minus.svg
new file mode 100644
index 000000000..248388b37
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/folder-minus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/folder-open.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/folder-open.svg
new file mode 100644
index 000000000..79d245ed3
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/folder-open.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/folder-plus.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/folder-plus.svg
new file mode 100644
index 000000000..0780a546e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/folder-plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/folder.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/folder.svg
new file mode 100644
index 000000000..c92e0fff2
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/folder.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/forward.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/forward.svg
new file mode 100644
index 000000000..11fd161ef
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/forward.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/funnel.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/funnel.svg
new file mode 100644
index 000000000..af3078fb9
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/funnel.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/gif.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/gif.svg
new file mode 100644
index 000000000..ff1cd387b
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/gif.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/gift-top.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/gift-top.svg
new file mode 100644
index 000000000..d650d0405
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/gift-top.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/gift.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/gift.svg
new file mode 100644
index 000000000..90362ab55
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/gift.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/globe-alt.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/globe-alt.svg
new file mode 100644
index 000000000..c8ff599d0
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/globe-alt.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/globe-americas.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/globe-americas.svg
new file mode 100644
index 000000000..7de872373
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/globe-americas.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/globe-asia-australia.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/globe-asia-australia.svg
new file mode 100644
index 000000000..b3da4dd29
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/globe-asia-australia.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/globe-europe-africa.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/globe-europe-africa.svg
new file mode 100644
index 000000000..92db1e13c
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/globe-europe-africa.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/hand-raised.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/hand-raised.svg
new file mode 100644
index 000000000..caa27db98
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/hand-raised.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/hand-thumb-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/hand-thumb-down.svg
new file mode 100644
index 000000000..06ffbe05e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/hand-thumb-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/hand-thumb-up.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/hand-thumb-up.svg
new file mode 100644
index 000000000..3d67d9848
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/hand-thumb-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/hashtag.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/hashtag.svg
new file mode 100644
index 000000000..29c9f1064
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/hashtag.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/heart.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/heart.svg
new file mode 100644
index 000000000..96e63d924
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/heart.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/home-modern.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/home-modern.svg
new file mode 100644
index 000000000..95033a38c
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/home-modern.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/home.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/home.svg
new file mode 100644
index 000000000..ae2acdc9f
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/home.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/identification.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/identification.svg
new file mode 100644
index 000000000..7a8338c60
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/identification.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/inbox-arrow-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/inbox-arrow-down.svg
new file mode 100644
index 000000000..37f464ebc
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/inbox-arrow-down.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/inbox-stack.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/inbox-stack.svg
new file mode 100644
index 000000000..b8f22d169
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/inbox-stack.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/inbox.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/inbox.svg
new file mode 100644
index 000000000..87ae30d0d
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/inbox.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/information-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/information-circle.svg
new file mode 100644
index 000000000..25ac64489
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/information-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/key.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/key.svg
new file mode 100644
index 000000000..97e8ad8ca
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/key.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/language.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/language.svg
new file mode 100644
index 000000000..e7524be19
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/language.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/lifebuoy.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/lifebuoy.svg
new file mode 100644
index 000000000..79134c1a0
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/lifebuoy.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/light-bulb.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/light-bulb.svg
new file mode 100644
index 000000000..415e3749c
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/light-bulb.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/link.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/link.svg
new file mode 100644
index 000000000..e8204136f
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/link.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/list-bullet.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/list-bullet.svg
new file mode 100644
index 000000000..363793406
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/list-bullet.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/lock-closed.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/lock-closed.svg
new file mode 100644
index 000000000..e7e1dc1d7
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/lock-closed.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/lock-open.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/lock-open.svg
new file mode 100644
index 000000000..2ac4b1488
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/lock-open.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/magnifying-glass-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/magnifying-glass-circle.svg
new file mode 100644
index 000000000..e025769e8
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/magnifying-glass-circle.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/magnifying-glass-minus.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/magnifying-glass-minus.svg
new file mode 100644
index 000000000..a8fb7a27d
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/magnifying-glass-minus.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/magnifying-glass-plus.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/magnifying-glass-plus.svg
new file mode 100644
index 000000000..e55fc4c3a
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/magnifying-glass-plus.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/magnifying-glass.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/magnifying-glass.svg
new file mode 100644
index 000000000..d90520a6a
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/magnifying-glass.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/map-pin.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/map-pin.svg
new file mode 100644
index 000000000..7adc8a919
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/map-pin.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/map.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/map.svg
new file mode 100644
index 000000000..7e25c7be0
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/map.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/megaphone.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/megaphone.svg
new file mode 100644
index 000000000..cf7378532
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/megaphone.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/microphone.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/microphone.svg
new file mode 100644
index 000000000..635ded0d4
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/microphone.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/minus-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/minus-circle.svg
new file mode 100644
index 000000000..5c361e2ac
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/minus-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/minus-small.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/minus-small.svg
new file mode 100644
index 000000000..4e041d3e2
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/minus-small.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/minus.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/minus.svg
new file mode 100644
index 000000000..6d8dd243a
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/minus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/moon.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/moon.svg
new file mode 100644
index 000000000..b5921106d
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/moon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/musical-note.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/musical-note.svg
new file mode 100644
index 000000000..c7f0aa866
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/musical-note.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/newspaper.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/newspaper.svg
new file mode 100644
index 000000000..be785e382
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/newspaper.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/no-symbol.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/no-symbol.svg
new file mode 100644
index 000000000..8463da2b4
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/no-symbol.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/paint-brush.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/paint-brush.svg
new file mode 100644
index 000000000..c2db8c018
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/paint-brush.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/paper-airplane.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/paper-airplane.svg
new file mode 100644
index 000000000..35315adb8
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/paper-airplane.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/paper-clip.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/paper-clip.svg
new file mode 100644
index 000000000..b38155ea0
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/paper-clip.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/pause-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/pause-circle.svg
new file mode 100644
index 000000000..732530a1c
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/pause-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/pause.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/pause.svg
new file mode 100644
index 000000000..b6544ba2e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/pause.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/pencil-square.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/pencil-square.svg
new file mode 100644
index 000000000..129ee44d4
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/pencil-square.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/pencil.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/pencil.svg
new file mode 100644
index 000000000..fa5049837
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/pencil.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/phone-arrow-down-left.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/phone-arrow-down-left.svg
new file mode 100644
index 000000000..feeb6366c
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/phone-arrow-down-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/phone-arrow-up-right.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/phone-arrow-up-right.svg
new file mode 100644
index 000000000..e1d933107
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/phone-arrow-up-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/phone-x-mark.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/phone-x-mark.svg
new file mode 100644
index 000000000..6f1fd361b
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/phone-x-mark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/phone.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/phone.svg
new file mode 100644
index 000000000..5fd57fcf3
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/phone.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/photo.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/photo.svg
new file mode 100644
index 000000000..db063d33e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/photo.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/play-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/play-circle.svg
new file mode 100644
index 000000000..d1587b771
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/play-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/play-pause.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/play-pause.svg
new file mode 100644
index 000000000..cdfa63b22
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/play-pause.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/play.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/play.svg
new file mode 100644
index 000000000..2cd53e17a
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/play.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/plus-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/plus-circle.svg
new file mode 100644
index 000000000..3925a14f0
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/plus-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/plus-small.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/plus-small.svg
new file mode 100644
index 000000000..eb2259844
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/plus-small.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/plus.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/plus.svg
new file mode 100644
index 000000000..218ab9366
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/power.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/power.svg
new file mode 100644
index 000000000..160382062
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/power.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/presentation-chart-bar.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/presentation-chart-bar.svg
new file mode 100644
index 000000000..e1a4242b1
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/presentation-chart-bar.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/presentation-chart-line.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/presentation-chart-line.svg
new file mode 100644
index 000000000..2e9281fc0
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/presentation-chart-line.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/printer.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/printer.svg
new file mode 100644
index 000000000..81d93dc2a
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/printer.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/puzzle-piece.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/puzzle-piece.svg
new file mode 100644
index 000000000..e5329e52d
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/puzzle-piece.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/qr-code.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/qr-code.svg
new file mode 100644
index 000000000..d5daf2a97
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/qr-code.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/question-mark-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/question-mark-circle.svg
new file mode 100644
index 000000000..893dab555
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/question-mark-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/queue-list.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/queue-list.svg
new file mode 100644
index 000000000..91f5b5732
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/queue-list.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/radio.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/radio.svg
new file mode 100644
index 000000000..9a12c8b7f
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/radio.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/receipt-percent.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/receipt-percent.svg
new file mode 100644
index 000000000..1a8f2544f
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/receipt-percent.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/receipt-refund.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/receipt-refund.svg
new file mode 100644
index 000000000..a134c56cb
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/receipt-refund.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/rectangle-group.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/rectangle-group.svg
new file mode 100644
index 000000000..599d5f4b6
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/rectangle-group.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/rectangle-stack.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/rectangle-stack.svg
new file mode 100644
index 000000000..94b56547f
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/rectangle-stack.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/rocket-launch.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/rocket-launch.svg
new file mode 100644
index 000000000..b97e89ed7
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/rocket-launch.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/rss.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/rss.svg
new file mode 100644
index 000000000..538ae9aad
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/rss.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/scale.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/scale.svg
new file mode 100644
index 000000000..60b0ed93b
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/scale.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/scissors.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/scissors.svg
new file mode 100644
index 000000000..3122658b5
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/scissors.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/server-stack.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/server-stack.svg
new file mode 100644
index 000000000..2247dbe84
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/server-stack.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/server.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/server.svg
new file mode 100644
index 000000000..6c8899ba4
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/server.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/share.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/share.svg
new file mode 100644
index 000000000..e5aafee5e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/share.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/shield-check.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/shield-check.svg
new file mode 100644
index 000000000..a8572d4ac
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/shield-check.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/shield-exclamation.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/shield-exclamation.svg
new file mode 100644
index 000000000..8562de40d
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/shield-exclamation.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/shopping-bag.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/shopping-bag.svg
new file mode 100644
index 000000000..e70c815db
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/shopping-bag.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/shopping-cart.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/shopping-cart.svg
new file mode 100644
index 000000000..855a631e4
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/shopping-cart.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/signal-slash.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/signal-slash.svg
new file mode 100644
index 000000000..822179a14
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/signal-slash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/signal.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/signal.svg
new file mode 100644
index 000000000..753920483
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/signal.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/sparkles.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/sparkles.svg
new file mode 100644
index 000000000..a247c949e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/sparkles.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/speaker-wave.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/speaker-wave.svg
new file mode 100644
index 000000000..2e6b3e0c6
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/speaker-wave.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/speaker-x-mark.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/speaker-x-mark.svg
new file mode 100644
index 000000000..0c39f61f7
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/speaker-x-mark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/square-2-stack.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/square-2-stack.svg
new file mode 100644
index 000000000..177d43a71
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/square-2-stack.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/square-3-stack-3d.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/square-3-stack-3d.svg
new file mode 100644
index 000000000..7d6b44f42
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/square-3-stack-3d.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/squares-2x2.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/squares-2x2.svg
new file mode 100644
index 000000000..47c181739
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/squares-2x2.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/squares-plus.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/squares-plus.svg
new file mode 100644
index 000000000..019eb3719
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/squares-plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/star.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/star.svg
new file mode 100644
index 000000000..a8703651d
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/star.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/stop-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/stop-circle.svg
new file mode 100644
index 000000000..9167a6449
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/stop-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/stop.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/stop.svg
new file mode 100644
index 000000000..b0e40dbf0
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/stop.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/sun.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/sun.svg
new file mode 100644
index 000000000..449e36c49
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/sun.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/swatch.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/swatch.svg
new file mode 100644
index 000000000..108954840
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/swatch.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/table-cells.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/table-cells.svg
new file mode 100644
index 000000000..aa8eacd77
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/table-cells.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/tag.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/tag.svg
new file mode 100644
index 000000000..d6c9c8b87
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/tag.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/ticket.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/ticket.svg
new file mode 100644
index 000000000..7d04b01e8
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/ticket.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/trash.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/trash.svg
new file mode 100644
index 000000000..16bd5c638
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/trash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/trophy.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/trophy.svg
new file mode 100644
index 000000000..e2ebdaff7
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/trophy.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/truck.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/truck.svg
new file mode 100644
index 000000000..a50085acf
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/truck.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/tv.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/tv.svg
new file mode 100644
index 000000000..b0c7209e7
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/tv.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/user-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/user-circle.svg
new file mode 100644
index 000000000..abd6c98d3
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/user-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/user-group.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/user-group.svg
new file mode 100644
index 000000000..dc8373617
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/user-group.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/user-minus.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/user-minus.svg
new file mode 100644
index 000000000..b092b7749
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/user-minus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/user-plus.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/user-plus.svg
new file mode 100644
index 000000000..afd596503
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/user-plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/user.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/user.svg
new file mode 100644
index 000000000..4d9b2ee0b
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/user.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/users.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/users.svg
new file mode 100644
index 000000000..43526a616
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/users.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/variable.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/variable.svg
new file mode 100644
index 000000000..3460817ae
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/variable.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/video-camera-slash.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/video-camera-slash.svg
new file mode 100644
index 000000000..95b94132a
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/video-camera-slash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/video-camera.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/video-camera.svg
new file mode 100644
index 000000000..4d22f1689
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/video-camera.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/view-columns.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/view-columns.svg
new file mode 100644
index 000000000..1111492e7
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/view-columns.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/viewfinder-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/viewfinder-circle.svg
new file mode 100644
index 000000000..5cfe9fbbe
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/viewfinder-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/wallet.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/wallet.svg
new file mode 100644
index 000000000..6ce8050e9
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/wallet.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/wifi.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/wifi.svg
new file mode 100644
index 000000000..f3c7118de
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/wifi.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/window.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/window.svg
new file mode 100644
index 000000000..9110a2b33
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/window.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/wrench-screwdriver.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/wrench-screwdriver.svg
new file mode 100644
index 000000000..2ad879f58
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/wrench-screwdriver.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/wrench.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/wrench.svg
new file mode 100644
index 000000000..2643e00e4
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/wrench.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/x-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/x-circle.svg
new file mode 100644
index 000000000..a660014f7
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/x-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/x-mark.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/x-mark.svg
new file mode 100644
index 000000000..0635bacf0
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/20/solid/x-mark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/academic-cap.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/academic-cap.svg
new file mode 100644
index 000000000..fc181078e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/academic-cap.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/adjustments-horizontal.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/adjustments-horizontal.svg
new file mode 100644
index 000000000..e859e5df1
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/adjustments-horizontal.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/adjustments-vertical.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/adjustments-vertical.svg
new file mode 100644
index 000000000..61538090e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/adjustments-vertical.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/archive-box-arrow-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/archive-box-arrow-down.svg
new file mode 100644
index 000000000..1a0a8303f
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/archive-box-arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/archive-box-x-mark.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/archive-box-x-mark.svg
new file mode 100644
index 000000000..49bd08792
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/archive-box-x-mark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/archive-box.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/archive-box.svg
new file mode 100644
index 000000000..704f35369
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/archive-box.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-down-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-down-circle.svg
new file mode 100644
index 000000000..248b0e857
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-down-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-down-left.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-down-left.svg
new file mode 100644
index 000000000..262b5ffe8
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-down-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-down-on-square-stack.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-down-on-square-stack.svg
new file mode 100644
index 000000000..42a5b84bd
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-down-on-square-stack.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-down-on-square.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-down-on-square.svg
new file mode 100644
index 000000000..da1b827f1
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-down-on-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-down-right.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-down-right.svg
new file mode 100644
index 000000000..9cc7a30f0
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-down-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-down-tray.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-down-tray.svg
new file mode 100644
index 000000000..a77546c81
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-down-tray.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-down.svg
new file mode 100644
index 000000000..b5b04fd1e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-left-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-left-circle.svg
new file mode 100644
index 000000000..849cc5f2d
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-left-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-left-on-rectangle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-left-on-rectangle.svg
new file mode 100644
index 000000000..0d6a3cce0
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-left-on-rectangle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-left.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-left.svg
new file mode 100644
index 000000000..49f15d4a1
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-long-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-long-down.svg
new file mode 100644
index 000000000..eb7a92b5e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-long-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-long-left.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-long-left.svg
new file mode 100644
index 000000000..d3e90057a
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-long-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-long-right.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-long-right.svg
new file mode 100644
index 000000000..413d6b55d
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-long-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-long-up.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-long-up.svg
new file mode 100644
index 000000000..fb029f441
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-long-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-path-rounded-square.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-path-rounded-square.svg
new file mode 100644
index 000000000..0cfe39e33
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-path-rounded-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-path.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-path.svg
new file mode 100644
index 000000000..7da4fd2ce
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-path.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-right-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-right-circle.svg
new file mode 100644
index 000000000..e7bcb80f2
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-right-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-right-on-rectangle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-right-on-rectangle.svg
new file mode 100644
index 000000000..2b49becb3
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-right-on-rectangle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-right.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-right.svg
new file mode 100644
index 000000000..8527a52fe
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-small-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-small-down.svg
new file mode 100644
index 000000000..1f1a210ed
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-small-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-small-left.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-small-left.svg
new file mode 100644
index 000000000..778cb1727
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-small-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-small-right.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-small-right.svg
new file mode 100644
index 000000000..1b5fc6451
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-small-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-small-up.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-small-up.svg
new file mode 100644
index 000000000..4ed197eae
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-small-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-top-right-on-square.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-top-right-on-square.svg
new file mode 100644
index 000000000..c4a9239cb
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-top-right-on-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-trending-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-trending-down.svg
new file mode 100644
index 000000000..aebbb1812
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-trending-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-trending-up.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-trending-up.svg
new file mode 100644
index 000000000..868f3d3bd
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-trending-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-up-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-up-circle.svg
new file mode 100644
index 000000000..51340d6ab
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-up-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-up-left.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-up-left.svg
new file mode 100644
index 000000000..ba4e54e23
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-up-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-up-on-square-stack.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-up-on-square-stack.svg
new file mode 100644
index 000000000..0d4d82365
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-up-on-square-stack.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-up-on-square.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-up-on-square.svg
new file mode 100644
index 000000000..2c38ea01b
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-up-on-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-up-right.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-up-right.svg
new file mode 100644
index 000000000..0b7a37276
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-up-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-up-tray.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-up-tray.svg
new file mode 100644
index 000000000..448b853ea
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-up-tray.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-up.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-up.svg
new file mode 100644
index 000000000..e2696241b
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-uturn-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-uturn-down.svg
new file mode 100644
index 000000000..51f99291e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-uturn-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-uturn-left.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-uturn-left.svg
new file mode 100644
index 000000000..b8f240edc
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-uturn-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-uturn-right.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-uturn-right.svg
new file mode 100644
index 000000000..ece509190
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-uturn-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-uturn-up.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-uturn-up.svg
new file mode 100644
index 000000000..b76c54b14
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrow-uturn-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrows-pointing-in.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrows-pointing-in.svg
new file mode 100644
index 000000000..0a8872d7d
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrows-pointing-in.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrows-pointing-out.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrows-pointing-out.svg
new file mode 100644
index 000000000..936ac458b
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrows-pointing-out.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrows-right-left.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrows-right-left.svg
new file mode 100644
index 000000000..18890f31d
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrows-right-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrows-up-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrows-up-down.svg
new file mode 100644
index 000000000..da4cdf3e9
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/arrows-up-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/at-symbol.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/at-symbol.svg
new file mode 100644
index 000000000..fe2f64424
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/at-symbol.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/backspace.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/backspace.svg
new file mode 100644
index 000000000..f76c5df10
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/backspace.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/backward.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/backward.svg
new file mode 100644
index 000000000..fb1da49db
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/backward.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/banknotes.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/banknotes.svg
new file mode 100644
index 000000000..0603b0ddd
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/banknotes.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bars-2.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bars-2.svg
new file mode 100644
index 000000000..9c49ca27a
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bars-2.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bars-3-bottom-left.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bars-3-bottom-left.svg
new file mode 100644
index 000000000..e23bbc35c
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bars-3-bottom-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bars-3-bottom-right.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bars-3-bottom-right.svg
new file mode 100644
index 000000000..a0f683d9a
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bars-3-bottom-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bars-3-center-left.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bars-3-center-left.svg
new file mode 100644
index 000000000..a8e83e1e4
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bars-3-center-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bars-3.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bars-3.svg
new file mode 100644
index 000000000..a7cf3205f
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bars-3.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bars-4.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bars-4.svg
new file mode 100644
index 000000000..f34bddfbf
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bars-4.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bars-arrow-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bars-arrow-down.svg
new file mode 100644
index 000000000..200fd3af9
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bars-arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bars-arrow-up.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bars-arrow-up.svg
new file mode 100644
index 000000000..d88bf4e5c
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bars-arrow-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/battery-0.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/battery-0.svg
new file mode 100644
index 000000000..fd2aa9dac
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/battery-0.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/battery-100.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/battery-100.svg
new file mode 100644
index 000000000..ba012c68e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/battery-100.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/battery-50.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/battery-50.svg
new file mode 100644
index 000000000..f6f983887
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/battery-50.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/beaker.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/beaker.svg
new file mode 100644
index 000000000..2d143fda7
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/beaker.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bell-alert.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bell-alert.svg
new file mode 100644
index 000000000..c4af4271e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bell-alert.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bell-slash.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bell-slash.svg
new file mode 100644
index 000000000..2df7520f3
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bell-slash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bell-snooze.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bell-snooze.svg
new file mode 100644
index 000000000..117de29a7
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bell-snooze.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bell.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bell.svg
new file mode 100644
index 000000000..63ab1532c
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bell.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bolt-slash.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bolt-slash.svg
new file mode 100644
index 000000000..13af3465e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bolt-slash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bolt.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bolt.svg
new file mode 100644
index 000000000..5e629febf
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bolt.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/book-open.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/book-open.svg
new file mode 100644
index 000000000..a4153b626
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/book-open.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bookmark-slash.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bookmark-slash.svg
new file mode 100644
index 000000000..f3ae625d4
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bookmark-slash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bookmark-square.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bookmark-square.svg
new file mode 100644
index 000000000..00e5cc37a
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bookmark-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bookmark.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bookmark.svg
new file mode 100644
index 000000000..6d06e4f33
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bookmark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/briefcase.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/briefcase.svg
new file mode 100644
index 000000000..adab6ff54
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/briefcase.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bug-ant.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bug-ant.svg
new file mode 100644
index 000000000..ac04fad8c
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/bug-ant.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/building-library.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/building-library.svg
new file mode 100644
index 000000000..4e2e1daeb
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/building-library.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/building-office-2.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/building-office-2.svg
new file mode 100644
index 000000000..45e063cdb
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/building-office-2.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/building-office.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/building-office.svg
new file mode 100644
index 000000000..0efd98236
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/building-office.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/building-storefront.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/building-storefront.svg
new file mode 100644
index 000000000..31fca5551
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/building-storefront.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/cake.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/cake.svg
new file mode 100644
index 000000000..a603e90ae
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/cake.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/calculator.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/calculator.svg
new file mode 100644
index 000000000..d97740ee5
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/calculator.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/calendar-days.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/calendar-days.svg
new file mode 100644
index 000000000..64b5f8f87
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/calendar-days.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/calendar.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/calendar.svg
new file mode 100644
index 000000000..5e4491175
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/calendar.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/camera.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/camera.svg
new file mode 100644
index 000000000..b8bdae37e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/camera.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chart-bar-square.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chart-bar-square.svg
new file mode 100644
index 000000000..d7fa42c53
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chart-bar-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chart-bar.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chart-bar.svg
new file mode 100644
index 000000000..27f20fac6
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chart-bar.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chart-pie.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chart-pie.svg
new file mode 100644
index 000000000..fa51c1679
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chart-pie.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chat-bubble-bottom-center-text.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chat-bubble-bottom-center-text.svg
new file mode 100644
index 000000000..4bc306e18
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chat-bubble-bottom-center-text.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chat-bubble-bottom-center.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chat-bubble-bottom-center.svg
new file mode 100644
index 000000000..d59d02aa8
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chat-bubble-bottom-center.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chat-bubble-left-ellipsis.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chat-bubble-left-ellipsis.svg
new file mode 100644
index 000000000..9a0ec734d
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chat-bubble-left-ellipsis.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chat-bubble-left-right.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chat-bubble-left-right.svg
new file mode 100644
index 000000000..4d366b8dd
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chat-bubble-left-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chat-bubble-left.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chat-bubble-left.svg
new file mode 100644
index 000000000..a41bf1ed5
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chat-bubble-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chat-bubble-oval-left-ellipsis.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chat-bubble-oval-left-ellipsis.svg
new file mode 100644
index 000000000..83d175160
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chat-bubble-oval-left-ellipsis.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chat-bubble-oval-left.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chat-bubble-oval-left.svg
new file mode 100644
index 000000000..d0d0d899c
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chat-bubble-oval-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/check-badge.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/check-badge.svg
new file mode 100644
index 000000000..8d6b79ada
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/check-badge.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/check-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/check-circle.svg
new file mode 100644
index 000000000..d4471d6bb
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/check-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/check.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/check.svg
new file mode 100644
index 000000000..7644e3010
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/check.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chevron-double-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chevron-double-down.svg
new file mode 100644
index 000000000..d7e937046
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chevron-double-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chevron-double-left.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chevron-double-left.svg
new file mode 100644
index 000000000..95834afa0
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chevron-double-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chevron-double-right.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chevron-double-right.svg
new file mode 100644
index 000000000..37a809d7a
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chevron-double-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chevron-double-up.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chevron-double-up.svg
new file mode 100644
index 000000000..518269161
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chevron-double-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chevron-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chevron-down.svg
new file mode 100644
index 000000000..b38efa5b2
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chevron-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chevron-left.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chevron-left.svg
new file mode 100644
index 000000000..73fe99af0
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chevron-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chevron-right.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chevron-right.svg
new file mode 100644
index 000000000..1e31bfdc8
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chevron-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chevron-up-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chevron-up-down.svg
new file mode 100644
index 000000000..27b1d4f53
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chevron-up-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chevron-up.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chevron-up.svg
new file mode 100644
index 000000000..713a6f1fb
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/chevron-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/circle-stack.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/circle-stack.svg
new file mode 100644
index 000000000..b8fb7699e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/circle-stack.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/clipboard-document-check.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/clipboard-document-check.svg
new file mode 100644
index 000000000..7bb03a16d
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/clipboard-document-check.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/clipboard-document-list.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/clipboard-document-list.svg
new file mode 100644
index 000000000..467077776
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/clipboard-document-list.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/clipboard-document.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/clipboard-document.svg
new file mode 100644
index 000000000..783a33373
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/clipboard-document.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/clipboard.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/clipboard.svg
new file mode 100644
index 000000000..ad9b943be
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/clipboard.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/clock.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/clock.svg
new file mode 100644
index 000000000..337196cca
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/clock.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/cloud-arrow-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/cloud-arrow-down.svg
new file mode 100644
index 000000000..7074791f7
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/cloud-arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/cloud-arrow-up.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/cloud-arrow-up.svg
new file mode 100644
index 000000000..8b450812f
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/cloud-arrow-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/cloud.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/cloud.svg
new file mode 100644
index 000000000..55fd72506
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/cloud.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/code-bracket-square.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/code-bracket-square.svg
new file mode 100644
index 000000000..8308024be
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/code-bracket-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/code-bracket.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/code-bracket.svg
new file mode 100644
index 000000000..3361add4d
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/code-bracket.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/cog-6-tooth.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/cog-6-tooth.svg
new file mode 100644
index 000000000..d58564583
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/cog-6-tooth.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/cog-8-tooth.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/cog-8-tooth.svg
new file mode 100644
index 000000000..28f85f42b
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/cog-8-tooth.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/cog.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/cog.svg
new file mode 100644
index 000000000..f2bad9ffe
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/cog.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/command-line.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/command-line.svg
new file mode 100644
index 000000000..baaf3629c
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/command-line.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/computer-desktop.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/computer-desktop.svg
new file mode 100644
index 000000000..fb9a6e0d9
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/computer-desktop.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/cpu-chip.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/cpu-chip.svg
new file mode 100644
index 000000000..cabc435ab
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/cpu-chip.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/credit-card.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/credit-card.svg
new file mode 100644
index 000000000..3c0c917df
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/credit-card.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/cube-transparent.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/cube-transparent.svg
new file mode 100644
index 000000000..5a8adac8c
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/cube-transparent.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/cube.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/cube.svg
new file mode 100644
index 000000000..70b0091a6
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/cube.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/currency-bangladeshi.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/currency-bangladeshi.svg
new file mode 100644
index 000000000..7f2fca3f5
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/currency-bangladeshi.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/currency-dollar.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/currency-dollar.svg
new file mode 100644
index 000000000..d376f4c99
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/currency-dollar.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/currency-euro.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/currency-euro.svg
new file mode 100644
index 000000000..8b9dd2e49
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/currency-euro.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/currency-pound.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/currency-pound.svg
new file mode 100644
index 000000000..8e7c52d21
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/currency-pound.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/currency-rupee.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/currency-rupee.svg
new file mode 100644
index 000000000..078bf0589
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/currency-rupee.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/currency-yen.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/currency-yen.svg
new file mode 100644
index 000000000..254011afa
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/currency-yen.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/cursor-arrow-rays.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/cursor-arrow-rays.svg
new file mode 100644
index 000000000..c29d0fd57
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/cursor-arrow-rays.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/cursor-arrow-ripple.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/cursor-arrow-ripple.svg
new file mode 100644
index 000000000..500a04ccc
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/cursor-arrow-ripple.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/device-phone-mobile.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/device-phone-mobile.svg
new file mode 100644
index 000000000..1caf91126
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/device-phone-mobile.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/device-tablet.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/device-tablet.svg
new file mode 100644
index 000000000..7090ecbe9
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/device-tablet.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/document-arrow-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/document-arrow-down.svg
new file mode 100644
index 000000000..04f6e6503
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/document-arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/document-arrow-up.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/document-arrow-up.svg
new file mode 100644
index 000000000..c0ca80ffc
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/document-arrow-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/document-chart-bar.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/document-chart-bar.svg
new file mode 100644
index 000000000..2ffa3fedd
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/document-chart-bar.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/document-check.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/document-check.svg
new file mode 100644
index 000000000..5ea7d9c6e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/document-check.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/document-duplicate.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/document-duplicate.svg
new file mode 100644
index 000000000..acc646403
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/document-duplicate.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/document-magnifying-glass.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/document-magnifying-glass.svg
new file mode 100644
index 000000000..f94eff6cc
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/document-magnifying-glass.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/document-minus.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/document-minus.svg
new file mode 100644
index 000000000..173cb1f30
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/document-minus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/document-plus.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/document-plus.svg
new file mode 100644
index 000000000..9ec31ad5f
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/document-plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/document-text.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/document-text.svg
new file mode 100644
index 000000000..cd77136f7
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/document-text.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/document.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/document.svg
new file mode 100644
index 000000000..863a8aa13
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/document.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/ellipsis-horizontal-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/ellipsis-horizontal-circle.svg
new file mode 100644
index 000000000..09aac5303
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/ellipsis-horizontal-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/ellipsis-horizontal.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/ellipsis-horizontal.svg
new file mode 100644
index 000000000..7541be5af
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/ellipsis-horizontal.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/ellipsis-vertical.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/ellipsis-vertical.svg
new file mode 100644
index 000000000..4676cf3c8
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/ellipsis-vertical.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/envelope-open.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/envelope-open.svg
new file mode 100644
index 000000000..ff9dccde6
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/envelope-open.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/envelope.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/envelope.svg
new file mode 100644
index 000000000..ae8ff727e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/envelope.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/exclamation-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/exclamation-circle.svg
new file mode 100644
index 000000000..25ef36fac
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/exclamation-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/exclamation-triangle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/exclamation-triangle.svg
new file mode 100644
index 000000000..c9742f1c3
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/exclamation-triangle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/eye-dropper.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/eye-dropper.svg
new file mode 100644
index 000000000..c7263e187
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/eye-dropper.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/eye-slash.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/eye-slash.svg
new file mode 100644
index 000000000..072c9f2ed
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/eye-slash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/eye.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/eye.svg
new file mode 100644
index 000000000..2a54d63d5
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/eye.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/face-frown.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/face-frown.svg
new file mode 100644
index 000000000..ba0cab32b
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/face-frown.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/face-smile.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/face-smile.svg
new file mode 100644
index 000000000..5246524eb
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/face-smile.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/film.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/film.svg
new file mode 100644
index 000000000..d76e59416
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/film.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/finger-print.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/finger-print.svg
new file mode 100644
index 000000000..0c1eeb278
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/finger-print.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/fire.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/fire.svg
new file mode 100644
index 000000000..54c974808
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/fire.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/flag.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/flag.svg
new file mode 100644
index 000000000..dff4126ca
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/flag.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/folder-arrow-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/folder-arrow-down.svg
new file mode 100644
index 000000000..96290cd0c
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/folder-arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/folder-minus.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/folder-minus.svg
new file mode 100644
index 000000000..824cb0e1e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/folder-minus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/folder-open.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/folder-open.svg
new file mode 100644
index 000000000..0721502a7
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/folder-open.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/folder-plus.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/folder-plus.svg
new file mode 100644
index 000000000..3df62d243
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/folder-plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/folder.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/folder.svg
new file mode 100644
index 000000000..305481927
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/folder.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/forward.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/forward.svg
new file mode 100644
index 000000000..cc80dc932
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/forward.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/funnel.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/funnel.svg
new file mode 100644
index 000000000..338fa522a
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/funnel.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/gif.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/gif.svg
new file mode 100644
index 000000000..ba8a18673
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/gif.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/gift-top.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/gift-top.svg
new file mode 100644
index 000000000..055b6d2d4
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/gift-top.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/gift.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/gift.svg
new file mode 100644
index 000000000..54458156d
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/gift.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/globe-alt.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/globe-alt.svg
new file mode 100644
index 000000000..a605be00a
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/globe-alt.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/globe-americas.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/globe-americas.svg
new file mode 100644
index 000000000..5d1a5cb70
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/globe-americas.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/globe-asia-australia.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/globe-asia-australia.svg
new file mode 100644
index 000000000..f4898fa60
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/globe-asia-australia.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/globe-europe-africa.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/globe-europe-africa.svg
new file mode 100644
index 000000000..c8f797dc5
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/globe-europe-africa.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/hand-raised.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/hand-raised.svg
new file mode 100644
index 000000000..859f1abcb
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/hand-raised.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/hand-thumb-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/hand-thumb-down.svg
new file mode 100644
index 000000000..c588a5325
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/hand-thumb-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/hand-thumb-up.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/hand-thumb-up.svg
new file mode 100644
index 000000000..66ca9c320
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/hand-thumb-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/hashtag.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/hashtag.svg
new file mode 100644
index 000000000..3ae10603e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/hashtag.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/heart.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/heart.svg
new file mode 100644
index 000000000..108476828
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/heart.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/home-modern.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/home-modern.svg
new file mode 100644
index 000000000..20f4e2c22
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/home-modern.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/home.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/home.svg
new file mode 100644
index 000000000..95433758b
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/home.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/identification.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/identification.svg
new file mode 100644
index 000000000..bfd302a18
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/identification.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/inbox-arrow-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/inbox-arrow-down.svg
new file mode 100644
index 000000000..db6ebda2e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/inbox-arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/inbox-stack.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/inbox-stack.svg
new file mode 100644
index 000000000..6c1e55c7f
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/inbox-stack.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/inbox.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/inbox.svg
new file mode 100644
index 000000000..56b35cb07
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/inbox.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/information-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/information-circle.svg
new file mode 100644
index 000000000..c7fa9d700
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/information-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/key.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/key.svg
new file mode 100644
index 000000000..e9684cd19
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/key.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/language.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/language.svg
new file mode 100644
index 000000000..0c606ef3c
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/language.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/lifebuoy.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/lifebuoy.svg
new file mode 100644
index 000000000..1660e9912
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/lifebuoy.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/light-bulb.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/light-bulb.svg
new file mode 100644
index 000000000..e3f2d9a72
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/light-bulb.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/link.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/link.svg
new file mode 100644
index 000000000..916a7038a
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/link.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/list-bullet.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/list-bullet.svg
new file mode 100644
index 000000000..147457322
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/list-bullet.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/lock-closed.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/lock-closed.svg
new file mode 100644
index 000000000..08b23c99d
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/lock-closed.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/lock-open.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/lock-open.svg
new file mode 100644
index 000000000..c5595dde8
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/lock-open.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/magnifying-glass-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/magnifying-glass-circle.svg
new file mode 100644
index 000000000..e71f8bff0
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/magnifying-glass-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/magnifying-glass-minus.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/magnifying-glass-minus.svg
new file mode 100644
index 000000000..6bd11c16f
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/magnifying-glass-minus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/magnifying-glass-plus.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/magnifying-glass-plus.svg
new file mode 100644
index 000000000..5dab7de0c
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/magnifying-glass-plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/magnifying-glass.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/magnifying-glass.svg
new file mode 100644
index 000000000..7cff88fc7
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/magnifying-glass.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/map-pin.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/map-pin.svg
new file mode 100644
index 000000000..1f272f4e4
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/map-pin.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/map.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/map.svg
new file mode 100644
index 000000000..f96c988ac
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/map.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/megaphone.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/megaphone.svg
new file mode 100644
index 000000000..ec1950814
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/megaphone.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/microphone.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/microphone.svg
new file mode 100644
index 000000000..670b34f23
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/microphone.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/minus-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/minus-circle.svg
new file mode 100644
index 000000000..b9630fc69
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/minus-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/minus-small.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/minus-small.svg
new file mode 100644
index 000000000..3e1a8b75d
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/minus-small.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/minus.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/minus.svg
new file mode 100644
index 000000000..781994c3d
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/minus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/moon.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/moon.svg
new file mode 100644
index 000000000..91501fd91
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/moon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/musical-note.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/musical-note.svg
new file mode 100644
index 000000000..c0667fc73
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/musical-note.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/newspaper.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/newspaper.svg
new file mode 100644
index 000000000..0a4ac573e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/newspaper.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/no-symbol.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/no-symbol.svg
new file mode 100644
index 000000000..19b0bd0ae
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/no-symbol.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/paint-brush.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/paint-brush.svg
new file mode 100644
index 000000000..b66098ffb
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/paint-brush.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/paper-airplane.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/paper-airplane.svg
new file mode 100644
index 000000000..32da43eae
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/paper-airplane.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/paper-clip.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/paper-clip.svg
new file mode 100644
index 000000000..1d78d81df
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/paper-clip.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/pause-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/pause-circle.svg
new file mode 100644
index 000000000..a9a9e9350
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/pause-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/pause.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/pause.svg
new file mode 100644
index 000000000..9843f7be2
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/pause.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/pencil-square.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/pencil-square.svg
new file mode 100644
index 000000000..3de435b8e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/pencil-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/pencil.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/pencil.svg
new file mode 100644
index 000000000..0c8759a94
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/pencil.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/phone-arrow-down-left.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/phone-arrow-down-left.svg
new file mode 100644
index 000000000..b1b2e6116
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/phone-arrow-down-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/phone-arrow-up-right.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/phone-arrow-up-right.svg
new file mode 100644
index 000000000..faaf659b9
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/phone-arrow-up-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/phone-x-mark.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/phone-x-mark.svg
new file mode 100644
index 000000000..0b8de6dbb
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/phone-x-mark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/phone.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/phone.svg
new file mode 100644
index 000000000..6f73149e0
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/phone.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/photo.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/photo.svg
new file mode 100644
index 000000000..6982a1157
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/photo.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/play-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/play-circle.svg
new file mode 100644
index 000000000..3a2fa635d
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/play-circle.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/play-pause.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/play-pause.svg
new file mode 100644
index 000000000..4ce4e55ed
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/play-pause.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/play.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/play.svg
new file mode 100644
index 000000000..c0ae6ded1
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/play.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/plus-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/plus-circle.svg
new file mode 100644
index 000000000..4da4d1f1a
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/plus-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/plus-small.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/plus-small.svg
new file mode 100644
index 000000000..991ed599c
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/plus-small.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/plus.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/plus.svg
new file mode 100644
index 000000000..048081734
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/power.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/power.svg
new file mode 100644
index 000000000..c4b2706a3
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/power.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/presentation-chart-bar.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/presentation-chart-bar.svg
new file mode 100644
index 000000000..87d8a6dc2
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/presentation-chart-bar.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/presentation-chart-line.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/presentation-chart-line.svg
new file mode 100644
index 000000000..2262e1f56
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/presentation-chart-line.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/printer.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/printer.svg
new file mode 100644
index 000000000..6f7c5facb
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/printer.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/puzzle-piece.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/puzzle-piece.svg
new file mode 100644
index 000000000..13aa1a530
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/puzzle-piece.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/qr-code.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/qr-code.svg
new file mode 100644
index 000000000..662a4bd24
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/qr-code.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/question-mark-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/question-mark-circle.svg
new file mode 100644
index 000000000..9fb25421a
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/question-mark-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/queue-list.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/queue-list.svg
new file mode 100644
index 000000000..91c3f1126
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/queue-list.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/radio.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/radio.svg
new file mode 100644
index 000000000..f9c177aeb
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/radio.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/receipt-percent.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/receipt-percent.svg
new file mode 100644
index 000000000..2d1925594
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/receipt-percent.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/receipt-refund.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/receipt-refund.svg
new file mode 100644
index 000000000..dc569fc15
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/receipt-refund.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/rectangle-group.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/rectangle-group.svg
new file mode 100644
index 000000000..b18496486
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/rectangle-group.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/rectangle-stack.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/rectangle-stack.svg
new file mode 100644
index 000000000..e1c0272c5
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/rectangle-stack.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/rocket-launch.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/rocket-launch.svg
new file mode 100644
index 000000000..6400ee8f6
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/rocket-launch.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/rss.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/rss.svg
new file mode 100644
index 000000000..1c36b21f3
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/rss.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/scale.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/scale.svg
new file mode 100644
index 000000000..500e3c665
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/scale.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/scissors.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/scissors.svg
new file mode 100644
index 000000000..a23dc8163
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/scissors.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/server-stack.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/server-stack.svg
new file mode 100644
index 000000000..3b7fe3230
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/server-stack.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/server.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/server.svg
new file mode 100644
index 000000000..c1675f34b
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/server.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/share.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/share.svg
new file mode 100644
index 000000000..125b6d1ad
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/share.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/shield-check.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/shield-check.svg
new file mode 100644
index 000000000..f9fa2b9f2
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/shield-check.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/shield-exclamation.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/shield-exclamation.svg
new file mode 100644
index 000000000..b52a2ff1d
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/shield-exclamation.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/shopping-bag.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/shopping-bag.svg
new file mode 100644
index 000000000..f5a51bde8
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/shopping-bag.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/shopping-cart.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/shopping-cart.svg
new file mode 100644
index 000000000..661477ba4
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/shopping-cart.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/signal-slash.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/signal-slash.svg
new file mode 100644
index 000000000..62992c3e6
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/signal-slash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/signal.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/signal.svg
new file mode 100644
index 000000000..56114d3ab
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/signal.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/sparkles.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/sparkles.svg
new file mode 100644
index 000000000..5a78b0961
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/sparkles.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/speaker-wave.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/speaker-wave.svg
new file mode 100644
index 000000000..1b6dde78c
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/speaker-wave.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/speaker-x-mark.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/speaker-x-mark.svg
new file mode 100644
index 000000000..427e21e56
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/speaker-x-mark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/square-2-stack.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/square-2-stack.svg
new file mode 100644
index 000000000..bc5e253bb
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/square-2-stack.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/square-3-stack-3d.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/square-3-stack-3d.svg
new file mode 100644
index 000000000..8af2704ab
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/square-3-stack-3d.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/squares-2x2.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/squares-2x2.svg
new file mode 100644
index 000000000..601366d56
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/squares-2x2.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/squares-plus.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/squares-plus.svg
new file mode 100644
index 000000000..b8033c119
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/squares-plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/star.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/star.svg
new file mode 100644
index 000000000..98aa481a1
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/star.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/stop-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/stop-circle.svg
new file mode 100644
index 000000000..b570e8e36
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/stop-circle.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/stop.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/stop.svg
new file mode 100644
index 000000000..4ee917a0f
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/stop.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/sun.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/sun.svg
new file mode 100644
index 000000000..5667cb3b5
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/sun.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/swatch.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/swatch.svg
new file mode 100644
index 000000000..5b136ebd5
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/swatch.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/table-cells.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/table-cells.svg
new file mode 100644
index 000000000..cb37937df
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/table-cells.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/tag.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/tag.svg
new file mode 100644
index 000000000..9620545eb
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/tag.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/ticket.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/ticket.svg
new file mode 100644
index 000000000..da2d69e06
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/ticket.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/trash.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/trash.svg
new file mode 100644
index 000000000..0d32d58b4
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/trash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/trophy.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/trophy.svg
new file mode 100644
index 000000000..f846e52df
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/trophy.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/truck.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/truck.svg
new file mode 100644
index 000000000..6e1ea69e7
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/truck.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/tv.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/tv.svg
new file mode 100644
index 000000000..7b8a706ad
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/tv.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/user-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/user-circle.svg
new file mode 100644
index 000000000..a177f2697
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/user-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/user-group.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/user-group.svg
new file mode 100644
index 000000000..4e7089b6b
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/user-group.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/user-minus.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/user-minus.svg
new file mode 100644
index 000000000..703478e51
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/user-minus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/user-plus.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/user-plus.svg
new file mode 100644
index 000000000..24533d10e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/user-plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/user.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/user.svg
new file mode 100644
index 000000000..e9b6c20be
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/user.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/users.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/users.svg
new file mode 100644
index 000000000..87304a0d3
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/users.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/variable.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/variable.svg
new file mode 100644
index 000000000..81fab0409
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/variable.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/video-camera-slash.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/video-camera-slash.svg
new file mode 100644
index 000000000..d1de13e76
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/video-camera-slash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/video-camera.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/video-camera.svg
new file mode 100644
index 000000000..aae1a198d
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/video-camera.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/view-columns.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/view-columns.svg
new file mode 100644
index 000000000..22a668e8f
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/view-columns.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/viewfinder-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/viewfinder-circle.svg
new file mode 100644
index 000000000..0583eef52
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/viewfinder-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/wallet.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/wallet.svg
new file mode 100644
index 000000000..8f19d644d
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/wallet.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/wifi.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/wifi.svg
new file mode 100644
index 000000000..084b3e13f
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/wifi.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/window.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/window.svg
new file mode 100644
index 000000000..4ffea7112
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/window.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/wrench-screwdriver.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/wrench-screwdriver.svg
new file mode 100644
index 000000000..1023ae9da
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/wrench-screwdriver.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/wrench.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/wrench.svg
new file mode 100644
index 000000000..de3a6e2cf
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/wrench.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/x-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/x-circle.svg
new file mode 100644
index 000000000..294ba2086
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/x-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/x-mark.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/x-mark.svg
new file mode 100644
index 000000000..a6d9eb7f0
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/outline/x-mark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/academic-cap.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/academic-cap.svg
new file mode 100644
index 000000000..2a13ef280
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/academic-cap.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/adjustments-horizontal.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/adjustments-horizontal.svg
new file mode 100644
index 000000000..ed9b95007
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/adjustments-horizontal.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/adjustments-vertical.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/adjustments-vertical.svg
new file mode 100644
index 000000000..fc4b90ccf
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/adjustments-vertical.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/archive-box-arrow-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/archive-box-arrow-down.svg
new file mode 100644
index 000000000..5999b72af
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/archive-box-arrow-down.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/archive-box-x-mark.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/archive-box-x-mark.svg
new file mode 100644
index 000000000..e7dd0d652
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/archive-box-x-mark.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/archive-box.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/archive-box.svg
new file mode 100644
index 000000000..74e0471dc
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/archive-box.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-down-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-down-circle.svg
new file mode 100644
index 000000000..c85a4ff93
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-down-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-down-left.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-down-left.svg
new file mode 100644
index 000000000..5cd0d4dc6
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-down-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-down-on-square-stack.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-down-on-square-stack.svg
new file mode 100644
index 000000000..d2ef0b302
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-down-on-square-stack.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-down-on-square.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-down-on-square.svg
new file mode 100644
index 000000000..35eab418b
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-down-on-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-down-right.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-down-right.svg
new file mode 100644
index 000000000..8c60942e6
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-down-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-down-tray.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-down-tray.svg
new file mode 100644
index 000000000..a18c62d94
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-down-tray.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-down.svg
new file mode 100644
index 000000000..5cb396baa
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-left-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-left-circle.svg
new file mode 100644
index 000000000..a937f8efb
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-left-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-left-on-rectangle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-left-on-rectangle.svg
new file mode 100644
index 000000000..972a85e77
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-left-on-rectangle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-left.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-left.svg
new file mode 100644
index 000000000..51bef7083
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-long-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-long-down.svg
new file mode 100644
index 000000000..891774e73
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-long-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-long-left.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-long-left.svg
new file mode 100644
index 000000000..aa12c0c8c
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-long-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-long-right.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-long-right.svg
new file mode 100644
index 000000000..0bcb6a0e7
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-long-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-long-up.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-long-up.svg
new file mode 100644
index 000000000..b36d8e080
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-long-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-path-rounded-square.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-path-rounded-square.svg
new file mode 100644
index 000000000..0808a5723
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-path-rounded-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-path.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-path.svg
new file mode 100644
index 000000000..48a71fd1a
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-path.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-right-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-right-circle.svg
new file mode 100644
index 000000000..424f75a43
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-right-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-right-on-rectangle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-right-on-rectangle.svg
new file mode 100644
index 000000000..73a7a7eb1
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-right-on-rectangle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-right.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-right.svg
new file mode 100644
index 000000000..1b1bbd1f7
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-small-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-small-down.svg
new file mode 100644
index 000000000..790993f59
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-small-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-small-left.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-small-left.svg
new file mode 100644
index 000000000..231b1b258
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-small-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-small-right.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-small-right.svg
new file mode 100644
index 000000000..5d9126126
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-small-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-small-up.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-small-up.svg
new file mode 100644
index 000000000..33b31cfde
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-small-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-top-right-on-square.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-top-right-on-square.svg
new file mode 100644
index 000000000..ac1bc3772
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-top-right-on-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-trending-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-trending-down.svg
new file mode 100644
index 000000000..f46b6098e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-trending-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-trending-up.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-trending-up.svg
new file mode 100644
index 000000000..f2ece6e4f
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-trending-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-up-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-up-circle.svg
new file mode 100644
index 000000000..0a9999ff6
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-up-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-up-left.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-up-left.svg
new file mode 100644
index 000000000..b6f9c2e7d
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-up-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-up-on-square-stack.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-up-on-square-stack.svg
new file mode 100644
index 000000000..b661da7ab
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-up-on-square-stack.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-up-on-square.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-up-on-square.svg
new file mode 100644
index 000000000..cba893e0f
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-up-on-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-up-right.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-up-right.svg
new file mode 100644
index 000000000..7554631b0
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-up-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-up-tray.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-up-tray.svg
new file mode 100644
index 000000000..19093f6e2
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-up-tray.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-up.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-up.svg
new file mode 100644
index 000000000..16f6c79d9
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-uturn-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-uturn-down.svg
new file mode 100644
index 000000000..697502491
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-uturn-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-uturn-left.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-uturn-left.svg
new file mode 100644
index 000000000..f0b679a06
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-uturn-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-uturn-right.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-uturn-right.svg
new file mode 100644
index 000000000..2da0f98c6
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-uturn-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-uturn-up.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-uturn-up.svg
new file mode 100644
index 000000000..8cfe23d64
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrow-uturn-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrows-pointing-in.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrows-pointing-in.svg
new file mode 100644
index 000000000..604920f07
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrows-pointing-in.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrows-pointing-out.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrows-pointing-out.svg
new file mode 100644
index 000000000..2399662d3
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrows-pointing-out.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrows-right-left.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrows-right-left.svg
new file mode 100644
index 000000000..93fb7f11e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrows-right-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrows-up-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrows-up-down.svg
new file mode 100644
index 000000000..356e9ca3e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/arrows-up-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/at-symbol.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/at-symbol.svg
new file mode 100644
index 000000000..a02c654e7
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/at-symbol.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/backspace.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/backspace.svg
new file mode 100644
index 000000000..e5a79c211
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/backspace.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/backward.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/backward.svg
new file mode 100644
index 000000000..bdf2a01ae
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/backward.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/banknotes.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/banknotes.svg
new file mode 100644
index 000000000..1cc180396
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/banknotes.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bars-2.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bars-2.svg
new file mode 100644
index 000000000..6ee47abf8
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bars-2.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bars-3-bottom-left.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bars-3-bottom-left.svg
new file mode 100644
index 000000000..a804c1106
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bars-3-bottom-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bars-3-bottom-right.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bars-3-bottom-right.svg
new file mode 100644
index 000000000..2fd11ad9f
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bars-3-bottom-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bars-3-center-left.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bars-3-center-left.svg
new file mode 100644
index 000000000..9a2c17085
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bars-3-center-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bars-3.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bars-3.svg
new file mode 100644
index 000000000..85584e883
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bars-3.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bars-4.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bars-4.svg
new file mode 100644
index 000000000..e3591d154
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bars-4.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bars-arrow-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bars-arrow-down.svg
new file mode 100644
index 000000000..10140b859
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bars-arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bars-arrow-up.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bars-arrow-up.svg
new file mode 100644
index 000000000..4b3d4a7c0
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bars-arrow-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/battery-0.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/battery-0.svg
new file mode 100644
index 000000000..f03a73789
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/battery-0.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/battery-100.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/battery-100.svg
new file mode 100644
index 000000000..62e4ec923
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/battery-100.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/battery-50.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/battery-50.svg
new file mode 100644
index 000000000..63344d75e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/battery-50.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/beaker.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/beaker.svg
new file mode 100644
index 000000000..e0b73ccd7
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/beaker.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bell-alert.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bell-alert.svg
new file mode 100644
index 000000000..f280b00d8
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bell-alert.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bell-slash.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bell-slash.svg
new file mode 100644
index 000000000..0ef076cc9
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bell-slash.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bell-snooze.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bell-snooze.svg
new file mode 100644
index 000000000..cf93ae093
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bell-snooze.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bell.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bell.svg
new file mode 100644
index 000000000..818496e0e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bell.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bolt-slash.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bolt-slash.svg
new file mode 100644
index 000000000..59d24f74b
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bolt-slash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bolt.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bolt.svg
new file mode 100644
index 000000000..596c47a12
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bolt.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/book-open.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/book-open.svg
new file mode 100644
index 000000000..2e0a18113
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/book-open.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bookmark-slash.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bookmark-slash.svg
new file mode 100644
index 000000000..8435a0258
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bookmark-slash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bookmark-square.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bookmark-square.svg
new file mode 100644
index 000000000..a4d3ca5b6
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bookmark-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bookmark.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bookmark.svg
new file mode 100644
index 000000000..e9f3fb71b
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bookmark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/briefcase.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/briefcase.svg
new file mode 100644
index 000000000..a66af5689
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/briefcase.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bug-ant.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bug-ant.svg
new file mode 100644
index 000000000..3c16cbccb
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/bug-ant.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/building-library.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/building-library.svg
new file mode 100644
index 000000000..90f86401c
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/building-library.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/building-office-2.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/building-office-2.svg
new file mode 100644
index 000000000..240eedbf8
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/building-office-2.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/building-office.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/building-office.svg
new file mode 100644
index 000000000..9883e33bf
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/building-office.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/building-storefront.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/building-storefront.svg
new file mode 100644
index 000000000..f3b54baf3
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/building-storefront.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/cake.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/cake.svg
new file mode 100644
index 000000000..f13b308f9
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/cake.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/calculator.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/calculator.svg
new file mode 100644
index 000000000..e058510e3
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/calculator.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/calendar-days.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/calendar-days.svg
new file mode 100644
index 000000000..0df9b163b
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/calendar-days.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/calendar.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/calendar.svg
new file mode 100644
index 000000000..27e208c30
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/calendar.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/camera.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/camera.svg
new file mode 100644
index 000000000..e58165d6b
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/camera.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chart-bar-square.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chart-bar-square.svg
new file mode 100644
index 000000000..d4af840af
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chart-bar-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chart-bar.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chart-bar.svg
new file mode 100644
index 000000000..abe5349ea
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chart-bar.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chart-pie.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chart-pie.svg
new file mode 100644
index 000000000..5aea729a8
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chart-pie.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chat-bubble-bottom-center-text.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chat-bubble-bottom-center-text.svg
new file mode 100644
index 000000000..bff24c4b9
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chat-bubble-bottom-center-text.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chat-bubble-bottom-center.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chat-bubble-bottom-center.svg
new file mode 100644
index 000000000..eab7a4189
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chat-bubble-bottom-center.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chat-bubble-left-ellipsis.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chat-bubble-left-ellipsis.svg
new file mode 100644
index 000000000..1ee6159d3
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chat-bubble-left-ellipsis.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chat-bubble-left-right.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chat-bubble-left-right.svg
new file mode 100644
index 000000000..80ad26d82
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chat-bubble-left-right.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chat-bubble-left.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chat-bubble-left.svg
new file mode 100644
index 000000000..3dd81b798
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chat-bubble-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chat-bubble-oval-left-ellipsis.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chat-bubble-oval-left-ellipsis.svg
new file mode 100644
index 000000000..815c6d756
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chat-bubble-oval-left-ellipsis.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chat-bubble-oval-left.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chat-bubble-oval-left.svg
new file mode 100644
index 000000000..473b921c0
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chat-bubble-oval-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/check-badge.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/check-badge.svg
new file mode 100644
index 000000000..058b329f1
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/check-badge.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/check-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/check-circle.svg
new file mode 100644
index 000000000..2b9083136
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/check-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/check.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/check.svg
new file mode 100644
index 000000000..2a6bc17dd
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/check.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chevron-double-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chevron-double-down.svg
new file mode 100644
index 000000000..ddbe304a8
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chevron-double-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chevron-double-left.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chevron-double-left.svg
new file mode 100644
index 000000000..5c6539d63
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chevron-double-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chevron-double-right.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chevron-double-right.svg
new file mode 100644
index 000000000..7e25238ed
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chevron-double-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chevron-double-up.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chevron-double-up.svg
new file mode 100644
index 000000000..029e6871d
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chevron-double-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chevron-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chevron-down.svg
new file mode 100644
index 000000000..4f9ce7e95
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chevron-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chevron-left.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chevron-left.svg
new file mode 100644
index 000000000..2d89e8b26
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chevron-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chevron-right.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chevron-right.svg
new file mode 100644
index 000000000..36e4859be
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chevron-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chevron-up-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chevron-up-down.svg
new file mode 100644
index 000000000..58edbc3fa
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chevron-up-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chevron-up.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chevron-up.svg
new file mode 100644
index 000000000..9abe9cd1f
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/chevron-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/circle-stack.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/circle-stack.svg
new file mode 100644
index 000000000..5a49d8022
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/circle-stack.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/clipboard-document-check.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/clipboard-document-check.svg
new file mode 100644
index 000000000..21ec021e7
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/clipboard-document-check.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/clipboard-document-list.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/clipboard-document-list.svg
new file mode 100644
index 000000000..d60bed5f5
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/clipboard-document-list.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/clipboard-document.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/clipboard-document.svg
new file mode 100644
index 000000000..d70b70830
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/clipboard-document.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/clipboard.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/clipboard.svg
new file mode 100644
index 000000000..c09970f2c
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/clipboard.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/clock.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/clock.svg
new file mode 100644
index 000000000..1d6fb4a61
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/clock.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/cloud-arrow-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/cloud-arrow-down.svg
new file mode 100644
index 000000000..d6cf7c5ed
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/cloud-arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/cloud-arrow-up.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/cloud-arrow-up.svg
new file mode 100644
index 000000000..7e0dceed9
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/cloud-arrow-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/cloud.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/cloud.svg
new file mode 100644
index 000000000..95d0c733a
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/cloud.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/code-bracket-square.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/code-bracket-square.svg
new file mode 100644
index 000000000..103f73be8
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/code-bracket-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/code-bracket.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/code-bracket.svg
new file mode 100644
index 000000000..9f331efe4
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/code-bracket.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/cog-6-tooth.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/cog-6-tooth.svg
new file mode 100644
index 000000000..ba6fca5de
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/cog-6-tooth.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/cog-8-tooth.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/cog-8-tooth.svg
new file mode 100644
index 000000000..9b9b1a614
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/cog-8-tooth.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/cog.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/cog.svg
new file mode 100644
index 000000000..e854f7305
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/cog.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/command-line.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/command-line.svg
new file mode 100644
index 000000000..e2a0af88d
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/command-line.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/computer-desktop.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/computer-desktop.svg
new file mode 100644
index 000000000..5b7f2efa8
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/computer-desktop.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/cpu-chip.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/cpu-chip.svg
new file mode 100644
index 000000000..e20f6fb08
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/cpu-chip.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/credit-card.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/credit-card.svg
new file mode 100644
index 000000000..fe4dc14ee
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/credit-card.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/cube-transparent.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/cube-transparent.svg
new file mode 100644
index 000000000..5577f2682
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/cube-transparent.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/cube.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/cube.svg
new file mode 100644
index 000000000..b0029f265
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/cube.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/currency-bangladeshi.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/currency-bangladeshi.svg
new file mode 100644
index 000000000..ca13c68ad
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/currency-bangladeshi.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/currency-dollar.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/currency-dollar.svg
new file mode 100644
index 000000000..e0155df48
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/currency-dollar.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/currency-euro.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/currency-euro.svg
new file mode 100644
index 000000000..2926c252d
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/currency-euro.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/currency-pound.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/currency-pound.svg
new file mode 100644
index 000000000..547f725bb
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/currency-pound.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/currency-rupee.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/currency-rupee.svg
new file mode 100644
index 000000000..2ee9b46bb
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/currency-rupee.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/currency-yen.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/currency-yen.svg
new file mode 100644
index 000000000..65ef9bc41
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/currency-yen.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/cursor-arrow-rays.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/cursor-arrow-rays.svg
new file mode 100644
index 000000000..c0e462ba8
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/cursor-arrow-rays.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/cursor-arrow-ripple.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/cursor-arrow-ripple.svg
new file mode 100644
index 000000000..867faa415
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/cursor-arrow-ripple.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/device-phone-mobile.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/device-phone-mobile.svg
new file mode 100644
index 000000000..eec0738e3
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/device-phone-mobile.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/device-tablet.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/device-tablet.svg
new file mode 100644
index 000000000..88e2cc811
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/device-tablet.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/document-arrow-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/document-arrow-down.svg
new file mode 100644
index 000000000..77ac19cca
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/document-arrow-down.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/document-arrow-up.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/document-arrow-up.svg
new file mode 100644
index 000000000..bc26cb916
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/document-arrow-up.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/document-chart-bar.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/document-chart-bar.svg
new file mode 100644
index 000000000..83d0eacf1
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/document-chart-bar.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/document-check.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/document-check.svg
new file mode 100644
index 000000000..e82785444
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/document-check.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/document-duplicate.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/document-duplicate.svg
new file mode 100644
index 000000000..fa7375d40
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/document-duplicate.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/document-magnifying-glass.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/document-magnifying-glass.svg
new file mode 100644
index 000000000..ab165f71a
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/document-magnifying-glass.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/document-minus.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/document-minus.svg
new file mode 100644
index 000000000..265c6ebfd
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/document-minus.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/document-plus.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/document-plus.svg
new file mode 100644
index 000000000..5e314595c
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/document-plus.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/document-text.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/document-text.svg
new file mode 100644
index 000000000..73b30cd05
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/document-text.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/document.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/document.svg
new file mode 100644
index 000000000..a05f20f1a
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/document.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/ellipsis-horizontal-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/ellipsis-horizontal-circle.svg
new file mode 100644
index 000000000..6ec2b50f3
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/ellipsis-horizontal-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/ellipsis-horizontal.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/ellipsis-horizontal.svg
new file mode 100644
index 000000000..ddb5a3fec
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/ellipsis-horizontal.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/ellipsis-vertical.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/ellipsis-vertical.svg
new file mode 100644
index 000000000..792c0aeb8
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/ellipsis-vertical.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/envelope-open.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/envelope-open.svg
new file mode 100644
index 000000000..e6bf97b38
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/envelope-open.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/envelope.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/envelope.svg
new file mode 100644
index 000000000..702341b85
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/envelope.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/exclamation-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/exclamation-circle.svg
new file mode 100644
index 000000000..fdaadc0e7
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/exclamation-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/exclamation-triangle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/exclamation-triangle.svg
new file mode 100644
index 000000000..627a71220
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/exclamation-triangle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/eye-dropper.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/eye-dropper.svg
new file mode 100644
index 000000000..15b16d043
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/eye-dropper.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/eye-slash.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/eye-slash.svg
new file mode 100644
index 000000000..11ef99b0b
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/eye-slash.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/eye.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/eye.svg
new file mode 100644
index 000000000..a648db3b7
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/eye.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/face-frown.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/face-frown.svg
new file mode 100644
index 000000000..7040d58cc
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/face-frown.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/face-smile.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/face-smile.svg
new file mode 100644
index 000000000..d5e75a2d7
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/face-smile.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/film.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/film.svg
new file mode 100644
index 000000000..fbd26cc9d
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/film.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/finger-print.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/finger-print.svg
new file mode 100644
index 000000000..68e72b45b
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/finger-print.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/fire.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/fire.svg
new file mode 100644
index 000000000..93b1b1fc3
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/fire.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/flag.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/flag.svg
new file mode 100644
index 000000000..8c67b013c
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/flag.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/folder-arrow-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/folder-arrow-down.svg
new file mode 100644
index 000000000..5d963b4f8
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/folder-arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/folder-minus.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/folder-minus.svg
new file mode 100644
index 000000000..d0292b84d
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/folder-minus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/folder-open.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/folder-open.svg
new file mode 100644
index 000000000..b9d80ba8d
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/folder-open.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/folder-plus.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/folder-plus.svg
new file mode 100644
index 000000000..efaf94942
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/folder-plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/folder.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/folder.svg
new file mode 100644
index 000000000..a7847f894
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/folder.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/forward.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/forward.svg
new file mode 100644
index 000000000..de9086342
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/forward.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/funnel.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/funnel.svg
new file mode 100644
index 000000000..fe5699f9f
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/funnel.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/gif.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/gif.svg
new file mode 100644
index 000000000..283e6e521
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/gif.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/gift-top.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/gift-top.svg
new file mode 100644
index 000000000..4bd4e6fec
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/gift-top.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/gift.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/gift.svg
new file mode 100644
index 000000000..2ca6c9293
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/gift.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/globe-alt.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/globe-alt.svg
new file mode 100644
index 000000000..0cbacaeff
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/globe-alt.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/globe-americas.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/globe-americas.svg
new file mode 100644
index 000000000..5ae0d5dae
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/globe-americas.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/globe-asia-australia.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/globe-asia-australia.svg
new file mode 100644
index 000000000..14249d63f
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/globe-asia-australia.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/globe-europe-africa.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/globe-europe-africa.svg
new file mode 100644
index 000000000..49a78fd3d
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/globe-europe-africa.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/hand-raised.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/hand-raised.svg
new file mode 100644
index 000000000..1717d5111
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/hand-raised.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/hand-thumb-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/hand-thumb-down.svg
new file mode 100644
index 000000000..7a2b9a61b
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/hand-thumb-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/hand-thumb-up.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/hand-thumb-up.svg
new file mode 100644
index 000000000..4942d2d46
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/hand-thumb-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/hashtag.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/hashtag.svg
new file mode 100644
index 000000000..29e677d3f
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/hashtag.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/heart.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/heart.svg
new file mode 100644
index 000000000..b5f0d9507
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/heart.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/home-modern.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/home-modern.svg
new file mode 100644
index 000000000..488685a6f
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/home-modern.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/home.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/home.svg
new file mode 100644
index 000000000..ec0bae18f
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/home.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/identification.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/identification.svg
new file mode 100644
index 000000000..829b24d58
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/identification.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/inbox-arrow-down.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/inbox-arrow-down.svg
new file mode 100644
index 000000000..4fd220bdb
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/inbox-arrow-down.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/inbox-stack.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/inbox-stack.svg
new file mode 100644
index 000000000..fffab993f
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/inbox-stack.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/inbox.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/inbox.svg
new file mode 100644
index 000000000..b74380ece
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/inbox.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/information-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/information-circle.svg
new file mode 100644
index 000000000..bd2723b51
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/information-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/key.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/key.svg
new file mode 100644
index 000000000..6acee2774
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/key.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/language.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/language.svg
new file mode 100644
index 000000000..60d1aee4c
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/language.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/lifebuoy.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/lifebuoy.svg
new file mode 100644
index 000000000..9ddc8d49b
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/lifebuoy.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/light-bulb.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/light-bulb.svg
new file mode 100644
index 000000000..ff49cb336
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/light-bulb.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/link.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/link.svg
new file mode 100644
index 000000000..a6dc09300
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/link.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/list-bullet.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/list-bullet.svg
new file mode 100644
index 000000000..7983877ad
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/list-bullet.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/lock-closed.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/lock-closed.svg
new file mode 100644
index 000000000..8a5a6d7cf
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/lock-closed.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/lock-open.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/lock-open.svg
new file mode 100644
index 000000000..4562f7ee3
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/lock-open.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/magnifying-glass-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/magnifying-glass-circle.svg
new file mode 100644
index 000000000..17a6f282e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/magnifying-glass-circle.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/magnifying-glass-minus.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/magnifying-glass-minus.svg
new file mode 100644
index 000000000..06ae161b3
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/magnifying-glass-minus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/magnifying-glass-plus.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/magnifying-glass-plus.svg
new file mode 100644
index 000000000..92040d0a9
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/magnifying-glass-plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/magnifying-glass.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/magnifying-glass.svg
new file mode 100644
index 000000000..b602e081d
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/magnifying-glass.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/map-pin.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/map-pin.svg
new file mode 100644
index 000000000..92e6785e4
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/map-pin.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/map.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/map.svg
new file mode 100644
index 000000000..9d4f7ddd0
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/map.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/megaphone.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/megaphone.svg
new file mode 100644
index 000000000..b1f1e1020
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/megaphone.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/microphone.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/microphone.svg
new file mode 100644
index 000000000..a5f4cb6a2
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/microphone.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/minus-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/minus-circle.svg
new file mode 100644
index 000000000..8c981ab60
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/minus-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/minus-small.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/minus-small.svg
new file mode 100644
index 000000000..782213ea3
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/minus-small.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/minus.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/minus.svg
new file mode 100644
index 000000000..1fa711709
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/minus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/moon.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/moon.svg
new file mode 100644
index 000000000..97d5c5a0d
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/moon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/musical-note.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/musical-note.svg
new file mode 100644
index 000000000..a9ab9b5ef
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/musical-note.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/newspaper.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/newspaper.svg
new file mode 100644
index 000000000..d1f2c1eb5
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/newspaper.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/no-symbol.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/no-symbol.svg
new file mode 100644
index 000000000..42eb7712e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/no-symbol.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/paint-brush.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/paint-brush.svg
new file mode 100644
index 000000000..35fd5a68e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/paint-brush.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/paper-airplane.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/paper-airplane.svg
new file mode 100644
index 000000000..9365a57b6
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/paper-airplane.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/paper-clip.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/paper-clip.svg
new file mode 100644
index 000000000..0a0dcddd6
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/paper-clip.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/pause-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/pause-circle.svg
new file mode 100644
index 000000000..4fe4f2b61
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/pause-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/pause.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/pause.svg
new file mode 100644
index 000000000..2e121ace1
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/pause.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/pencil-square.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/pencil-square.svg
new file mode 100644
index 000000000..5f4aaf8c7
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/pencil-square.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/pencil.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/pencil.svg
new file mode 100644
index 000000000..78ec61a38
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/pencil.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/phone-arrow-down-left.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/phone-arrow-down-left.svg
new file mode 100644
index 000000000..06f3ba01f
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/phone-arrow-down-left.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/phone-arrow-up-right.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/phone-arrow-up-right.svg
new file mode 100644
index 000000000..678c4f626
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/phone-arrow-up-right.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/phone-x-mark.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/phone-x-mark.svg
new file mode 100644
index 000000000..a017a7de1
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/phone-x-mark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/phone.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/phone.svg
new file mode 100644
index 000000000..ca2a6bc1a
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/phone.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/photo.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/photo.svg
new file mode 100644
index 000000000..57e023dbd
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/photo.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/play-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/play-circle.svg
new file mode 100644
index 000000000..752273aea
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/play-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/play-pause.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/play-pause.svg
new file mode 100644
index 000000000..e5bb17cd6
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/play-pause.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/play.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/play.svg
new file mode 100644
index 000000000..da0e4e2ea
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/play.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/plus-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/plus-circle.svg
new file mode 100644
index 000000000..b45f965bd
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/plus-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/plus-small.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/plus-small.svg
new file mode 100644
index 000000000..0c4b74432
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/plus-small.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/plus.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/plus.svg
new file mode 100644
index 000000000..85d3b1404
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/power.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/power.svg
new file mode 100644
index 000000000..2bf830f86
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/power.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/presentation-chart-bar.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/presentation-chart-bar.svg
new file mode 100644
index 000000000..cb0bc9aba
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/presentation-chart-bar.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/presentation-chart-line.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/presentation-chart-line.svg
new file mode 100644
index 000000000..54e10b2b0
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/presentation-chart-line.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/printer.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/printer.svg
new file mode 100644
index 000000000..4fce79102
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/printer.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/puzzle-piece.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/puzzle-piece.svg
new file mode 100644
index 000000000..4f85b374e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/puzzle-piece.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/qr-code.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/qr-code.svg
new file mode 100644
index 000000000..7f676cab4
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/qr-code.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/question-mark-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/question-mark-circle.svg
new file mode 100644
index 000000000..2ae51be97
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/question-mark-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/queue-list.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/queue-list.svg
new file mode 100644
index 000000000..536fd88b4
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/queue-list.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/radio.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/radio.svg
new file mode 100644
index 000000000..92ca5149e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/radio.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/receipt-percent.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/receipt-percent.svg
new file mode 100644
index 000000000..5eb637144
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/receipt-percent.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/receipt-refund.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/receipt-refund.svg
new file mode 100644
index 000000000..6a1a154e2
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/receipt-refund.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/rectangle-group.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/rectangle-group.svg
new file mode 100644
index 000000000..289d1985d
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/rectangle-group.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/rectangle-stack.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/rectangle-stack.svg
new file mode 100644
index 000000000..82a1334e6
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/rectangle-stack.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/rocket-launch.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/rocket-launch.svg
new file mode 100644
index 000000000..522fc6461
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/rocket-launch.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/rss.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/rss.svg
new file mode 100644
index 000000000..b9a8ab2e7
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/rss.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/scale.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/scale.svg
new file mode 100644
index 000000000..b7e57c7b0
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/scale.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/scissors.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/scissors.svg
new file mode 100644
index 000000000..9c971b38d
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/scissors.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/server-stack.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/server-stack.svg
new file mode 100644
index 000000000..c0d3074b9
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/server-stack.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/server.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/server.svg
new file mode 100644
index 000000000..55f9aedb4
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/server.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/share.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/share.svg
new file mode 100644
index 000000000..8f45dfcac
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/share.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/shield-check.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/shield-check.svg
new file mode 100644
index 000000000..2596ace48
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/shield-check.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/shield-exclamation.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/shield-exclamation.svg
new file mode 100644
index 000000000..ce53fcc15
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/shield-exclamation.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/shopping-bag.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/shopping-bag.svg
new file mode 100644
index 000000000..e6503ee38
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/shopping-bag.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/shopping-cart.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/shopping-cart.svg
new file mode 100644
index 000000000..931a12f5e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/shopping-cart.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/signal-slash.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/signal-slash.svg
new file mode 100644
index 000000000..21c65cb37
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/signal-slash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/signal.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/signal.svg
new file mode 100644
index 000000000..9027aef1c
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/signal.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/sparkles.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/sparkles.svg
new file mode 100644
index 000000000..0d8d0c190
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/sparkles.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/speaker-wave.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/speaker-wave.svg
new file mode 100644
index 000000000..bd84477f2
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/speaker-wave.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/speaker-x-mark.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/speaker-x-mark.svg
new file mode 100644
index 000000000..e71f1b672
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/speaker-x-mark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/square-2-stack.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/square-2-stack.svg
new file mode 100644
index 000000000..c3726a52b
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/square-2-stack.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/square-3-stack-3d.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/square-3-stack-3d.svg
new file mode 100644
index 000000000..8ed638ded
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/square-3-stack-3d.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/squares-2x2.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/squares-2x2.svg
new file mode 100644
index 000000000..475f6c3dc
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/squares-2x2.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/squares-plus.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/squares-plus.svg
new file mode 100644
index 000000000..88a2dda4d
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/squares-plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/star.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/star.svg
new file mode 100644
index 000000000..850981926
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/star.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/stop-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/stop-circle.svg
new file mode 100644
index 000000000..8e57a2c27
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/stop-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/stop.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/stop.svg
new file mode 100644
index 000000000..1bf426f61
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/stop.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/sun.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/sun.svg
new file mode 100644
index 000000000..1b597fa1b
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/sun.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/swatch.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/swatch.svg
new file mode 100644
index 000000000..9b26c0397
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/swatch.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/table-cells.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/table-cells.svg
new file mode 100644
index 000000000..151a30c1e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/table-cells.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/tag.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/tag.svg
new file mode 100644
index 000000000..efcd01bc0
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/tag.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/ticket.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/ticket.svg
new file mode 100644
index 000000000..e947c4166
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/ticket.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/trash.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/trash.svg
new file mode 100644
index 000000000..ed7bf43cd
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/trash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/trophy.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/trophy.svg
new file mode 100644
index 000000000..ed7ee1599
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/trophy.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/truck.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/truck.svg
new file mode 100644
index 000000000..c218da65f
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/truck.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/tv.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/tv.svg
new file mode 100644
index 000000000..8f270260f
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/tv.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/user-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/user-circle.svg
new file mode 100644
index 000000000..978d0b8d6
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/user-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/user-group.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/user-group.svg
new file mode 100644
index 000000000..7ae76006b
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/user-group.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/user-minus.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/user-minus.svg
new file mode 100644
index 000000000..062a7c94f
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/user-minus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/user-plus.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/user-plus.svg
new file mode 100644
index 000000000..ef313fa9c
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/user-plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/user.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/user.svg
new file mode 100644
index 000000000..207213d8b
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/user.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/users.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/users.svg
new file mode 100644
index 000000000..2959115d2
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/users.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/variable.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/variable.svg
new file mode 100644
index 000000000..5601cac1b
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/variable.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/video-camera-slash.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/video-camera-slash.svg
new file mode 100644
index 000000000..2a344d5a2
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/video-camera-slash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/video-camera.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/video-camera.svg
new file mode 100644
index 000000000..55bf7b4f4
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/video-camera.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/view-columns.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/view-columns.svg
new file mode 100644
index 000000000..f7295e371
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/view-columns.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/viewfinder-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/viewfinder-circle.svg
new file mode 100644
index 000000000..e04b727f7
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/viewfinder-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/wallet.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/wallet.svg
new file mode 100644
index 000000000..001b38a70
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/wallet.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/wifi.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/wifi.svg
new file mode 100644
index 000000000..eb4fd4e6e
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/wifi.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/window.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/window.svg
new file mode 100644
index 000000000..4de83b3f3
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/window.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/wrench-screwdriver.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/wrench-screwdriver.svg
new file mode 100644
index 000000000..b7e0e9e8d
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/wrench-screwdriver.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/wrench.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/wrench.svg
new file mode 100644
index 000000000..3b61d5b35
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/wrench.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/x-circle.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/x-circle.svg
new file mode 100644
index 000000000..913782adb
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/x-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/x-mark.svg b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/x-mark.svg
new file mode 100644
index 000000000..e525a8f05
--- /dev/null
+++ b/phoenix-1.7/counter/priv/hero_icons/optimized/24/solid/x-mark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/phoenix-1.7/counter/priv/static/favicon.ico b/phoenix-1.7/counter/priv/static/favicon.ico
new file mode 100644
index 000000000..73de524aa
Binary files /dev/null and b/phoenix-1.7/counter/priv/static/favicon.ico differ
diff --git a/phoenix-1.7/counter/priv/static/robots.txt b/phoenix-1.7/counter/priv/static/robots.txt
new file mode 100644
index 000000000..26e06b5f1
--- /dev/null
+++ b/phoenix-1.7/counter/priv/static/robots.txt
@@ -0,0 +1,5 @@
+# See https://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file
+#
+# To ban all spiders from the entire site uncomment the next two lines:
+# User-agent: *
+# Disallow: /
diff --git a/phoenix-1.7/counter/test/counter_web/controllers/error_html_test.exs b/phoenix-1.7/counter/test/counter_web/controllers/error_html_test.exs
new file mode 100644
index 000000000..4881cc2ec
--- /dev/null
+++ b/phoenix-1.7/counter/test/counter_web/controllers/error_html_test.exs
@@ -0,0 +1,14 @@
+defmodule CounterWeb.ErrorHTMLTest do
+ use CounterWeb.ConnCase, async: true
+
+ # Bring render_to_string/4 for testing custom views
+ import Phoenix.Template
+
+ test "renders 404.html" do
+ assert render_to_string(CounterWeb.ErrorHTML, "404", "html", []) == "Not Found"
+ end
+
+ test "renders 500.html" do
+ assert render_to_string(CounterWeb.ErrorHTML, "500", "html", []) == "Internal Server Error"
+ end
+end
diff --git a/phoenix-1.7/counter/test/counter_web/controllers/error_json_test.exs b/phoenix-1.7/counter/test/counter_web/controllers/error_json_test.exs
new file mode 100644
index 000000000..45f55445e
--- /dev/null
+++ b/phoenix-1.7/counter/test/counter_web/controllers/error_json_test.exs
@@ -0,0 +1,12 @@
+defmodule CounterWeb.ErrorJSONTest do
+ use CounterWeb.ConnCase, async: true
+
+ test "renders 404" do
+ assert CounterWeb.ErrorJSON.render("404.json", %{}) == %{errors: %{detail: "Not Found"}}
+ end
+
+ test "renders 500" do
+ assert CounterWeb.ErrorJSON.render("500.json", %{}) ==
+ %{errors: %{detail: "Internal Server Error"}}
+ end
+end
diff --git a/phoenix-1.7/counter/test/counter_web/controllers/page_controller_test.exs b/phoenix-1.7/counter/test/counter_web/controllers/page_controller_test.exs
new file mode 100644
index 000000000..60a08d603
--- /dev/null
+++ b/phoenix-1.7/counter/test/counter_web/controllers/page_controller_test.exs
@@ -0,0 +1,8 @@
+defmodule CounterWeb.PageControllerTest do
+ use CounterWeb.ConnCase
+
+ test "GET /", %{conn: conn} do
+ conn = get(conn, ~p"/")
+ assert html_response(conn, 200) =~ "Peace of mind from prototype to production"
+ end
+end
diff --git a/phoenix-1.7/counter/test/support/conn_case.ex b/phoenix-1.7/counter/test/support/conn_case.ex
new file mode 100644
index 000000000..96c8b988b
--- /dev/null
+++ b/phoenix-1.7/counter/test/support/conn_case.ex
@@ -0,0 +1,37 @@
+defmodule CounterWeb.ConnCase do
+ @moduledoc """
+ This module defines the test case to be used by
+ tests that require setting up a connection.
+
+ Such tests rely on `Phoenix.ConnTest` and also
+ import other functionality to make it easier
+ to build common data structures and query the data layer.
+
+ Finally, if the test case interacts with the database,
+ we enable the SQL sandbox, so changes done to the database
+ are reverted at the end of every test. If you are using
+ PostgreSQL, you can even run database tests asynchronously
+ by setting `use CounterWeb.ConnCase, async: true`, although
+ this option is not recommended for other databases.
+ """
+
+ use ExUnit.CaseTemplate
+
+ using do
+ quote do
+ # The default endpoint for testing
+ @endpoint CounterWeb.Endpoint
+
+ use CounterWeb, :verified_routes
+
+ # Import conveniences for testing with connections
+ import Plug.Conn
+ import Phoenix.ConnTest
+ import CounterWeb.ConnCase
+ end
+ end
+
+ setup _tags do
+ {:ok, conn: Phoenix.ConnTest.build_conn()}
+ end
+end
diff --git a/phoenix-1.7/counter/test/test_helper.exs b/phoenix-1.7/counter/test/test_helper.exs
new file mode 100644
index 000000000..869559e70
--- /dev/null
+++ b/phoenix-1.7/counter/test/test_helper.exs
@@ -0,0 +1 @@
+ExUnit.start()
diff --git a/progress.json b/progress.json
index c298c1f19..922afce87 100644
--- a/progress.json
+++ b/progress.json
@@ -9,23 +9,23 @@
"mazes_exercise": false,
"rollable_expressions_exercise": false,
"modules_reading": false,
- "file_reading": false,
+ "file_reading": true,
"agents_and_ets_reading": false,
"protocols_reading": false,
"games_score_tracker_exercise": false,
- "habit_tracker_exercise": false,
+ "habit_tracker_exercise": true,
"reduce_reading": false,
"code_editors_reading": false,
"exdoc_reading": false,
"process_drills_exercise": false,
"saferange_exercise": false,
- "time_converting_exercise": false,
+ "time_converting_exercise": true,
"pokemon_server_exercise": false,
"strings_reading": false,
"counting_votes_exercise": false,
"metric_conversion_exercise": false,
"shopping_list_exercise": false,
- "file_drills_exercise": false,
+ "file_drills_exercise": true,
"fibonacci_challenge_exercise": false,
"ecto_changeset_reading": false,
"comparison_operators_reading": false,
@@ -43,33 +43,33 @@
"pascals_triangle_exercise": false,
"book_search_book_content_reading": false,
"portfolio_exercise": false,
- "non_enumerables_reading": false,
+ "non_enumerables_reading": true,
"control_flow_reading": false,
"lists_vs_tuples_reading": false,
- "dominoes_exercise": false,
+ "dominoes_exercise": true,
"command_line_family_tree_exercise": false,
"phoenix_and_ecto_reading": false,
- "number_finder_exercise": false,
+ "number_finder_exercise": true,
"pic_chat_image_upload_reading": false,
- "timeline_exercise": false,
+ "timeline_exercise": true,
"newsletter_reading": false,
"advanced_pattern_matching_reading": false,
- "games_guessing_game_exercise": false,
+ "games_guessing_game_exercise": true,
"math_with_guards_exercise": false,
- "pokemon_api_exercise": false,
+ "pokemon_api_exercise": true,
"file_search_exercise": false,
- "animal_generator_exercise": false,
+ "animal_generator_exercise": true,
"group_project_blog_exercise": false,
"treasure_matching_exercise": false,
"github_engineering_journal_exercise": false,
- "mailbox_server_exercise": false,
+ "mailbox_server_exercise": true,
"blog_posts_exercise": false,
- "git_reading": false,
+ "git_reading": true,
"named_number_lists_exercise": false,
"big_o_notation_reading": false,
"battle_map_exercise": false,
"group_project_blog_presentation_exercise": false,
- "timer_exercise": false,
+ "timer_exercise": true,
"games_benchmarking_exercise": false,
"guessing_games_exercise": false,
"sign_up_form_exercise": false,
@@ -77,7 +77,7 @@
"caesar_cypher_exercise": false,
"booleans_reading": false,
"blog_comments_exercise": false,
- "anagram_exercise": false,
+ "anagram_exercise": true,
"lazy_product_filters_exercise": false,
"file_system_todo_app_exercise": false,
"phoenix_1.7_reading": false,
@@ -86,10 +86,10 @@
"github_collab_exercise": false,
"web_servers_reading": false,
"book_search_deployment_reading": false,
- "tic-tac-toe_exercise": false,
+ "tic-tac-toe_exercise": true,
"games_supervised_score_tracker_exercise": false,
"benchmarking_reading": false,
- "processes_reading": false,
+ "processes_reading": true,
"games_menu_exercise": false,
"supervised_mix_project_reading": false,
"liveview_reading": false,
@@ -97,12 +97,12 @@
"io_reading": false,
"tuples_reading": false,
"ranges_reading": false,
- "task_reading": false,
+ "task_reading": true,
"executables_reading": false,
"rdbms_reading": false,
"fun_formulas_exercise": false,
"rpg_dialogue_exercise": false,
- "palindrome_exercise": false,
+ "palindrome_exercise": true,
"comprehensions_reading": false,
"comments_reading": false,
"rock_paper_scissors_exercise": false,
@@ -112,24 +112,24 @@
"blog_seeding_exercise": false,
"custom_enum_with_recursion_exercise": false,
"drill-patternmatching-replace-nils_exercise": false,
- "games_rock_paper_scissors_exercise": false,
+ "games_rock_paper_scissors_exercise": true,
"blog_migration_exercise": false,
"inventory_management_exercise": false,
"iex_reading": false,
"phone_number_parsing_exercise": false,
"maps_reading": false,
- "exunit_reading": false,
+ "exunit_reading": true,
"keyword_lists_reading": false,
"command_line_reading": false,
"stack_exercise": false,
"traffic_light_server_exercise": false,
"supervisor_and_genserver_drills_exercise": false,
"computer_hardware_reading": false,
- "supervised_stack_exercise": false,
+ "supervised_stack_exercise": true,
"naming_numbers_exercise": false,
"deployment_exercise": false,
"typespecs_reading": false,
- "card_counting_exercise": false,
+ "card_counting_exercise": true,
"math_with_protocols_exercise": false,
"stack_server_exercise": false,
"pokemon_battle_exercise": false,
@@ -141,11 +141,11 @@
"blog_content_exercise": false,
"math_module_testing_exercise": false,
"phoenix_authentication_reading": false,
- "games_setup_exercise": false,
+ "games_setup_exercise": true,
"task_drills_exercise": false,
"monster_spawner_exercise": false,
"metaprogramming_reading": false,
- "start_here_reading": false,
+ "start_here_reading": true,
"games_supervisor_setup_exercise": false,
"pic_chat_pub_sub_reading": false,
"lists_reading": false,
@@ -153,18 +153,18 @@
"functions_reading": false,
"spoonacular_recipe_api_exercise": false,
"book_changeset_exercise": false,
- "weighted_voting_exercise": false,
+ "weighted_voting_exercise": true,
"supervisors_reading": false,
"save_game_exercise": false,
"document_tools_exercise": false,
"factorial_exercise": false,
- "livebook_reading": false,
- "filter_values_by_type_exercise": false,
+ "livebook_reading": true,
+ "filter_values_by_type_exercise": true,
"book_search_exercise": false,
"guards_reading": false,
"sql_drills_exercise": false,
"maps_mapsets_keyword_lists_reading": false,
- "lucas_numbers_exercise": false,
+ "lucas_numbers_exercise": true,
"mapset_product_filters_exercise": false,
"consumable_protocol_exercise": false,
"task_supervisor_reading": false,
@@ -180,13 +180,13 @@
"with_points_exercise": false,
"itinerary_exercise": false,
"apis_reading": false,
- "built-in_modules_reading": false,
+ "built-in_modules_reading": true,
"rps_pattern_matching_exercise": false,
"arithmetic_reading": false,
"rps_guards_exercise": false,
"book_search_tags_reading": false,
"email_validation_exercise": false,
- "custom_enum_with_reduce_exercise": false,
+ "custom_enum_with_reduce_exercise": true,
"blog_comment_form_exercise": false,
"doctests_reading": false,
"pic_chat_infinite_scroll_reading": false,
@@ -195,14 +195,14 @@
"strings_and_binaries_reading": false,
"phoenix_drills_exercise": false,
"html_css_reading": false,
- "score_tracker_exercise": false,
- "tailwind_reading": false,
+ "score_tracker_exercise": true,
+ "tailwind_reading": true,
"mapset_drills_exercise": false,
"book_search_books_reading": false,
"recursion_reading": false,
"in-memory_todo_list_exercise": false,
"capstone_project_guide_reading": false,
- "fibonacci_exercise": false,
+ "fibonacci_exercise": true,
"typespec_drills_exercise": false,
"custom_assertions_exercise": false,
"atoms_reading": false
diff --git a/reading/apis.livemd b/reading/apis.livemd
index 5b64ad6ee..ec5abccc9 100644
--- a/reading/apis.livemd
+++ b/reading/apis.livemd
@@ -236,6 +236,7 @@ Use [Jason.decode!/2](https://hexdocs.pm/jason/Jason.html#encode!/2) to decode t
```elixir
json = "{\"hello\"\: \"world\"}"
+Jason.decode(json)
```
## Poison
@@ -282,7 +283,7 @@ Private APIs require an API key to communicate with them. This key is then inclu
For example, the [Open Weather API](https://openweathermap.org/) requires an API key when making a GET request. The server returns a `401` unauthorized response without the correct API key.
```elixir
-api_key = ""
+api_key = "a492ee767808f098ff912f4afc1a2b8d"
HTTPoison.get("https://api.openweathermap.org/data/2.5/weather?lat=35&lon=139&appid=#{api_key}")
```
@@ -312,7 +313,7 @@ Use your API key and valid latitude/longitude coordinates to make a successful r
```elixir
lat = 35
lon = 139
-api_key = ""
+api_key = "a492ee767808f098ff912f4afc1a2b8d"
{:ok, response} =
HTTPoison.get(
diff --git a/reading/built-in_modules.livemd b/reading/built-in_modules.livemd
index 55aeaa455..d574b8f19 100644
--- a/reading/built-in_modules.livemd
+++ b/reading/built-in_modules.livemd
@@ -108,6 +108,7 @@ Use [Kernel.elem/2](https://hexdocs.pm/elixir/Kernel.html#elem/2) to retrieve `1
```elixir
tuple = {0, 4, 1, 100, 5, 7}
+elem(tuple, 3)
```
## Checking Types
@@ -149,31 +150,31 @@ is_atom(:example)
```
```elixir
-%{}
+is_map(%{})
```
```elixir
-{}
+is_map({})
```
```elixir
-[]
+is_list([])
```
```elixir
-true
+is_boolean(true)
```
```elixir
-1.0
+is_float(1.0)
```
```elixir
-1
+is_integer(1)
```
```elixir
-""
+is_binary("")
```
The [Kernel](https://hexdocs.pm/elixir/Kernel.html) is reasonably large. Remember, our goal is not to memorize every function but to develop familiarity with repeated practice.
@@ -213,8 +214,10 @@ Created a `capped_seconds` variable that uses the value of `seconds` and cannot
Enter your solution below. if `seconds` is less than `0` `capped_seconds` should be `0`. If `seconds` is greater than `59`, then `capped_seconds` should be `59`.
```elixir
-seconds = 60
-capped_seconds = nil
+seconds = 20
+# min(seconds, 59)
+# max(seconds, 0)
+capped_seconds = max(min(seconds, 59), 0)
```
## Safe Inspection
@@ -264,7 +267,8 @@ map = %{}
list = [1, 2, 3]
tuple = {1, 2, 3}
-""
+# ""
+inspect(tuple)
```
## The Integer Module
@@ -345,7 +349,7 @@ Use the [Integer.gcd/2](https://hexdocs.pm/elixir/Integer.html#gcd/2) function t
positive integer that divides both 10 and 15 evenly, so the result should be `5`.
```elixir
-
+Integer.gcd(10, 15)
```
## The String Module
@@ -427,7 +431,7 @@ Use the [String.at/2](https://hexdocs.pm/elixir/String.html#at/2) function to ge
```elixir
-"hello"
+String.at("hello", 2)
```
Use the [String.at/2](https://hexdocs.pm/elixir/String.html#at/2) function to retrieve the letter `"o"` in `"hello"`
@@ -610,7 +614,7 @@ Use [List.delete_at/2](https://hexdocs.pm/elixir/List.html#delete_at/2) to remov
```elixir
-[2, 1, 3]
+List.delete_at([2, 1, 3], 0)
```
Use [List.flatten/1](https://hexdocs.pm/elixir/List.html#flatten/1) to flatten the following list into `[1, 2, 3, 4, 5, 6, 7, 8, 9]`
@@ -626,7 +630,7 @@ Use [List.flatten/1](https://hexdocs.pm/elixir/List.html#flatten/1) to flatten t
```elixir
-[1, 2, [3, 4, 5], 6, [7, [8, [9]]]]
+List.flatten([1, 2, [3, 4, 5], 6, [7, [8, [9]]]])
```
Use [List.insert_at/3](https://hexdocs.pm/elixir/List.html#insert_at/3) to insert `2` into the following list to make `[1, 2, 3]`.
@@ -642,7 +646,7 @@ Use [List.insert_at/3](https://hexdocs.pm/elixir/List.html#insert_at/3) to inser
```elixir
-[1, 3]
+List.insert_at([1, 3], 1, 2)
```
Use [List.last/2](https://hexdocs.pm/elixir/List.html#last/2) to retrieve the last element `10000` in a list from `1` to `10000`.
@@ -664,7 +668,7 @@ Use [List.last/2](https://hexdocs.pm/elixir/List.html#last/2) to retrieve the la
```elixir
-Enum.to_list(1..10000)
+List.last(Enum.to_list(1..10000))
```
Use [List.update_at/3](https://hexdocs.pm/elixir/List.html#update_at/3) to subtract `2` from `4` in the following list to make `[1, 2, 3]`.
@@ -680,7 +684,7 @@ Use [List.update_at/3](https://hexdocs.pm/elixir/List.html#update_at/3) to subtr
```elixir
-[1, 4, 3]
+List.update_at([1, 4, 3], 1, &(&1 - 2))
```
Use [List.zip/1](https://hexdocs.pm/elixir/List.html#zip/1) to combine these two lists to make `[{"a", 1}, {"b", 2}, {"c", 3}]`.
@@ -701,6 +705,7 @@ Use [List.zip/1](https://hexdocs.pm/elixir/List.html#zip/1) to combine these two
```elixir
letters = ["a", "b", "c"]
numbers = [1, 2, 3]
+List.zip([letters, numbers])
```
## The Map Module
@@ -756,7 +761,7 @@ Use [Map.get/3](https://hexdocs.pm/elixir/Map.html#get/3) to retrieve the `"worl
```elixir
-%{hello: "world"}
+Map.get(%{hello: "world"}, :hello)
```
Use [Map.put/3](https://hexdocs.pm/elixir/Map.html#put/3) to add the key `:two` with the value `2` to the following map.
@@ -772,7 +777,7 @@ Use [Map.put/3](https://hexdocs.pm/elixir/Map.html#put/3) to add the key `:two`
```elixir
-%{one: 1}
+Map.put(%{one: 1}, :two, 2)
```
Use [Map.keys/1](https://hexdocs.pm/elixir/Map.html#keys/1) to retrieve the keys for the following map.
@@ -788,7 +793,7 @@ Use [Map.keys/1](https://hexdocs.pm/elixir/Map.html#keys/1) to retrieve the keys
```elixir
-%{key1: 1, key2: 2, key3: 3}
+Map.keys(%{key1: 1, key2: 2, key3: 3})
```
Use [Map.delete/2](https://hexdocs.pm/elixir/Map.html#delete/2) to remove `:key1` from the following map.
@@ -804,7 +809,7 @@ Use [Map.delete/2](https://hexdocs.pm/elixir/Map.html#delete/2) to remove `:key1
```elixir
-%{key1: 1, key2: 2, key3: 3}
+Map.delete(%{key1: 1, key2: 2, key3: 3}, :key1)
```
Use [Map.merge/2](https://hexdocs.pm/elixir/Map.html#merge/2) to combine `%{one: 1}` and `%{two: 2}`.
@@ -820,7 +825,7 @@ Use [Map.merge/2](https://hexdocs.pm/elixir/Map.html#merge/2) to combine `%{one:
```elixir
-
+Map.merge(%{one: 1}, %{two: 2})
```
Use [Map.update/4](https://hexdocs.pm/elixir/Map.html#update/4) or [Map.update!/3](https://hexdocs.pm/elixir/Map.html#update!/3) to update the `:count` key in this map to be `5` plus the existing value.
@@ -836,7 +841,7 @@ Use [Map.update/4](https://hexdocs.pm/elixir/Map.html#update/4) or [Map.update!/
```elixir
-%{count: 10}
+Map.update(%{count: 10}, :count, 10, &(&1 + 5))
```
Use [Map.values/1](https://hexdocs.pm/elixir/Map.html#values/1) to retrieve the values `[1, 2, 3]` in the following map.
@@ -852,7 +857,7 @@ Use [Map.values/1](https://hexdocs.pm/elixir/Map.html#values/1) to retrieve the
```elixir
-%{key1: 1, key2: 2, key3: 3}
+Map.values(%{key1: 1, key2: 2, key3: 3})
```
## The Keyword Module
@@ -915,7 +920,7 @@ Use [Keyword.get/3](https://hexdocs.pm/elixir/Keyword.html#get/3) to access the
```elixir
-[color: "red"]
+Keyword.get([color: "red"], :color)
```
Use [Keyword.get/3](https://hexdocs.pm/elixir/Keyword.html#get/3) to access the value for the `:color` key in the following empty list. If the `:color` key does not exist, provide a default value of `"blue"`.
@@ -931,7 +936,7 @@ Use [Keyword.get/3](https://hexdocs.pm/elixir/Keyword.html#get/3) to access the
```elixir
-[]
+Keyword.get([], :color, "blue")
```
Use the [Keyword.keys/1](https://hexdocs.pm/elixir/Keyword.html#keys/1) function to list all of the keys in the following keyword list.
@@ -947,7 +952,7 @@ Use the [Keyword.keys/1](https://hexdocs.pm/elixir/Keyword.html#keys/1) function
```elixir
-[one: 1, two: 2, three: 3]
+Keyword.keys(one: 1, two: 2, three: 3)
```
Use the [Keyword.keyword?/1](https://hexdocs.pm/elixir/Keyword.html#keyword?/1) function to determine if the following is a keyword list.
@@ -963,7 +968,7 @@ Use the [Keyword.keyword?/1](https://hexdocs.pm/elixir/Keyword.html#keyword?/1)
```elixir
-[key: "value"]
+Keyword.keyword?(key: "value")
```
Use the [Keyword.keyword?/1](https://hexdocs.pm/elixir/Keyword.html#keyword?/1) function to determine if an empty list is a keyword list.
@@ -981,7 +986,7 @@ Use the [Keyword.keyword?/1](https://hexdocs.pm/elixir/Keyword.html#keyword?/1)
```elixir
-[]
+Keyword.keyword?([])
```
Use the [Keyword.keyword?/1](https://hexdocs.pm/elixir/Keyword.html#keyword?/1) function to determine if the following list is a keyword list.
@@ -997,7 +1002,7 @@ Use the [Keyword.keyword?/1](https://hexdocs.pm/elixir/Keyword.html#keyword?/1)
```elixir
-[1, 2, 3]
+Keyword.keyword?([1, 2, 3])
```
## Further Reading
diff --git a/reading/comprehensions.livemd b/reading/comprehensions.livemd
index 9d2eae025..4dffebbc8 100644
--- a/reading/comprehensions.livemd
+++ b/reading/comprehensions.livemd
@@ -222,7 +222,9 @@ each generator creates another nested loop and therefore has a significant perfo
In the Elixir cell below, use a comprehension with a generator of `1..50` to create a list of even integers from `2` to `100`.
```elixir
-
+for n <- 1..50, rem(n, 2) == 0 do
+ n
+end
```
## Filters
@@ -315,7 +317,9 @@ end
```elixir
-
+for a <- 1..7, b <- 1..7, c <- 1..7, a + b + c == 7 do
+ {a, b, c}
+end
```
## Collectables
@@ -418,7 +422,9 @@ Enum.map(1..5, fn each -> each * 2 end)
```
```elixir
-
+for n <- 1..5, n do
+ n * 2
+end
```
In the Elixir cell below, convert the following `Enum.reduce` into a comprehension.
diff --git a/reading/enum.livemd b/reading/enum.livemd
index 64a5398d2..f8859418c 100644
--- a/reading/enum.livemd
+++ b/reading/enum.livemd
@@ -371,7 +371,7 @@ Use [Enum.map/2](https://hexdocs.pm/elixir/1.12/Enum.html#map/2) to convert a li
Enter your solution below.
```elixir
-
+Enum.map(1..10, fn int -> to_string(int) end)
```
## Enum.reduce/2 and Enum.reduce/3
@@ -492,7 +492,13 @@ Use [Enum.reduce/3](https://hexdocs.pm/elixir/Enum.html#reduce/3) or [Enum.reduc
Enter your solution below.
```elixir
-
+Enum.reduce(1..10, 0, fn int, acc ->
+ if rem(int, 2) == 0 do
+ acc + int
+ else
+ acc
+ end
+end)
```
## Enum.filter
@@ -530,7 +536,8 @@ odd_numbers = Enum.filter(1..10, fn integer -> rem(integer, 2) != 0 end)
Enter your solution below.
```elixir
-
+even = Enum.filter(1..10, fn int -> rem(int, 2) == 0 end)
+odd = Enum.filter(1..10, fn int -> rem(int, 2) != 0 end)
```
## Enum.all?/2
@@ -585,6 +592,7 @@ Use [Enum.all/2](https://hexdocs.pm/elixir/Enum.html#all/2) to determine if all
```elixir
colors = [:green, :green, :red]
+Enum.all?(colors, fn color -> color == :green end)
```
## Enum.any/2
@@ -628,7 +636,8 @@ Enum.any?(1..10_000_000, fn integer -> is_bitstring(integer) end)
Use [Enum.any/2](https://hexdocs.pm/elixir/Enum.html#any/2) to determine if any of the animals in the `animals` list are `:dogs`. You may change the `animals` list to experiment with [Enum.any/2](https://hexdocs.pm/elixir/Enum.html#any/2).
```elixir
-[:cats, :dogs, :bears, :lions, :penguins]
+animals = [:cats, :dogs, :bears, :lions, :penguins]
+Enum.any?(animals, fn animal -> animal == :dogs end)
```
## Enum.count/1
@@ -656,6 +665,8 @@ In the Elixir cell below, count the number of elements in the `collection`. It s
```elixir
collection = [1, 2, 3, 4, 5]
+
+Enum.count(collection)
```
## Enum.find/3
@@ -683,7 +694,9 @@ Enum.find(["h", "e", "l", "l", "o"], 10, fn each -> is_integer(each) end)
Use [Enum.find/2](https://hexdocs.pm/elixir/Enum.html#find/2) to find the first even integer in this list.
```elixir
-[1, "2", "three", 4, "five", 6]
+mylist = [1, "2", "three", 4, "five", 6]
+
+Enum.find(mylist, fn item -> is_integer(item) && rem(item, 2) == 0 end)
```
## Enum.random/1
@@ -710,7 +723,7 @@ Enum.map(1..10, fn _ -> Enum.random(0..9) end)
Enter your solution below.
```elixir
-
+Enum.random(0..9)
```
## Capture Operator and Module Functions
diff --git a/reading/file.livemd b/reading/file.livemd
index 6b33b16f0..d19278092 100644
--- a/reading/file.livemd
+++ b/reading/file.livemd
@@ -185,7 +185,8 @@ Path.join(path1, path2)
Experiment with the functions above. Refer to the documentation for examples you can try.
```elixir
-
+path = __DIR__
+Path.split(path)
```
## Bang Functions
diff --git a/reading/keyword_lists.livemd b/reading/keyword_lists.livemd
index b0d06161b..b8a3d435a 100644
--- a/reading/keyword_lists.livemd
+++ b/reading/keyword_lists.livemd
@@ -165,7 +165,7 @@ In the Elixir cell below, create a keyword list of your favourite super hero. In
Enter your solution below.
```elixir
-
+[hero1: "superman", hero2: "batman", hero3: "robin"]
```
## Accessing A Key
@@ -184,6 +184,7 @@ Access the `:hello` key in the following keyword list.
```elixir
keyword_list = [hello: "world"]
+keyword_list[:hello]
```
## Keyword List Operators
@@ -206,13 +207,13 @@ evaluate as a tuple again. Remember that keyword lists are simply lists of tuple
In the Elixir cell below, use `++` to add `[one: 1]` to `[two: 2]` to make `[one: 1, two: 2]`.
```elixir
-
+[one: 1] ++ [two: 2]
```
Remove `[two: 2]` from `[one: 1, two: 2]` to make `[one: 1]`.
```elixir
-
+[one: 1, two: 2] -- [two: 2]
```
## Pattern Matching
@@ -274,7 +275,8 @@ Bind `1` in the following keyword list to a variable `one`.
Enter your solution below.
```elixir
-[one: 1, two: 2, three: 3, four: 4]
+[{key, one} | tail] = [one: 1, two: 2, three: 3, four: 4]
+one
```
## Further Reading
diff --git a/reading/maps.livemd b/reading/maps.livemd
index 3fc6d2a1c..f75b8f24a 100644
--- a/reading/maps.livemd
+++ b/reading/maps.livemd
@@ -193,6 +193,8 @@ map[:hello]
```elixir
map = %{hello: "world"}
+map.hello
+map[:hello]
```
### Updating Maps
@@ -253,7 +255,9 @@ todo = %{title: "finish maps exercise", completed: false}
```elixir
-
+todo = %{title: "finish maps exercises", completed: false}
+updated = %{todo | completed: true}
+updated.completed
```
## Pattern Matching
@@ -332,7 +336,8 @@ Bind `2` and `4` in the following map to variables `two` and `four`.
Enter your solution below.
```elixir
-%{one: 1, two: 2, three: 3, four: 4}
+%{two: two, four: four} = %{one: 1, two: 2, three: 3, four: 4}
+four
```
## Further Reading
diff --git a/reading/modules.livemd b/reading/modules.livemd
index 13b965088..1bf6dbdc6 100644
--- a/reading/modules.livemd
+++ b/reading/modules.livemd
@@ -308,7 +308,13 @@ end
Enter your solution below.
```elixir
+defmodule Languages.German do
+ def greeting do
+ "Guten Tag"
+ end
+end
+Languages.German.greeting()
```
### Nested Modules
@@ -347,8 +353,8 @@ We use the `@` symbol to define a compile-time module attribute.
```elixir
defmodule Hero do
- @name "Spider-Man"
- @nemesis "Green Goblin"
+ @name "Batman"
+ @nemesis "Penguin"
def introduce do
"Hello, my name is #{@name}!"
@@ -506,7 +512,29 @@ end
```elixir
+defmodule Math do
+ @moduledoc """
+ Math Module
+ Module demonstrates 2 functions with same name and different arity
+ """
+
+ @doc """
+ add/2
+ """
+ def add(a, b) do
+ a + b
+ end
+
+ @doc """
+ add/3
+ """
+ def add(a, b, c) do
+ a + b + c
+ end
+end
+Math.add(2, 3)
+Math.add(2, 3, 4)
```
## Default Arguments
@@ -573,7 +601,14 @@ Greeting.hello("Andrew")
```
```elixir
+defmodule Greeting do
+ def hello(name \\ "fubar") do
+ "Hello #{name}"
+ end
+end
+Greeting.hello("extra fubar")
+Greeting.hello()
```
## Documentation
@@ -658,7 +693,7 @@ defmodule DoctestFailure do
"expected return value"
"""
def test do
- "actual return value"
+ "expected return value"
end
end
```
@@ -686,25 +721,27 @@ If this is the case, you either have to fix your code, or remove/comment the cra
Uncomment the following code and evaluate the cell to see an example. Re-comment your code to avoid crashing the livebook as you continue with the lesson.
```elixir
-# defmodule DoctestCrash do
-# @moduledoc """
-# DoctestCrash
+defmodule DoctestCrash do
+ @moduledoc """
+ DoctestCrash
-# Explains doctest crashes with examples
-# """
+ Explains doctest crashes with examples
+ """
-# @doc """
-# Purposely crashes doctest using invalid pattern matching
+ @doc """
+ Purposely crashes doctest using invalid pattern matching
-# ## Examples
+ ## Examples
-# iex> {} = DoctestCrash.crash()
-# "2"
-# """
-# def crash do
+ iex> DoctestCrash.crash()
+ "2"
+ """
+ def crash do
+ "2"
+ end
+end
-# end
-# end
+DoctestCrash.crash()
```
### Your Turn
diff --git a/reading/non_enumerables.livemd b/reading/non_enumerables.livemd
index 724734dd2..cabb378ca 100644
--- a/reading/non_enumerables.livemd
+++ b/reading/non_enumerables.livemd
@@ -57,7 +57,7 @@ Integer.digits(123)
In the Elixir cell below, convert the integer `4389` into a list of digits.
```elixir
-
+Integer.digits(4389)
```
### Undigits
@@ -138,7 +138,7 @@ Now your string is an enumerable list of characters.
In the Elixir cell below, convert the string `"Hello, world!"` into a list of single characters.
```elixir
-
+String.split("Hello, world!", "")
```
### Joining Strings
@@ -216,6 +216,7 @@ defmodule CharacterCount do
4
"""
def count(string) do
+ Enum.count(String.split(string, "", trim: true))
end
end
```
diff --git a/reading/processes.livemd b/reading/processes.livemd
index 22893ec05..0d8605fac 100644
--- a/reading/processes.livemd
+++ b/reading/processes.livemd
@@ -258,7 +258,14 @@ In the Elixir cell below, spawn a new process and send it a message `{:hello, "w
`IO.puts` the message's payload where `"world"` is the payload.
```elixir
+pid2 =
+ spawn(fn ->
+ receive do
+ {:hello, message} -> IO.puts(message)
+ end
+ end)
+send(pid2, "world")
```
## State
@@ -363,6 +370,7 @@ defmodule Counter do
receive do
:increment -> loop(state + 1)
+ :decrement -> loop(state - 1)
end
end
end
@@ -373,7 +381,7 @@ counter_process = spawn(fn -> Counter.loop() end)
You should be able to send a `:decrement` message to a spawned `Counter`. Uncomment and evaluate the code below to test your solution.
```elixir
-# send(counter_process, :decrement)
+send(counter_process, :decrement)
```
## Mark As Completed
diff --git a/reading/protocols.livemd b/reading/protocols.livemd
index 03f2e357d..c11de4c48 100644
--- a/reading/protocols.livemd
+++ b/reading/protocols.livemd
@@ -193,7 +193,13 @@ end
```elixir
+defimpl Adder, for: List do
+ def add(list1, list2) do
+ list1 ++ list2
+ end
+end
+Adder.add([1], [2])
```
## Protocols With Structs
@@ -245,8 +251,21 @@ Sound.say(%Cat{mood: :angry})
```elixir
defmodule Dog do
- defstruct []
+ defstruct [:mood]
+end
+```
+
+```elixir
+defimpl Sound, for: Dog do
+ def say(dog) do
+ case dog.mood do
+ :happy -> "Bark!"
+ :angry -> "Growl!"
+ end
+ end
end
+
+Sound.say(%Dog{mood: :happy})
```
Define a `Sound` implementation for the `Dog` struct above.
diff --git a/reading/ranges.livemd b/reading/ranges.livemd
index 342c427b9..e089b5708 100644
--- a/reading/ranges.livemd
+++ b/reading/ranges.livemd
@@ -121,7 +121,7 @@ In the Elixir cell below, use [Enum.to_list/1](https://hexdocs.pm/elixir/Enum.ht
```elixir
-
+Enum.to_list(3..9//3)
```
### Pattern Matching With Ranges
diff --git a/reading/start_here.livemd b/reading/start_here.livemd
index 6e4bfd8ae..91ef12af0 100644
--- a/reading/start_here.livemd
+++ b/reading/start_here.livemd
@@ -99,6 +99,10 @@ There is a **Commit Your Progress** and a **Mark as Completed** section at the e
However, self-led students can complete these sections if they want to track their progress and get more practice using GitHub. We ask that you don't create pull requests to the DockYard Academy repo, as this spams our PR tracker. If you are not an academy student, we also ask that you refrain from @mentioning the instructor as this spams our notifications, and 1-1 feedback is only available to academy students.
+```elixir
+2 + 2
+```
+
## Mark As Completed
diff --git a/reading/strings_and_binaries.livemd b/reading/strings_and_binaries.livemd
index d1be8eff8..b5a4ce294 100644
--- a/reading/strings_and_binaries.livemd
+++ b/reading/strings_and_binaries.livemd
@@ -85,6 +85,10 @@ Each byte stores an integer between `1` and `255` in binary. These integers are
?A
```
+```elixir
+?Z
+```
+
We can also see that a string is actually a series of binary bytes representing a codepoint using [IO.inspect/2](https://hexdocs.pm/elixir/IO.html#inspect/2) with the `binaries: :as_binaries` option.
```elixir
@@ -218,13 +222,13 @@ String.graphemes("eĢ")
Use [String.graphemes/1](https://hexdocs.pm/elixir/String.html#graphemes/1) to convert the [woman fire fighter](https://emojipedia.org/woman-firefighter/) emoji š©āš to a list of graphemes.
```elixir
-
+String.graphemes("š©āš")
```
Use [String.codepoints/1](https://hexdocs.pm/elixir/String.html#codepoints/1) to convert the emoji š©āš into a list of codepoints. You'll notice it's actually a combination of the š© and š emojis.
```elixir
-
+String.codepoints("š©āš")
```
## Hexadecimal
@@ -316,7 +320,7 @@ Use hexadecimal `0x` syntax to represent the number `15`.
```elixir
-
+0xF
```
## Bitstrings
@@ -416,7 +420,7 @@ Convert the alphabet `"abcdefghijklmnopqrstuvwxyz"` to a charlist, then inspect
```elixir
-
+IO.inspect(String.to_charlist("abcdefghijklmnopqrstuvwxyz"), charlists: :as_lists)
```
## Further Reading
diff --git a/reading/task.livemd b/reading/task.livemd
index 70412b63f..4e7553800 100644
--- a/reading/task.livemd
+++ b/reading/task.livemd
@@ -242,7 +242,8 @@ In the Elixir cell below, spawn a task which takes one second to complete.
`await/2` the task and alter the timeout value to be one second. Awaiting the task should crash.
```elixir
-
+task = Task.async(fn -> Process.sleep(1000) end)
+Task.await(task, 1000)
```
## Further Reading
diff --git a/reading/typespecs.livemd b/reading/typespecs.livemd
index 0b435ac7b..8ee71e39b 100644
--- a/reading/typespecs.livemd
+++ b/reading/typespecs.livemd
@@ -66,6 +66,7 @@ In the `Adder` module below, create an `@spec` for integers with the `add/2` fun
```elixir
defmodule Adder do
+ @spec add(integer(), integer()) :: integer()
def add(integer1, integer2) do
integer1 + integer2
end
@@ -108,6 +109,7 @@ In the `Math` module below, define a custom `@type` `input()` that can be a list
```elixir
defmodule Math do
+ @type mynumber :: list() | integer() | charlist()
end
```
diff --git a/reading/web_servers.livemd b/reading/web_servers.livemd
index 93f664f15..406af24e8 100644
--- a/reading/web_servers.livemd
+++ b/reading/web_servers.livemd
@@ -138,7 +138,7 @@ defmodule WebServer do
# send response
current_time = Time.to_string(Time.utc_now())
- response = "HTTP/1.1 200\r\nContent-Type: text/html\r\n\r\n It is #{current_time}"
+ response = "HTTP/1.1 200\r\nContent-Type: text/html\r\n\r\n
It is #{current_time} "
:gen_tcp.send(connection, response)
# close connection