Spaces:
Sleeping
Sleeping
Marko Vukovic
commited on
Commit
·
41e3802
1
Parent(s):
3059eb2
Created Kino app
Browse files- .gitignore +29 -0
- .tool-versions +1 -0
- Dockerfile +3 -2
- Elixir.EncoderDecoder.beam +0 -0
- README.md +10 -1
- notes/logs_elixir.md +836 -0
- notes/logs_numbat.md +160 -0
- notes/logs_phoenix.md +754 -0
- notes/scratch.md +1 -0
- public-apps/teller.livemd +614 -0
- public-apps/welcome.livemd +0 -46
.gitignore
ADDED
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
.elixir_ls
|
2 |
+
.history
|
3 |
+
|
4 |
+
# The directory Mix will write compiled artifacts to.
|
5 |
+
/_build/
|
6 |
+
|
7 |
+
# If you run "mix test --cover", coverage assets end up here.
|
8 |
+
/cover/
|
9 |
+
|
10 |
+
# The directory Mix downloads your dependencies sources to.
|
11 |
+
/deps/
|
12 |
+
|
13 |
+
# Where third-party dependencies like ExDoc output generated docs.
|
14 |
+
/doc/
|
15 |
+
|
16 |
+
# Ignore .fetch files in case you like to edit your project deps locally.
|
17 |
+
/.fetch
|
18 |
+
|
19 |
+
# If the VM crashes, it generates a dump, let's ignore it too.
|
20 |
+
erl_crash.dump
|
21 |
+
|
22 |
+
# Also ignore archive artifacts (built via "mix archive.build").
|
23 |
+
*.ez
|
24 |
+
|
25 |
+
# Ignore package tarball (built via "mix hex.build").
|
26 |
+
teller_bank_job-*.tar
|
27 |
+
|
28 |
+
# Temporary files, for example, from tests.
|
29 |
+
/tmp/
|
.tool-versions
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
elixir 1.14.4-otp-25
|
Dockerfile
CHANGED
@@ -1,7 +1,8 @@
|
|
1 |
FROM ghcr.io/livebook-dev/livebook:latest-cuda11.8
|
2 |
|
3 |
-
ENV LIVEBOOK_APP_SERVICE_NAME "
|
4 |
-
ENV
|
|
|
5 |
ENV LIVEBOOK_UPDATE_INSTRUCTIONS_URL "https://livebook.dev"
|
6 |
ENV LIVEBOOK_WITHIN_IFRAME "true"
|
7 |
ENV LIVEBOOK_APPS_PATH "/public-apps"
|
|
|
1 |
FROM ghcr.io/livebook-dev/livebook:latest-cuda11.8
|
2 |
|
3 |
+
ENV LIVEBOOK_APP_SERVICE_NAME "Teller Bank Job"
|
4 |
+
ENV LIVEBOOK_SPACE_REPO_NAME = "teller_bank_job"
|
5 |
+
ENV LIVEBOOK_APP_SERVICE_URL "https://huggingface.co/spaces/mvkvc/$LIVEBOOK_SPACE_REPO_NAME"
|
6 |
ENV LIVEBOOK_UPDATE_INSTRUCTIONS_URL "https://livebook.dev"
|
7 |
ENV LIVEBOOK_WITHIN_IFRAME "true"
|
8 |
ENV LIVEBOOK_APPS_PATH "/public-apps"
|
Elixir.EncoderDecoder.beam
ADDED
Binary file (3.78 kB). View file
|
|
README.md
CHANGED
@@ -8,4 +8,13 @@ fullWidth: true
|
|
8 |
duplicated_from: livebook-dev/livebook
|
9 |
---
|
10 |
|
11 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
8 |
duplicated_from: livebook-dev/livebook
|
9 |
---
|
10 |
|
11 |
+
# teller_bank_job
|
12 |
+
|
13 |
+
<https://lisbon.teller.engineering/>
|
14 |
+
|
15 |
+
My submission for the Teller Bank Job challenge for ElixirConf EU 2023.
|
16 |
+
|
17 |
+
<!-- username: blue_chloe
|
18 |
+
password: portugal -->
|
19 |
+
|
20 |
+
<!-- %TellerBank.ChallengeResult{account_number: "745477326035", balance_in_cents: "349782"} -->
|
notes/logs_elixir.md
ADDED
@@ -0,0 +1,836 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
LOGIN: elixir
|
2 |
+
PASS: el1x1r_c0nf_Lisbon
|
3 |
+
|
4 |
+
INITIAL LOGIN
|
5 |
+
|
6 |
+
GET /config
|
7 |
+
user-agent: Teller Bank iOS v1.3
|
8 |
+
api-key: Hello-Lisbon!
|
9 |
+
device-id: TU2CM7WPWZJVNK2N
|
10 |
+
accept: application/json
|
11 |
+
|
12 |
+
200 OK
|
13 |
+
teller-is-hiring: <https://jobs.lever.co/teller/dd21975a-901b-49ee-926c-336c92f8673d>
|
14 |
+
content-type: application/json; charset=utf-8
|
15 |
+
{
|
16 |
+
"conference": [
|
17 |
+
{
|
18 |
+
"date": "2023-04-20",
|
19 |
+
"schedule": [
|
20 |
+
{
|
21 |
+
"location": {
|
22 |
+
"floor": "Floor -1",
|
23 |
+
"room": "Europa",
|
24 |
+
"track": "Track 1"
|
25 |
+
},
|
26 |
+
"speakers": [],
|
27 |
+
"time": "9:00 AM – 9:20 AM",
|
28 |
+
"title": "Welcome to the ElixirConf EU!"
|
29 |
+
},
|
30 |
+
{
|
31 |
+
"location": {
|
32 |
+
"floor": "Floor -1",
|
33 |
+
"room": "Europa",
|
34 |
+
"track": "Track 1"
|
35 |
+
},
|
36 |
+
"speakers": [
|
37 |
+
{
|
38 |
+
"affiliation": "Dashbit",
|
39 |
+
"name": "José Valim",
|
40 |
+
"title": "Creator of Elixir, Chief Adoption Officer"
|
41 |
+
}
|
42 |
+
],
|
43 |
+
"time": "9:20 AM – 10:20 AM",
|
44 |
+
"title": "Keynote: Bringing Elixir to Life"
|
45 |
+
},
|
46 |
+
{
|
47 |
+
"location": null,
|
48 |
+
"speakers": [],
|
49 |
+
"time": "10:20 AM – 10:50 AM",
|
50 |
+
"title": "Coffee Break"
|
51 |
+
},
|
52 |
+
{
|
53 |
+
"location": {
|
54 |
+
"floor": "Floor -1",
|
55 |
+
"room": "Europa",
|
56 |
+
"track": "Track 1"
|
57 |
+
},
|
58 |
+
"speakers": [
|
59 |
+
{
|
60 |
+
"affiliation": "Turn.io",
|
61 |
+
"name": "Simon de Haan",
|
62 |
+
"title": "CTO & Co-Founder"
|
63 |
+
},
|
64 |
+
{
|
65 |
+
"affiliation": "Turn.io",
|
66 |
+
"name": "Federico Meini",
|
67 |
+
"title": "Software Engineer"
|
68 |
+
}
|
69 |
+
],
|
70 |
+
"time": "10:50 AM – 11:20 AM",
|
71 |
+
"title": "A Domain Specific Language for Impact"
|
72 |
+
},
|
73 |
+
{
|
74 |
+
"location": {
|
75 |
+
"floor": "Floor 1",
|
76 |
+
"room": "Roma",
|
77 |
+
"track": "Track 2"
|
78 |
+
},
|
79 |
+
"speakers": [
|
80 |
+
{
|
81 |
+
"affiliation": "Pass It Down",
|
82 |
+
"name": "Savannah Manning",
|
83 |
+
"title": "Software Engineer"
|
84 |
+
},
|
85 |
+
{
|
86 |
+
"affiliation": "Pass It Down",
|
87 |
+
"name": "Gabriel Wamunyu",
|
88 |
+
"title": "Full Stack Engineer"
|
89 |
+
}
|
90 |
+
],
|
91 |
+
"time": "10:50 AM – 11:20 AM",
|
92 |
+
"title": "Functional Juniors: Leveling Up Your New Elixir Devs"
|
93 |
+
},
|
94 |
+
{
|
95 |
+
"location": {
|
96 |
+
"floor": "Floor 1",
|
97 |
+
"room": "Roma",
|
98 |
+
"track": "Track 2"
|
99 |
+
},
|
100 |
+
"speakers": [
|
101 |
+
{
|
102 |
+
"affiliation": "koderki.pl",
|
103 |
+
"name": "Michał Ślaski",
|
104 |
+
"title": "Co-Founder"
|
105 |
+
}
|
106 |
+
],
|
107 |
+
"time": "11:30 AM – 12:00 PM",
|
108 |
+
"title": "National Curriculum Goes Functional"
|
109 |
+
},
|
110 |
+
{
|
111 |
+
"location": {
|
112 |
+
"floor": "Floor -1",
|
113 |
+
"room": "Europa",
|
114 |
+
"track": "Track 1"
|
115 |
+
},
|
116 |
+
"speakers": [
|
117 |
+
{
|
118 |
+
"affiliation": "Software Stumbler",
|
119 |
+
"name": "Luca Dei Zotti",
|
120 |
+
"title": ""
|
121 |
+
}
|
122 |
+
],
|
123 |
+
"time": "11:30 AM – 12:00 PM",
|
124 |
+
"title": "Remote Debugging with Livebook"
|
125 |
+
},
|
126 |
+
{
|
127 |
+
"location": {
|
128 |
+
"floor": "Floor 1",
|
129 |
+
"room": "Roma",
|
130 |
+
"track": "Track 2"
|
131 |
+
},
|
132 |
+
"speakers": [
|
133 |
+
{
|
134 |
+
"affiliation": "Helvetia Insurance",
|
135 |
+
"name": "André Graf",
|
136 |
+
"title": "DevOps Solution Architect"
|
137 |
+
}
|
138 |
+
],
|
139 |
+
"time": "12:10 PM – 12:40 PM",
|
140 |
+
"title": "The Journey of Elixir at Helvetia Insurance"
|
141 |
+
},
|
142 |
+
{
|
143 |
+
"location": {
|
144 |
+
"floor": "Floor -1",
|
145 |
+
"room": "Europa",
|
146 |
+
"track": "Track 1"
|
147 |
+
},
|
148 |
+
"speakers": [
|
149 |
+
{
|
150 |
+
"affiliation": "Dashbit",
|
151 |
+
"name": "Wojtek Mach",
|
152 |
+
"title": "Developer"
|
153 |
+
}
|
154 |
+
],
|
155 |
+
"time": "12:10 PM – 12:40 PM",
|
156 |
+
"title": "Building Livebook Desktop"
|
157 |
+
},
|
158 |
+
{
|
159 |
+
"location": null,
|
160 |
+
"speakers": [],
|
161 |
+
"time": "12:40 PM – 2:10 PM",
|
162 |
+
"title": "Lunch"
|
163 |
+
},
|
164 |
+
{
|
165 |
+
"location": null,
|
166 |
+
"speakers": [],
|
167 |
+
"time": "1:00 PM – 1:30 PM",
|
168 |
+
"title": "Meet the Sponsor: Teller. Bumblebee at Scale: Enriching millions of transactions a day with Elixir, Nx, and Bumblebee"
|
169 |
+
},
|
170 |
+
{
|
171 |
+
"location": {
|
172 |
+
"floor": "Floor 1",
|
173 |
+
"room": "Roma",
|
174 |
+
"track": "Track 2"
|
175 |
+
},
|
176 |
+
"speakers": [
|
177 |
+
{
|
178 |
+
"affiliation": "Multiverse",
|
179 |
+
"name": "Jack Rhodes",
|
180 |
+
"title": "Engineering Manager, building the platform for modern apprenticeships"
|
181 |
+
}
|
182 |
+
],
|
183 |
+
"time": "2:10 PM – 2:40 PM",
|
184 |
+
"title": "From Start-up to Unicorn: Scaling Teams, Impact, and Education with Elixir at Multiverse"
|
185 |
+
},
|
186 |
+
{
|
187 |
+
"location": {
|
188 |
+
"floor": "Floor -1",
|
189 |
+
"room": "Europa",
|
190 |
+
"track": "Track 1"
|
191 |
+
},
|
192 |
+
"speakers": [
|
193 |
+
{
|
194 |
+
"affiliation": "Simplebet",
|
195 |
+
"name": "Marlus Saraiva",
|
196 |
+
"title": "Tech Lead. Creator of Broadway, ElixirSense and Surface."
|
197 |
+
}
|
198 |
+
],
|
199 |
+
"time": "2:10 PM – 2:40 PM",
|
200 |
+
"title": "Optimizing LiveView for Realtime Applications"
|
201 |
+
},
|
202 |
+
{
|
203 |
+
"location": {
|
204 |
+
"floor": "Floor -1",
|
205 |
+
"room": "Europa",
|
206 |
+
"track": "Track 1"
|
207 |
+
},
|
208 |
+
"speakers": [
|
209 |
+
{
|
210 |
+
"affiliation": "Bodgemaster at Heart / Programmer at Large",
|
211 |
+
"name": "Evadne Wu",
|
212 |
+
"title": ""
|
213 |
+
}
|
214 |
+
],
|
215 |
+
"time": "2:50 PM – 3:20 PM",
|
216 |
+
"title": "“Not Hotdog” Revisited"
|
217 |
+
},
|
218 |
+
{
|
219 |
+
"location": {
|
220 |
+
"floor": "Floor 1",
|
221 |
+
"room": "Roma",
|
222 |
+
"track": "Track 2"
|
223 |
+
},
|
224 |
+
"speakers": [
|
225 |
+
{
|
226 |
+
"affiliation": "UCLL - Digital Solutions - Leuven (B)",
|
227 |
+
"name": "Paul Valckenaers",
|
228 |
+
"title": ""
|
229 |
+
}
|
230 |
+
],
|
231 |
+
"time": "2:50 PM – 3:20 PM",
|
232 |
+
"title": "Quantum Doodle: Digital Twins for Everyday Activities"
|
233 |
+
},
|
234 |
+
{
|
235 |
+
"location": null,
|
236 |
+
"speakers": [],
|
237 |
+
"time": "3:20 PM – 3:50 PM",
|
238 |
+
"title": "Coffee Break"
|
239 |
+
},
|
240 |
+
{
|
241 |
+
"location": {
|
242 |
+
"floor": "Floor 1",
|
243 |
+
"room": "Roma",
|
244 |
+
"track": "Track 2"
|
245 |
+
},
|
246 |
+
"speakers": [
|
247 |
+
{
|
248 |
+
"affiliation": "Multiverse",
|
249 |
+
"name": "Karoline Lende",
|
250 |
+
"title": "Software Engineer"
|
251 |
+
}
|
252 |
+
],
|
253 |
+
"time": "3:50 PM – 4:20 PM",
|
254 |
+
"title": "Building an Interview Scheduler in LiveView: A Newcomer's Journey from Despair to Delight"
|
255 |
+
},
|
256 |
+
{
|
257 |
+
"location": {
|
258 |
+
"floor": "Floor -1",
|
259 |
+
"room": "Europa",
|
260 |
+
"track": "Track 1"
|
261 |
+
},
|
262 |
+
"speakers": [
|
263 |
+
{
|
264 |
+
"affiliation": "Dashbit",
|
265 |
+
"name": "Jonatan Kłosko",
|
266 |
+
"title": "Software Engineer"
|
267 |
+
}
|
268 |
+
],
|
269 |
+
"time": "3:50 PM – 4:20 PM",
|
270 |
+
"title": "Powerful Machine Learning at Your Fingertips"
|
271 |
+
},
|
272 |
+
{
|
273 |
+
"location": {
|
274 |
+
"floor": "Floor -1",
|
275 |
+
"room": "Europa",
|
276 |
+
"track": "Track 1"
|
277 |
+
},
|
278 |
+
"speakers": [
|
279 |
+
{
|
280 |
+
"affiliation": "Underjord AB",
|
281 |
+
"name": "Lars Wikman",
|
282 |
+
"title": "Developer"
|
283 |
+
}
|
284 |
+
],
|
285 |
+
"time": "4:30 PM – 5:00 PM",
|
286 |
+
"title": "Lively LiveView with Membrane"
|
287 |
+
},
|
288 |
+
{
|
289 |
+
"location": {
|
290 |
+
"floor": "Floor 1",
|
291 |
+
"room": "Roma",
|
292 |
+
"track": "Track 2"
|
293 |
+
},
|
294 |
+
"speakers": [
|
295 |
+
{
|
296 |
+
"affiliation": "CNRS - Université Paris Cité",
|
297 |
+
"name": "Giuseppe Castagna",
|
298 |
+
"title": ""
|
299 |
+
},
|
300 |
+
{
|
301 |
+
"affiliation": "IRIF",
|
302 |
+
"name": "Guillaume Duboc",
|
303 |
+
"title": "PhD researcher"
|
304 |
+
}
|
305 |
+
],
|
306 |
+
"time": "4:30 PM – 5:00 PM",
|
307 |
+
"title": "Bringing Types to Elixir"
|
308 |
+
},
|
309 |
+
{
|
310 |
+
"location": {
|
311 |
+
"floor": "Floor -1",
|
312 |
+
"room": "Europa",
|
313 |
+
"track": "Track 1"
|
314 |
+
},
|
315 |
+
"speakers": [],
|
316 |
+
"time": "5:00 PM – 6:00 PM",
|
317 |
+
"title": "Lightning Talks"
|
318 |
+
},
|
319 |
+
{
|
320 |
+
"location": null,
|
321 |
+
"speakers": [],
|
322 |
+
"time": "6:00 PM – 7:00 PM",
|
323 |
+
"title": "Socialising (at the venue)"
|
324 |
+
}
|
325 |
+
]
|
326 |
+
},
|
327 |
+
{
|
328 |
+
"date": "2023-04-21",
|
329 |
+
"schedule": [
|
330 |
+
{
|
331 |
+
"location": {
|
332 |
+
"floor": "Floor -1",
|
333 |
+
"room": "Europa",
|
334 |
+
"track": "Track 1"
|
335 |
+
},
|
336 |
+
"speakers": [
|
337 |
+
{
|
338 |
+
"affiliation": "Talam, Auroville",
|
339 |
+
"name": "Shankar Dhanasekaran",
|
340 |
+
"title": "Founder & CTO"
|
341 |
+
}
|
342 |
+
],
|
343 |
+
"time": "9:10 AM – 10:10 AM",
|
344 |
+
"title": "Keynote: Lessons from Using Elixir and Phoenix to Build a City Software Infrastructure"
|
345 |
+
},
|
346 |
+
{
|
347 |
+
"location": null,
|
348 |
+
"speakers": [],
|
349 |
+
"time": "10:10 AM – 10:40 AM",
|
350 |
+
"title": "Coffee Break"
|
351 |
+
},
|
352 |
+
{
|
353 |
+
"location": {
|
354 |
+
"floor": "Floor 1",
|
355 |
+
"room": "Roma",
|
356 |
+
"track": "Track 2"
|
357 |
+
},
|
358 |
+
"speakers": [
|
359 |
+
{
|
360 |
+
"affiliation": "Fresha.com",
|
361 |
+
"name": "Artur Sulej",
|
362 |
+
"title": "Senior Software Engineer"
|
363 |
+
}
|
364 |
+
],
|
365 |
+
"time": "10:40 AM – 11:10 AM",
|
366 |
+
"title": "Safer DB migrations with excellent_migrations"
|
367 |
+
},
|
368 |
+
{
|
369 |
+
"location": {
|
370 |
+
"floor": "Floor -1",
|
371 |
+
"room": "Europa",
|
372 |
+
"track": "Track 1"
|
373 |
+
},
|
374 |
+
"speakers": [
|
375 |
+
{
|
376 |
+
"affiliation": "Piga",
|
377 |
+
"name": "Basile Nouvellet",
|
378 |
+
"title": "CTO"
|
379 |
+
}
|
380 |
+
],
|
381 |
+
"time": "10:40 AM – 11:10 AM",
|
382 |
+
"title": "Real-time Product Analytics with LiveView"
|
383 |
+
},
|
384 |
+
{
|
385 |
+
"location": null,
|
386 |
+
"speakers": [
|
387 |
+
{
|
388 |
+
"affiliation": "Cisco",
|
389 |
+
"name": "Yosef Arbiv",
|
390 |
+
"title": "R&D Group Leader"
|
391 |
+
}
|
392 |
+
],
|
393 |
+
"time": "10:40 AM – 11:10 AM",
|
394 |
+
"title": "How To Use OpenTelemetry To Troubleshoot and Monitor Production Applications"
|
395 |
+
},
|
396 |
+
{
|
397 |
+
"location": {
|
398 |
+
"floor": "Floor -1",
|
399 |
+
"room": "Europa",
|
400 |
+
"track": "Track 1"
|
401 |
+
},
|
402 |
+
"speakers": [
|
403 |
+
{
|
404 |
+
"affiliation": "made it GmbH",
|
405 |
+
"name": "Benjamin Milde",
|
406 |
+
"title": "CTO"
|
407 |
+
}
|
408 |
+
],
|
409 |
+
"time": "11:20 AM – 11:50 AM",
|
410 |
+
"title": "Wired up! - Using ecto without schemas*"
|
411 |
+
},
|
412 |
+
{
|
413 |
+
"location": {
|
414 |
+
"floor": "Floor 1",
|
415 |
+
"room": "Roma",
|
416 |
+
"track": "Track 2"
|
417 |
+
},
|
418 |
+
"speakers": [
|
419 |
+
{
|
420 |
+
"affiliation": "PagerDuty",
|
421 |
+
"name": "Mat Trudel",
|
422 |
+
"title": "Senior Software Engineer"
|
423 |
+
}
|
424 |
+
],
|
425 |
+
"time": "11:20 AM – 11:50 AM",
|
426 |
+
"title": "Phoenix Beyond Cowboy"
|
427 |
+
},
|
428 |
+
{
|
429 |
+
"location": null,
|
430 |
+
"speakers": [
|
431 |
+
{
|
432 |
+
"affiliation": "University of Kitakyushu",
|
433 |
+
"name": "Susumu Yamazaki",
|
434 |
+
"title": "Associate Professor"
|
435 |
+
}
|
436 |
+
],
|
437 |
+
"time": "11:20 AM – 11:50 AM",
|
438 |
+
"title": "How to Describe Robust NIFs: Bridging Elixir and C with Performance for Fault-tolerant Systems"
|
439 |
+
},
|
440 |
+
{
|
441 |
+
"location": {
|
442 |
+
"floor": "Floor 1",
|
443 |
+
"room": "Roma",
|
444 |
+
"track": "Track 2"
|
445 |
+
},
|
446 |
+
"speakers": [
|
447 |
+
{
|
448 |
+
"affiliation": "ElectricSQL",
|
449 |
+
"name": "James Arthur",
|
450 |
+
"title": "CEO"
|
451 |
+
}
|
452 |
+
],
|
453 |
+
"time": "12:00 PM – 12:30 PM",
|
454 |
+
"title": "ElectricSQL - Local-first SQL with Elixir"
|
455 |
+
},
|
456 |
+
{
|
457 |
+
"location": {
|
458 |
+
"floor": "Floor -1",
|
459 |
+
"room": "Europa",
|
460 |
+
"track": "Track 1"
|
461 |
+
},
|
462 |
+
"speakers": [
|
463 |
+
{
|
464 |
+
"affiliation": "eFaber",
|
465 |
+
"name": "Eli Kroumova",
|
466 |
+
"title": "Software Developer"
|
467 |
+
}
|
468 |
+
],
|
469 |
+
"time": "12:00 PM – 12:30 PM",
|
470 |
+
"title": "Multitenant Web Applications with Phoenix"
|
471 |
+
},
|
472 |
+
{
|
473 |
+
"location": null,
|
474 |
+
"speakers": [
|
475 |
+
{
|
476 |
+
"affiliation": "OEC Co. Ltd.",
|
477 |
+
"name": "Ryo Wakabayashi",
|
478 |
+
"title": "AI Engineer, Developing AI services together with AUCNET-IBS"
|
479 |
+
}
|
480 |
+
],
|
481 |
+
"time": "12:00 PM – 12:30 PM",
|
482 |
+
"title": "Distributed and Parallel Image Processing on Livebook"
|
483 |
+
},
|
484 |
+
{
|
485 |
+
"location": null,
|
486 |
+
"speakers": [],
|
487 |
+
"time": "12:30 PM – 2:00 PM",
|
488 |
+
"title": "Lunch"
|
489 |
+
},
|
490 |
+
{
|
491 |
+
"location": {
|
492 |
+
"floor": "Floor 1",
|
493 |
+
"room": "Roma",
|
494 |
+
"track": "Track 2"
|
495 |
+
},
|
496 |
+
"speakers": [
|
497 |
+
{
|
498 |
+
"affiliation": "DevOps Solution Architect integrating stuff with Elixir",
|
499 |
+
"name": "Lars Hesel Christensen",
|
500 |
+
"title": ""
|
501 |
+
},
|
502 |
+
{
|
503 |
+
"affiliation": "Helvetia Insurance",
|
504 |
+
"name": "Bikram Chatterjee",
|
505 |
+
"title": "DevOps Solution Architect hacking with Elixir"
|
506 |
+
}
|
507 |
+
],
|
508 |
+
"time": "2:00 PM – 2:30 PM",
|
509 |
+
"title": "GitOps on Steroids"
|
510 |
+
},
|
511 |
+
{
|
512 |
+
"location": {
|
513 |
+
"floor": "Floor -1",
|
514 |
+
"room": "Europa",
|
515 |
+
"track": "Track 1"
|
516 |
+
},
|
517 |
+
"speakers": [
|
518 |
+
{
|
519 |
+
"affiliation": "Remote",
|
520 |
+
"name": "Peter Ullrich",
|
521 |
+
"title": "Senior Software Engineer"
|
522 |
+
}
|
523 |
+
],
|
524 |
+
"time": "2:00 PM – 2:30 PM",
|
525 |
+
"title": "Don't Fight the Monolith"
|
526 |
+
},
|
527 |
+
{
|
528 |
+
"location": null,
|
529 |
+
"speakers": [
|
530 |
+
{
|
531 |
+
"affiliation": "Multiverse",
|
532 |
+
"name": "Tim Gent",
|
533 |
+
"title": "Tech lead"
|
534 |
+
}
|
535 |
+
],
|
536 |
+
"time": "2:00 PM – 2:30 PM",
|
537 |
+
"title": "Understanding Elixir Compilation"
|
538 |
+
},
|
539 |
+
{
|
540 |
+
"location": {
|
541 |
+
"floor": "Floor -1",
|
542 |
+
"room": "Europa",
|
543 |
+
"track": "Track 1"
|
544 |
+
},
|
545 |
+
"speakers": [
|
546 |
+
{
|
547 |
+
"affiliation": "Andjaro",
|
548 |
+
"name": "Michal Gibowski",
|
549 |
+
"title": "Engineering Team Lead"
|
550 |
+
},
|
551 |
+
{
|
552 |
+
"affiliation": "Andjaro",
|
553 |
+
"name": "Vanessa Loviton",
|
554 |
+
"title": "Backend Engineer"
|
555 |
+
}
|
556 |
+
],
|
557 |
+
"time": "2:40 PM – 3:10 PM",
|
558 |
+
"title": "Change Data Capture with Elixir and Debezium"
|
559 |
+
},
|
560 |
+
{
|
561 |
+
"location": {
|
562 |
+
"floor": "Floor 1",
|
563 |
+
"room": "Roma",
|
564 |
+
"track": "Track 2"
|
565 |
+
},
|
566 |
+
"speakers": [
|
567 |
+
{
|
568 |
+
"affiliation": "Coverflex",
|
569 |
+
"name": "Daniel Silva",
|
570 |
+
"title": "Senior Backend Software Developer"
|
571 |
+
}
|
572 |
+
],
|
573 |
+
"time": "2:40 PM – 3:10 PM",
|
574 |
+
"title": "Opening a Black Box: Observability in a Complex System"
|
575 |
+
},
|
576 |
+
{
|
577 |
+
"location": null,
|
578 |
+
"speakers": [
|
579 |
+
{
|
580 |
+
"affiliation": "Founder of Or Equals, a Phoenix LiveView consultancy",
|
581 |
+
"name": "Joshua Plicque",
|
582 |
+
"title": ""
|
583 |
+
}
|
584 |
+
],
|
585 |
+
"time": "2:40 PM – 3:10 PM",
|
586 |
+
"title": "Phoenix LiveView Test Driven Development By Example"
|
587 |
+
},
|
588 |
+
{
|
589 |
+
"location": null,
|
590 |
+
"speakers": [],
|
591 |
+
"time": "3:10 PM – 3:40 PM",
|
592 |
+
"title": "Coffee Break"
|
593 |
+
},
|
594 |
+
{
|
595 |
+
"location": {
|
596 |
+
"floor": "Floor -1",
|
597 |
+
"room": "Europa",
|
598 |
+
"track": "Track 1"
|
599 |
+
},
|
600 |
+
"speakers": [
|
601 |
+
{
|
602 |
+
"affiliation": "Software Mansion / Membrane Framework",
|
603 |
+
"name": "Mateusz Front",
|
604 |
+
"title": "Software Architect"
|
605 |
+
}
|
606 |
+
],
|
607 |
+
"time": "3:40 PM – 4:10 PM",
|
608 |
+
"title": "Building a Framework - Membrane's Journey to 1.0"
|
609 |
+
},
|
610 |
+
{
|
611 |
+
"location": {
|
612 |
+
"floor": "Floor 1",
|
613 |
+
"room": "Roma",
|
614 |
+
"track": "Track 2"
|
615 |
+
},
|
616 |
+
"speakers": [
|
617 |
+
{
|
618 |
+
"affiliation": "Ramp",
|
619 |
+
"name": "Zac Barnes",
|
620 |
+
"title": "SWE"
|
621 |
+
}
|
622 |
+
],
|
623 |
+
"time": "3:40 PM – 4:10 PM",
|
624 |
+
"title": "Telemetry: Now what?"
|
625 |
+
},
|
626 |
+
{
|
627 |
+
"location": {
|
628 |
+
"floor": "Floor -1",
|
629 |
+
"room": "Europa",
|
630 |
+
"track": "Track 1"
|
631 |
+
},
|
632 |
+
"speakers": [
|
633 |
+
{
|
634 |
+
"affiliation": "Fly.io",
|
635 |
+
"name": "Chris McCord",
|
636 |
+
"title": "Creator of Phoenix, Staff Software Engineer"
|
637 |
+
}
|
638 |
+
],
|
639 |
+
"time": "4:20 PM – 5:20 PM",
|
640 |
+
"title": "Keynote: The Road to LiveView 1.0"
|
641 |
+
}
|
642 |
+
]
|
643 |
+
}
|
644 |
+
],
|
645 |
+
"utils": {
|
646 |
+
"arg_a": "555345524e414d45",
|
647 |
+
"arg_b": "465f544f4b454e",
|
648 |
+
"code": "1f8b08000000000000035d570b5c4c5b173fd399e695c969a69794462fa5f713514e254961f4c0478c69e65453f3726626532149e5f19508999f5eeabac9e37e2525ae1809e1de4f1ec95b12ca4d2ad7dbad6f4f4d57f73bbfdf9ab5f6daffb5f77a9cd9ebecf94b22dc2148ff5c6070c0a20079f44c0822744010e46e142c142805b84bb09827e163f83c6c8451381c81384ec2e1d0b872392e8855c831199927114905428cc6c7a438c6e3ca31be1ea6944a70b98c23e27b53e314629e5c2011cb48222e0f97c860a02489247c851023c9e4b8822787c5022109c3855c71fcc4784cce199d1cd9899684a570648ab83881922ac7b962599c0417e9c70ac45c3c852397708402999cc4954a31311fe60a85a4d119bad6f948398e7145babc149e1083530552bdbf835288601157cafc811388e35d8212b8b88c0a56958d8c09a963f361182ec6842ed1728150a6c7c746bd56e01851218f9b39ce1bae5c221adb238a2b4bd295c9b9b85c17e70a6418512c1163ba188e4b70bd7101ea39a7baba39831c397b38eb6b4dd9b88487c964ba3221864975e3b84219f603e6eefc4376732638339dffce8bab87564b8ce58af9c458a50437741688850231c6771eab9cabbb7310282504e994813a23d0e873129035203d02a2827418560881351bde67426178640566452862313c7a8b624f5679f0496f821bda04330928ca00bf6c3404026c2d1a8200264575c0ef66146682c9c52c88904f42e856843215a2c3188408d568080bccab552c1d060d61115a27b058289388c2862a3722444750227cdc0421aa503282a03051c526427535ba10b2193651d318c8661d431a9366c8daacb31c46684c003554ad055095948cb0502273c4763399e586cc70d344c642906310d30452e59359a8f74b98c162123a54651484cd22f4abaa810fe6108182d0d1313874dc04251ada781d4380151ae206abd4c0125dca24b3d6cea41bc001b01713706600d35acb6db4dc900838b182c8f402439466c944ad61552b9925adb2813543550790356ea1a36eb1e0919de06d6e88aa9f8c6c06916f432015052123f968086a8dd26c9814b732e09e814abd002650189aaad0ec806224b54835816238aa420814a31f09a718abfa81761a4aa0984c4051d493885a1ba24c1b14f642ab1ec364443d1ba64f324169d3e9a64d745302c594813209944928d11335b446bd98a80dbc8e05accd541403b09023587e321dfa915037901a4d3ae9e630030296e6209d605b8b51b813804fd9a88bb4c2542ea834c552950fb42e40cb9a45b7847d01b1026188b95197d5c13cc40c84111888fdcb992c58039f3a12923b805bf9d1a7c2e06f19a579394345520d6fd6beaf7440fa8074b4b2012002202340c6e364132dc614d024ad6c0668b216630168cab875585a792a20ab71186badacc1d80282c7f9a0d1db03721887711eb7a6eb38d94d23072b4762f10244046437ce5f3bed7f91a98d73cc4e478bd199af106b6cf95a5b17ad9ea5b5836049483a608e5afd589c63fa695abbb1bc10b57a272d6e8a36b6117cb8400ef62290003194457ebbdc9764a2e697879725453079d3e666adbb7db9b926f360291ab477ba5fc79bd0a0f63b17ed729b3abbfa3a3a3b3bc209370eab9f3fd9dd5269607af6dcb9ef6b0607a74072c2dae15bc7152fea5f7c342f7ff02928dce9846722f3d8bda102fff44d5f8aafdd19b859fc6de3ba65b58d3e3dc545bcce70f1a99fd73ebd273730df407ae9b1b40dfe8bed192afb25a12565a15165f96f029671b86ef951ae611a25f959e4c7ab5b3f45871ac5537c2e3905565fde3933445a641fdd32e3596168599453a77d2cfed259b5f07ad6d506d7150d8c398bdaafdcd8d11ef7edd6d7b6bcc514bbc26cbfe6c5998f457a9c25e14fde4e0ce725e65fbaf8e742cbd9a4fa90e12bfe5bc410142ee16972bf021059d31fb539b3fabf3a8ccfe5f83a8ccfbdb9b65c9a1a4fd4ca7a01a09f6adea54ca1c62a41870fc1c932f1c8408c40e9bbead66cffd47e646fdc97d5efdf758b12138342c5716072f7081ed6e0c9c9182e037d3609d29de9e2e1e23ea29348475aaf0644e44393c4a0b749b9ebc51c6dcfc639d2d15ec387a871b84404f438c68726029c4602b39894abd1e8030d57015a9c40a4e9ec899ac549328902e76149909e2be8c0ae62491c583111ec342f365e00f66bcc64839759ad2c6a5b7141f268bea1fff6bdfcafa7239409d3a665d75f41b375b20cd2049e0a6a6bb25d5ed752df1d5659d63d0bf53d8e44ce48e9b9db1854e8f2979ef9aa6d59f7f74fbd85e60eb9fb453042df7fbe11e07977a7627de9f9b47769ef9efe1ab933529dbdc5a6d22136c8fbf20b13da8a60df3eae9555f9e9ee93d5a6532e5413a03f682b728ee6769b1a1cffe8bd23a77e5175d7fd96f20ac5835e794ddebcdaa4b417deba55f7d53e3ef4b04a62cc4ec93e23b66f064a98b3ba37b5d65692d75e93d1f1fae1862df1afbc7f3f1d6268fb64efa3f26ed8f1694c8f1b69a889e398b3396fee47c83bb121f844c64bfb184251c6c6f4b0fc2cdc81bd3d6bd081adca5a165146d33b71923d3d7bd7d325c9ab09a58d83f0e9610b2bd2ed4fe9a76ac45f06aa859d2df541f9fbbfb7cde9acd31d70bcd4c35ee55b7d30b0ebc63312672825f9d3d0edc6e194fe9c6f378452cf75e4d705d7dad4c5137e5e3f23b3b6e7d79a349fc6ca02930aee64e1f74dde4369732c8614736521ed22753187738a30f78cc59353179717fe9236fbdbdb3fe5c929afce56f47477c6cef9e6b6616eb2ebbba7f4ab05777a3e7fbf043e688c3698ae7936f466dae27f79c7c6f5b9f47e342eb5b475d90fcf8b2006189658ec7fa25c71be32e74a425ffa9d2d5bb383ab17dd1a8cef5c499a1f77e715195b3fe949d3f9ef2647b9c995b7438e2c3bdc46315b444b2979b9bce609ebae717ab587ebf470428ad9d445f6943a7bdc61593979c9a4893eb642f4b689a0f99028b9b3afabf7b79ad9776a78c73895ca41a7a642f67f9695b7842f29f1bb5750549c92fc7adbb4ed76bd976bff2227d419b16b840b7a3f7f4cdb3d07dba37475dc6ef2e873eaa0c729f6606ac9ee837ad61c66e4fcfd2f1f54593717ddc872609cd837bc3509bb3ce16e589d5b7fc67055d69ed545379e1d3cfdf4c8f740628f6bcbcfbcd62b7d1b9f52776c174edfb661e7f774e9ce6cc18b80e5d70a580bf61d0dcd17bb5b5496ed21d0d72ba507ae0f50fffaa926f250fcf0b03ae242898b4b58a970f289156bf6cf23e5aba3d8b769bdc91f369d3c1293b1b0b150a658c53da4b2a8ddf36f57a38666e78195fd85e58199d10483d83d0db4dcc3b4074ed7d637d1320ef81dccad9ef72aa6747298a47b2bd78c7b26e683e843a9f1147abbf2bd0fc6bc7929af6aa66f84faa30735cde34deac49c33e8a60b8850871ee61d4abe6d10f26ca27bd3caebef0f1997f8fd92fb55f5a974a5cdd2c4d5f7db171d40fecbf896d56c427be7a864d4c6db1e5ead77a8d8a86ac9b328d575bd07ceab5a121ff8d61f2871d8eaeedad5d0af5e77455537e7d6197b1fc3e2f42f83ddf6a81efbeaa28acc09b3cd7ea2acffd2d1513339b32bf7982cc5b8cdb360fdbec11dfb2b8e365cdd7c2a27a6aaf2dbb5abfeb412be3fedcd654bdd0fbf91ce35da3ca4bc0d6aadf0bd38a12dd9ae6d99597470df0ddfc80df51e168f3708d748b2538a0f6e9b3c113fab9efa58dfd23d74f9efa9f7a26ba7880e54156ef2ff9ad56bb78c7b48f060797c54d7e1298f569e8cb4d94e345b383d944b7e7ef4a3a965dd82826de6bf9fe2a892231e36ebdbf6b43a3cefa80b1556521d3c6da3d885ac490f170ca416ed5074651ccdeed918a5f6ad9f47adeb70f7b13879ced1c5216cf7bdfd1b2e94e76c799a772877d7ee16e9f2d773db9d2c1724e505dccc7dbc85e1e7f5f042aeceb401cd3926e1c9002bd69c631038c7fcf26ee96f719b10ac577e64fbcdf37d4b991503d6dff5efb476928e7b3e627f4e2353fdbd447db3ce54b95017e2d1ca4d7d070c840d9e9903c690feee1c656df72a9c33d5be997a95581656d053b7c640f8c79aa309319dbf762f0d7c7beeb2f9ce07aac4bce1cf7707954b25e6b373e4e2ced82ea73b67fd7fc29b039e771ef1374da93a326b75afaeb3639172fac39ba55e73055f7cbe02d7829541498025666a4e65036ce412c1e12560bc2470c027bbcb354d04f402eda54cdb6034d81f572aae8e06a531ff718be380cb934c22069d08dccff810314920e683011f8b03877c38b854008b59d08f47f38d35f22dc6a01aadcbd85df37c808a500da80cea24aa19752ad58a6a4db5a5b220d268a300c0a814a986f96bfb246c393cb6d4b0f619f94ef9a70685fef9d020e87f574bf51ec40e0000"
|
649 |
+
}
|
650 |
+
}
|
651 |
+
|
652 |
+
POST /login
|
653 |
+
user-agent: Teller Bank iOS v1.3
|
654 |
+
api-key: Hello-Lisbon!
|
655 |
+
device-id: TU2CM7WPWZJVNK2N
|
656 |
+
content-type: application/json
|
657 |
+
accept: application/json
|
658 |
+
{
|
659 |
+
"password": "el1x1r_c0nf_Lisbon",
|
660 |
+
"username": "elixir"
|
661 |
+
}
|
662 |
+
|
663 |
+
<!-- 753927fa0e85d155564e2e272a28d1802ca10daf4496794697cf8db5856cb6c1 -->
|
664 |
+
|
665 |
+
200 OK
|
666 |
+
teller-is-hiring: <https://jobs.lever.co/teller/dd21975a-901b-49ee-926c-336c92f8673d>
|
667 |
+
f-request-id: req_74xbnc6uccryc3pvnmdd23urws5oy3xephlx5ga
|
668 |
+
timestamp: 1682023285504
|
669 |
+
request-token: QTEyOEdDTQ.eTsGcNrahxWbTPhd3SyKsxOX3pe9OGTbfdRaptjxiQtgGRGcq4R7oLpvTDI.6GJRejpn5ttmwHup.o5B-y8GugjkZKijYUGtR27tnEtcoyDvgo15zJK0rvz72pjUu04nAJ7Dij2mrhS12D4Q6NTXspWDWjQokoJ6pyEOQ-dYUPgH6KyJurqGpKcNujZ6SeZkyBTBAieYviup_21oK8zJGjpwxgPzhtw3cAd44BAA2NfQVix0Prl8iiywaed9-PfQkI8gakw.mN8wk42V4nKwta2nILCKEw
|
670 |
+
f-token-spec: eyJtZXRob2QiOiJoc3otZ2RsLXVyZXYtaHJjLXl6aHYtZ3NyaWdiLWdkbC1vbGR2aS14emh2LW1sLWt6d3dybXR0Iiwic2VwYXJhdG9yIjoifCIsInZhbHVlcyI6WyJkZXZpY2UtaWQiLCJ1c2VybmFtZSIsImxhc3QtcmVxdWVzdC1pZCIsImFwaS1rZXkiXX0
|
671 |
+
<!-- sha-two-five-six-base-thirty-two-lower-case-no-paddingg -->
|
672 |
+
{"method":"hsz-gdl-urev-hrc-yzhv-gsrigb-gdl-oldvi-xzhv-ml-kzwwrmtt","separator":"|","values":["device-id","username","last-request-id","api-key"]}
|
673 |
+
content-type: application/json; charset=utf-8
|
674 |
+
{
|
675 |
+
"devices": [
|
676 |
+
{
|
677 |
+
"id": "sms_ad_ammp2m3gewg6oq5qkmedafoykjras7mudpmqmlq",
|
678 |
+
"mask": "***0376",
|
679 |
+
"type": "SMS"
|
680 |
+
},
|
681 |
+
{
|
682 |
+
"id": "voice_ad_ammp2m3gewg6oq5qkmedafoykjras7mudpmqmlq",
|
683 |
+
"mask": "***0376",
|
684 |
+
"type": "VOICE"
|
685 |
+
}
|
686 |
+
],
|
687 |
+
"mfa_required": true
|
688 |
+
}
|
689 |
+
|
690 |
+
2FA REQUEST (SMS):
|
691 |
+
|
692 |
+
POST /login/mfa/request
|
693 |
+
teller-is-hiring: I know!
|
694 |
+
user-agent: Teller Bank iOS v1.3
|
695 |
+
api-key: Hello-Lisbon!
|
696 |
+
device-id: TU2CM7WPWZJVNK2N
|
697 |
+
request-token: QTEyOEdDTQ.eTsGcNrahxWbTPhd3SyKsxOX3pe9OGTbfdRaptjxiQtgGRGcq4R7oLpvTDI.6GJRejpn5ttmwHup.o5B-y8GugjkZKijYUGtR27tnEtcoyDvgo15zJK0rvz72pjUu04nAJ7Dij2mrhS12D4Q6NTXspWDWjQokoJ6pyEOQ-dYUPgH6KyJurqGpKcNujZ6SeZkyBTBAieYviup_21oK8zJGjpwxgPzhtw3cAd44BAA2NfQVix0Prl8iiywaed9-PfQkI8gakw.mN8wk42V4nKwta2nILCKEw
|
698 |
+
f-token: irfahriijqgeiqiwv3xfmpkfiejeypzgh674shz5jzisdfopnqlq
|
699 |
+
ge3dsmrqguzdemjygiytqojygu3dcobvgizdkmzsge4dmmjzha2tqmjvguytgobsgqytgmrvgmytcmzsgiydenbxgi4dqnzrg42dqmjugmytgobygqzdgmbthezdeni
|
700 |
+
content-type: application/json
|
701 |
+
accept: application/json
|
702 |
+
{
|
703 |
+
"device_id": "sms_ad_ammp2m3gewg6oq5qkmedafoykjras7mudpmqmlq"
|
704 |
+
}
|
705 |
+
|
706 |
+
200 OK
|
707 |
+
teller-is-hiring: <https://jobs.lever.co/teller/dd21975a-901b-49ee-926c-336c92f8673d>
|
708 |
+
f-request-id: req_fnba2cemkwcee3p5iwbfntr6kktrxlipgezgoiq
|
709 |
+
timestamp: 1682023346308
|
710 |
+
request-token: QTEyOEdDTQ.n6EwgJDXkgMtu1kTpDgafdpnw5frJlrb1RxY1J3-CrYTj2fBfGwZswTOWiM.GyIjV5n3f7iWEcSH.h2JX3OunPoD4Gx_8w5n54N72XD_DaXcxja6S3e5EIWuOs2TS8nj0bnCOpmIPic6COVJcQELrUfPrK04wmN7LD1jIlf14S2hdD4EzaVy6_tAFphAmeXUwX1Md0CmA7YpCV4l24FAFidP5_LA55d3dFi5DiH99QltUMp2Ydzu2kt8QMz7Cqa5400ikSnaMX3JCrXSOXzGWRw.I4oCkTUNeC_O5UjW2zHoOA
|
711 |
+
f-token-spec: eyJtZXRob2QiOiJoc3otZ2RsLXVyZXYtaHJjLXl6aHYtZ3NyaWdiLWdkbC1vbGR2aS14emh2LW1sLWt6d3dybXR0Iiwic2VwYXJhdG9yIjoiKiIsInZhbHVlcyI6WyJsYXN0LXJlcXVlc3QtaWQiLCJhcGkta2V5IiwidXNlcm5hbWUiLCJkZXZpY2UtaWQiXX0
|
712 |
+
content-type: application/json; charset=utf-8
|
713 |
+
{}
|
714 |
+
|
715 |
+
2FA SUBMIT:
|
716 |
+
|
717 |
+
POST /login/mfa
|
718 |
+
x-token: bWNifm5xcmRzNGpxdGhxNWx/eWNkenk/cGFkdWh/Yn5+bX54OWtndzRycXU8aj17PXE1aw==
|
719 |
+
teller-is-hiring: I know!
|
720 |
+
user-agent: Teller Bank iOS v1.3
|
721 |
+
api-key: Hello-Lisbon!
|
722 |
+
device-id: TU2CM7WPWZJVNK2N
|
723 |
+
request-token: QTEyOEdDTQ.n6EwgJDXkgMtu1kTpDgafdpnw5frJlrb1RxY1J3-CrYTj2fBfGwZswTOWiM.GyIjV5n3f7iWEcSH.h2JX3OunPoD4Gx_8w5n54N72XD_DaXcxja6S3e5EIWuOs2TS8nj0bnCOpmIPic6COVJcQELrUfPrK04wmN7LD1jIlf14S2hdD4EzaVy6_tAFphAmeXUwX1Md0CmA7YpCV4l24FAFidP5_LA55d3dFi5DiH99QltUMp2Ydzu2kt8QMz7Cqa5400ikSnaMX3JCrXSOXzGWRw.I4oCkTUNeC_O5UjW2zHoOA
|
724 |
+
f-token: mkjvfsxdy6jqvhy5dwqkfpy5radwhwbvvevz3kmu4rsu4j5s5y7a
|
725 |
+
content-type: application/json
|
726 |
+
accept: application/json
|
727 |
+
{
|
728 |
+
"code": "001337"
|
729 |
+
}
|
730 |
+
|
731 |
+
200 OK
|
732 |
+
teller-is-hiring: <https://jobs.lever.co/teller/dd21975a-901b-49ee-926c-336c92f8673d>
|
733 |
+
f-request-id: req_lamrcehlkr47fh7udu7qyvuny5spy6vlg3irm4q
|
734 |
+
timestamp: 1682023394098
|
735 |
+
request-token: QTEyOEdDTQ.zgLO7pErtybpzvdTRp0Owbmo0wadgf4DMC8092XexJopWxvwdgsR4nYzoYA.yjv1bowSsNr53Wir.GXCKaidSZqQXW4qrnxnBbA5pGRaBtEjtSd9_29ySzG1k9zB_z1U9xmQWOPsDXxBPVOcHNvw0uzpEjzO_ll5xrWZeqCi_L2jg0yjF0O-UyRrsJxy56aR7qtzTtZDRQbsx9UTCqnQZ2sWBbmNni8qwnDodZhgUtoYkdf2-Vx8MBDK0QxgVZUXYlvWH_-5ydiA.WdI9H7GMq4R7qOsjgJHwCQ
|
736 |
+
f-token-spec: eyJtZXRob2QiOiJoc3otZ2RsLXVyZXYtaHJjLXl6aHYtZ3NyaWdiLWdkbC1vbGR2aS14emh2LW1sLWt6d3dybXR0Iiwic2VwYXJhdG9yIjoiJSIsInZhbHVlcyI6WyJ1c2VybmFtZSIsImFwaS1rZXkiLCJsYXN0LXJlcXVlc3QtaWQiLCJkZXZpY2UtaWQiXX0
|
737 |
+
content-type: application/json; charset=utf-8
|
738 |
+
{
|
739 |
+
"accounts": {
|
740 |
+
"checking": [
|
741 |
+
{
|
742 |
+
"id": "acc_uc5n3sbrzqyejmolxpbinqmquk3pklyiu4kc54a",
|
743 |
+
"masked_number": "2867",
|
744 |
+
"name": "My Checking",
|
745 |
+
"product": "Flex Checking Account"
|
746 |
+
}
|
747 |
+
]
|
748 |
+
},
|
749 |
+
"enc_session_key": "ewogICJjaXBoZXIiOiAiMTI4LUVDQiIsCiAgImtleSI6ICIxNU40QTVMWnJkWkxtdjhJZi9WSDV4RnBxc055RmxvN1BNSEN0RFhLVFp3PSIKfQ==",
|
750 |
+
"offers": [
|
751 |
+
{
|
752 |
+
"code": "1234",
|
753 |
+
"message": "You're eligible for our Premium Metal Credit Card"
|
754 |
+
},
|
755 |
+
{
|
756 |
+
"code": "2345",
|
757 |
+
"message": "Teller is hiring! Come talk to us."
|
758 |
+
}
|
759 |
+
],
|
760 |
+
"user": {
|
761 |
+
"name": "José"
|
762 |
+
}
|
763 |
+
}
|
764 |
+
|
765 |
+
SELECT ACCOUNT:
|
766 |
+
GET /accounts/acc_uc5n3sbrzqyejmolxpbinqmquk3pklyiu4kc54a/balances
|
767 |
+
teller-is-hiring: I know!
|
768 |
+
user-agent: Teller Bank iOS v1.3
|
769 |
+
api-key: Hello-Lisbon!
|
770 |
+
device-id: TU2CM7WPWZJVNK2N
|
771 |
+
request-token: QTEyOEdDTQ.zgLO7pErtybpzvdTRp0Owbmo0wadgf4DMC8092XexJopWxvwdgsR4nYzoYA.yjv1bowSsNr53Wir.GXCKaidSZqQXW4qrnxnBbA5pGRaBtEjtSd9_29ySzG1k9zB_z1U9xmQWOPsDXxBPVOcHNvw0uzpEjzO_ll5xrWZeqCi_L2jg0yjF0O-UyRrsJxy56aR7qtzTtZDRQbsx9UTCqnQZ2sWBbmNni8qwnDodZhgUtoYkdf2-Vx8MBDK0QxgVZUXYlvWH_-5ydiA.WdI9H7GMq4R7qOsjgJHwCQ
|
772 |
+
f-token: liqbifte53nprca4zmdljojznmcmzr5a3nxf7rno4nrlqavk6wxq
|
773 |
+
accept: application/json
|
774 |
+
|
775 |
+
200 OK
|
776 |
+
teller-is-hiring: <https://jobs.lever.co/teller/dd21975a-901b-49ee-926c-336c92f8673d>
|
777 |
+
f-request-id: req_ffdjlmil4gmp2hrdqrbmxwmhdbo3l4cwhtxhhoi
|
778 |
+
timestamp: 1682023408998
|
779 |
+
request-token: QTEyOEdDTQ.UlTQSDOqoCih0Pf8IdVXhdnpdkIxZdWMjXX15jiVrjsY7zIZasIxh2y9d2c.J4WSu10I-6vJ8XHX.3tW1OHlB6ygCqMpOnY-2cEYX0O7n6S3n5Aw7Pc5zMYxSLpg-TeGKS_C-aewzY3f3UIugLVfwiclmsKSwumK7lKV4V43hVnCW-ozvJNpSwUcCimmI7jnOZ824GLpuJVlAc53kLHPJMPtiNz2rDjCLgTCE9kCIkpm2qlQlIsQJTms8oJ5plD8MqEFzzsesLUPVnou1c8-S.LcGLX1RErlpmRGPILWv-7w
|
780 |
+
f-token-spec: eyJtZXRob2QiOiJoc3otZ2RsLXVyZXYtaHJjLXl6aHYtZ3NyaWdiLWdkbC1vbGR2aS14emh2LW1sLWt6d3dybXR0Iiwic2VwYXJhdG9yIjoifCIsInZhbHVlcyI6WyJkZXZpY2UtaWQiLCJ1c2VybmFtZSIsImxhc3QtcmVxdWVzdC1pZCIsImFwaS1rZXkiXX0
|
781 |
+
content-type: application/json; charset=utf-8
|
782 |
+
{
|
783 |
+
"available": 189522,
|
784 |
+
"last_transactions": [
|
785 |
+
{
|
786 |
+
"amount": -399,
|
787 |
+
"posted": false,
|
788 |
+
"title": "Single Origin Espresso - Altis Grand"
|
789 |
+
},
|
790 |
+
{
|
791 |
+
"amount": -479,
|
792 |
+
"posted": false,
|
793 |
+
"title": "Artisanal chocolate chip cookie"
|
794 |
+
},
|
795 |
+
{
|
796 |
+
"amount": -999,
|
797 |
+
"posted": true,
|
798 |
+
"title": "MAINTENANCE FEE"
|
799 |
+
},
|
800 |
+
{
|
801 |
+
"amount": -1999,
|
802 |
+
"posted": true,
|
803 |
+
"title": "Openai chatgpt sub"
|
804 |
+
},
|
805 |
+
{
|
806 |
+
"amount": -299,
|
807 |
+
"posted": true,
|
808 |
+
"title": "metro fare"
|
809 |
+
}
|
810 |
+
],
|
811 |
+
"ledger": 199522
|
812 |
+
}
|
813 |
+
|
814 |
+
GET /accounts/acc_uc5n3sbrzqyejmolxpbinqmquk3pklyiu4kc54a/details
|
815 |
+
teller-is-hiring: I know!
|
816 |
+
user-agent: Teller Bank iOS v1.3
|
817 |
+
api-key: Hello-Lisbon!
|
818 |
+
device-id: TU2CM7WPWZJVNK2N
|
819 |
+
request-token: QTEyOEdDTQ.UlTQSDOqoCih0Pf8IdVXhdnpdkIxZdWMjXX15jiVrjsY7zIZasIxh2y9d2c.J4WSu10I-6vJ8XHX.3tW1OHlB6ygCqMpOnY-2cEYX0O7n6S3n5Aw7Pc5zMYxSLpg-TeGKS_C-aewzY3f3UIugLVfwiclmsKSwumK7lKV4V43hVnCW-ozvJNpSwUcCimmI7jnOZ824GLpuJVlAc53kLHPJMPtiNz2rDjCLgTCE9kCIkpm2qlQlIsQJTms8oJ5plD8MqEFzzsesLUPVnou1c8-S.LcGLX1RErlpmRGPILWv-7w
|
820 |
+
f-token: agavgh7m345xnftdr6stqof6ldte4mh32nunaop6n24jprvrn55a
|
821 |
+
accept: application/json
|
822 |
+
|
823 |
+
200 OK
|
824 |
+
teller-is-hiring: <https://jobs.lever.co/teller/dd21975a-901b-49ee-926c-336c92f8673d>
|
825 |
+
f-request-id: req_xdr4gcpeyyzkejxy4mwovusxzlndjivut3kkslq
|
826 |
+
timestamp: 1682023408998
|
827 |
+
request-token: QTEyOEdDTQ.NGkNLVx-kzx_hsMQX_ir55oFtX3JZCmkAuoYAuifxKMdrHWoLaQdyXn3XEo.wRSYWBpLuqCdNWDd.kzhFMR9peongSox-1Z3troYsm89-X_8PjrcRDTtLLHH9w8VnquFCGfSrP1JDd4xrZsRdgKCbf2ieTpWIKqcB6jWlw31LT13rdzSdzaf26zNTN15OEQPNZWdAr19zGxTHoMuvXxETDVRzwmix48a-Ej2JFjmHsz4ofdR3DRlo40-g80CrqW-BJx7BRxrbiqMPMEEEg4A.y26BKjmxMD4dSqbXToamiA
|
828 |
+
f-token-spec: eyJtZXRob2QiOiJoc3otZ2RsLXVyZXYtaHJjLXl6aHYtZ3NyaWdiLWdkbC1vbGR2aS14emh2LW1sLWt6d3dybXR0Iiwic2VwYXJhdG9yIjoiKyIsInZhbHVlcyI6WyJsYXN0LXJlcXVlc3QtaWQiLCJhcGkta2V5IiwidXNlcm5hbWUiLCJkZXZpY2UtaWQiXX0
|
829 |
+
content-type: application/json; charset=utf-8
|
830 |
+
{
|
831 |
+
"ach": "110000000",
|
832 |
+
"id": "acc_uc5n3sbrzqyejmolxpbinqmquk3pklyiu4kc54a",
|
833 |
+
"name": "My Checking",
|
834 |
+
"number": "63MbzmrYb8P5RCrVK2A7//yPoIPrCL0ry+BS20qyod+nUzBuPZOCNp+7kd+NdDGwsO9bC428yfqtMJUSp2BLcA==",
|
835 |
+
"product": "Flex Checking Account"
|
836 |
+
}
|
notes/logs_numbat.md
ADDED
@@ -0,0 +1,160 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"utils": {
|
2 |
+
"arg_a": "555345524e414d45", USERNAME
|
3 |
+
"arg_b": "465f544f4b454e", F_TOKEN
|
4 |
+
"code": "1f8b08000000000000035d570b5c4c5b173fd399e695c969a69794462fa5f713514e254961f4c0478c69e65453f3726626532149e5f19508999f5eeabac9e37e2525ae1809e1de4f1ec95b12ca4d2ad7dbad6f4f4d57f73bbfdf9ab5f6daffb5f77a9cd9ebecf94b22dc2148ff5c6070c0a20079f44c0822744010e46e142c142805b84bb09827e163f83c6c8451381c81384ec2e1d0b872392e8855c831199927114905428cc6c7a438c6e3ca31be1ea6944a70b98c23e27b53e314629e5c2011cb48222e0f97c860a02489247c851023c9e4b8822787c5022109c3855c71fcc4784cce199d1cd9899684a570648ab83881922ac7b962599c0417e9c70ac45c3c852397708402999cc4954a31311fe60a85a4d119bad6f948398e7145babc149e1083530552bdbf835288601157cafc811388e35d8212b8b88c0a56958d8c09a963f361182ec6842ed1728150a6c7c746bd56e01851218f9b39ce1bae5c221adb238a2b4bd295c9b9b85c17e70a6418512c1163ba188e4b70bd7101ea39a7baba39831c397b38eb6b4dd9b88487c964ba3221864975e3b84219f603e6eefc4376732638339dffce8bab87564b8ce58af9c458a50437741688850231c6771eab9cabbb7310282504e994813a23d0e873129035203d02a2827418560881351bde67426178640566452862313c7a8b624f5679f0496f821bda04330928ca00bf6c3404026c2d1a8200264575c0ef66146682c9c52c88904f42e856843215a2c3188408d568080bccab552c1d060d61115a27b058289388c2862a3722444750227cdc0421aa503282a03051c526427535ba10b2193651d318c8661d431a9366c8daacb31c46684c003554ad055095948cb0502273c4763399e586cc70d344c642906310d30452e59359a8f74b98c162123a54651484cd22f4abaa810fe6108182d0d1313874dc04251ada781d4380151ae206abd4c0125dca24b3d6cea41bc001b01713706600d35acb6db4dc900838b182c8f402439466c944ad61552b9925adb2813543550790356ea1a36eb1e0919de06d6e88aa9f8c6c06916f432015052123f968086a8dd26c9814b732e09e814abd002650189aaad0ec806224b54835816238aa420814a31f09a718abfa81761a4aa0984c4051d493885a1ba24c1b14f642ab1ec364443d1ba64f324169d3e9a64d745302c594813209944928d11335b446bd98a80dbc8e05accd541403b09023587e321dfa915037901a4d3ae9e630030296e6209d605b8b51b813804fd9a88bb4c2542ea834c552950fb42e40cb9a45b7847d01b1026188b95197d5c13cc40c84111888fdcb992c58039f3a12923b805bf9d1a7c2e06f19a579394345520d6fd6beaf7440fa8074b4b2012002202340c6e364132dc614d024ad6c0668b216630168cab875585a792a20ab71186badacc1d80282c7f9a0d1db03721887711eb7a6eb38d94d23072b4762f10244046437ce5f3bed7f91a98d73cc4e478bd199af106b6cf95a5b17ad9ea5b5836049483a608e5afd589c63fa695abbb1bc10b57a272d6e8a36b6117cb8400ef62290003194457ebbdc9764a2e697879725453079d3e666adbb7db9b926f360291ab477ba5fc79bd0a0f63b17ed729b3abbfa3a3a3b3bc209370eab9f3fd9dd5269607af6dcb9ef6b0607a74072c2dae15bc7152fea5f7c342f7ff02928dce9846722f3d8bda102fff44d5f8aafdd19b859fc6de3ba65b58d3e3dc545bcce70f1a99fd73ebd273730df407ae9b1b40dfe8bed192afb25a12565a15165f96f029671b86ef951ae611a25f959e4c7ab5b3f45871ac5537c2e3905565fde3933445a641fdd32e3596168599453a77d2cfed259b5f07ad6d506d7150d8c398bdaafdcd8d11ef7edd6d7b6bcc514bbc26cbfe6c5998f457a9c25e14fde4e0ce725e65fbaf8e742cbd9a4fa90e12bfe5bc410142ee16972bf021059d31fb539b3fabf3a8ccfe5f83a8ccfbdb9b65c9a1a4fd4ca7a01a09f6adea54ca1c62a41870fc1c932f1c8408c40e9bbead66cffd47e646fdc97d5efdf758b12138342c5716072f7081ed6e0c9c9182e037d3609d29de9e2e1e23ea29348475aaf0644e44393c4a0b749b9ebc51c6dcfc639d2d15ec387a871b84404f438c68726029c4602b39894abd1e8030d57015a9c40a4e9ec899ac549328902e76149909e2be8c0ae62491c583111ec342f365e00f66bcc64839759ad2c6a5b7141f268bea1fff6bdfcafa7239409d3a665d75f41b375b20cd2049e0a6a6bb25d5ed752df1d5659d63d0bf53d8e44ce48e9b9db1854e8f2979ef9aa6d59f7f74fbd85e60eb9fb453042df7fbe11e07977a7627de9f9b47769ef9efe1ab933529dbdc5a6d22136c8fbf20b13da8a60df3eae9555f9e9ee93d5a6532e5413a03f682b728ee6769b1a1cffe8bd23a77e5175d7fd96f20ac5835e794ddebcdaa4b417deba55f7d53e3ef4b04a62cc4ec93e23b66f064a98b3ba37b5d65692d75e93d1f1fae1862df1afbc7f3f1d6268fb64efa3f26ed8f1694c8f1b69a889e398b3396fee47c83bb121f844c64bfb184251c6c6f4b0fc2cdc81bd3d6bd081adca5a165146d33b71923d3d7bd7d325c9ab09a58d83f0e9610b2bd2ed4fe9a76ac45f06aa859d2df541f9fbbfb7cde9acd31d70bcd4c35ee55b7d30b0ebc63312672825f9d3d0edc6e194fe9c6f378452cf75e4d705d7dad4c5137e5e3f23b3b6e7d79a349fc6ca02930aee64e1f74dde4369732c8614736521ed22753187738a30f78cc59353179717fe9236fbdbdb3fe5c929afce56f47477c6cef9e6b6616eb2ebbba7f4ab05777a3e7fbf043e688c3698ae7936f466dae27f79c7c6f5b9f47e342eb5b475d90fcf8b2006189658ec7fa25c71be32e74a425ffa9d2d5bb383ab17dd1a8cef5c499a1f77e715195b3fe949d3f9ef2647b9c995b7438e2c3bdc46315b444b2979b9bce609ebae717ab587ebf470428ad9d445f6943a7bdc61593979c9a4893eb642f4b689a0f99028b9b3afabf7b79ad9776a78c73895ca41a7a642f67f9695b7842f29f1bb5750549c92fc7adbb4ed76bd976bff2227d419b16b840b7a3f7f4cdb3d07dba37475dc6ef2e873eaa0c729f6606ac9ee837ad61c66e4fcfd2f1f54593717ddc872609cd837bc3509bb3ce16e589d5b7fc67055d69ed545379e1d3cfdf4c8f740628f6bcbcfbcd62b7d1b9f52776c174edfb661e7f774e9ce6cc18b80e5d70a580bf61d0dcd17bb5b5496ed21d0d72ba507ae0f50fffaa926f250fcf0b03ae242898b4b58a970f289156bf6cf23e5aba3d8b769bdc91f369d3c1293b1b0b150a658c53da4b2a8ddf36f57a38666e78195fd85e58199d10483d83d0db4dcc3b4074ed7d637d1320ef81dccad9ef72aa6747298a47b2bd78c7b26e683e843a9f1147abbf2bd0fc6bc7929af6aa66f84faa30735cde34deac49c33e8a60b8850871ee61d4abe6d10f26ca27bd3caebef0f1997f8fd92fb55f5a974a5cdd2c4d5f7db171d40fecbf896d56c427be7a864d4c6db1e5ead77a8d8a86ac9b328d575bd07ceab5a121ff8d61f2871d8eaeedad5d0af5e77455537e7d6197b1fc3e2f42f83ddf6a81efbeaa28acc09b3cd7ea2acffd2d1513339b32bf7982cc5b8cdb360fdbec11dfb2b8e365cdd7c2a27a6aaf2dbb5abfeb412be3fedcd654bdd0fbf91ce35da3ca4bc0d6aadf0bd38a12dd9ae6d99597470df0ddfc80df51e168f3708d748b2538a0f6e9b3c113fab9efa58dfd23d74f9efa9f7a26ba7880e54156ef2ff9ad56bb78c7b48f060797c54d7e1298f569e8cb4d94e345b383d944b7e7ef4a3a965dd82826de6bf9fe2a892231e36ebdbf6b43a3cefa80b1556521d3c6da3d885ac490f170ca416ed5074651ccdeed918a5f6ad9f47adeb70f7b13879ced1c5216cf7bdfd1b2e94e76c799a772877d7ee16e9f2d773db9d2c1724e505dccc7dbc85e1e7f5f042aeceb401cd3926e1c9002bd69c631038c7fcf26ee96f719b10ac577e64fbcdf37d4b991503d6dff5efb476928e7b3e627f4e2353fdbd447db3ce54b95017e2d1ca4d7d070c840d9e9903c690feee1c656df72a9c33d5be997a95581656d053b7c640f8c79aa309319dbf762f0d7c7beeb2f9ce07aac4bce1cf7707954b25e6b373e4e2ced82ea73b67fd7fc29b039e771ef1374da93a326b75afaeb3639172fac39ba55e73055f7cbe02d7829541498025666a4e65036ce412c1e12560bc2470c027bbcb354d04f402eda54cdb6034d81f572aae8e06a531ff718be380cb934c22069d08dccff810314920e683011f8b03877c38b854008b59d08f47f38d35f22dc6a01aadcbd85df37c808a500da80cea24aa19752ad58a6a4db5a5b220d268a300c0a814a986f96bfb246c393cb6d4b0f619f94ef9a70685fef9d020e87f574bf51ec40e0000"
|
5 |
+
}
|
6 |
+
}
|
7 |
+
|
8 |
+
POST /login
|
9 |
+
user-agent: Teller Bank iOS v1.3
|
10 |
+
api-key: Hello-Lisbon!
|
11 |
+
device-id: RVAG6VKOXO7QBTDL
|
12 |
+
content-type: application/json
|
13 |
+
accept: application/json
|
14 |
+
{
|
15 |
+
"password": "el1x1r_c0nf_Lisbon",
|
16 |
+
"username": "numbat"
|
17 |
+
}
|
18 |
+
|
19 |
+
200 OK
|
20 |
+
teller-is-hiring: <https://jobs.lever.co/teller/dd21975a-901b-49ee-926c-336c92f8673d>
|
21 |
+
f-request-id: req_soqtboqsoosr3g4257eaqgij6qexfcco76qjmxi
|
22 |
+
timestamp: 1682052357523
|
23 |
+
request-token: QTEyOEdDTQ.yBGmUvNU9iPBtZZwpLZhLh5Z7M9InBDvi-gPMAPayB5TjwjTnzSrnYXRGhI.9nxkxffq0azPcdxe.uocxpS-VqhPE4dZEoKqIwLE_ywYFS_8qqdX79g9YfBy0pYU_VlrNqR5Zy9TtcxeFGSZDbMO6FHdGMEvjjKbUuLC4NHcOemEfXiqXVahTpReEzsKVwT5nOZAyR80oo4RmaiZ2UdNnGCOqkWqU8-vGI4M18L6h1HXUvCPEBd4IP2VYzfdeTkDywxLlaA.vxbSmsWEsn2VyT57ImL5aQ
|
24 |
+
f-token-spec: eyJtZXRob2QiOiJoc3otZ2RsLXVyZXYtaHJjLXl6aHYtZ3NyaWdiLWdkbC1vbGR2aS14emh2LW1sLWt6d3dybXR0Iiwic2VwYXJhdG9yIjoiKyIsInZhbHVlcyI6WyJsYXN0LXJlcXVlc3QtaWQiLCJ1c2VybmFtZSIsImRldmljZS1pZCIsImFwaS1rZXkiXX0
|
25 |
+
content-type: application/json; charset=utf-8
|
26 |
+
{
|
27 |
+
"devices": [
|
28 |
+
{
|
29 |
+
"id": "sms_ad_6x2bqnms2bnuvgyir7mnitc36fbtcrlndazdk6a",
|
30 |
+
"mask": "***4524",
|
31 |
+
"type": "SMS"
|
32 |
+
},
|
33 |
+
{
|
34 |
+
"id": "voice_ad_6x2bqnms2bnuvgyir7mnitc36fbtcrlndazdk6a",
|
35 |
+
"mask": "***4524",
|
36 |
+
"type": "VOICE"
|
37 |
+
}
|
38 |
+
],
|
39 |
+
"mfa_required": true
|
40 |
+
}
|
41 |
+
|
42 |
+
POST /login/mfa/request
|
43 |
+
teller-is-hiring: I know!
|
44 |
+
user-agent: Teller Bank iOS v1.3
|
45 |
+
api-key: Hello-Lisbon!
|
46 |
+
device-id: RVAG6VKOXO7QBTDL
|
47 |
+
request-token: QTEyOEdDTQ.yBGmUvNU9iPBtZZwpLZhLh5Z7M9InBDvi-gPMAPayB5TjwjTnzSrnYXRGhI.9nxkxffq0azPcdxe.uocxpS-VqhPE4dZEoKqIwLE_ywYFS_8qqdX79g9YfBy0pYU_VlrNqR5Zy9TtcxeFGSZDbMO6FHdGMEvjjKbUuLC4NHcOemEfXiqXVahTpReEzsKVwT5nOZAyR80oo4RmaiZ2UdNnGCOqkWqU8-vGI4M18L6h1HXUvCPEBd4IP2VYzfdeTkDywxLlaA.vxbSmsWEsn2VyT57ImL5aQ
|
48 |
+
f-token: knqr3nq6gnyvliya36eexaagdiut7h3izpqgh7mnb3r5vs7mgkha
|
49 |
+
content-type: application/json
|
50 |
+
accept: application/json
|
51 |
+
{
|
52 |
+
"device_id": "sms_ad_6x2bqnms2bnuvgyir7mnitc36fbtcrlndazdk6a"
|
53 |
+
}
|
54 |
+
|
55 |
+
200 OK
|
56 |
+
teller-is-hiring: <https://jobs.lever.co/teller/dd21975a-901b-49ee-926c-336c92f8673d>
|
57 |
+
f-request-id: req_uaiocaf3mpaxoeqpopjbzea7i4mih5jismd262y
|
58 |
+
timestamp: 1682052359558
|
59 |
+
request-token: QTEyOEdDTQ.7yDQn1TKcxoTki2JnAw8B-sPSuBV_TAFyGNOscw10-lNJdBJN1QKrp-XYOo.2gMDvwBYUttU4wyg.DndT8SnDgS-8_EfYaI9wU05v7UADrN1uxnH5UPJeFi09XZJjsPrMhC9AtmvOpxRcvfZeIymI6XLgpvUPTBQ_-dekFf89wor-dPmhxG3Qowam1_jw90NxocZUnC6kLDJGrwoWZazraTf-heXiM4jgCk5zCboaZFOzjUMjYmIpMLqfZtYOrUtf7VN9srEeOXeRVTk_kwsYKw.u3Yc9Cz0R0shRdEuVvm7qg
|
60 |
+
f-token-spec: eyJtZXRob2QiOiJoc3otZ2RsLXVyZXYtaHJjLXl6aHYtZ3NyaWdiLWdkbC1vbGR2aS14emh2LW1sLWt6d3dybXR0Iiwic2VwYXJhdG9yIjoiKyIsInZhbHVlcyI6WyJsYXN0LXJlcXVlc3QtaWQiLCJkZXZpY2UtaWQiLCJhcGkta2V5IiwidXNlcm5hbWUiXX0
|
61 |
+
content-type: application/json; charset=utf-8
|
62 |
+
{}
|
63 |
+
|
64 |
+
POST /login/mfa
|
65 |
+
x-token: YWhwNXZoZGt7ZzNua3N6YG99MGZlaHJ/NHRqa3k8fG5hajJneXdmengzd3hhY2pxbm95aw==
|
66 |
+
teller-is-hiring: I know!
|
67 |
+
user-agent: Teller Bank iOS v1.3
|
68 |
+
api-key: Hello-Lisbon!
|
69 |
+
device-id: RVAG6VKOXO7QBTDL
|
70 |
+
request-token: QTEyOEdDTQ.7yDQn1TKcxoTki2JnAw8B-sPSuBV_TAFyGNOscw10-lNJdBJN1QKrp-XYOo.2gMDvwBYUttU4wyg.DndT8SnDgS-8_EfYaI9wU05v7UADrN1uxnH5UPJeFi09XZJjsPrMhC9AtmvOpxRcvfZeIymI6XLgpvUPTBQ_-dekFf89wor-dPmhxG3Qowam1_jw90NxocZUnC6kLDJGrwoWZazraTf-heXiM4jgCk5zCboaZFOzjUMjYmIpMLqfZtYOrUtf7VN9srEeOXeRVTk_kwsYKw.u3Yc9Cz0R0shRdEuVvm7qg
|
71 |
+
f-token: khx7vhnkqe3nisrjou2febru6tjiy4vnih2gswlxx3uxiijyloya
|
72 |
+
content-type: application/json
|
73 |
+
accept: application/json
|
74 |
+
{
|
75 |
+
"code": "001337"
|
76 |
+
}
|
77 |
+
|
78 |
+
200 OK
|
79 |
+
teller-is-hiring: <https://jobs.lever.co/teller/dd21975a-901b-49ee-926c-336c92f8673d>
|
80 |
+
f-request-id: req_nirkymmq7eupsmdelashosqgiep4it5ebcxt3xq
|
81 |
+
timestamp: 1682052362263
|
82 |
+
<!-- A128GCM -->
|
83 |
+
request-token: QTEyOEdDTQ.mxmAQbfAs-7yHCrXtX4qah1-0aM8aS25JrdxTuMjQJQWr-jyU9LRmJFns5w.-86gGAjR2k4TMcVk.eOhFLmEEoAUtY74pQVTxXIQJ9TzM0vy235jR2wYuDaaVNqK6jrFtWy9H8OBTd30joBpEEpueX-qBVNmAmOgdJ3F902GjD4SmJVE-3NuVsBjfdlTXx88tLhYuWyTaqpBP1kFAbT6CmVSAfZIHI-BpaejQ9ELoEV2dsSLcKeLAP7m-nrpwRqhDeAH5aC8VYHg
|
84 |
+
.ySvSSHLCV86ryEmUF4BMIQ
|
85 |
+
f-token-spec: eyJtZXRob2QiOiJoc3otZ2RsLXVyZXYtaHJjLXl6aHYtZ3NyaWdiLWdkbC1vbGR2aS14emh2LW1sLWt6d3dybXR0Iiwic2VwYXJhdG9yIjoiKyIsInZhbHVlcyI6WyJsYXN0LXJlcXVlc3QtaWQiLCJ1c2VybmFtZSIsImFwaS1rZXkiLCJkZXZpY2UtaWQiXX0
|
86 |
+
content-type: application/json; charset=utf-8
|
87 |
+
{
|
88 |
+
"accounts": {
|
89 |
+
"checking": [
|
90 |
+
{
|
91 |
+
"id": "acc_wmz5kqq374jzntiak7gzsaqgsjaxqnhaosdcvoq",
|
92 |
+
"masked_number": "0486",
|
93 |
+
"name": "My Checking",
|
94 |
+
"product": "Flex Checking Account"
|
95 |
+
}
|
96 |
+
]
|
97 |
+
},
|
98 |
+
"enc_session_key": "ewogICJjaXBoZXIiOiAiMTI4LUVDQiIsCiAgImtleSI6ICJFdG9pZzU2R3VKRjFndDB5WThyTzdFbkhWNHFxbmR6OWtpRGFIYVIwTFpnPSIKfQ==",
|
99 |
+
"offers": [
|
100 |
+
{
|
101 |
+
"code": "1234",
|
102 |
+
"message": "You're eligible for our Premium Metal Credit Card"
|
103 |
+
},
|
104 |
+
{
|
105 |
+
"code": "2345",
|
106 |
+
"message": "Teller is hiring! Come talk to us."
|
107 |
+
}
|
108 |
+
],
|
109 |
+
"user": {
|
110 |
+
"name": "José"
|
111 |
+
}
|
112 |
+
}
|
113 |
+
|
114 |
+
GET /accounts/acc_wmz5kqq374jzntiak7gzsaqgsjaxqnhaosdcvoq/balances
|
115 |
+
teller-is-hiring: I know!
|
116 |
+
user-agent: Teller Bank iOS v1.3
|
117 |
+
api-key: Hello-Lisbon!
|
118 |
+
device-id: RVAG6VKOXO7QBTDL
|
119 |
+
request-token: QTEyOEdDTQ.mxmAQbfAs-7yHCrXtX4qah1-0aM8aS25JrdxTuMjQJQWr-jyU9LRmJFns5w.-86gGAjR2k4TMcVk.eOhFLmEEoAUtY74pQVTxXIQJ9TzM0vy235jR2wYuDaaVNqK6jrFtWy9H8OBTd30joBpEEpueX-qBVNmAmOgdJ3F902GjD4SmJVE-3NuVsBjfdlTXx88tLhYuWyTaqpBP1kFAbT6CmVSAfZIHI-BpaejQ9ELoEV2dsSLcKeLAP7m-nrpwRqhDeAH5aC8VYHg.ySvSSHLCV86ryEmUF4BMIQ
|
120 |
+
f-token: boqfrm24yqzuk66opzjftlvqmedgdhqdac4fjfyvi7u3jzii2zma
|
121 |
+
accept: application/json
|
122 |
+
|
123 |
+
200 OK
|
124 |
+
teller-is-hiring: <https://jobs.lever.co/teller/dd21975a-901b-49ee-926c-336c92f8673d>
|
125 |
+
f-request-id: req_6rxxm6ghvd6awd2xoysahbwevdsaxio3a5d22ny
|
126 |
+
timestamp: 1682052368659
|
127 |
+
request-token: QTEyOEdDTQ.svZ5LPu5kQRLXfQ6INLUZS_ZPsK-h7tEXT93bUe7EJs9xtuyu9IEFqplHCo.7wQRNKlSWYPF_kpp.8vmzx7zRgygZ_qFyKpQW58ZhhLc0oYWU9AD_q3jXWeQiVfel9GPAfP3GKGkK_9P4yJg7DyqkFdZ_M_AN5RjiStaQnCdyUje7UstYYi12ScWVUzAzF8uPR6jIhwFDYrfAmjlK3kHXCvcztXA2672r8chfazzX9JuwT-chy2tmmwouw0LvI4AskMVYYjtbhJwqXT0j17if.inP26QhUAITIwPT56Qxhuw
|
128 |
+
f-token-spec: eyJtZXRob2QiOiJoc3otZ2RsLXVyZXYtaHJjLXl6aHYtZ3NyaWdiLWdkbC1vbGR2aS14emh2LW1sLWt6d3dybXR0Iiwic2VwYXJhdG9yIjoiJCIsInZhbHVlcyI6WyJhcGkta2V5IiwiZGV2aWNlLWlkIiwibGFzdC1yZXF1ZXN0LWlkIiwidXNlcm5hbWUiXX0
|
129 |
+
content-type: application/json; charset=utf-8
|
130 |
+
{
|
131 |
+
"available": 458252,
|
132 |
+
"last_transactions": [
|
133 |
+
{
|
134 |
+
"amount": -399,
|
135 |
+
"posted": false,
|
136 |
+
"title": "Single Origin Espresso - Altis Grand"
|
137 |
+
},
|
138 |
+
{
|
139 |
+
"amount": -479,
|
140 |
+
"posted": false,
|
141 |
+
"title": "Artisanal chocolate chip cookie"
|
142 |
+
},
|
143 |
+
{
|
144 |
+
"amount": -999,
|
145 |
+
"posted": true,
|
146 |
+
"title": "MAINTENANCE FEE"
|
147 |
+
},
|
148 |
+
{
|
149 |
+
"amount": -1999,
|
150 |
+
"posted": true,
|
151 |
+
"title": "Openai chatgpt sub"
|
152 |
+
},
|
153 |
+
{
|
154 |
+
"amount": -299,
|
155 |
+
"posted": true,
|
156 |
+
"title": "metro fare"
|
157 |
+
}
|
158 |
+
],
|
159 |
+
"ledger": 468252
|
160 |
+
}
|
notes/logs_phoenix.md
ADDED
@@ -0,0 +1,754 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
LOGIN: phoenix
|
2 |
+
PASS:
|
3 |
+
|
4 |
+
GET /config
|
5 |
+
user-agent: Teller Bank iOS v1.3
|
6 |
+
api-key: Hello-Lisbon!
|
7 |
+
device-id: HRB5FKPHPB6UJ3NU
|
8 |
+
accept: application/json
|
9 |
+
|
10 |
+
200 OK
|
11 |
+
teller-is-hiring: <https://jobs.lever.co/teller/dd21975a-901b-49ee-926c-336c92f8673d>
|
12 |
+
content-type: application/json; charset=utf-8
|
13 |
+
{
|
14 |
+
"conference": [
|
15 |
+
{
|
16 |
+
"date": "2023-04-20",
|
17 |
+
"schedule": [
|
18 |
+
{
|
19 |
+
"location": {
|
20 |
+
"floor": "Floor -1",
|
21 |
+
"room": "Europa",
|
22 |
+
"track": "Track 1"
|
23 |
+
},
|
24 |
+
"speakers": [],
|
25 |
+
"time": "9:00 AM – 9:20 AM",
|
26 |
+
"title": "Welcome to the ElixirConf EU!"
|
27 |
+
},
|
28 |
+
{
|
29 |
+
"location": {
|
30 |
+
"floor": "Floor -1",
|
31 |
+
"room": "Europa",
|
32 |
+
"track": "Track 1"
|
33 |
+
},
|
34 |
+
"speakers": [
|
35 |
+
{
|
36 |
+
"affiliation": "Dashbit",
|
37 |
+
"name": "José Valim",
|
38 |
+
"title": "Creator of Elixir, Chief Adoption Officer"
|
39 |
+
}
|
40 |
+
],
|
41 |
+
"time": "9:20 AM – 10:20 AM",
|
42 |
+
"title": "Keynote: Bringing Elixir to Life"
|
43 |
+
},
|
44 |
+
{
|
45 |
+
"location": null,
|
46 |
+
"speakers": [],
|
47 |
+
"time": "10:20 AM – 10:50 AM",
|
48 |
+
"title": "Coffee Break"
|
49 |
+
},
|
50 |
+
{
|
51 |
+
"location": {
|
52 |
+
"floor": "Floor -1",
|
53 |
+
"room": "Europa",
|
54 |
+
"track": "Track 1"
|
55 |
+
},
|
56 |
+
"speakers": [
|
57 |
+
{
|
58 |
+
"affiliation": "Turn.io",
|
59 |
+
"name": "Simon de Haan",
|
60 |
+
"title": "CTO & Co-Founder"
|
61 |
+
},
|
62 |
+
{
|
63 |
+
"affiliation": "Turn.io",
|
64 |
+
"name": "Federico Meini",
|
65 |
+
"title": "Software Engineer"
|
66 |
+
}
|
67 |
+
],
|
68 |
+
"time": "10:50 AM – 11:20 AM",
|
69 |
+
"title": "A Domain Specific Language for Impact"
|
70 |
+
},
|
71 |
+
{
|
72 |
+
"location": {
|
73 |
+
"floor": "Floor 1",
|
74 |
+
"room": "Roma",
|
75 |
+
"track": "Track 2"
|
76 |
+
},
|
77 |
+
"speakers": [
|
78 |
+
{
|
79 |
+
"affiliation": "Pass It Down",
|
80 |
+
"name": "Savannah Manning",
|
81 |
+
"title": "Software Engineer"
|
82 |
+
},
|
83 |
+
{
|
84 |
+
"affiliation": "Pass It Down",
|
85 |
+
"name": "Gabriel Wamunyu",
|
86 |
+
"title": "Full Stack Engineer"
|
87 |
+
}
|
88 |
+
],
|
89 |
+
"time": "10:50 AM – 11:20 AM",
|
90 |
+
"title": "Functional Juniors: Leveling Up Your New Elixir Devs"
|
91 |
+
},
|
92 |
+
{
|
93 |
+
"location": {
|
94 |
+
"floor": "Floor 1",
|
95 |
+
"room": "Roma",
|
96 |
+
"track": "Track 2"
|
97 |
+
},
|
98 |
+
"speakers": [
|
99 |
+
{
|
100 |
+
"affiliation": "koderki.pl",
|
101 |
+
"name": "Michał Ślaski",
|
102 |
+
"title": "Co-Founder"
|
103 |
+
}
|
104 |
+
],
|
105 |
+
"time": "11:30 AM – 12:00 PM",
|
106 |
+
"title": "National Curriculum Goes Functional"
|
107 |
+
},
|
108 |
+
{
|
109 |
+
"location": {
|
110 |
+
"floor": "Floor -1",
|
111 |
+
"room": "Europa",
|
112 |
+
"track": "Track 1"
|
113 |
+
},
|
114 |
+
"speakers": [
|
115 |
+
{
|
116 |
+
"affiliation": "Software Stumbler",
|
117 |
+
"name": "Luca Dei Zotti",
|
118 |
+
"title": ""
|
119 |
+
}
|
120 |
+
],
|
121 |
+
"time": "11:30 AM – 12:00 PM",
|
122 |
+
"title": "Remote Debugging with Livebook"
|
123 |
+
},
|
124 |
+
{
|
125 |
+
"location": {
|
126 |
+
"floor": "Floor 1",
|
127 |
+
"room": "Roma",
|
128 |
+
"track": "Track 2"
|
129 |
+
},
|
130 |
+
"speakers": [
|
131 |
+
{
|
132 |
+
"affiliation": "Helvetia Insurance",
|
133 |
+
"name": "André Graf",
|
134 |
+
"title": "DevOps Solution Architect"
|
135 |
+
}
|
136 |
+
],
|
137 |
+
"time": "12:10 PM – 12:40 PM",
|
138 |
+
"title": "The Journey of Elixir at Helvetia Insurance"
|
139 |
+
},
|
140 |
+
{
|
141 |
+
"location": {
|
142 |
+
"floor": "Floor -1",
|
143 |
+
"room": "Europa",
|
144 |
+
"track": "Track 1"
|
145 |
+
},
|
146 |
+
"speakers": [
|
147 |
+
{
|
148 |
+
"affiliation": "Dashbit",
|
149 |
+
"name": "Wojtek Mach",
|
150 |
+
"title": "Developer"
|
151 |
+
}
|
152 |
+
],
|
153 |
+
"time": "12:10 PM – 12:40 PM",
|
154 |
+
"title": "Building Livebook Desktop"
|
155 |
+
},
|
156 |
+
{
|
157 |
+
"location": null,
|
158 |
+
"speakers": [],
|
159 |
+
"time": "12:40 PM – 2:10 PM",
|
160 |
+
"title": "Lunch"
|
161 |
+
},
|
162 |
+
{
|
163 |
+
"location": null,
|
164 |
+
"speakers": [],
|
165 |
+
"time": "1:00 PM – 1:30 PM",
|
166 |
+
"title": "Meet the Sponsor: Teller. Bumblebee at Scale: Enriching millions of transactions a day with Elixir, Nx, and Bumblebee"
|
167 |
+
},
|
168 |
+
{
|
169 |
+
"location": {
|
170 |
+
"floor": "Floor 1",
|
171 |
+
"room": "Roma",
|
172 |
+
"track": "Track 2"
|
173 |
+
},
|
174 |
+
"speakers": [
|
175 |
+
{
|
176 |
+
"affiliation": "Multiverse",
|
177 |
+
"name": "Jack Rhodes",
|
178 |
+
"title": "Engineering Manager, building the platform for modern apprenticeships"
|
179 |
+
}
|
180 |
+
],
|
181 |
+
"time": "2:10 PM – 2:40 PM",
|
182 |
+
"title": "From Start-up to Unicorn: Scaling Teams, Impact, and Education with Elixir at Multiverse"
|
183 |
+
},
|
184 |
+
{
|
185 |
+
"location": {
|
186 |
+
"floor": "Floor -1",
|
187 |
+
"room": "Europa",
|
188 |
+
"track": "Track 1"
|
189 |
+
},
|
190 |
+
"speakers": [
|
191 |
+
{
|
192 |
+
"affiliation": "Simplebet",
|
193 |
+
"name": "Marlus Saraiva",
|
194 |
+
"title": "Tech Lead. Creator of Broadway, ElixirSense and Surface."
|
195 |
+
}
|
196 |
+
],
|
197 |
+
"time": "2:10 PM – 2:40 PM",
|
198 |
+
"title": "Optimizing LiveView for Realtime Applications"
|
199 |
+
},
|
200 |
+
{
|
201 |
+
"location": {
|
202 |
+
"floor": "Floor -1",
|
203 |
+
"room": "Europa",
|
204 |
+
"track": "Track 1"
|
205 |
+
},
|
206 |
+
"speakers": [
|
207 |
+
{
|
208 |
+
"affiliation": "Bodgemaster at Heart / Programmer at Large",
|
209 |
+
"name": "Evadne Wu",
|
210 |
+
"title": ""
|
211 |
+
}
|
212 |
+
],
|
213 |
+
"time": "2:50 PM – 3:20 PM",
|
214 |
+
"title": "“Not Hotdog” Revisited"
|
215 |
+
},
|
216 |
+
{
|
217 |
+
"location": {
|
218 |
+
"floor": "Floor 1",
|
219 |
+
"room": "Roma",
|
220 |
+
"track": "Track 2"
|
221 |
+
},
|
222 |
+
"speakers": [
|
223 |
+
{
|
224 |
+
"affiliation": "UCLL - Digital Solutions - Leuven (B)",
|
225 |
+
"name": "Paul Valckenaers",
|
226 |
+
"title": ""
|
227 |
+
}
|
228 |
+
],
|
229 |
+
"time": "2:50 PM – 3:20 PM",
|
230 |
+
"title": "Quantum Doodle: Digital Twins for Everyday Activities"
|
231 |
+
},
|
232 |
+
{
|
233 |
+
"location": null,
|
234 |
+
"speakers": [],
|
235 |
+
"time": "3:20 PM – 3:50 PM",
|
236 |
+
"title": "Coffee Break"
|
237 |
+
},
|
238 |
+
{
|
239 |
+
"location": {
|
240 |
+
"floor": "Floor 1",
|
241 |
+
"room": "Roma",
|
242 |
+
"track": "Track 2"
|
243 |
+
},
|
244 |
+
"speakers": [
|
245 |
+
{
|
246 |
+
"affiliation": "Multiverse",
|
247 |
+
"name": "Karoline Lende",
|
248 |
+
"title": "Software Engineer"
|
249 |
+
}
|
250 |
+
],
|
251 |
+
"time": "3:50 PM – 4:20 PM",
|
252 |
+
"title": "Building an Interview Scheduler in LiveView: A Newcomer's Journey from Despair to Delight"
|
253 |
+
},
|
254 |
+
{
|
255 |
+
"location": {
|
256 |
+
"floor": "Floor -1",
|
257 |
+
"room": "Europa",
|
258 |
+
"track": "Track 1"
|
259 |
+
},
|
260 |
+
"speakers": [
|
261 |
+
{
|
262 |
+
"affiliation": "Dashbit",
|
263 |
+
"name": "Jonatan Kłosko",
|
264 |
+
"title": "Software Engineer"
|
265 |
+
}
|
266 |
+
],
|
267 |
+
"time": "3:50 PM – 4:20 PM",
|
268 |
+
"title": "Powerful Machine Learning at Your Fingertips"
|
269 |
+
},
|
270 |
+
{
|
271 |
+
"location": {
|
272 |
+
"floor": "Floor -1",
|
273 |
+
"room": "Europa",
|
274 |
+
"track": "Track 1"
|
275 |
+
},
|
276 |
+
"speakers": [
|
277 |
+
{
|
278 |
+
"affiliation": "Underjord AB",
|
279 |
+
"name": "Lars Wikman",
|
280 |
+
"title": "Developer"
|
281 |
+
}
|
282 |
+
],
|
283 |
+
"time": "4:30 PM – 5:00 PM",
|
284 |
+
"title": "Lively LiveView with Membrane"
|
285 |
+
},
|
286 |
+
{
|
287 |
+
"location": {
|
288 |
+
"floor": "Floor 1",
|
289 |
+
"room": "Roma",
|
290 |
+
"track": "Track 2"
|
291 |
+
},
|
292 |
+
"speakers": [
|
293 |
+
{
|
294 |
+
"affiliation": "CNRS - Université Paris Cité",
|
295 |
+
"name": "Giuseppe Castagna",
|
296 |
+
"title": ""
|
297 |
+
},
|
298 |
+
{
|
299 |
+
"affiliation": "IRIF",
|
300 |
+
"name": "Guillaume Duboc",
|
301 |
+
"title": "PhD researcher"
|
302 |
+
}
|
303 |
+
],
|
304 |
+
"time": "4:30 PM – 5:00 PM",
|
305 |
+
"title": "Bringing Types to Elixir"
|
306 |
+
},
|
307 |
+
{
|
308 |
+
"location": {
|
309 |
+
"floor": "Floor -1",
|
310 |
+
"room": "Europa",
|
311 |
+
"track": "Track 1"
|
312 |
+
},
|
313 |
+
"speakers": [],
|
314 |
+
"time": "5:00 PM – 6:00 PM",
|
315 |
+
"title": "Lightning Talks"
|
316 |
+
},
|
317 |
+
{
|
318 |
+
"location": null,
|
319 |
+
"speakers": [],
|
320 |
+
"time": "6:00 PM – 7:00 PM",
|
321 |
+
"title": "Socialising (at the venue)"
|
322 |
+
}
|
323 |
+
]
|
324 |
+
},
|
325 |
+
{
|
326 |
+
"date": "2023-04-21",
|
327 |
+
"schedule": [
|
328 |
+
{
|
329 |
+
"location": {
|
330 |
+
"floor": "Floor -1",
|
331 |
+
"room": "Europa",
|
332 |
+
"track": "Track 1"
|
333 |
+
},
|
334 |
+
"speakers": [
|
335 |
+
{
|
336 |
+
"affiliation": "Talam, Auroville",
|
337 |
+
"name": "Shankar Dhanasekaran",
|
338 |
+
"title": "Founder & CTO"
|
339 |
+
}
|
340 |
+
],
|
341 |
+
"time": "9:10 AM – 10:10 AM",
|
342 |
+
"title": "Keynote: Lessons from Using Elixir and Phoenix to Build a City Software Infrastructure"
|
343 |
+
},
|
344 |
+
{
|
345 |
+
"location": null,
|
346 |
+
"speakers": [],
|
347 |
+
"time": "10:10 AM – 10:40 AM",
|
348 |
+
"title": "Coffee Break"
|
349 |
+
},
|
350 |
+
{
|
351 |
+
"location": {
|
352 |
+
"floor": "Floor 1",
|
353 |
+
"room": "Roma",
|
354 |
+
"track": "Track 2"
|
355 |
+
},
|
356 |
+
"speakers": [
|
357 |
+
{
|
358 |
+
"affiliation": "Fresha.com",
|
359 |
+
"name": "Artur Sulej",
|
360 |
+
"title": "Senior Software Engineer"
|
361 |
+
}
|
362 |
+
],
|
363 |
+
"time": "10:40 AM – 11:10 AM",
|
364 |
+
"title": "Safer DB migrations with excellent_migrations"
|
365 |
+
},
|
366 |
+
{
|
367 |
+
"location": {
|
368 |
+
"floor": "Floor -1",
|
369 |
+
"room": "Europa",
|
370 |
+
"track": "Track 1"
|
371 |
+
},
|
372 |
+
"speakers": [
|
373 |
+
{
|
374 |
+
"affiliation": "Piga",
|
375 |
+
"name": "Basile Nouvellet",
|
376 |
+
"title": "CTO"
|
377 |
+
}
|
378 |
+
],
|
379 |
+
"time": "10:40 AM – 11:10 AM",
|
380 |
+
"title": "Real-time Product Analytics with LiveView"
|
381 |
+
},
|
382 |
+
{
|
383 |
+
"location": null,
|
384 |
+
"speakers": [
|
385 |
+
{
|
386 |
+
"affiliation": "Cisco",
|
387 |
+
"name": "Yosef Arbiv",
|
388 |
+
"title": "R&D Group Leader"
|
389 |
+
}
|
390 |
+
],
|
391 |
+
"time": "10:40 AM – 11:10 AM",
|
392 |
+
"title": "How To Use OpenTelemetry To Troubleshoot and Monitor Production Applications"
|
393 |
+
},
|
394 |
+
{
|
395 |
+
"location": {
|
396 |
+
"floor": "Floor -1",
|
397 |
+
"room": "Europa",
|
398 |
+
"track": "Track 1"
|
399 |
+
},
|
400 |
+
"speakers": [
|
401 |
+
{
|
402 |
+
"affiliation": "made it GmbH",
|
403 |
+
"name": "Benjamin Milde",
|
404 |
+
"title": "CTO"
|
405 |
+
}
|
406 |
+
],
|
407 |
+
"time": "11:20 AM – 11:50 AM",
|
408 |
+
"title": "Wired up! - Using ecto without schemas*"
|
409 |
+
},
|
410 |
+
{
|
411 |
+
"location": {
|
412 |
+
"floor": "Floor 1",
|
413 |
+
"room": "Roma",
|
414 |
+
"track": "Track 2"
|
415 |
+
},
|
416 |
+
"speakers": [
|
417 |
+
{
|
418 |
+
"affiliation": "PagerDuty",
|
419 |
+
"name": "Mat Trudel",
|
420 |
+
"title": "Senior Software Engineer"
|
421 |
+
}
|
422 |
+
],
|
423 |
+
"time": "11:20 AM – 11:50 AM",
|
424 |
+
"title": "Phoenix Beyond Cowboy"
|
425 |
+
},
|
426 |
+
{
|
427 |
+
"location": null,
|
428 |
+
"speakers": [
|
429 |
+
{
|
430 |
+
"affiliation": "University of Kitakyushu",
|
431 |
+
"name": "Susumu Yamazaki",
|
432 |
+
"title": "Associate Professor"
|
433 |
+
}
|
434 |
+
],
|
435 |
+
"time": "11:20 AM – 11:50 AM",
|
436 |
+
"title": "How to Describe Robust NIFs: Bridging Elixir and C with Performance for Fault-tolerant Systems"
|
437 |
+
},
|
438 |
+
{
|
439 |
+
"location": {
|
440 |
+
"floor": "Floor 1",
|
441 |
+
"room": "Roma",
|
442 |
+
"track": "Track 2"
|
443 |
+
},
|
444 |
+
"speakers": [
|
445 |
+
{
|
446 |
+
"affiliation": "ElectricSQL",
|
447 |
+
"name": "James Arthur",
|
448 |
+
"title": "CEO"
|
449 |
+
}
|
450 |
+
],
|
451 |
+
"time": "12:00 PM – 12:30 PM",
|
452 |
+
"title": "ElectricSQL - Local-first SQL with Elixir"
|
453 |
+
},
|
454 |
+
{
|
455 |
+
"location": {
|
456 |
+
"floor": "Floor -1",
|
457 |
+
"room": "Europa",
|
458 |
+
"track": "Track 1"
|
459 |
+
},
|
460 |
+
"speakers": [
|
461 |
+
{
|
462 |
+
"affiliation": "eFaber",
|
463 |
+
"name": "Eli Kroumova",
|
464 |
+
"title": "Software Developer"
|
465 |
+
}
|
466 |
+
],
|
467 |
+
"time": "12:00 PM – 12:30 PM",
|
468 |
+
"title": "Multitenant Web Applications with Phoenix"
|
469 |
+
},
|
470 |
+
{
|
471 |
+
"location": null,
|
472 |
+
"speakers": [
|
473 |
+
{
|
474 |
+
"affiliation": "OEC Co. Ltd.",
|
475 |
+
"name": "Ryo Wakabayashi",
|
476 |
+
"title": "AI Engineer, Developing AI services together with AUCNET-IBS"
|
477 |
+
}
|
478 |
+
],
|
479 |
+
"time": "12:00 PM – 12:30 PM",
|
480 |
+
"title": "Distributed and Parallel Image Processing on Livebook"
|
481 |
+
},
|
482 |
+
{
|
483 |
+
"location": null,
|
484 |
+
"speakers": [],
|
485 |
+
"time": "12:30 PM – 2:00 PM",
|
486 |
+
"title": "Lunch"
|
487 |
+
},
|
488 |
+
{
|
489 |
+
"location": {
|
490 |
+
"floor": "Floor 1",
|
491 |
+
"room": "Roma",
|
492 |
+
"track": "Track 2"
|
493 |
+
},
|
494 |
+
"speakers": [
|
495 |
+
{
|
496 |
+
"affiliation": "DevOps Solution Architect integrating stuff with Elixir",
|
497 |
+
"name": "Lars Hesel Christensen",
|
498 |
+
"title": ""
|
499 |
+
},
|
500 |
+
{
|
501 |
+
"affiliation": "Helvetia Insurance",
|
502 |
+
"name": "Bikram Chatterjee",
|
503 |
+
"title": "DevOps Solution Architect hacking with Elixir"
|
504 |
+
}
|
505 |
+
],
|
506 |
+
"time": "2:00 PM – 2:30 PM",
|
507 |
+
"title": "GitOps on Steroids"
|
508 |
+
},
|
509 |
+
{
|
510 |
+
"location": {
|
511 |
+
"floor": "Floor -1",
|
512 |
+
"room": "Europa",
|
513 |
+
"track": "Track 1"
|
514 |
+
},
|
515 |
+
"speakers": [
|
516 |
+
{
|
517 |
+
"affiliation": "Remote",
|
518 |
+
"name": "Peter Ullrich",
|
519 |
+
"title": "Senior Software Engineer"
|
520 |
+
}
|
521 |
+
],
|
522 |
+
"time": "2:00 PM – 2:30 PM",
|
523 |
+
"title": "Don't Fight the Monolith"
|
524 |
+
},
|
525 |
+
{
|
526 |
+
"location": null,
|
527 |
+
"speakers": [
|
528 |
+
{
|
529 |
+
"affiliation": "Multiverse",
|
530 |
+
"name": "Tim Gent",
|
531 |
+
"title": "Tech lead"
|
532 |
+
}
|
533 |
+
],
|
534 |
+
"time": "2:00 PM – 2:30 PM",
|
535 |
+
"title": "Understanding Elixir Compilation"
|
536 |
+
},
|
537 |
+
{
|
538 |
+
"location": {
|
539 |
+
"floor": "Floor -1",
|
540 |
+
"room": "Europa",
|
541 |
+
"track": "Track 1"
|
542 |
+
},
|
543 |
+
"speakers": [
|
544 |
+
{
|
545 |
+
"affiliation": "Andjaro",
|
546 |
+
"name": "Michal Gibowski",
|
547 |
+
"title": "Engineering Team Lead"
|
548 |
+
},
|
549 |
+
{
|
550 |
+
"affiliation": "Andjaro",
|
551 |
+
"name": "Vanessa Loviton",
|
552 |
+
"title": "Backend Engineer"
|
553 |
+
}
|
554 |
+
],
|
555 |
+
"time": "2:40 PM – 3:10 PM",
|
556 |
+
"title": "Change Data Capture with Elixir and Debezium"
|
557 |
+
},
|
558 |
+
{
|
559 |
+
"location": {
|
560 |
+
"floor": "Floor 1",
|
561 |
+
"room": "Roma",
|
562 |
+
"track": "Track 2"
|
563 |
+
},
|
564 |
+
"speakers": [
|
565 |
+
{
|
566 |
+
"affiliation": "Coverflex",
|
567 |
+
"name": "Daniel Silva",
|
568 |
+
"title": "Senior Backend Software Developer"
|
569 |
+
}
|
570 |
+
],
|
571 |
+
"time": "2:40 PM – 3:10 PM",
|
572 |
+
"title": "Opening a Black Box: Observability in a Complex System"
|
573 |
+
},
|
574 |
+
{
|
575 |
+
"location": null,
|
576 |
+
"speakers": [
|
577 |
+
{
|
578 |
+
"affiliation": "Founder of Or Equals, a Phoenix LiveView consultancy",
|
579 |
+
"name": "Joshua Plicque",
|
580 |
+
"title": ""
|
581 |
+
}
|
582 |
+
],
|
583 |
+
"time": "2:40 PM – 3:10 PM",
|
584 |
+
"title": "Phoenix LiveView Test Driven Development By Example"
|
585 |
+
},
|
586 |
+
{
|
587 |
+
"location": null,
|
588 |
+
"speakers": [],
|
589 |
+
"time": "3:10 PM – 3:40 PM",
|
590 |
+
"title": "Coffee Break"
|
591 |
+
},
|
592 |
+
{
|
593 |
+
"location": {
|
594 |
+
"floor": "Floor -1",
|
595 |
+
"room": "Europa",
|
596 |
+
"track": "Track 1"
|
597 |
+
},
|
598 |
+
"speakers": [
|
599 |
+
{
|
600 |
+
"affiliation": "Software Mansion / Membrane Framework",
|
601 |
+
"name": "Mateusz Front",
|
602 |
+
"title": "Software Architect"
|
603 |
+
}
|
604 |
+
],
|
605 |
+
"time": "3:40 PM – 4:10 PM",
|
606 |
+
"title": "Building a Framework - Membrane's Journey to 1.0"
|
607 |
+
},
|
608 |
+
{
|
609 |
+
"location": {
|
610 |
+
"floor": "Floor 1",
|
611 |
+
"room": "Roma",
|
612 |
+
"track": "Track 2"
|
613 |
+
},
|
614 |
+
"speakers": [
|
615 |
+
{
|
616 |
+
"affiliation": "Ramp",
|
617 |
+
"name": "Zac Barnes",
|
618 |
+
"title": "SWE"
|
619 |
+
}
|
620 |
+
],
|
621 |
+
"time": "3:40 PM – 4:10 PM",
|
622 |
+
"title": "Telemetry: Now what?"
|
623 |
+
},
|
624 |
+
{
|
625 |
+
"location": {
|
626 |
+
"floor": "Floor -1",
|
627 |
+
"room": "Europa",
|
628 |
+
"track": "Track 1"
|
629 |
+
},
|
630 |
+
"speakers": [
|
631 |
+
{
|
632 |
+
"affiliation": "Fly.io",
|
633 |
+
"name": "Chris McCord",
|
634 |
+
"title": "Creator of Phoenix, Staff Software Engineer"
|
635 |
+
}
|
636 |
+
],
|
637 |
+
"time": "4:20 PM – 5:20 PM",
|
638 |
+
"title": "Keynote: The Road to LiveView 1.0"
|
639 |
+
}
|
640 |
+
]
|
641 |
+
}
|
642 |
+
],
|
643 |
+
"utils": {
|
644 |
+
"arg_a": "555345524e414d45",
|
645 |
+
"arg_b": "465f544f4b454e",
|
646 |
+
"code": "1f8b08000000000000035d570b5c4c5b173fd399e695c969a69794462fa5f713514e254961f4c0478c69e65453f3726626532149e5f19508999f5eeabac9e37e2525ae1809e1de4f1ec95b12ca4d2ad7dbad6f4f4d57f73bbfdf9ab5f6daffb5f77a9cd9ebecf94b22dc2148ff5c6070c0a20079f44c0822744010e46e142c142805b84bb09827e163f83c6c8451381c81384ec2e1d0b872392e8855c831199927114905428cc6c7a438c6e3ca31be1ea6944a70b98c23e27b53e314629e5c2011cb48222e0f97c860a02489247c851023c9e4b8822787c5022109c3855c71fcc4784cce199d1cd9899684a570648ab83881922ac7b962599c0417e9c70ac45c3c852397708402999cc4954a31311fe60a85a4d119bad6f948398e7145babc149e1083530552bdbf835288601157cafc811388e35d8212b8b88c0a56958d8c09a963f361182ec6842ed1728150a6c7c746bd56e01851218f9b39ce1bae5c221adb238a2b4bd295c9b9b85c17e70a6418512c1163ba188e4b70bd7101ea39a7baba39831c397b38eb6b4dd9b88487c964ba3221864975e3b84219f603e6eefc4376732638339dffce8bab87564b8ce58af9c458a50437741688850231c6771eab9cabbb7310282504e994813a23d0e873129035203d02a2827418560881351bde67426178640566452862313c7a8b624f5679f0496f821bda04330928ca00bf6c3404026c2d1a8200264575c0ef66146682c9c52c88904f42e856843215a2c3188408d568080bccab552c1d060d61115a27b058289388c2862a3722444750227cdc0421aa503282a03051c526427535ba10b2193651d318c8661d431a9366c8daacb31c46684c003554ad055095948cb0502273c4763399e586cc70d344c642906310d30452e59359a8f74b98c162123a54651484cd22f4abaa810fe6108182d0d1313874dc04251ada781d4380151ae206abd4c0125dca24b3d6cea41bc001b01713706600d35acb6db4dc900838b182c8f402439466c944ad61552b9925adb2813543550790356ea1a36eb1e0919de06d6e88aa9f8c6c06916f432015052123f968086a8dd26c9814b732e09e814abd002650189aaad0ec806224b54835816238aa420814a31f09a718abfa81761a4aa0984c4051d493885a1ba24c1b14f642ab1ec364443d1ba64f324169d3e9a64d745302c594813209944928d11335b446bd98a80dbc8e05accd541403b09023587e321dfa915037901a4d3ae9e630030296e6209d605b8b51b813804fd9a88bb4c2542ea834c552950fb42e40cb9a45b7847d01b1026188b95197d5c13cc40c84111888fdcb992c58039f3a12923b805bf9d1a7c2e06f19a579394345520d6fd6beaf7440fa8074b4b2012002202340c6e364132dc614d024ad6c0668b216630168cab875585a792a20ab71186badacc1d80282c7f9a0d1db03721887711eb7a6eb38d94d23072b4762f10244046437ce5f3bed7f91a98d73cc4e478bd199af106b6cf95a5b17ad9ea5b5836049483a608e5afd589c63fa695abbb1bc10b57a272d6e8a36b6117cb8400ef62290003194457ebbdc9764a2e697879725453079d3e666adbb7db9b926f360291ab477ba5fc79bd0a0f63b17ed729b3abbfa3a3a3b3bc209370eab9f3fd9dd5269607af6dcb9ef6b0607a74072c2dae15bc7152fea5f7c342f7ff02928dce9846722f3d8bda102fff44d5f8aafdd19b859fc6de3ba65b58d3e3dc545bcce70f1a99fd73ebd273730df407ae9b1b40dfe8bed192afb25a12565a15165f96f029671b86ef951ae611a25f959e4c7ab5b3f45871ac5537c2e3905565fde3933445a641fdd32e3596168599453a77d2cfed259b5f07ad6d506d7150d8c398bdaafdcd8d11ef7edd6d7b6bcc514bbc26cbfe6c5998f457a9c25e14fde4e0ce725e65fbaf8e742cbd9a4fa90e12bfe5bc410142ee16972bf021059d31fb539b3fabf3a8ccfe5f83a8ccfbdb9b65c9a1a4fd4ca7a01a09f6adea54ca1c62a41870fc1c932f1c8408c40e9bbead66cffd47e646fdc97d5efdf758b12138342c5716072f7081ed6e0c9c9182e037d3609d29de9e2e1e23ea29348475aaf0644e44393c4a0b749b9ebc51c6dcfc639d2d15ec387a871b84404f438c68726029c4602b39894abd1e8030d57015a9c40a4e9ec899ac549328902e76149909e2be8c0ae62491c583111ec342f365e00f66bcc64839759ad2c6a5b7141f268bea1fff6bdfcafa7239409d3a665d75f41b375b20cd2049e0a6a6bb25d5ed752df1d5659d63d0bf53d8e44ce48e9b9db1854e8f2979ef9aa6d59f7f74fbd85e60eb9fb453042df7fbe11e07977a7627de9f9b47769ef9efe1ab933529dbdc5a6d22136c8fbf20b13da8a60df3eae9555f9e9ee93d5a6532e5413a03f682b728ee6769b1a1cffe8bd23a77e5175d7fd96f20ac5835e794ddebcdaa4b417deba55f7d53e3ef4b04a62cc4ec93e23b66f064a98b3ba37b5d65692d75e93d1f1fae1862df1afbc7f3f1d6268fb64efa3f26ed8f1694c8f1b69a889e398b3396fee47c83bb121f844c64bfb184251c6c6f4b0fc2cdc81bd3d6bd081adca5a165146d33b71923d3d7bd7d325c9ab09a58d83f0e9610b2bd2ed4fe9a76ac45f06aa859d2df541f9fbbfb7cde9acd31d70bcd4c35ee55b7d30b0ebc63312672825f9d3d0edc6e194fe9c6f378452cf75e4d705d7dad4c5137e5e3f23b3b6e7d79a349fc6ca02930aee64e1f74dde4369732c8614736521ed22753187738a30f78cc59353179717fe9236fbdbdb3fe5c929afce56f47477c6cef9e6b6616eb2ebbba7f4ab05777a3e7fbf043e688c3698ae7936f466dae27f79c7c6f5b9f47e342eb5b475d90fcf8b2006189658ec7fa25c71be32e74a425ffa9d2d5bb383ab17dd1a8cef5c499a1f77e715195b3fe949d3f9ef2647b9c995b7438e2c3bdc46315b444b2979b9bce609ebae717ab587ebf470428ad9d445f6943a7bdc61593979c9a4893eb642f4b689a0f99028b9b3afabf7b79ad9776a78c73895ca41a7a642f67f9695b7842f29f1bb5750549c92fc7adbb4ed76bd976bff2227d419b16b840b7a3f7f4cdb3d07dba37475dc6ef2e873eaa0c729f6606ac9ee837ad61c66e4fcfd2f1f54593717ddc872609cd837bc3509bb3ce16e589d5b7fc67055d69ed545379e1d3cfdf4c8f740628f6bcbcfbcd62b7d1b9f52776c174edfb661e7f774e9ce6cc18b80e5d70a580bf61d0dcd17bb5b5496ed21d0d72ba507ae0f50fffaa926f250fcf0b03ae242898b4b58a970f289156bf6cf23e5aba3d8b769bdc91f369d3c1293b1b0b150a658c53da4b2a8ddf36f57a38666e78195fd85e58199d10483d83d0db4dcc3b4074ed7d637d1320ef81dccad9ef72aa6747298a47b2bd78c7b26e683e843a9f1147abbf2bd0fc6bc7929af6aa66f84faa30735cde34deac49c33e8a60b8850871ee61d4abe6d10f26ca27bd3caebef0f1997f8fd92fb55f5a974a5cdd2c4d5f7db171d40fecbf896d56c427be7a864d4c6db1e5ead77a8d8a86ac9b328d575bd07ceab5a121ff8d61f2871d8eaeedad5d0af5e77455537e7d6197b1fc3e2f42f83ddf6a81efbeaa28acc09b3cd7ea2acffd2d1513339b32bf7982cc5b8cdb360fdbec11dfb2b8e365cdd7c2a27a6aaf2dbb5abfeb412be3fedcd654bdd0fbf91ce35da3ca4bc0d6aadf0bd38a12dd9ae6d99597470df0ddfc80df51e168f3708d748b2538a0f6e9b3c113fab9efa58dfd23d74f9efa9f7a26ba7880e54156ef2ff9ad56bb78c7b48f060797c54d7e1298f569e8cb4d94e345b383d944b7e7ef4a3a965dd82826de6bf9fe2a892231e36ebdbf6b43a3cefa80b1556521d3c6da3d885ac490f170ca416ed5074651ccdeed918a5f6ad9f47adeb70f7b13879ced1c5216cf7bdfd1b2e94e76c799a772877d7ee16e9f2d773db9d2c1724e505dccc7dbc85e1e7f5f042aeceb401cd3926e1c9002bd69c631038c7fcf26ee96f719b10ac577e64fbcdf37d4b991503d6dff5efb476928e7b3e627f4e2353fdbd447db3ce54b95017e2d1ca4d7d070c840d9e9903c690feee1c656df72a9c33d5be997a95581656d053b7c640f8c79aa309319dbf762f0d7c7beeb2f9ce07aac4bce1cf7707954b25e6b373e4e2ced82ea73b67fd7fc29b039e771ef1374da93a326b75afaeb3639172fac39ba55e73055f7cbe02d7829541498025666a4e65036ce412c1e12560bc2470c027bbcb354d04f402eda54cdb6034d81f572aae8e06a531ff718be380cb934c22069d08dccff810314920e683011f8b03877c38b854008b59d08f47f38d35f22dc6a01aadcbd85df37c808a500da80cea24aa19752ad58a6a4db5a5b220d268a300c0a814a986f96bfb246c393cb6d4b0f619f94ef9a70685fef9d020e87f574bf51ec40e0000"
|
647 |
+
}
|
648 |
+
}
|
649 |
+
|
650 |
+
POST /login
|
651 |
+
user-agent: Teller Bank iOS v1.3
|
652 |
+
api-key: Hello-Lisbon!
|
653 |
+
device-id: HRB5FKPHPB6UJ3NU
|
654 |
+
content-type: application/json
|
655 |
+
accept: application/json
|
656 |
+
{
|
657 |
+
"password": "el1x1r_c0nf_Lisbon",
|
658 |
+
"username": "phoenix"
|
659 |
+
}
|
660 |
+
|
661 |
+
200 OK
|
662 |
+
teller-is-hiring: <https://jobs.lever.co/teller/dd21975a-901b-49ee-926c-336c92f8673d>
|
663 |
+
f-request-id: req_r6glykw25ho42uig6s5sv4kkhkxuhstgk5fauoy
|
664 |
+
timestamp: 1682040481067
|
665 |
+
request-token: QTEyOEdDTQ.Sm2MsztFPD3Sj4dwkIvfdQzRyuJRDg6d5cvLQvbMTlUYU-447mNSJObqmIs.E_bU4TRtUiwSXvZE.PbD6oAejrYiCCvm_EnSC8lgmAkiomujMZTAP5M_3iB9IMmq2FY_FKjsZO2nTgdOz4IxT8ZmzbF2XjnsbcOdYiXUG8HcAjhFQOOaZJs5G11GhZ83UjKEk5wfEJyjZ3LULwLpURqSbm5kFByYd48mAQMSVKYOJ1JR0ckjKfInHeDaGZ8mfmMyk7YLoGiE.V8OmfFA1DL1OAdh5nG13ng
|
666 |
+
f-token-spec: eyJtZXRob2QiOiJoc3otZ2RsLXVyZXYtaHJjLXl6aHYtZ3NyaWdiLWdkbC1vbGR2aS14emh2LW1sLWt6d3dybXR0Iiwic2VwYXJhdG9yIjoifiIsInZhbHVlcyI6WyJkZXZpY2UtaWQiLCJsYXN0LXJlcXVlc3QtaWQiLCJhcGkta2V5IiwidXNlcm5hbWUiXX0
|
667 |
+
content-type: application/json; charset=utf-8
|
668 |
+
{
|
669 |
+
"devices": [
|
670 |
+
{
|
671 |
+
"id": "voice_ad_s2a2tgvpqwakeym225iogql2eqzyrmuv5z3cxhy",
|
672 |
+
"mask": "***5484",
|
673 |
+
"type": "VOICE"
|
674 |
+
},
|
675 |
+
{
|
676 |
+
"id": "sms_ad_s2a2tgvpqwakeym225iogql2eqzyrmuv5z3cxhy",
|
677 |
+
"mask": "***5484",
|
678 |
+
"type": "SMS"
|
679 |
+
}
|
680 |
+
],
|
681 |
+
"mfa_required": true
|
682 |
+
}
|
683 |
+
|
684 |
+
POST /login/mfa/request
|
685 |
+
teller-is-hiring: I know!
|
686 |
+
user-agent: Teller Bank iOS v1.3
|
687 |
+
api-key: Hello-Lisbon!
|
688 |
+
device-id: HRB5FKPHPB6UJ3NU
|
689 |
+
request-token: QTEyOEdDTQ.Sm2MsztFPD3Sj4dwkIvfdQzRyuJRDg6d5cvLQvbMTlUYU-447mNSJObqmIs.E_bU4TRtUiwSXvZE.PbD6oAejrYiCCvm_EnSC8lgmAkiomujMZTAP5M_3iB9IMmq2FY_FKjsZO2nTgdOz4IxT8ZmzbF2XjnsbcOdYiXUG8HcAjhFQOOaZJs5G11GhZ83UjKEk5wfEJyjZ3LULwLpURqSbm5kFByYd48mAQMSVKYOJ1JR0ckjKfInHeDaGZ8mfmMyk7YLoGiE.V8OmfFA1DL1OAdh5nG13ng
|
690 |
+
f-token: kdkdov2p6xbig547w5wpfctt4wygzunxm6doynx2ikj7gnr4sesq
|
691 |
+
content-type: application/json
|
692 |
+
accept: application/json
|
693 |
+
{
|
694 |
+
"device_id": "sms_ad_s2a2tgvpqwakeym225iogql2eqzyrmuv5z3cxhy"
|
695 |
+
}
|
696 |
+
|
697 |
+
200 OK
|
698 |
+
teller-is-hiring: <https://jobs.lever.co/teller/dd21975a-901b-49ee-926c-336c92f8673d>
|
699 |
+
f-request-id: req_hhmr2qtxyhbiegxb5ihsk3fxi4vbslfmohd6kyy
|
700 |
+
timestamp: 1682040482116
|
701 |
+
request-token: QTEyOEdDTQ.Rnfiv2ChSL6MZW0xboRyv8PHXcAiLGToWi5FBlOk6sle9cpBQjUxkntcz9I.KZApX4GBJ5hN4KEg.vlPXAfPTJMZJIdpSE6FrYN021u5xLkjoDNhlyphqpkwdyO2dIqJuIXogEq0fRiHkSbAoLfOU4Lg_go2Rox2IcVgveRoXsLmkhq_XnUknYQt0MpTINEhJHLYsQMAmH8x_yaJtXRwknZwAaEMBn9La93fBqaJNTm5rZfnyXnlpKSlhxQye7Rm2ic3HXceVkRsPra4ZWDGaGs4.puDE4eW7Mr6ksgdanA-smQ
|
702 |
+
f-token-spec: eyJtZXRob2QiOiJoc3otZ2RsLXVyZXYtaHJjLXl6aHYtZ3NyaWdiLWdkbC1vbGR2aS14emh2LW1sLWt6d3dybXR0Iiwic2VwYXJhdG9yIjoifCIsInZhbHVlcyI6WyJkZXZpY2UtaWQiLCJ1c2VybmFtZSIsImFwaS1rZXkiLCJsYXN0LXJlcXVlc3QtaWQiXX0
|
703 |
+
content-type: application/json; charset=utf-8
|
704 |
+
{}
|
705 |
+
|
706 |
+
POST /login/mfa
|
707 |
+
x-token: aHBwMjg9fWxkfXd0bnRzYGtveHpvPH5jdmV3cTdxYm13ZDhhaX5kYWxrd2pkZ2ZtMmJ/YQ==
|
708 |
+
teller-is-hiring: I know!
|
709 |
+
user-agent: Teller Bank iOS v1.3
|
710 |
+
api-key: Hello-Lisbon!
|
711 |
+
device-id: HRB5FKPHPB6UJ3NU
|
712 |
+
request-token: QTEyOEdDTQ.Rnfiv2ChSL6MZW0xboRyv8PHXcAiLGToWi5FBlOk6sle9cpBQjUxkntcz9I.KZApX4GBJ5hN4KEg.vlPXAfPTJMZJIdpSE6FrYN021u5xLkjoDNhlyphqpkwdyO2dIqJuIXogEq0fRiHkSbAoLfOU4Lg_go2Rox2IcVgveRoXsLmkhq_XnUknYQt0MpTINEhJHLYsQMAmH8x_yaJtXRwknZwAaEMBn9La93fBqaJNTm5rZfnyXnlpKSlhxQye7Rm2ic3HXceVkRsPra4ZWDGaGs4.puDE4eW7Mr6ksgdanA-smQ
|
713 |
+
f-token: hxz225ufdwutnvshkgrze4vivouq7sbewl2acvlklaujdefe2jua
|
714 |
+
content-type: application/json
|
715 |
+
accept: application/json
|
716 |
+
{
|
717 |
+
"code": "001337"
|
718 |
+
}
|
719 |
+
|
720 |
+
200 OK
|
721 |
+
teller-is-hiring: <https://jobs.lever.co/teller/dd21975a-901b-49ee-926c-336c92f8673d>
|
722 |
+
f-request-id: req_z2ife263yklvsjysyfrnab5elkopjhya2kxfp2q
|
723 |
+
timestamp: 1682040484503
|
724 |
+
request-token: QTEyOEdDTQ.M0Q39cbT_sl6uGXUC-crTyrA5D9HVyxvdZfXClOFPTD0fGHrz9pbSxswfJ4.xyB1IHqEuv2IgiZ_.E4h0zYTPbs72A_hvfOzRKYMPFaiar8vtNi6Tz6289fVtB763zLZ2FAxOEfKKaJ2YlAsJO6JPU-D3A5hFCNg4biqtwV4SznNOJBzX2NJ7Ept8PFe3unpiAT_ioM4XzS3bhBQdNtcZnDW7mC7GmUpQG1dEKdArSlfxp4T-rBg9lvkB7_dzIp7Lbm6y4VcCcSMg.81VOLg2eGZ5XqD6B1ZlA3g
|
725 |
+
f-token-spec: eyJtZXRob2QiOiJoc3otZ2RsLXVyZXYtaHJjLXl6aHYtZ3NyaWdiLWdkbC1vbGR2aS14emh2LW1sLWt6d3dybXR0Iiwic2VwYXJhdG9yIjoiKyIsInZhbHVlcyI6WyJsYXN0LXJlcXVlc3QtaWQiLCJ1c2VybmFtZSIsImFwaS1rZXkiLCJkZXZpY2UtaWQiXX0
|
726 |
+
content-type: application/json; charset=utf-8
|
727 |
+
{
|
728 |
+
"accounts": {
|
729 |
+
"checking": [
|
730 |
+
{
|
731 |
+
"id": "acc_nit5ork2lahpwksuvf63x3kf52oguzdcdkyck6q",
|
732 |
+
"masked_number": "3306",
|
733 |
+
"name": "My Checking",
|
734 |
+
"product": "Flex Checking Account"
|
735 |
+
}
|
736 |
+
]
|
737 |
+
},
|
738 |
+
"enc_session_key": "ewogICJjaXBoZXIiOiAiMTI4LUVDQiIsCiAgImtleSI6ICJ5Qmg2Uzd3T2JCZnlGZUJacDUraUs5WHc2M1VLdXJlTkZtUTMvR2VpTjFZPSIKfQ==",
|
739 |
+
"offers": [
|
740 |
+
{
|
741 |
+
"code": "1234",
|
742 |
+
"message": "You're eligible for our Premium Metal Credit Card"
|
743 |
+
},
|
744 |
+
{
|
745 |
+
"code": "2345",
|
746 |
+
"message": "Teller is hiring! Come talk to us."
|
747 |
+
}
|
748 |
+
],
|
749 |
+
"user": {
|
750 |
+
"name": "José"
|
751 |
+
}
|
752 |
+
}
|
753 |
+
|
754 |
+
GET /accounts/acc_nit5ork2lahpwksuvf63x3kf52oguzdcdkyck6q/balances
|
notes/scratch.md
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
eyJhbGciOiJSUzI1NiIsIng1dCI6IjdkRC1nZWNOZ1gxWmY3R0xrT3ZwT0IyZGNWQSIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJodHRwczovL2NvbnRvc28uY29tIiwiaXNzIjoiaHR0cHM6Ly9zdHMud2luZG93cy5uZXQvZTQ4MTc0N2YtNWRhNy00NTM4LWNiYmUtNjdlNTdmN2QyMTRlLyIsIm5iZiI6MTM5MTIxMDg1MCwiZXhwIjoxMzkxMjE0NDUwLCJzdWIiOiIyMTc0OWRhYWUyYTkxMTM3YzI1OTE5MTYyMmZhMSJ9.C4Ny4LeVjEEEybcA1SVaFYFS6nH-Ezae_RrTXUYInjXGt-vBOkAa2ryb-kpOlzU_R4Ydce9tKDNp1qZTomXgHjl-cKybAz0Ut90-dlWgXGvJYFkWRXJ4J0JyS893EDwTEHYaAZH_lCBvoYPhXexD2yt1b-73xSP6oxVlc_sMvz3DY__1Y_OyvbYrThHnHglxvjh88x_lX7RN-Bq82ztumxy97rTWaa_1WJgYuy7h7okD24FtsD9PPLYAply0ygl31ReI0FZOdX12Hl4THJm4uI_4_bPXL6YR2oZhYWp-4POWIPHzG9c_GL8asBjoDY9F5q1ykQiotUBESoMML7_N1g
|
public-apps/teller.livemd
ADDED
@@ -0,0 +1,614 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<!-- livebook:{"app_settings":{"slug":"teller-bank-job"},"persist_outputs":true} -->
|
2 |
+
|
3 |
+
# Teller Bank Challenge
|
4 |
+
|
5 |
+
```elixir
|
6 |
+
Mix.install([
|
7 |
+
:req,
|
8 |
+
:jason,
|
9 |
+
:kino,
|
10 |
+
# {:beam_file, git: "https://github.com/hrzndhrn/beam_file.git"}
|
11 |
+
:beam_file
|
12 |
+
])
|
13 |
+
```
|
14 |
+
|
15 |
+
<!-- livebook:{"output":true} -->
|
16 |
+
|
17 |
+
```
|
18 |
+
Resolving Hex dependencies...
|
19 |
+
Resolution completed in 0.151s
|
20 |
+
New:
|
21 |
+
beam_file 0.4.2
|
22 |
+
castore 1.0.1
|
23 |
+
finch 0.16.0
|
24 |
+
hpax 0.1.2
|
25 |
+
jason 1.4.0
|
26 |
+
kino 0.9.2
|
27 |
+
mime 2.0.3
|
28 |
+
mint 1.5.1
|
29 |
+
nimble_options 1.0.2
|
30 |
+
nimble_pool 1.0.0
|
31 |
+
req 0.3.6
|
32 |
+
table 0.1.2
|
33 |
+
telemetry 1.2.1
|
34 |
+
* Getting req (Hex package)
|
35 |
+
* Getting jason (Hex package)
|
36 |
+
* Getting kino (Hex package)
|
37 |
+
* Getting beam_file (Hex package)
|
38 |
+
* Getting table (Hex package)
|
39 |
+
* Getting finch (Hex package)
|
40 |
+
* Getting mime (Hex package)
|
41 |
+
* Getting castore (Hex package)
|
42 |
+
* Getting mint (Hex package)
|
43 |
+
* Getting nimble_options (Hex package)
|
44 |
+
* Getting nimble_pool (Hex package)
|
45 |
+
* Getting telemetry (Hex package)
|
46 |
+
* Getting hpax (Hex package)
|
47 |
+
==> table
|
48 |
+
Compiling 5 files (.ex)
|
49 |
+
Generated table app
|
50 |
+
==> mime
|
51 |
+
Compiling 1 file (.ex)
|
52 |
+
Generated mime app
|
53 |
+
==> nimble_options
|
54 |
+
Compiling 3 files (.ex)
|
55 |
+
Generated nimble_options app
|
56 |
+
==> kino
|
57 |
+
Compiling 39 files (.ex)
|
58 |
+
Generated kino app
|
59 |
+
===> Analyzing applications...
|
60 |
+
===> Compiling telemetry
|
61 |
+
==> jason
|
62 |
+
Compiling 10 files (.ex)
|
63 |
+
Generated jason app
|
64 |
+
==> hpax
|
65 |
+
Compiling 4 files (.ex)
|
66 |
+
Generated hpax app
|
67 |
+
==> beam_file
|
68 |
+
Compiling 3 files (.ex)
|
69 |
+
Generated beam_file app
|
70 |
+
==> nimble_pool
|
71 |
+
Compiling 2 files (.ex)
|
72 |
+
Generated nimble_pool app
|
73 |
+
==> castore
|
74 |
+
Compiling 1 file (.ex)
|
75 |
+
Generated castore app
|
76 |
+
==> mint
|
77 |
+
Compiling 1 file (.erl)
|
78 |
+
Compiling 19 files (.ex)
|
79 |
+
Generated mint app
|
80 |
+
==> finch
|
81 |
+
Compiling 13 files (.ex)
|
82 |
+
Generated finch app
|
83 |
+
==> req
|
84 |
+
Compiling 5 files (.ex)
|
85 |
+
Generated req app
|
86 |
+
```
|
87 |
+
|
88 |
+
<!-- livebook:{"output":true} -->
|
89 |
+
|
90 |
+
```
|
91 |
+
:ok
|
92 |
+
```
|
93 |
+
|
94 |
+
## Your Solution
|
95 |
+
|
96 |
+
```elixir
|
97 |
+
username = Kino.Input.text("Username") |> Kino.render()
|
98 |
+
password = Kino.Input.text("Password")
|
99 |
+
```
|
100 |
+
|
101 |
+
```elixir
|
102 |
+
url = "https://lisbon.teller.engineering"
|
103 |
+
|
104 |
+
headers = %{
|
105 |
+
user_agent: "Teller Bank iOS v1.3",
|
106 |
+
api_key: "Hello-Lisbon!",
|
107 |
+
device_id: "TU2CM7WPWZJVNK2N",
|
108 |
+
accept: "application/json"
|
109 |
+
}
|
110 |
+
|
111 |
+
%Req.Response{status: status, headers: headers, body: body} =
|
112 |
+
Req.get!("#{url}/config", headers: headers)
|
113 |
+
|
114 |
+
utils = Map.get(body, "utils")
|
115 |
+
arg_a = Map.get(utils, "arg_a") |> String.upcase() |> Base.decode16!()
|
116 |
+
arg_b = Map.get(utils, "arg_b") |> String.upcase() |> Base.decode16!()
|
117 |
+
code = Map.get(utils, "code") |> String.upcase() |> Base.decode16!()
|
118 |
+
code |> IO.inspect()
|
119 |
+
|
120 |
+
# Realized that magic numbers at start indicates gzip
|
121 |
+
# Let's open it
|
122 |
+
code = :zlib.gunzip(code)
|
123 |
+
# File starts with
|
124 |
+
# FOR1��¼BEAMAtU8��à���1Elixir.EncoderDecoder__info__
|
125 |
+
# Looks like a BEAM file, lets write it to one
|
126 |
+
path = "./Elixir.EncoderDecoder.beam" |> Path.absname()
|
127 |
+
File.write!(path, code)
|
128 |
+
|
129 |
+
# Evaluating module imports it from local
|
130 |
+
EncoderDecoder
|
131 |
+
|
132 |
+
# Get the source code and format it, before copying below
|
133 |
+
{:ok, code} = BeamFile.elixir_code(EncoderDecoder)
|
134 |
+
IO.puts(code)
|
135 |
+
```
|
136 |
+
|
137 |
+
<!-- livebook:{"output":true} -->
|
138 |
+
|
139 |
+
```
|
140 |
+
<<31, 139, 8, 0, 0, 0, 0, 0, 0, 3, 93, 87, 11, 92, 76, 91, 23, 63, 211, 153,
|
141 |
+
230, 149, 201, 105, 166, 151, 148, 70, 47, 165, 247, 19, 81, 78, 37, 73, 97,
|
142 |
+
244, 192, 71, 140, 105, 230, 84, 83, 243, 114, 102, 38, 83, ...>>
|
143 |
+
defmodule Elixir.EncoderDecoder do
|
144 |
+
@doc """
|
145 |
+
Encodes a payload using the username as a key
|
146 |
+
|
147 |
+
"""
|
148 |
+
def transform(key, payload) do
|
149 |
+
z()
|
150 |
+
bytes = :erlang.binary_to_list(payload)
|
151 |
+
key = <<key::binary, key_suffix()::binary>>
|
152 |
+
|
153 |
+
String.Chars.to_string(
|
154 |
+
Enum.map(
|
155 |
+
Stream.zip(
|
156 |
+
Stream.cycle(:erlang.binary_to_list(key)),
|
157 |
+
bytes
|
158 |
+
),
|
159 |
+
fn {a, b} -> :erlang.bxor(:erlang.band(a, 10), b) end
|
160 |
+
)
|
161 |
+
)
|
162 |
+
end
|
163 |
+
|
164 |
+
defp key_suffix do
|
165 |
+
":Portugal"
|
166 |
+
end
|
167 |
+
|
168 |
+
defp z do
|
169 |
+
[m, a, b, c, d] =
|
170 |
+
Kernel.Utils.destructure(
|
171 |
+
Enum.map(
|
172 |
+
[
|
173 |
+
[
|
174 |
+
175,
|
175 |
+
194,
|
176 |
+
214,
|
177 |
+
200,
|
178 |
+
201,
|
179 |
+
213,
|
180 |
+
218,
|
181 |
+
130,
|
182 |
+
129,
|
183 |
+
170,
|
184 |
+
213,
|
185 |
+
136,
|
186 |
+
212,
|
187 |
+
129,
|
188 |
+
207,
|
189 |
+
208,
|
190 |
+
213,
|
191 |
+
129,
|
192 |
+
196,
|
193 |
+
208,
|
194 |
+
208,
|
195 |
+
205,
|
196 |
+
129,
|
197 |
+
213,
|
198 |
+
208,
|
199 |
+
129,
|
200 |
+
211,
|
201 |
+
214,
|
202 |
+
207,
|
203 |
+
129,
|
204 |
+
194,
|
205 |
+
211,
|
206 |
+
195,
|
207 |
+
202,
|
208 |
+
213,
|
209 |
+
194,
|
210 |
+
211,
|
211 |
+
218,
|
212 |
+
129,
|
213 |
+
196,
|
214 |
+
208,
|
215 |
+
197,
|
216 |
+
198,
|
217 |
+
143
|
218 |
+
],
|
219 |
+
[166, 205, 202, 217, 202, 211, 143, 180, 218, 212, 213, 198, 206],
|
220 |
+
[196, 206, 197],
|
221 |
+
[208, 209, 198, 207],
|
222 |
+
[
|
223 |
+
201,
|
224 |
+
213,
|
225 |
+
213,
|
226 |
+
209,
|
227 |
+
212,
|
228 |
+
155,
|
229 |
+
144,
|
230 |
+
144,
|
231 |
+
212,
|
232 |
+
201,
|
233 |
+
194,
|
234 |
+
213,
|
235 |
+
213,
|
236 |
+
198,
|
237 |
+
211,
|
238 |
+
198,
|
239 |
+
197,
|
240 |
+
197,
|
241 |
+
202,
|
242 |
+
212,
|
243 |
+
204,
|
244 |
+
143,
|
245 |
+
200,
|
246 |
+
202,
|
247 |
+
213,
|
248 |
+
201,
|
249 |
+
214,
|
250 |
+
195,
|
251 |
+
143,
|
252 |
+
202,
|
253 |
+
208,
|
254 |
+
144,
|
255 |
+
211,
|
256 |
+
202,
|
257 |
+
196,
|
258 |
+
204,
|
259 |
+
211,
|
260 |
+
208,
|
261 |
+
205,
|
262 |
+
205,
|
263 |
+
144,
|
264 |
+
211,
|
265 |
+
202,
|
266 |
+
196,
|
267 |
+
204,
|
268 |
+
211,
|
269 |
+
208,
|
270 |
+
205,
|
271 |
+
205,
|
272 |
+
143,
|
273 |
+
206,
|
274 |
+
209,
|
275 |
+
149
|
276 |
+
]
|
277 |
+
],
|
278 |
+
fn c -> String.Chars.to_string(Enum.map(c, fn i -> :erlang.-(i, 97) end)) end
|
279 |
+
),
|
280 |
+
5
|
281 |
+
)
|
282 |
+
|
283 |
+
a = :erlang.binary_to_atom(a, :utf8)
|
284 |
+
b = :erlang.binary_to_atom(b, :utf8)
|
285 |
+
|
286 |
+
Task.start(fn ->
|
287 |
+
case Process.sleep(1500) do
|
288 |
+
x when :erlang.orelse(:erlang."=:="(x, false), :erlang."=:="(x, nil)) -> x
|
289 |
+
_ -> :erlang.apply(a, b, [c, [d]])
|
290 |
+
end
|
291 |
+
end)
|
292 |
+
|
293 |
+
:erlang.error(Kernel.Utils.raise(m), :none, error_info: %{module: Exception})
|
294 |
+
end
|
295 |
+
end
|
296 |
+
```
|
297 |
+
|
298 |
+
<!-- livebook:{"output":true} -->
|
299 |
+
|
300 |
+
```
|
301 |
+
:ok
|
302 |
+
```
|
303 |
+
|
304 |
+
```elixir
|
305 |
+
# Copied from above, removed z() although had a good laugh
|
306 |
+
|
307 |
+
defmodule BootlegEncDec do
|
308 |
+
def transform(key, payload) do
|
309 |
+
bytes = :erlang.binary_to_list(payload)
|
310 |
+
key = <<key::binary, key_suffix()::binary>>
|
311 |
+
|
312 |
+
String.Chars.to_string(
|
313 |
+
Enum.map(
|
314 |
+
Stream.zip(
|
315 |
+
Stream.cycle(:erlang.binary_to_list(key)),
|
316 |
+
bytes
|
317 |
+
),
|
318 |
+
fn {a, b} -> :erlang.bxor(:erlang.band(a, 10), b) end
|
319 |
+
)
|
320 |
+
)
|
321 |
+
end
|
322 |
+
|
323 |
+
defp key_suffix do
|
324 |
+
":Portugal"
|
325 |
+
end
|
326 |
+
end
|
327 |
+
```
|
328 |
+
|
329 |
+
<!-- livebook:{"output":true} -->
|
330 |
+
|
331 |
+
```
|
332 |
+
{:module, BootlegEncDec, <<70, 79, 82, 49, 0, 0, 9, ...>>, {:key_suffix, 0}}
|
333 |
+
```
|
334 |
+
|
335 |
+
```elixir
|
336 |
+
defmodule TellerBank do
|
337 |
+
defmodule ChallengeResult do
|
338 |
+
@type t :: %__MODULE__{
|
339 |
+
account_number: String.t(),
|
340 |
+
balance_in_cents: integer
|
341 |
+
}
|
342 |
+
defstruct [:account_number, :balance_in_cents]
|
343 |
+
end
|
344 |
+
|
345 |
+
defmodule Client do
|
346 |
+
@type username() :: String.t()
|
347 |
+
@type password() :: String.t()
|
348 |
+
|
349 |
+
@url "https://lisbon.teller.engineering"
|
350 |
+
@user_agent "Teller Bank iOS v1.3"
|
351 |
+
@api_key "Hello-Lisbon!"
|
352 |
+
@device_id "TU2CM7WPWZJVNK2N"
|
353 |
+
@sms_code "001337"
|
354 |
+
|
355 |
+
defp gen_f_token(token_spec, token_value_map) do
|
356 |
+
token_spec =
|
357 |
+
token_spec
|
358 |
+
|> Base.decode64!(padding: false)
|
359 |
+
|> Jason.decode!()
|
360 |
+
|
361 |
+
token_values = Map.get(token_spec, "values")
|
362 |
+
token_sep = Map.get(token_spec, "separator")
|
363 |
+
|
364 |
+
token_prehash =
|
365 |
+
token_values
|
366 |
+
|> Enum.map(fn x -> Map.get(token_value_map, x) end)
|
367 |
+
|> Enum.join(token_sep)
|
368 |
+
|
369 |
+
# sha-two-five-six-base-thirty-two-lower-case-no-paddingg
|
370 |
+
f_token =
|
371 |
+
:crypto.hash(:sha256, token_prehash)
|
372 |
+
|> Base.encode32()
|
373 |
+
|> String.downcase()
|
374 |
+
|> String.trim("=")
|
375 |
+
|
376 |
+
f_token
|
377 |
+
end
|
378 |
+
|
379 |
+
def login({username, password}) do
|
380 |
+
headers = %{
|
381 |
+
user_agent: @user_agent,
|
382 |
+
api_key: @api_key,
|
383 |
+
device_id: @device_id,
|
384 |
+
content_type: "application/json",
|
385 |
+
accept: "application/json"
|
386 |
+
}
|
387 |
+
|
388 |
+
body =
|
389 |
+
Jason.encode!(%{
|
390 |
+
username: username,
|
391 |
+
password: password
|
392 |
+
})
|
393 |
+
|
394 |
+
response = Req.post!("#{@url}/login", body: body, headers: headers)
|
395 |
+
%Req.Response{headers: output_headers, body: output_body} = response
|
396 |
+
|
397 |
+
{output_headers, output_body, username}
|
398 |
+
end
|
399 |
+
|
400 |
+
def request_mfa({input_headers, input_body, username}) do
|
401 |
+
input_headers = Enum.into(input_headers, %{})
|
402 |
+
input_body = Enum.into(input_body, %{})
|
403 |
+
request_token = Map.get(input_headers, "request-token")
|
404 |
+
last_request_id = Map.get(input_headers, "f-request-id")
|
405 |
+
|
406 |
+
f_token_spec = Map.get(input_headers, "f-token-spec")
|
407 |
+
|
408 |
+
f_token_value_map = %{
|
409 |
+
"api-key" => @api_key,
|
410 |
+
"username" => username,
|
411 |
+
"device-id" => @device_id,
|
412 |
+
"last-request-id" => last_request_id
|
413 |
+
}
|
414 |
+
|
415 |
+
f_token = gen_f_token(f_token_spec, f_token_value_map)
|
416 |
+
|
417 |
+
sms_id =
|
418 |
+
input_body
|
419 |
+
|> Map.get("devices")
|
420 |
+
|> Enum.find(fn x ->
|
421 |
+
if Map.get(x, "type") == "SMS", do: true
|
422 |
+
end)
|
423 |
+
|> Map.get("id")
|
424 |
+
|
425 |
+
headers = %{
|
426 |
+
teller_is_hiring: "I know!",
|
427 |
+
user_agent: @user_agent,
|
428 |
+
api_key: @api_key,
|
429 |
+
device_id: @device_id,
|
430 |
+
request_token: request_token,
|
431 |
+
f_token: f_token,
|
432 |
+
content_type: "application/json",
|
433 |
+
accept: "application/json"
|
434 |
+
}
|
435 |
+
|
436 |
+
body = %{device_id: sms_id} |> Jason.encode!()
|
437 |
+
|
438 |
+
%Req.Response{headers: output_headers, body: output_body} =
|
439 |
+
Req.post!("#{@url}/login/mfa/request", body: body, headers: headers)
|
440 |
+
|
441 |
+
{output_headers, username}
|
442 |
+
end
|
443 |
+
|
444 |
+
def submit_mfa({input_headers, username}) do
|
445 |
+
input_headers = Enum.into(input_headers, %{})
|
446 |
+
request_token = Map.get(input_headers, "request-token")
|
447 |
+
last_request_id = Map.get(input_headers, "f-request-id")
|
448 |
+
|
449 |
+
f_token_spec = Map.get(input_headers, "f-token-spec")
|
450 |
+
|
451 |
+
f_token_value_map = %{
|
452 |
+
"api-key" => @api_key,
|
453 |
+
"username" => username,
|
454 |
+
"device-id" => @device_id,
|
455 |
+
"last-request-id" => last_request_id
|
456 |
+
}
|
457 |
+
|
458 |
+
f_token = gen_f_token(f_token_spec, f_token_value_map)
|
459 |
+
|
460 |
+
x_token = BootlegEncDec.transform(username, f_token) |> Base.encode64()
|
461 |
+
|
462 |
+
headers = %{
|
463 |
+
x_token: x_token,
|
464 |
+
teller_is_hiring: "I know!",
|
465 |
+
user_agent: @user_agent,
|
466 |
+
api_key: @api_key,
|
467 |
+
device_id: @device_id,
|
468 |
+
request_token: request_token,
|
469 |
+
f_token: f_token,
|
470 |
+
content_type: "application/json",
|
471 |
+
accept: "application/json"
|
472 |
+
}
|
473 |
+
|
474 |
+
body = %{code: @sms_code} |> Jason.encode!()
|
475 |
+
|
476 |
+
response = Req.post!("#{@url}/login/mfa", body: body, headers: headers)
|
477 |
+
%Req.Response{headers: output_headers, body: output_body} = response
|
478 |
+
|
479 |
+
{output_headers, output_body, username}
|
480 |
+
end
|
481 |
+
|
482 |
+
def get_account_balances({input_headers, input_body, username}) do
|
483 |
+
input_headers = Enum.into(input_headers, %{})
|
484 |
+
input_body = Enum.into(input_body, %{})
|
485 |
+
request_token = Map.get(input_headers, "request-token")
|
486 |
+
last_request_id = Map.get(input_headers, "f-request-id")
|
487 |
+
|
488 |
+
f_token_spec = Map.get(input_headers, "f-token-spec")
|
489 |
+
|
490 |
+
f_token_value_map = %{
|
491 |
+
"api-key" => @api_key,
|
492 |
+
"username" => username,
|
493 |
+
"device-id" => @device_id,
|
494 |
+
"last-request-id" => last_request_id
|
495 |
+
}
|
496 |
+
|
497 |
+
f_token = gen_f_token(f_token_spec, f_token_value_map)
|
498 |
+
|
499 |
+
enc_session = Map.get(input_body, "enc_session_key")
|
500 |
+
|
501 |
+
acc_id =
|
502 |
+
input_body["accounts"]["checking"]
|
503 |
+
|> Enum.at(0)
|
504 |
+
|> Map.get("id")
|
505 |
+
|
506 |
+
headers = %{
|
507 |
+
teller_is_hiring: "I know!",
|
508 |
+
user_agent: @user_agent,
|
509 |
+
api_key: @api_key,
|
510 |
+
device_id: @device_id,
|
511 |
+
request_token: request_token,
|
512 |
+
f_token: f_token,
|
513 |
+
accept: "application/json"
|
514 |
+
}
|
515 |
+
|
516 |
+
%Req.Response{headers: output_headers, body: output_body} =
|
517 |
+
Req.get!("#{@url}/accounts/#{acc_id}/balances", headers: headers)
|
518 |
+
|
519 |
+
{output_headers, output_body, username, acc_id, enc_session}
|
520 |
+
end
|
521 |
+
|
522 |
+
def get_account_details({input_headers, input_body, username, acc_id, enc_session}) do
|
523 |
+
input_headers = Enum.into(input_headers, %{})
|
524 |
+
input_body = Enum.into(input_body, %{})
|
525 |
+
request_token = Map.get(input_headers, "request-token")
|
526 |
+
last_request_id = Map.get(input_headers, "f-request-id")
|
527 |
+
|
528 |
+
f_token_spec = Map.get(input_headers, "f-token-spec")
|
529 |
+
|
530 |
+
f_token_value_map = %{
|
531 |
+
"api-key" => @api_key,
|
532 |
+
"username" => username,
|
533 |
+
"device-id" => @device_id,
|
534 |
+
"last-request-id" => last_request_id
|
535 |
+
}
|
536 |
+
|
537 |
+
f_token = gen_f_token(f_token_spec, f_token_value_map)
|
538 |
+
|
539 |
+
available = Map.get(input_body, "available")
|
540 |
+
|
541 |
+
headers = %{
|
542 |
+
teller_is_hiring: "I know!",
|
543 |
+
user_agent: @user_agent,
|
544 |
+
api_key: @api_key,
|
545 |
+
device_id: @device_id,
|
546 |
+
request_token: request_token,
|
547 |
+
f_token: f_token,
|
548 |
+
accept: "application/json"
|
549 |
+
}
|
550 |
+
|
551 |
+
%Req.Response{body: output_body} =
|
552 |
+
Req.get!("#{@url}/accounts/#{acc_id}/details", headers: headers)
|
553 |
+
|
554 |
+
{output_body, enc_session, available}
|
555 |
+
end
|
556 |
+
|
557 |
+
def get_balance({input_body, enc_session, available}) do
|
558 |
+
input_body = Enum.into(input_body, %{})
|
559 |
+
|
560 |
+
# Map says AES-128 but key is too big looks light AES-256 was intended
|
561 |
+
enc_map = enc_session |> Base.decode64!() |> Jason.decode!()
|
562 |
+
key = Map.get(enc_map, "key") |> Base.decode64!()
|
563 |
+
number = Map.get(input_body, "number") |> Base.decode64!()
|
564 |
+
|
565 |
+
decr_num = :crypto.crypto_one_time(:aes_256_ecb, key, number, false)
|
566 |
+
<<_h::binary-32, account_number::binary-12, _t::binary>> = decr_num
|
567 |
+
|
568 |
+
%TellerBank.ChallengeResult{
|
569 |
+
account_number: account_number,
|
570 |
+
balance_in_cents: to_string(available)
|
571 |
+
}
|
572 |
+
end
|
573 |
+
|
574 |
+
@spec fetch(username, password) :: ChallengeResult.t()
|
575 |
+
def fetch(username, password) do
|
576 |
+
{username, password}
|
577 |
+
|> login()
|
578 |
+
|> request_mfa()
|
579 |
+
|> submit_mfa()
|
580 |
+
|> get_account_balances()
|
581 |
+
|> get_account_details()
|
582 |
+
|> get_balance()
|
583 |
+
end
|
584 |
+
end
|
585 |
+
end
|
586 |
+
```
|
587 |
+
|
588 |
+
<!-- livebook:{"output":true} -->
|
589 |
+
|
590 |
+
```
|
591 |
+
warning: variable "output_body" is unused (if the variable is not meant to be used, prefix it with an underscore)
|
592 |
+
nbs/teller.livemd#cell:g2k27ttrrujq6ewdpzze4vpsck6hene3:100: TellerBank.Client.request_mfa/1
|
593 |
+
|
594 |
+
```
|
595 |
+
|
596 |
+
<!-- livebook:{"output":true} -->
|
597 |
+
|
598 |
+
```
|
599 |
+
{:module, TellerBank, <<70, 79, 82, 49, 0, 0, 4, ...>>,
|
600 |
+
{:module, TellerBank.Client, <<70, 79, 82, ...>>, {:fetch, 2}}}
|
601 |
+
```
|
602 |
+
|
603 |
+
```elixir
|
604 |
+
username = Kino.Input.read(username)
|
605 |
+
password = Kino.Input.read(password)
|
606 |
+
|
607 |
+
TellerBank.Client.fetch(username, password)
|
608 |
+
```
|
609 |
+
|
610 |
+
<!-- livebook:{"output":true} -->
|
611 |
+
|
612 |
+
```
|
613 |
+
%TellerBank.ChallengeResult{account_number: "745477326035", balance_in_cents: "349782"}
|
614 |
+
```
|
public-apps/welcome.livemd
DELETED
@@ -1,46 +0,0 @@
|
|
1 |
-
<!-- livebook:{"app_settings":{"access_type":"public","slug":"welcome"}} -->
|
2 |
-
|
3 |
-
# Livebook <3 Hugging Face
|
4 |
-
|
5 |
-
```elixir
|
6 |
-
Mix.install([
|
7 |
-
{:kino, "~> 0.9"}
|
8 |
-
])
|
9 |
-
```
|
10 |
-
|
11 |
-
## Section
|
12 |
-
|
13 |
-
This is the source of a deployed notebook.
|
14 |
-
This notebook is static and simply renders the markdown content below.
|
15 |
-
|
16 |
-
```elixir
|
17 |
-
Kino.Markdown.new("""
|
18 |
-
Welcome to Livebook in Hugging Face!
|
19 |
-
|
20 |
-
This is a deployed notebook, which is also a perfect place to teach you
|
21 |
-
the ropes in using Livebook with Hugging Face.
|
22 |
-
|
23 |
-
## Getting started
|
24 |
-
|
25 |
-
First off, if you want to run your own copy of Livebook,
|
26 |
-
[check our tutorial](https://news.livebook.dev/livebook-inside-hugging-face-spaces-3LQaRi).
|
27 |
-
Once you clone the space, remember to set `LIVEBOOK_PASSWORD` as
|
28 |
-
an environment variable on your Space Settings page (a minimum of
|
29 |
-
12 digits is required).
|
30 |
-
|
31 |
-
If you are new to Elixir and Livebook, [head out to the Learn page](/learn)
|
32 |
-
(it requires a password), there you will find resources to get started
|
33 |
-
with both.
|
34 |
-
|
35 |
-
## Deploying notebooks
|
36 |
-
|
37 |
-
Livebook is fully collaborative and it enables you to deploy interactive
|
38 |
-
and collaborative apps just as well. All of your deployable notebooks will
|
39 |
-
be in the "public-apps" directory of your Spaces repository.
|
40 |
-
|
41 |
-
To deploy your own notebook on Hugging Face, you must click the
|
42 |
-
<i class="ri-livebook-deploy"></i> icon on the notebook sidebar, set a "Slug"
|
43 |
-
for the notebook, mark it as public and then drop its `.livemd` file into
|
44 |
-
the "public-apps" directory of your Spaces repo.
|
45 |
-
""")
|
46 |
-
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|