<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><link href="https://bytearchitect.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://bytearchitect.io/" rel="alternate" type="text/html" /><updated>2026-05-11T12:28:10+02:00</updated><id>https://bytearchitect.io/feed.xml</id><title type="html">The Byte Architect</title><subtitle>macOS Security Research, Reverse Engineering, and Exploit Development</subtitle><author><name>Gabriel Biondo</name></author><entry><title type="html">Apple Defences - APFS and the SSV</title><link href="https://bytearchitect.io/macos-security/Apple-Defences-APFS-and-the-SSV/" rel="alternate" type="text/html" title="Apple Defences - APFS and the SSV" /><published>2026-05-11T00:00:00+02:00</published><updated>2026-05-11T00:00:00+02:00</updated><id>https://bytearchitect.io/macos-security/Apple-Defences-APFS-and-the-SSV</id><content type="html" xml:base="https://bytearchitect.io/macos-security/Apple-Defences-APFS-and-the-SSV/">&lt;p&gt;&lt;em&gt;Skip the usual preamble: most of mine add no value anyway. This one’s different though.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Not the usual “It took me time to write…” - although it’s true. I took some days off, and days off imply no laptop.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Second - one of my previous posts (&lt;a href=&quot;https://bytearchitect.io/macos-security/theory/Filesystem-Wars-Why-Your-Choice-of-Storage-is-Actually-a-Security-Move/&quot;&gt;Filesystem Wars: Why Your Choice of Storage is Actually a Security Move&lt;/a&gt;) has been heavily criticised by trolls on Reddit. Therefore the &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;linuxFanboysSuck&lt;/span&gt;&lt;/code&gt; or &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;TrollTurd&lt;/span&gt;&lt;/code&gt; prompts. They wanted some visibility, here they go! Who am I to deny them the pleasure to embarrass themselves?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Third - the elephant in the room: I am not a native speaker. My English is what it is, and yes, &lt;strong&gt;I do use LLMs.&lt;/strong&gt; Mainly to polish my English, and to soften my bluntness. The damn content is mine! If you want to understand the “LLM policy”, please have a read: &lt;a href=&quot;https://bytearchitect.io/service-notices/Memento-deinde-loquere/&quot;&gt;Memento, deinde loquere&lt;/a&gt; To keep it short: LLMs are what saves people from sentences like “if you don’t like it, you can s&lt;strong&gt;** my mot&lt;/strong&gt;&lt;strong&gt;* d&lt;/strong&gt;** you a&lt;strong&gt;** * * ** *** **&lt;/strong&gt;* &lt;strong&gt;**&lt;/strong&gt;** &lt;strong&gt;**&lt;/strong&gt;&lt;strong&gt;**&lt;/strong&gt;* ….”&lt;/em&gt; (hope you recognised the Fibonacci sequence. If not, try the Fibonacci Soup. It’s the soup of yesterday mixed with the soup of the day before).&lt;/p&gt;

&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;So, what is this post about? Originally, I wanted to prepare something that showed how Apple uses APFS to build a strong defence for macOS. Then while writing the raw contents I realised that there’s a deeper strategy. I will try to describe it, but this is a broad topic, so I expect follow-up notes, corrections, and possibly a few &lt;em&gt;errata corrigenda&lt;/em&gt;. TL;DR: if you find this article interesting, you may want to come back. So, we will see the filesystem and some other security controls interacting as a great example of Defence in depth.&lt;/p&gt;

&lt;p&gt;I would also ask the readers to highlight aspects I forgot, and if you can link these concepts to others (even in other OSes), please feel free to get in touch with me. I am &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gbiondo&lt;/span&gt;&lt;/code&gt; on the Mastodon instance &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;infosec&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;exchange&lt;/span&gt;&lt;/code&gt;. Kudos, mentions, and toasts will be reciprocated!&lt;/p&gt;

&lt;h3 id=&quot;how-it-all-begins&quot;&gt;How it all begins&lt;/h3&gt;
&lt;p&gt;You’re on Facebook/Reddit/OnlyFans/Instagram/../dirTransv/../Tinder/X and you see the usual newbie post:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;I&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;just&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;installed&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Kali&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Linux&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;on&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;machine&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt; 
&lt;span class=&quot;n&quot;&gt;Now&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;what&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;?&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Chances are that 97% of the answers are like&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;remove&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;the&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;french&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;language&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;support&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;with&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;no&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;preserve&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;root&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;A touching example of community spirit, but the joke is so worn out by now that if you still type it, please stop reading me.&lt;/p&gt;

&lt;p&gt;That command is meant to nuke the system. On modern Linux boxes, plain &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;/code&gt; should be stopped by the default &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;o&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;preserve&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;root&lt;/span&gt;&lt;/code&gt; failsafe, but &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;o&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;no&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;preserve&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;root&lt;/span&gt;&lt;/code&gt; is literally there to bypass it. I haven’t bothered testing it on Linux for this post: the macOS side is what we care about, and the contrast with Linux is enough as a thought experiment.&lt;/p&gt;

&lt;p&gt;But before applying the same prank to a macOS box — and seeing why it doesn’t quite work the same way — let’s look at how Apple has organised the filesystem.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Notice the philosophy: Unix tells you ‘I think you’re about to do something stupid, but I’ll let you’. macOS, as we’ll see, is going to tell you ‘you’re being stupid, and I won’t let you’ — which is either a feature or a bug depending on which side of the kernel you sit on.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;the-filesystem&quot;&gt;The filesystem&lt;/h2&gt;
&lt;p&gt;Let’s take a quick step back to the structure of the filesystem. The APFS structure and operating philosophy have been already described in the aforementioned post, but just to refresh the ideas:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;a disk is subdivided into partitions&lt;/li&gt;
  &lt;li&gt;in the normal case, a partition hosts an APFS container&lt;/li&gt;
  &lt;li&gt;the container hosts one or more APFS volumes&lt;/li&gt;
  &lt;li&gt;the free space inside the container is shared among those volumes, which can grow or shrink independently&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This taxonomy is evident when using &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;diskutil&lt;/span&gt;&lt;/code&gt;. From the man page:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DESCRIPTION&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;**&lt;/span&gt;

&lt;span class=&quot;err&quot;&gt;  &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;o&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;diskutil&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;**&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;manipulates&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;the&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;structure&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;local&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;disks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;It&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;provides&lt;/span&gt; 
&lt;span class=&quot;err&quot;&gt;  &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;n&quot;&gt;information&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;about&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;allows&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;the&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;administration&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;of&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;partitioning&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;schemes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; 
&lt;span class=&quot;err&quot;&gt;  &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;n&quot;&gt;layouts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;formats&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;disks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;This&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;includes&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hard&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;disks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;solid&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;state&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;disks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; 
&lt;span class=&quot;err&quot;&gt;  &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;n&quot;&gt;optical&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;discs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;disk&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;images&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;APFS&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;volumes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CoreStorage&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;volumes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;and&lt;/span&gt; 
&lt;span class=&quot;err&quot;&gt;  &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;n&quot;&gt;AppleRAID&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sets&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;n&quot;&gt;It&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;generally&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;manipulates&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;whole&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;volumes&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;instead&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;of&lt;/span&gt; 
&lt;span class=&quot;err&quot;&gt;  &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;n&quot;&gt;individual&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;files&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;directories&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Although the man page is quite useful, sometimes you just want the quick reference. Run &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;diskutil&lt;/span&gt;&lt;/code&gt; without arguments and it will dump its help.&lt;/p&gt;

&lt;p&gt;Let’s launch &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;diskutil&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;list&lt;/span&gt;&lt;/code&gt; to obtain:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;gabriel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;virtosaurus&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;erectus&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;~&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;diskutil&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;list&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dev&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;disk0&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;internal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;physical&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;  &lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;#:                       TYPE NAME                    SIZE       IDENTIFIER
&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;  &lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GUID_partition_scheme&lt;/span&gt;&lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;68.7&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GB&lt;/span&gt;&lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;n&quot;&gt;disk0&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;  &lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Apple_APFS_ISC&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Container&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;disk2&lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;524.3&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MB&lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;n&quot;&gt;disk0s1&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;  &lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Apple_APFS&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Container&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;disk4&lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;62.8&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GB&lt;/span&gt;&lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;n&quot;&gt;disk0s2&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;  &lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Apple_APFS_Recovery&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Container&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;disk3&lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;5.4&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GB&lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;n&quot;&gt;disk0s3&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dev&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;disk1&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;internal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;physical&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;  &lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;#:                       TYPE NAME                    SIZE       IDENTIFIER
&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;  &lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;n&quot;&gt;FDisk_partition_scheme&lt;/span&gt;&lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;13.6&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MB&lt;/span&gt;&lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;n&quot;&gt;disk1&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;  &lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Apple_HFS&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Guest&lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;13.6&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MB&lt;/span&gt;&lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;n&quot;&gt;disk1s1&lt;/span&gt;
  

&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dev&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;disk4&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;synthesized&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;  &lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;#:                       TYPE NAME                    SIZE       IDENTIFIER
&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;  &lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;n&quot;&gt;APFS&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Container&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Scheme&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;62.8&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GB&lt;/span&gt;&lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;n&quot;&gt;disk4&lt;/span&gt;

&lt;span class=&quot;err&quot;&gt;  &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Physical&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Store&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;disk0s2&lt;/span&gt;

&lt;span class=&quot;err&quot;&gt;  &lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;n&quot;&gt;APFS&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Volume&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Macintosh&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;HD&lt;/span&gt;&lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;12.6&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GB&lt;/span&gt;&lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;n&quot;&gt;disk4s1&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;  &lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;n&quot;&gt;APFS&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Snapshot&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;com&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;apple&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;12.6&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GB&lt;/span&gt;&lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;n&quot;&gt;disk4s1s1&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;  &lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;n&quot;&gt;APFS&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Volume&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Preboot&lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;7.2&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GB&lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;n&quot;&gt;disk4s2&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;  &lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;n&quot;&gt;APFS&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Volume&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Recovery&lt;/span&gt;&lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;1.3&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GB&lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;n&quot;&gt;disk4s3&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;  &lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;n&quot;&gt;APFS&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Volume&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Data&lt;/span&gt;&lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;2.8&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GB&lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;n&quot;&gt;disk4s5&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;  &lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;n&quot;&gt;APFS&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Volume&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;VM&lt;/span&gt;&lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;20.5&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;KB&lt;/span&gt;&lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;n&quot;&gt;disk4s6&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This output is &lt;em&gt;per se&lt;/em&gt; a small pedagogical masterpiece that shows the organisation/layering of APFS.&lt;/p&gt;

&lt;p&gt;First: the output tracks three top-level disk devices, but one is &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;synthesized&lt;/span&gt;&lt;/code&gt;. The (further!) abstraction layer introduced by APFS is made explicit by &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;diskutil&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;disk0&lt;/span&gt;&lt;/code&gt; is the physical disk using a GUID Partition Table (yep - GPT. The tradition of acronyms is reaching its theoretical collision limits). It has three partitions:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;Apple_APFS_ISC&lt;/span&gt;&lt;/code&gt;: the iBoot System Container (ISC). Contains system-critical boot material used by iBoot on Apple Silicon machines.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;Apple_APFS_Recovery&lt;/span&gt;&lt;/code&gt; - the recovery container, hosting an independent recoveryOS.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;Apple_APFS&lt;/span&gt;&lt;/code&gt; - the “real” APFS partition.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;disk4&lt;/span&gt;&lt;/code&gt; is the “materialisation” of &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;disk0s2&lt;/span&gt;&lt;/code&gt;. In detail:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Disk&lt;/th&gt;
      &lt;th&gt;Label&lt;/th&gt;
      &lt;th&gt;Purpose&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;disk4s1&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;Macintosh&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;HD&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;System volume&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;disk4s1s1&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;com&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;apple&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Snapshot of &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;disk4s1&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;disk4s2&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;Preboot&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Kernel cache, boot policies, and boot support material&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;disk4s3&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;Recovery&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;recoveryOS. Local.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;disk4s5&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;Data&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Writable volume - more on this later&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;disk4s6&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;VM&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Swap/Sleepimage. Isolated to ease wiping.&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Why this organisation - it looks redundant and cumbersome! Hah, you puny penguin preacher, you don’t see the structure which I hide on purpose :). Look at  the &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;disk4s1&lt;/span&gt;&lt;/code&gt; + &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;disk4s1s1&lt;/span&gt;&lt;/code&gt; combo: volume + snapshot. The system boots from the sealed snapshot, not from the writable volume. The snapshot is cryptographically sealed, and changing this would imply breaking a Merkle-tree-like chain of hashes that reaches up to Secure Boot. Therefore, attackers with root privileges can’t persistently write in &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;usr&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;bin&lt;/span&gt;&lt;/code&gt; because they’re not writing there at all. They’re writing to a volume that nobody reads at the next boot.&lt;/p&gt;

&lt;p&gt;But actually this mechanism - cryptographically sealed volumes, which we are only glancing at now - probably grants one of the strongest forms of system integrity. Yeah, root cannot do everything (well… not really. But there are caveats.), but - do you really think that having a user who can do anything on a machine improves its security? Take your time, think about it…&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Lately I think that root (both as user and privileges) is the toy of late-90s/beginning-2000s sysadmins. Great thing, sure… but the world has changed. Already the introduction of &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;doas&lt;/span&gt;&lt;/code&gt; instead of &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;su&lt;/span&gt;&lt;/code&gt; is a strong indicator. Personal opinion. But this blog is opinionated.&lt;/em&gt;&lt;/p&gt;

&lt;h3 id=&quot;snapshots&quot;&gt;Snapshots&lt;/h3&gt;

&lt;p&gt;Now, look at this simple output:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;gabriel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;virtosaurus&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;erectus&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;~&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;diskutil&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;apfs&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;list&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;APFS&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Containers&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;found&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;+--&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Container&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;disk4&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5531&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F5C3&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;04&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;B2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;45E4&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;84&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;72296&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C71CD67&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;====================================================&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;APFS&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Container&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Reference&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;     &lt;span class=&quot;n&quot;&gt;disk4&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;Size&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Capacity&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Ceiling&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;      &lt;span class=&quot;mi&quot;&gt;62826479616&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;B&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;62.8&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GB&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;Capacity&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;In&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Use&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;By&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Volumes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;   &lt;span class=&quot;mi&quot;&gt;25124798464&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;B&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;25.1&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GB&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;40.0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;used&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;Capacity&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Not&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Allocated&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;       &lt;span class=&quot;mi&quot;&gt;37701681152&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;B&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;37.7&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GB&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;60.0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;free&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;+-&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Physical&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Store&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;disk0s2&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0488&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C2FD&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C78&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;46&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F6&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;BB6A&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D4215930C0EB&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;o&quot;&gt;-----------------------------------------------------------&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;APFS&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Physical&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Store&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Disk&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;disk0s2&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;Size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;                       &lt;span class=&quot;mi&quot;&gt;62826479616&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;B&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;62.8&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GB&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;+-&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Volume&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;disk4s1&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;C806F908&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;958&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4945&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ADB7&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;29&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;B5646526E9&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;o&quot;&gt;---------------------------------------------------&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;APFS&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Volume&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Disk&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Role&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;disk4s1&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;Name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;                      &lt;span class=&quot;n&quot;&gt;Macintosh&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;HD&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Case&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;insensitive&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;Mount&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Point&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;               &lt;span class=&quot;n&quot;&gt;Not&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Mounted&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;Capacity&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Consumed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;         &lt;span class=&quot;mi&quot;&gt;12551831552&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;B&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;12.6&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GB&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;Sealed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;                    &lt;span class=&quot;n&quot;&gt;Yes&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;FileVault&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;                 &lt;span class=&quot;n&quot;&gt;No&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;Snapshot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;                  &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CF13368&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CF2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;480&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;8518&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;6626E86&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ACCFE&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;Snapshot&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Disk&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;             &lt;span class=&quot;n&quot;&gt;disk4s1s1&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;Snapshot&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Mount&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Point&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;      &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;Snapshot&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Sealed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;           &lt;span class=&quot;n&quot;&gt;Yes&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;+-&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Volume&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;disk4s2&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;15&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FD3EDD&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;17&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;B5&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4855&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D8A&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C76AA5EC5D18&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;o&quot;&gt;---------------------------------------------------&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;APFS&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Volume&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Disk&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Role&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;disk4s2&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Preboot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;Name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;                      &lt;span class=&quot;n&quot;&gt;Preboot&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Case&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;insensitive&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;Mount&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Point&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;               &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Volumes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Preboot&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;Capacity&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Consumed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;         &lt;span class=&quot;mi&quot;&gt;7238791168&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;B&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;7.2&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GB&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;Sealed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;                    &lt;span class=&quot;n&quot;&gt;No&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;FileVault&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;                 &lt;span class=&quot;n&quot;&gt;No&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;+-&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Volume&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;disk4s3&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;AD1D82CF&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;E831&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;48&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A59&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;06E74&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FFEAA27&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;o&quot;&gt;---------------------------------------------------&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;APFS&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Volume&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Disk&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Role&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;disk4s3&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Recovery&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;Name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;                      &lt;span class=&quot;n&quot;&gt;Recovery&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Case&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;insensitive&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;Mount&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Point&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;               &lt;span class=&quot;n&quot;&gt;Not&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Mounted&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;Capacity&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Consumed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;         &lt;span class=&quot;mi&quot;&gt;1251835904&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;B&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;1.3&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GB&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;Sealed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;                    &lt;span class=&quot;n&quot;&gt;No&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;FileVault&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;                 &lt;span class=&quot;n&quot;&gt;No&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;+-&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Volume&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;disk4s5&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;D71D56D7&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D99&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4793&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A1B0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;05E96&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D1B76E9&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;o&quot;&gt;---------------------------------------------------&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;APFS&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Volume&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Disk&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Role&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;disk4s5&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;Name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;                      &lt;span class=&quot;n&quot;&gt;Data&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Case&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;insensitive&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;Mount&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Point&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;               &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Volumes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Data&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;Capacity&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Consumed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;         &lt;span class=&quot;mi&quot;&gt;3961692160&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;B&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;4.0&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GB&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;Sealed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;                    &lt;span class=&quot;n&quot;&gt;No&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;FileVault&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;                 &lt;span class=&quot;n&quot;&gt;No&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;+-&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Volume&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;disk4s6&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;8E3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;E0F26&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CE48&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;43&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;AA&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D63&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A59DC1A151FB&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;---------------------------------------------------&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;APFS&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Volume&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Disk&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Role&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;disk4s6&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;VM&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;Name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;                      &lt;span class=&quot;n&quot;&gt;VM&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Case&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;insensitive&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;Mount&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Point&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;               &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Volumes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;VM&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;Capacity&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Consumed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;         &lt;span class=&quot;mi&quot;&gt;20480&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;B&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;20.5&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;KB&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;Sealed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;                    &lt;span class=&quot;n&quot;&gt;No&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;FileVault&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;                 &lt;span class=&quot;n&quot;&gt;No&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;(With the &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;apfs&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;list&lt;/span&gt;&lt;/code&gt; verb, &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;diskutil&lt;/span&gt;&lt;/code&gt; gives us the APFS-native view: containers, physical stores, volumes, roles, snapshots, UUIDs, and space accounting.)&lt;/p&gt;

&lt;p&gt;Focus on this detail:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;o&quot;&gt;+-&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Volume&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;disk4s1&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;C806F908&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;958&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4945&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ADB7&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;29&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;B5646526E9&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;o&quot;&gt;---------------------------------------------------&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;APFS&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Volume&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Disk&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Role&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;disk4s1&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;Name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;                      &lt;span class=&quot;n&quot;&gt;Macintosh&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;HD&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Case&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;insensitive&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;Mount&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Point&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;               &lt;span class=&quot;n&quot;&gt;Not&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Mounted&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;Capacity&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Consumed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;         &lt;span class=&quot;mi&quot;&gt;12551831552&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;B&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;12.6&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GB&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;Sealed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;                    &lt;span class=&quot;n&quot;&gt;Yes&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;FileVault&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;                 &lt;span class=&quot;n&quot;&gt;No&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;Snapshot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;                  &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CF13368&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CF2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;480&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;8518&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;6626E86&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ACCFE&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;Snapshot&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Disk&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;             &lt;span class=&quot;n&quot;&gt;disk4s1s1&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;Snapshot&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Mount&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Point&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;      &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;Snapshot&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Sealed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;           &lt;span class=&quot;n&quot;&gt;Yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;which actually shows how the mechanism works. The system volume is &lt;strong&gt;not&lt;/strong&gt; mounted. But it has a snapshot, whose UUID is &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CF13368&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CF2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;480&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;8518&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;6626E86&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ACCFE&lt;/span&gt;&lt;/code&gt;, the snapshot disk is &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;disk4s1s1&lt;/span&gt;&lt;/code&gt;. The OS runs from that snapshot.&lt;/p&gt;

&lt;p&gt;Usually, under Linux and BSD, the filesystem is mounted at &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;/code&gt;. The neat result is that the user perceives “the system” and the root filesystem as the same thing. On modern macOS, this is not true. &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;Macintosh&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;HD&lt;/span&gt;&lt;/code&gt; - or better, &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;disk4s1&lt;/span&gt;&lt;/code&gt; is there, it exists. It occupies roughly 12.6 GB of space. But it isn’t mounted anywhere. What is really mounted on &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;/code&gt; is &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;disk4s1s1&lt;/span&gt;&lt;/code&gt;, the snapshot.&lt;/p&gt;

&lt;p&gt;Let’s explicitly observe something. Snapshots and seals are not “marketing-named defences”, such as “Gatekeeper” or “System Integrity Protection”. They’re just technical primitive features of APFS that Apple has &lt;em&gt;also used&lt;/em&gt; to build some defences. For instance, most users first met APFS snapshots through Time Machine.&lt;/p&gt;

&lt;p&gt;In fact - an APFS snapshot is a&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;point-in-time&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;read only&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;immutable&lt;/em&gt;
version of a volume. It’s not a “real” copy, from this perspective; but since APFS is &lt;em&gt;copy-on-write&lt;/em&gt; the snapshot shares blocks with the live volume until the user or an agent changes something. In that case, new blocks are allocated, but only for the &lt;em&gt;delta&lt;/em&gt;. Initial cost: near zero. Time cost: O(delta). Plus the usual metadata tax.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This observation shows some technical properties that enforce the defensive character of the snapshot mechanism:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;read-only&lt;/strong&gt;. You cannot write to it. Not even with &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;mount&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;uw&lt;/span&gt;&lt;/code&gt;. To modify a system running from a snapshot, one must modify the underlying System volume, create a new bootable snapshot, and make the system boot from it. With SSV, this also means dealing with the seal (we’ll get there, hold your horses).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;atomic&lt;/strong&gt;. The snapshot either exists or doesn’t exist: it sees a consistent point-in-time state, not a half-mutated filesystem. If you take a snapshot while you’re writing a file, the snapshot itself sees either the status before or after the writing operation. This results in integrity enforcement.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;cheap to revert&lt;/strong&gt;. Rolling back to a snapshot comes almost for free. It’s one of the mechanisms behind the “Restore to previous version” functionality we see on many backup systems.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;sealing&quot;&gt;Sealing&lt;/h3&gt;
&lt;p&gt;A snapshot is immutable by construction, we saw.  Sealing adds a cryptographic verification of its integrity.&lt;/p&gt;

&lt;p&gt;Apple builds a Merkle-tree over the contents of the sealed System snapshot. Each block is hashed, the hashes are grouped in nodes, up to a root (of the tree… too many roots here.)&lt;/p&gt;

&lt;p&gt;The root hash — the seal — is then signed/trusted as part of Apple’s boot chain.&lt;/p&gt;

&lt;p&gt;That &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;Sealed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Yes&lt;/span&gt;&lt;/code&gt; displayed by &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;diskutil&lt;/span&gt;&lt;/code&gt; is APFS telling you: this object is not merely read-only; it has a cryptographic seal.&lt;/p&gt;

&lt;p&gt;At boot time, depending on the Mac generation, iBoot or the boot chain verifies the seal before the snapshot becomes &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;/code&gt;. If the hash does not match, the seal is considered invalid and the normal boot process aborts. This is the main difference with “read-only mounting” a volume. A read-only volume can be written, provided one has the right privileges to do so. A sealed volume cannot - even if someone could write on it, the seal would be invalid at the next boot.&lt;/p&gt;

&lt;h3 id=&quot;putting-it-all-together-ssv&quot;&gt;Putting it all together: SSV&lt;/h3&gt;
&lt;p&gt;If:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;the volume is sealed (&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;Sealed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Yes&lt;/span&gt;&lt;/code&gt;)&lt;/li&gt;
  &lt;li&gt;the snapshot is sealed (&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;Snapshot&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Sealed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Yes&lt;/span&gt;&lt;/code&gt;)&lt;/li&gt;
  &lt;li&gt;and&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;Snapshot&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Mount&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Point&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;/code&gt; 
…then we have the so called &lt;strong&gt;Signed System Volume&lt;/strong&gt; (SSV). It is not a different volume, but  the configuration of a system volume and its snapshot, properly sealed. Apple calls it SSV.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The boot sequence becomes:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;iBoot (or the boot chain) verifies the kernelcache signature&lt;/li&gt;
  &lt;li&gt;iBoot verifies the snapshot seal against Apple’s signing keys (the root of the Merkle tree)&lt;/li&gt;
  &lt;li&gt;If the seal is valid, then
    &lt;ul&gt;
      &lt;li&gt;kernel mounts the snapshot as &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;otherwise, it rejects it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When it comes to updating, the flow (very simplified, here) becomes:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Apple signs a new system volume&lt;/li&gt;
  &lt;li&gt;the updater writes on the “live” volume (i.e. &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;disk4s1&lt;/span&gt;&lt;/code&gt;), which is &lt;em&gt;unmounted&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;a new snapshot is created&lt;/li&gt;
  &lt;li&gt;its seal is verified&lt;/li&gt;
  &lt;li&gt;if verification passes, the new snapshot becomes the boot snapshot and the system reboots into it. The old snapshot stays as fallback: if something goes wrong, you can still boot the previous OS state.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some important observations are required, here.&lt;/p&gt;

&lt;p&gt;First, to remove all ambiguities: it is important to state clearly that &lt;strong&gt;this is not SIP&lt;/strong&gt;. Here two filesystem primitives (snapshot and seal) and an architectural choice (booting from the snapshot) have been assembled together to build another layer of defence, independent from SIP. SIP deals with the enforcement of kernel policies at runtime, whilst SSV is a structural property of the filesystem. They strengthen each other, but they are independent.&lt;/p&gt;

&lt;p&gt;Second: the seal is not “every single file is signed by the OS”. The seal is just a hash, namely the root of the Merkle tree, that covers the entire volume. There is only one signature — well, Fibonacci and Recursion would probably object, but I trust the common sense of the reader. What changes is the underlying tree. This is important because it has impacts on performance. In fact, to check the seal at boot time it is sufficient to check the root against Apple’s signature. If something has been tampered with, the hashes don’t match. It’s not even important understanding where and why the hashes don’t match: the system does not boot anyway. Furthermore, APFS can verify subtrees on demand when it reads blocks. This means that even at runtime, reading a file from the system volume implies a cryptographic check from the path of the file up to the root. Therefore, a runtime tampering is immediately detected. Finally, if Apple had to sign every single file, each update would require a tremendous amount of signatures and a gigantic trust structure in place. With Merkle trees, only one item is signed.&lt;/p&gt;

&lt;p&gt;Third, a security observation. During the years we saw several SIP bypasses (Shrootless CVE-2021-30892, “migraine” CVE-2023-32369, …). Breaking the SSV is a different thing. It would require breaking the underlying cryptographic algorithms, not “finding an entitlement that breaks policies”.&lt;/p&gt;

&lt;p&gt;The canonical tool to observe the status of SSV is &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;csrutil&lt;/span&gt;&lt;/code&gt;. By the way, it is also used to investigate the SIP status - which is probably what justifies some of the common misunderstandings about the two technologies.&lt;/p&gt;

&lt;p&gt;Launched without arguments, as usual, it gives a short help page:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;gabriel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;LinuxFanboysSuck&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;~&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;csrutil&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;usage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;csrutil&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;command&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Modify&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;the&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;System&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Integrity&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Protection&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;configuration&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Available&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;commands&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;clear&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;Clear&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;the&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;existing&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;configuration&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;disable&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;Disable&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;the&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;protection&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;the&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;OS&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;installation&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Only&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;available&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; 
        &lt;span class=&quot;n&quot;&gt;Recovery&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;OS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;enable&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;Enable&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;the&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;protection&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;the&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;OS&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;installation&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Only&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;available&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Recovery&lt;/span&gt; 
        &lt;span class=&quot;n&quot;&gt;OS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;status&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;In&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Recovery&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;OS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;displays&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;the&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;configuration&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;each&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;OS&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;installation&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;In&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;macOS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;displays&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;the&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;configuration&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;the&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;running&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;OS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;allow&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;research&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;guests&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;status&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;Show&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;the&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;current&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;allow&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;research&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;guests&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;setting&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;disable&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;Disallow&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;research&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;guests&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Only&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;available&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Recovery&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;OS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;enable&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;Allow&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;research&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;guests&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Only&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;available&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Recovery&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;OS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;authenticated&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;root&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;status&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;Show&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;the&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;current&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;authenticated&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;root&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;setting&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;disable&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;Allow&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;booting&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;non&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sealed&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;system&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;snapshots&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Only&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;available&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; 
            &lt;span class=&quot;n&quot;&gt;Recovery&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;OS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;enable&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;Only&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;allow&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;booting&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sealed&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;system&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;snapshots&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Only&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;available&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; 
            &lt;span class=&quot;n&quot;&gt;Recovery&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;OS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Observe how the most important features require booting in Recovery OS (keeping the power button pressed for a while during restart on Apple Silicon machines). In other words, the user must lower the security level to change these values.&lt;/p&gt;

&lt;p&gt;On a fresh system, like the one I am using now:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;gabriel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;LinuxFanboysSuck&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;~&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;csrutil&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;authenticated&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;root&lt;/span&gt;&lt;span class=&quot;err&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Authenticated&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Root&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;status&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;enabled&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;(it looks like &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;status&lt;/span&gt;&lt;/code&gt; is not required, actually).&lt;/p&gt;

&lt;p&gt;However: &lt;strong&gt;Authenticated Root&lt;/strong&gt; is the &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;csrutil&lt;/span&gt;&lt;/code&gt; name for the SSV-related control. It is important also to read between the lines: the “authenticated” framing is stricter than “signed”, from a logical perspective. Actually, authenticated here means that &lt;em&gt;the root — both the filesystem root and the Merkle-tree root; yes, enjoy the pun — is checked before being trusted&lt;/em&gt;. It is an active authentication, not a passive property.&lt;/p&gt;

&lt;h2 id=&quot;conclusions&quot;&gt;Conclusions&lt;/h2&gt;
&lt;p&gt;If you were wondering: what happens if you ran &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fr&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;no&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;preserve&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;root&lt;/span&gt;&lt;/code&gt; on a Mac? Well — not much, at least where the sealed system is concerned.&lt;/p&gt;

&lt;p&gt;System applications remain mostly there:&lt;/p&gt;
&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;gabriel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;virtosaurus&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;erectus&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;~&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Applications&lt;/span&gt; 
&lt;span class=&quot;n&quot;&gt;App&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Store&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;		&lt;span class=&quot;n&quot;&gt;Font&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Book&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;		&lt;span class=&quot;n&quot;&gt;Music&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;		&lt;span class=&quot;n&quot;&gt;Siri&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Apps&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;		&lt;span class=&quot;n&quot;&gt;Freeform&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;		&lt;span class=&quot;n&quot;&gt;News&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;		&lt;span class=&quot;n&quot;&gt;Stickies&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Automator&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;		&lt;span class=&quot;n&quot;&gt;Games&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;		&lt;span class=&quot;n&quot;&gt;Notes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;		&lt;span class=&quot;n&quot;&gt;Stocks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Books&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;		&lt;span class=&quot;n&quot;&gt;Home&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;		&lt;span class=&quot;n&quot;&gt;Passwords&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;		&lt;span class=&quot;n&quot;&gt;System&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Settings&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Calculator&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;		&lt;span class=&quot;n&quot;&gt;Image&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Capture&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;Phone&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;		&lt;span class=&quot;n&quot;&gt;TextEdit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Calendar&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;		&lt;span class=&quot;n&quot;&gt;Image&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Playground&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;Photo&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Booth&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;		&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Machine&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Chess&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;		&lt;span class=&quot;n&quot;&gt;iPhone&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Mirroring&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;Photos&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;		&lt;span class=&quot;n&quot;&gt;Tips&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Clock&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;		&lt;span class=&quot;n&quot;&gt;Journal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;		&lt;span class=&quot;n&quot;&gt;Podcasts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;		&lt;span class=&quot;n&quot;&gt;TV&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Contacts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;		&lt;span class=&quot;n&quot;&gt;Mail&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;		&lt;span class=&quot;n&quot;&gt;Preview&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;		&lt;span class=&quot;n&quot;&gt;Utilities&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Dictionary&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;		&lt;span class=&quot;n&quot;&gt;Maps&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;		&lt;span class=&quot;n&quot;&gt;QuickTime&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Player&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;VoiceMemos&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;FaceTime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;		&lt;span class=&quot;n&quot;&gt;Messages&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;		&lt;span class=&quot;n&quot;&gt;Reminders&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;		&lt;span class=&quot;n&quot;&gt;Weather&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;FindMy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;		&lt;span class=&quot;n&quot;&gt;Mission&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Control&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;Shortcuts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Applications&lt;/span&gt;&lt;/code&gt; takes some damage, nevertheless: the &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;Utilities&lt;/span&gt;&lt;/code&gt; subdirectory is gone.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;gabriel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;virtosaurus&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;erectus&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;~&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Applications&lt;/span&gt;&lt;span class=&quot;err&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Safari&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Unsurprisingly, the structure of the home folder does not change:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;gabriel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;virtosaurus&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;erectus&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;~&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;~/&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Desktop&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Downloads&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Movies&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Pictures&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Documents&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Library&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Music&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Public&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This is just to give you the idea. However, I ran that &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;rm&lt;/span&gt;&lt;/code&gt; on a machine with no SIP/SSV changes. The next time, I promise, I’ll bring you the results on a tweaked machine.&lt;/p&gt;

&lt;p&gt;We’ll catch up in a week or so, with some more tests and a discussion on SIP. Or on the Fibonacci Soup. You’re welcome to cook it.&lt;/p&gt;

&lt;p&gt;Stay paranoid, and have fun. Cook some Soup.&lt;/p&gt;</content><author><name>Gabriel Biondo</name></author><category term="macos-security" /><category term="apple-security-101" /><summary type="html">APFS does not just store files: it turns filesystem structure into defence. Snapshots, seals, and SSV show why root is no longer the supreme deity of modern macOS.</summary></entry><entry><title type="html">Memento, deinde loquere</title><link href="https://bytearchitect.io/service-notices/Memento-deinde-loquere/" rel="alternate" type="text/html" title="Memento, deinde loquere" /><published>2026-04-24T00:00:00+02:00</published><updated>2026-04-24T00:00:00+02:00</updated><id>https://bytearchitect.io/service-notices/Memento-deinde-loquere</id><content type="html" xml:base="https://bytearchitect.io/service-notices/Memento-deinde-loquere/">&lt;p&gt;&lt;em&gt;Memento, deinde loquere&lt;/em&gt; is the latin equivalent of “Think first, then speak”.&lt;/p&gt;

&lt;p&gt;This post is meant to bring some clarity on my approach to LLMs and the way this technology is used within all my websites.&lt;/p&gt;

&lt;p&gt;I am a non-native English speaker and this shows in my communications. My sentences tend to be quite long, with several “relative clauses” or “subordinate clauses” (this latter aspect depends on the specific region I come from. For those who do not know - and I expect them to be the majority of my readers, a relative clause is one introduced by &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;that&lt;/span&gt;&lt;/code&gt;, &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;which&lt;/span&gt;&lt;/code&gt; and similar particles). Don’t misunderstand me: being Italian, I have a very good English - at least this is what native speakers say. How do I rate myself? I know that I am not at the “It’s a me, it’s a Mario”/”the cat is on the table” level - but I also appreciate the fact that the &lt;strong&gt;real English&lt;/strong&gt; is something else.&lt;/p&gt;

&lt;p&gt;With that being said: I use LLMs only to polish my English. Ah, yeah, and also to flatten somehow my tone - because I am the guy who loves to send people where they belong. Content is mine, nevertheless.&lt;/p&gt;

&lt;p&gt;It’s just a matter of respect for the readers - I don’t want to force anyone to waste their time rebuilding my sentences. &lt;em&gt;Sic et simpliciter&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;My personal opinion on LLM? It’s a great technology. It could be even better if access to it were regulated differently. However, this would be a long discussion — too long for this blog.&lt;/p&gt;

&lt;p&gt;And this brings us to another point - why I wrote this post.&lt;/p&gt;

&lt;p&gt;A few days ago I published a post on this blog, and I cross-posted it on Reddit and Mastodon. Usual way to harvest a few readers. It’s a great post, in my opinion: it is conceptually very dense, and this reverberates through its length (7k words). On &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;linuxadmin&lt;/span&gt;&lt;/code&gt; several people attacked me with accusations like &lt;em&gt;“you used LLM”&lt;/em&gt;, &lt;em&gt;“LLM Slop”&lt;/em&gt;, &lt;em&gt;“LLM Hallucination”&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Then I went through their profiles: very high karma subdivided as:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;high comment karma&lt;/li&gt;
  &lt;li&gt;low post karma
I scanned their posts and comments and found the posts quite boring (really, nothing to learn there); while a lot of comments were like:&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;bash&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;or&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;postgres&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;or even - and this is the pinnacle of their reasoning&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;💩&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You can have fun with math and realise that the ratio of comment karma to post karma could be a good metric to detect trolls. In that case, be my guest - find the right parameters yourself. A trivial formula could be:&lt;/p&gt;

\[TI = \frac{K_c}{K_p + 1}\]

&lt;p&gt;$TI$ troll index; $K_c$ Karma comments; $K_p$ Karma post.&lt;/p&gt;

&lt;p&gt;If $TI&amp;gt;100$ and comments are one-liners or emojis, here you go: a troll in sight!&lt;/p&gt;

&lt;p&gt;Dealing with trolls is a waste of time. Nevertheless, this post is also for them - I’m not sure they’ll understand, but at least no one can question my good will.&lt;/p&gt;

&lt;p&gt;I am not here to teach people how to live, and I really don’t care what people do for a living. I am not here to teach people the difference between constructive criticism and some random rant, either&lt;/p&gt;

&lt;p&gt;One thing is for sure: I profoundly pity people who identify with a given technology, making it a religion (and well, many Linux fanboys don’t know how to do any better), or worse: an extension of their persona.&lt;/p&gt;

&lt;p&gt;The bottom line is extremely simple.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Dear Troll - you’re surely entitled to your opinion. I am entitled not to give a fuck about it. But please, don’t show what a thermal waste you are in public - that’s revolting, and you’re embarrassing yourself. Your miserable existence is not our fault.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I won’t be posting to r/linuxadmin anymore. It’s a toxic environment, pretty much like Facebook. &lt;em&gt;Ad futuram rei memoriam&lt;/em&gt;…&lt;/p&gt;</content><author><name>Gabriel Biondo</name></author><category term="service-notices" /><summary type="html">Why I use LLMs to polish my tone. Think first, then speak.</summary></entry><entry><title type="html">Filesystem Wars: Why Your Choice of Storage is Actually a Security Move</title><link href="https://bytearchitect.io/macos-security/theory/Filesystem-Wars-Why-Your-Choice-of-Storage-is-Actually-a-Security-Move/" rel="alternate" type="text/html" title="Filesystem Wars: Why Your Choice of Storage is Actually a Security Move" /><published>2026-04-20T00:00:00+02:00</published><updated>2026-04-20T00:00:00+02:00</updated><id>https://bytearchitect.io/macos-security/theory/Filesystem-Wars-Why-Your-Choice-of-Storage-is-Actually-a-Security-Move</id><content type="html" xml:base="https://bytearchitect.io/macos-security/theory/Filesystem-Wars-Why-Your-Choice-of-Storage-is-Actually-a-Security-Move/">&lt;p&gt;&lt;em&gt;While this post isn’t part of my ‘Canonical Series,’ it serves to lay the groundwork for an upcoming instalment in my ‘Apple Defenses’ series.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;We’ll be exploring file systems from a high-level perspective, skipping disk geometry and low-level parameters in order to focus on the core concepts behind the most widely used systems, their overall design, and their respective strengths and weaknesses.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;enter-the-arena&quot;&gt;Enter the arena&lt;/h2&gt;

&lt;p&gt;We will be focusing on the following filesystems.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Filesystem&lt;/th&gt;
      &lt;th&gt;Role&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;FFS / FFS2 (Fast File System)&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;The noble ancestor&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;BFS (Be File System)&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;The forgotten innovator&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;NTFS (New Technology File System)&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;An industrial standard&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;ext4 (Fourth Extended Filesystem)&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Linux’s reliable workhorse&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;ZFS (Zettabyte File System)&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;The champion of data integrity&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;APFS (Apple File System)&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;Our&lt;/em&gt; main character&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;in-memoriam---reiserfs&quot;&gt;In memoriam - ReiserFS&lt;/h3&gt;
&lt;p&gt;I used this one extensively back in my “Linux fanboy era”—a phase that, fortunately, is long behind me. The community has essentially deprecated it, and for reasons that have nothing to do with code.&lt;/p&gt;

&lt;p&gt;Among sysadmins, there’s a grim, recurring mantra: &lt;em&gt;“ReiserFS is the only filesystem capable of making files disappear without a trace… just like its author did with his wife.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sic transit gloria mundi — Ford Transit Gloria Guida.&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;the-fundamental-problem-crash-consistency&quot;&gt;THE FUNDAMENTAL PROBLEM: Crash Consistency&lt;/h3&gt;
&lt;p&gt;Filesystem operations are &lt;strong&gt;not atomic&lt;/strong&gt; at the hardware level. Creating a file involves multiple disk writes: allocate blocks, write data, create inode, update directory entry.&lt;/p&gt;

&lt;p&gt;If the system crashes mid-operation, you can end up with orphaned blocks (space leak), dangling pointers (corruption), or directory entries pointing to garbage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Every filesystem must solve this.&lt;/strong&gt; Two classic solutions:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Journaling&lt;/strong&gt; (NTFS, ext3/ext4): Write-ahead logging. Write intended changes to a journal first, then apply them to the filesystem. If a crash occurs, replay the journal. The cost: metadata is written twice (journal + final location).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Soft updates&lt;/strong&gt; (FFS/FreeBSD): Track metadata dependencies and enforce write ordering. Never write a pointer before the thing it points to exists on disk. If a crash occurs, the filesystem is always consistent; worst case is a space leak, which background &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;fsck&lt;/span&gt;&lt;/code&gt; reclaims. The cost: none (single writes).&lt;/p&gt;

&lt;p&gt;We will see both approaches in action below.&lt;/p&gt;
&lt;h2 id=&quot;ffsffs2&quot;&gt;FFS/FFS2&lt;/h2&gt;
&lt;p&gt;UFS, the old Unix filesystem, kept metadata and data far too far apart. Inodes lived near the beginning of the disk, while data blocks were pushed toward the end. The result was obvious: read inode, seek; read data, seek again; repeat. On spinning rust, this was performance hell.&lt;/p&gt;

&lt;p&gt;FFS solved that problem with one of the most important ideas in filesystem history: &lt;strong&gt;cylinder groups&lt;/strong&gt;. Instead of treating the disk as one monolithic space, it split it into smaller regions and gave each of them its own local inode table, local data blocks, and a backup copy of the superblock. In plain English: keep related things physically close. Put files near their metadata, keep related files near each other, and replicate critical metadata so recovery remains possible if one copy gets corrupted.&lt;/p&gt;

&lt;p&gt;That alone was a huge step forward. It reduced seek times dramatically, improved locality, and established a pattern that influenced basically every serious Unix filesystem that came after it. ext4, ZFS, APFS: different worlds, different philosophies, but all of them live downstream of ideas that FFS helped define back in 1984.&lt;/p&gt;

&lt;p&gt;So, if I had to compress its philosophy into one sentence, it would be this:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Simple, reliable, UNIX-native fundamentals — no feature bloat, just solid engineering.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;key-architecture&quot;&gt;Key architecture&lt;/h3&gt;
&lt;p&gt;The heart of FFS is still &lt;strong&gt;cylinder groups&lt;/strong&gt;: metadata and data are kept close to each other, related files are often placed in the same region, and superblock redundancy gives the filesystem a chance to recover even when part of the disk goes bad.&lt;/p&gt;

&lt;p&gt;Where things get particularly elegant is with &lt;strong&gt;soft updates&lt;/strong&gt;, a major FreeBSD innovation. Instead of journaling every metadata operation, FFS tracks metadata dependencies and enforces the only rule that really matters: &lt;strong&gt;never write a pointer before the thing it points to exists on disk&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When creating a file, the dependency chain looks like this:&lt;/p&gt;

&lt;p&gt;Creating a file is not one operation but a dependency chain: first the blocks must exist and be marked as allocated; then the inode may point to them; only after that may the directory entry link the filename to that inode.&lt;/p&gt;

&lt;p&gt;This ordering matters because it determines what happens if the system crashes halfway through the operation.&lt;/p&gt;

&lt;p&gt;If the crash occurs &lt;strong&gt;after blocks have been allocated, but before anything points to them&lt;/strong&gt;, the result is simple: some blocks are marked as used, but no inode references them. That is a space leak, not corruption, and &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;fsck&lt;/span&gt;&lt;/code&gt; can reclaim the leaked space later.&lt;/p&gt;

&lt;p&gt;If the crash occurs &lt;strong&gt;after blocks have been allocated and data has been written&lt;/strong&gt;, but before the inode exists, the situation is still the same in practical terms: leaked space, no structural corruption.&lt;/p&gt;

&lt;p&gt;If the crash occurs &lt;strong&gt;after the inode has been created&lt;/strong&gt;, then the inode points to valid data blocks, but no directory entry references it yet. In other words, the file exists, but it is orphaned. &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;fsck&lt;/span&gt;&lt;/code&gt; can recover it by linking it into &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;lost&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;found&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;/code&gt;, or remove it if needed.&lt;/p&gt;

&lt;p&gt;If the crash occurs &lt;strong&gt;after the directory entry has been updated&lt;/strong&gt;, then the operation is complete and the file is fully visible. No recovery is needed.&lt;/p&gt;

&lt;p&gt;That is the beauty of soft updates: no journal, no double writes, no need to replay intent logs just to get back to a sane state. The filesystem remains consistent because write ordering prevents invalid references from ever reaching disk.&lt;/p&gt;

&lt;p&gt;The tradeoff is equally clear: recovery is not as immediate as with journaling. You may still need &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;fsck&lt;/span&gt;&lt;/code&gt; in the background to reclaim leaked space or clean up orphaned objects. But the key point is that the filesystem does not collapse into corruption.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UFS2&lt;/strong&gt; extends this design without betraying it: 64-bit support, larger filesystems, larger files, extended attributes, POSIX.1e ACLs, and larger inodes. Evolution, not reinvention.&lt;/p&gt;

&lt;p&gt;Then there are the &lt;strong&gt;flags&lt;/strong&gt;, which remain one of the nicest BSD touches: &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;chflags&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;immutable&lt;/span&gt;&lt;/code&gt; can prevent modification even by root, while &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;chflags&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sappnd&lt;/span&gt;&lt;/code&gt; gives you append-only semantics that are still genuinely useful for logs and operational hardening. Nothing magical, nothing cryptographic, just simple kernel-enforced constraints that still matter.&lt;/p&gt;

&lt;h3 id=&quot;security-model&quot;&gt;Security model&lt;/h3&gt;
&lt;p&gt;The security model is classic BSD pragmatism.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;POSIX permissions&lt;/strong&gt; provide the standard user/group/world (&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;rwx&lt;/span&gt;&lt;/code&gt;) access model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ACLs&lt;/strong&gt;, in UFS2, add finer-grained control through POSIX.1e semantics.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Flags&lt;/strong&gt; such as immutable, append-only, and nodump go beyond plain POSIX permissions and give the administrator a few extra levers that are small, simple, and surprisingly effective.&lt;/p&gt;

&lt;p&gt;What FFS/UFS2 does &lt;strong&gt;not&lt;/strong&gt; provide is native encryption. On BSD systems, encryption is handled below the filesystem layer: on FreeBSD, that typically means &lt;strong&gt;GELI&lt;/strong&gt; or, historically, &lt;strong&gt;GBDE&lt;/strong&gt;.&lt;/p&gt;

&lt;h3 id=&quot;operational-assumptions&quot;&gt;Operational assumptions&lt;/h3&gt;
&lt;p&gt;FFS/UFS2 was designed for &lt;strong&gt;BSD systems&lt;/strong&gt;: FreeBSD, OpenBSD, NetBSD.&lt;/p&gt;

&lt;p&gt;Its assumptions are old-school and very clear: reliability matters more than flashy features, and consistency matters more than novelty. Soft updates give it crash safety without the overhead of full journaling, which is exactly the kind of engineering tradeoff BSD people tend to appreciate.&lt;/p&gt;

&lt;p&gt;Portability, on the other hand, is not really its game. Outside the BSD world, UFS support exists mostly as a compatibility story, not as something people seriously build modern systems around.&lt;/p&gt;

&lt;h3 id=&quot;weaknesses&quot;&gt;Weaknesses&lt;/h3&gt;
&lt;p&gt;Its weaknesses are exactly what you would expect from a design with roots in 1984.&lt;/p&gt;

&lt;p&gt;There is &lt;strong&gt;no native encryption&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;There is &lt;strong&gt;no CoW model&lt;/strong&gt;, so fragmentation remains a fact of life, even if the layout is smarter than old UFS.&lt;/p&gt;

&lt;p&gt;Snapshots exist only as &lt;strong&gt;bolt-ons&lt;/strong&gt; in specific BSD environments; they are not a native, first-class mechanism in the ZFS or APFS sense.&lt;/p&gt;

&lt;p&gt;And, of course, portability is limited: this is fundamentally a BSD filesystem, not a cross-platform citizen.&lt;/p&gt;

&lt;h3 id=&quot;overall-commentary&quot;&gt;Overall commentary&lt;/h3&gt;
&lt;p&gt;FFS is 42 years old. It predates Linux. It predates ext2. And yet, it still matters, because it defined what a serious Unix filesystem was supposed to look like.&lt;/p&gt;

&lt;p&gt;Cylinder groups, soft updates, file flags: these are not random features. They are design patterns. Later filesystems either inherited them, adapted them, or reacted against them.&lt;/p&gt;

&lt;p&gt;Is it cutting-edge? Obviously not. Does it offer ZFS-level integrity guarantees or APFS-style OS integration? No.&lt;/p&gt;

&lt;p&gt;But it is still trusted by FreeBSD and OpenBSD for core system roles, and that tells you a lot. FFS did not win by being flashy. It won by being disciplined.&lt;/p&gt;

&lt;p&gt;It taught filesystems how to be faster through locality. It taught them how to stay consistent without drowning in complexity. And it did that without turning itself into a monster.&lt;/p&gt;

&lt;p&gt;Respect the ancestor.&lt;/p&gt;

&lt;h2 id=&quot;zfs-zettabyte-file-system--sun-microsystems--openzfs&quot;&gt;ZFS (Zettabyte File System) — Sun Microsystems / OpenZFS&lt;/h2&gt;
&lt;p&gt;We can formalise the philosophy of this filesystem as:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;The filesystem IS the volume manager IS the RAID controller.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;key-architecture-1&quot;&gt;Key architecture&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Pooled Storage&lt;/strong&gt;: In ZFS, partitions are a thing of the past. You create a storage pool (&lt;strong&gt;zpool&lt;/strong&gt;) and then “carve” datasets or volumes out of it as needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Copy-on-Write&lt;/strong&gt; (CoW): This is the core engine. The file system never overwrites data in place; it writes new blocks and updates pointers atomically, ensuring consistency.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;End-to-End Checksums&lt;/strong&gt;: Every block is checksummed, and that checksum is stored in the metadata that references the block rather than inside the block itself. Every read operation can therefore be verified independently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Snapshots &amp;amp; Clones&lt;/strong&gt;: Thanks to CoW, snapshots are nearly “free” (low overhead). You can keep them indefinitely, and cloning is as simple as creating a writable branch from a snapshot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Self-Healing&lt;/strong&gt;: If configured with RAID-Z or mirrors, ZFS automatically detects bit rot via checksums and repairs the corrupted data using a healthy copy.&lt;/p&gt;

&lt;h3 id=&quot;security-model-1&quot;&gt;Security model&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Data Integrity&lt;/strong&gt;: This includes protection against silent corruption, integrity verification through end-to-end checksums, and near-instant recovery through snapshots and rollback.&lt;/p&gt;

&lt;p&gt;In more detail, ZFS stores block checksums in the metadata that points to those blocks, creating a hierarchical chain of verification across the tree. This is not a substitute for a formal digital signature, but it provides a robust mechanism for detecting corruption and certain forms of unauthorized modification.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Encryption&lt;/strong&gt;: Added later in the development cycle (notably in OpenZFS), &lt;em&gt;encryption was not part of the original Sun Microsystems design&lt;/em&gt;. It operates as &lt;strong&gt;block-level encryption&lt;/strong&gt; with external key management, allowing for encrypted datasets that can be replicated even without the host knowing the key (blind replication).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Access Control&lt;/strong&gt;: ZFS provides no granular access control at the filesystem layer itself; it relies entirely on standard &lt;strong&gt;POSIX permissions&lt;/strong&gt; (or ACLs depending on the OS implementation).&lt;/p&gt;

&lt;h3 id=&quot;operational-assumptions-1&quot;&gt;Operational assumptions&lt;/h3&gt;
&lt;p&gt;Designed for servers/NAS with large storage pools, ECC RAM (recommended), and multiple disks.&lt;br /&gt;
Expects you to care about data integrity over decades.&lt;br /&gt;
Not plug-and-play: you do not just format a random disk and mount it elsewhere. Pool metadata is complex.&lt;/p&gt;

&lt;h3 id=&quot;weaknesses-1&quot;&gt;Weaknesses&lt;/h3&gt;
&lt;p&gt;RAM-hungry (ARC cache).&lt;br /&gt;
Linux support = third-party (licensing issues with kernel).&lt;br /&gt;
Overkill for single-disk laptops.&lt;/p&gt;

&lt;h3 id=&quot;overall-commentary-1&quot;&gt;Overall commentary&lt;/h3&gt;
&lt;p&gt;It’s my default choice on FreeBSD. I am not a FOSS crusader, and I couldn’t be arsed with all that licensing rubbish; therefore in my case the pros outweigh the cons. Whilst I think it’s overkill for laptops, my FreeBSD laptop still uses it :)&lt;/p&gt;

&lt;h2 id=&quot;bfs-be-file-system--beos--haiku&quot;&gt;BFS (Be File System) — BeOS / Haiku&lt;/h2&gt;
&lt;p&gt;The philosophy of this file system was simple yet revolutionary:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;Metadata isn’t just storage overhead. It’s queryable data.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let’s address the elephant in the room: when I first saw BeOS back in 1997, I immediately fell in love with it. I still miss it—not in a misty-eyed, nostalgic way, but in a &lt;em&gt;“they solved problems in 1997 that everyone else ignored for 20 years”&lt;/em&gt; kind of way.&lt;/p&gt;

&lt;p&gt;BFS treated &lt;strong&gt;metadata as first-class citizens&lt;/strong&gt;. You didn’t just &lt;em&gt;grep&lt;/em&gt; filenames or rely on fragile directory hierarchies. You &lt;strong&gt;queried the file system like a database&lt;/strong&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;“Show me all MP3s where Artist contains ‘Sabbath’ and Bitrate &amp;gt; 256kbps.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The file system answered instantly. No heavy indexing daemons, no Spotlight-style background crawlers eating your CPU. &lt;strong&gt;The file system WAS the index.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;key-architecture-2&quot;&gt;Key architecture&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Journaling&lt;/strong&gt;: Metadata journaling for crash recovery (relatively novel for 1997).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Attributes&lt;/strong&gt;: Arbitrary key-value metadata on files (not just POSIX extended attributes: BFS could actually query them).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live Queries&lt;/strong&gt;: Real-time FS queries updated automatically as files changed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;B+ Trees&lt;/strong&gt;: Core structures relied on B+ trees, which helped BFS scale efficiently and suited the media-heavy workloads BeOS cared about.&lt;/p&gt;

&lt;p&gt;Here some further notes deserve their own space:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Live queries (the magic touch)&lt;/strong&gt;: If you had a folder (read - &lt;em&gt;a saved query&lt;/em&gt;) that showed &lt;em&gt;all incoming mails from James&lt;/em&gt; and a new mail from James came in, it would appear in the folder &lt;em&gt;automatically&lt;/em&gt;. No refresh, no lag. The “dynamic folder” concept done well. 30 years ahead of its time.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;B+ Trees&lt;/strong&gt;: interestingly, BFS used B+ trees &lt;em&gt;for attributes&lt;/em&gt;, not only for files. That’s why queries were almost instantaneous: the system was not scanning a disk - it was an efficient visit on a balanced, pre-indexed tree.&lt;/li&gt;
  &lt;li&gt;A note: &lt;strong&gt;relation with APFS&lt;/strong&gt; - Dominic Giampaolo, the author of BFS, joined Apple after Be closed their doors. He’s been one of Spotlight’s lead engineers and worked extensively on APFS.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;security-model-2&quot;&gt;Security Model&lt;/h3&gt;
&lt;p&gt;Sadly, the security model of BFS was &lt;strong&gt;minimal&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;POSIX permissions (user/group/world), nothing more.&lt;/li&gt;
  &lt;li&gt;No encryption.&lt;/li&gt;
  &lt;li&gt;No ACLs.&lt;/li&gt;
  &lt;li&gt;No advanced security features.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is understandable: BeOS was designed for &lt;strong&gt;multimedia performance&lt;/strong&gt;, not enterprise security. And we are talking about the late 1990s, when security was rarely front and centre.&lt;/p&gt;

&lt;h3 id=&quot;operational-assumptions-2&quot;&gt;Operational Assumptions&lt;/h3&gt;
&lt;p&gt;BFS was designed for &lt;strong&gt;BeOS/Haiku&lt;/strong&gt; (desktop OS, multimedia-focused), and optimized for &lt;strong&gt;low-latency media access&lt;/strong&gt; (video editing, audio production).&lt;/p&gt;

&lt;p&gt;Journalists at trade shows would boot BeOS on a BeBox and play eight simultaneous video streams. Jaws dropped.&lt;/p&gt;

&lt;h3 id=&quot;weaknesses-2&quot;&gt;Weaknesses&lt;/h3&gt;
&lt;p&gt;Let’s be clear: this should be seen as a research-ish filesystem. If you approach it from that angle and focus on its strengths, it becomes a great source of ideas.&lt;/p&gt;

&lt;p&gt;The truth of the matter is that BeOS died in 2001. Palm bought the corpse for a while. Haiku keeps BFS alive, but it’s a hobbyist OS.&lt;/p&gt;

&lt;p&gt;The lack of modern security and portability already makes this filesystem an interesting case study, but not a viable alternative.&lt;/p&gt;

&lt;h3 id=&quot;overall-commentary-2&quot;&gt;Overall Commentary&lt;/h3&gt;
&lt;p&gt;Be, Inc. had it right: &lt;strong&gt;filesystems aren’t just block allocators; they’re application platforms&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;BFS proved that metadata queries could be fast, intuitive, and &lt;strong&gt;part of the user experience&lt;/strong&gt; rather than bolted-on search tools.&lt;/p&gt;

&lt;p&gt;Apple didn’t copy BFS (they barely acknowledged it existed), but they learned the same lesson 20 years later: &lt;strong&gt;the filesystem is part of the OS identity, not just infrastructure.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I still miss BeOS. But APFS is the closest thing to a spiritual successor—not in features, but in &lt;strong&gt;philosophy&lt;/strong&gt;.&lt;/p&gt;

&lt;h2 id=&quot;ntfs&quot;&gt;NTFS&lt;/h2&gt;
&lt;p&gt;I am not a Windows guy, but NTFS still deserves its tribute. It has been carrying most of the personal computing world for more than thirty years. It predates the web browser. It was designed when 1 GB hard drives were cutting-edge and Windows NT still ran on RISC workstations. And yet, in 2026, it is still the default filesystem on ordinary Windows systems. Microsoft tried to push ReFS as the future, but NTFS is still what normal Windows machines actually run. Some technologies age gracefully. NTFS just refuses to retire.&lt;/p&gt;

&lt;p&gt;Its philosophy is something like:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Enterprise filesystem built for IT departments that need ACLs, audit trails, and endless backward compatibility.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Or, less politely:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;What happens when you design a filesystem to satisfy legal compliance and still run software from 1993.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Whatever. Let’s pay respect to NTFS anyway.&lt;/p&gt;

&lt;h3 id=&quot;key-architecture-3&quot;&gt;Key Architecture&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;MFT (Master File Table)&lt;/strong&gt;: Everything is represented as a file, including metadata. The MFT is effectively a giant database of file records.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Journaling&lt;/strong&gt;: Logs metadata changes for crash recovery.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not CoW&lt;/strong&gt;: NTFS overwrites in place; the journal records intent and metadata updates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alternate Data Streams&lt;/strong&gt;: Files can contain multiple streams beyond the main unnamed one. Legitimate feature, excellent hiding place, and therefore catnip for malware.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ACLs&lt;/strong&gt;: Fine-grained permissions with allow/deny entries, inheritance, and auditing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;EFS / BitLocker&lt;/strong&gt;: Per-file encryption with EFS, full-volume encryption with BitLocker.&lt;/p&gt;

&lt;h3 id=&quot;security-model-3&quot;&gt;Security Model&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;ACLs&lt;/strong&gt;: Powerful, flexible, and borderline Byzantine. Deny rules, inheritance chains, audit entries, the whole cathedral.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;EFS&lt;/strong&gt;: Per-file encryption tied to user certificates. Functional, but awkward. Recovery agents exist, key management is very Windows, and it can become painful when profiles or certificates go sideways.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BitLocker&lt;/strong&gt;: Full-volume encryption, usually TPM-backed. Separate from NTFS in architectural terms, but it is the encryption layer that actually won on Windows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;USN Journal&lt;/strong&gt;: Persistent change log useful for forensics, backup, and monitoring.&lt;/p&gt;

&lt;h3 id=&quot;operational-assumptions-3&quot;&gt;Operational Assumptions&lt;/h3&gt;
&lt;p&gt;NTFS is built for Windows desktops and servers.&lt;/p&gt;

&lt;p&gt;It expects NTFS-aware tooling: &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;chkdsk&lt;/span&gt;&lt;/code&gt;, defrag, the Windows permissions model, and the usual Microsoft admin machinery.&lt;/p&gt;

&lt;p&gt;It is only partially portable. Linux can handle it with external drivers such as &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;ntfs&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;g&lt;/span&gt;&lt;/code&gt;; macOS traditionally exposes it as read-only unless you go out of your way.&lt;/p&gt;

&lt;h3 id=&quot;weaknesses-3&quot;&gt;Weaknesses&lt;/h3&gt;
&lt;p&gt;The expected ones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fragmentation&lt;/strong&gt;: No CoW means files can scatter over time. Defragmentation mitigates it; SSDs make it less visible, but the design is still old-school.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No native snapshots&lt;/strong&gt;: Volume Shadow Copy is an OS service, not a filesystem-native mechanism in the ZFS/APFS sense.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;EFS&lt;/strong&gt;: Still there, still usable, but clearly overshadowed by BitLocker and much more fragile operationally.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Proprietary&lt;/strong&gt;: Microsoft has published a fair amount, but the ecosystem still carries enough opacity to keep reverse engineers employed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Complexity overhead&lt;/strong&gt;: ACLs, ADS, reparse points, legacy semantics. More features, more weirdness, more attack surface.&lt;/p&gt;

&lt;h3 id=&quot;overall-commentary-3&quot;&gt;Overall Commentary&lt;/h3&gt;
&lt;p&gt;NTFS is the filesystem nobody loves and everybody uses. It is over-engineered for edge cases most users will never hit, yet somehow still full of compromises.&lt;/p&gt;

&lt;p&gt;It fragments like it came from another century. EFS exists, but BitLocker won the encryption war long ago.&lt;/p&gt;

&lt;p&gt;But here is the thing: &lt;strong&gt;it works&lt;/strong&gt;. Billions of Windows machines run NTFS without catastrophic drama. It is boring, legacy-laden, and inelegant, but reliable enough for enterprise reality. I would not choose it if I had a real choice.&lt;/p&gt;

&lt;p&gt;But if you live in Windows-land, it is not the worst prison.&lt;/p&gt;

&lt;h2 id=&quot;ext4&quot;&gt;Ext4&lt;/h2&gt;
&lt;p&gt;I discuss ext4 together with NTFS because, to me, they feel oddly similar. I know many Linux fanboys will send ninjas to my house to kill me, and I have probably already received three &lt;em&gt;fatwas&lt;/em&gt; from the Holy Linux Inquisition, led by Mr. Stallman and the Seven Dwarves, for the previous sentence. I don’t really care.&lt;/p&gt;

&lt;p&gt;ext4 is Linux’s default answer to “what filesystem should I use?” It is not exciting. It does not chase paradigm shifts. It just &lt;strong&gt;works&lt;/strong&gt;, predictably, across millions of deployments.&lt;/p&gt;

&lt;p&gt;As the fourth iteration of the Extended Filesystem lineage (ext2, ext3, ext4), it represents evolutionary refinement rather than revolutionary redesign. Think of it as the Toyota Camry of filesystems: boring, reliable, and nobody ever regrets choosing it.&lt;/p&gt;

&lt;p&gt;It shipped in 2008 with kernel 2.6.28, which makes it 18 years old in 2026. Not ancient like FFS, not cutting-edge like APFS, just… dependable.&lt;/p&gt;

&lt;p&gt;So, to honour the structure of this post, let’s get to the philosophy. Let’s say ext4 is:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The iterative workhorse: backward-compatible evolution focused on reliability over revolution.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Or, better still:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;What happens when you take a solid foundation (ext2) and incrementally fix its problems for 20 years without breaking anything.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;key-architecture-4&quot;&gt;Key architecture&lt;/h3&gt;
&lt;p&gt;ext2 and ext3 relied on &lt;strong&gt;indirect block pointers&lt;/strong&gt;. ext4, instead, moved to &lt;strong&gt;extents&lt;/strong&gt;: contiguous ranges of blocks described as something like &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;start_block&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;length&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;/code&gt;. This brings several advantages: less metadata overhead, better large-file performance, and reduced fragmentation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Journaling&lt;/strong&gt; is inherited from ext3. ext4 still has no native CoW: it overwrites in place, while the journal records metadata changes and ordering semantics. It offers three journaling modes:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;journal&lt;/span&gt;&lt;/code&gt; (safest, slowest — journals both metadata and data)&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ordered&lt;/span&gt;&lt;/code&gt; (default — journals metadata, but forces data blocks out before the related metadata is committed)&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;writeback&lt;/span&gt;&lt;/code&gt; (fastest, least safe — journals metadata only, with no ordering guarantees for data writes)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Still on CoW: the lack of native Copy-on-Write means no cheap clones, no native snapshots, and no automatic deduplication.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Delayed allocation&lt;/strong&gt;: block allocation is postponed until writeback. Dirty data accumulates in memory, allowing the filesystem to batch writes and choose optimal block placement before committing to disk. The upside is better block placement, less fragmentation, and often fewer writes. The downside is that a crash can still lose recently written data before commit. Journaling helps with consistency, but it does not magically turn ext4 into CoW. Journaling has overhead — every metadata change is written twice (once to journal, once to final location). This is the price of crash safety. Note also that &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;journal&lt;/span&gt;&lt;/code&gt; disables delayed allocation.&lt;/p&gt;

&lt;p&gt;ext4 can &lt;strong&gt;grow&lt;/strong&gt; a filesystem while mounted via &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;resize2fs&lt;/span&gt;&lt;/code&gt;, and filesystems can also be shrunk while unmounted. There is also &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;e4defrag&lt;/span&gt;&lt;/code&gt; for defragmentation — rarely needed, but it exists.&lt;/p&gt;

&lt;p&gt;We mentioned snapshots. ext4 has no native snapshot facility, unlike ZFS or APFS. LVM can provide snapshots, but that is OS-level plumbing, not a filesystem-native feature.&lt;/p&gt;

&lt;h2 id=&quot;security-model-4&quot;&gt;Security model&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;POSIX permissions + ACLs&lt;/strong&gt;: standard Linux access control with user/group/world (&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;rwx&lt;/span&gt;&lt;/code&gt;) permissions, plus optional ACLs via &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;setfacl&lt;/span&gt;&lt;/code&gt;/&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;getfacl&lt;/span&gt;&lt;/code&gt; when finer-grained control is needed. Solid, unsurprising, and good enough for most Unix-like workloads.&lt;/p&gt;

&lt;p&gt;The filesystem also supports &lt;strong&gt;native encryption&lt;/strong&gt; via &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;fscrypt&lt;/span&gt;&lt;/code&gt;, introduced for ext4 in the Linux 4.1 timeframe. This is directory-tree-based encryption rather than full-disk encryption: you apply a policy to a directory, and the files and subdirectories under it are protected accordingly. Keys live in the kernel keyring, not on disk. A typical use case is protecting user data at rest, for example under &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;home&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Its obvious limitation is that this is not the same thing as full-volume encryption: some filesystem metadata remains visible (directory structure, file count), and without the key, filenames appear as base64-encoded ciphertext rather than readable names.&lt;/p&gt;

&lt;p&gt;From a security standpoint, ext4 also offers two simple but useful features: immutable and append-only flags:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;chattr&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;/code&gt; (immutable — cannot modify, delete, or rename)&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;chattr&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;/code&gt; (append-only — can add data, cannot modify existing content)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These provide basic tamper resistance. Nothing cryptographic, just kernel-enforced constraints.&lt;/p&gt;

&lt;h3 id=&quot;operational-assumptions-4&quot;&gt;Operational Assumptions&lt;/h3&gt;
&lt;p&gt;ext4 is designed for &lt;strong&gt;Linux servers and desktops&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It is still the default choice in many Linux environments, and very much the expected baseline in the Debian/Ubuntu world. Fedora Workstation moved to Btrfs long ago, and RHEL prefers XFS, but ext4 remains the boring, familiar standard Linux admins know by heart.&lt;/p&gt;

&lt;p&gt;Standard Linux tooling (&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;e2fsck&lt;/span&gt;&lt;/code&gt;, &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;tune2fs&lt;/span&gt;&lt;/code&gt;, &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;resize2fs&lt;/span&gt;&lt;/code&gt;, &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;e4defrag&lt;/span&gt;&lt;/code&gt;) is part of the deal.&lt;/p&gt;

&lt;h4 id=&quot;portability&quot;&gt;Portability&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Linux-native&lt;/strong&gt; (obviously)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Windows&lt;/strong&gt;: third-party drivers and tools exist&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;macOS&lt;/strong&gt;: readable via third-party tools and FUSE-based solutions&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Not plug-and-play&lt;/strong&gt; outside Linux&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;other-weaknesses&quot;&gt;Other weaknesses&lt;/h3&gt;
&lt;p&gt;We already covered the CoW-related trade-offs and the fragmentation angle, even if ext4 mitigates both reasonably well.&lt;/p&gt;

&lt;p&gt;Another thing I personally miss: ext4 journals &lt;strong&gt;metadata&lt;/strong&gt;, but it does not provide end-to-end integrity checking for file data in the ZFS/APFS sense. Metadata checksums exist, but silent corruption in file contents is still a real possibility.&lt;/p&gt;

&lt;h3 id=&quot;overall-commentary-4&quot;&gt;Overall commentary&lt;/h3&gt;
&lt;p&gt;Remember when I said ext4 and NTFS feel oddly similar? This is the reason.&lt;/p&gt;

&lt;p&gt;They solve the same class of problems in roughly the same conservative way. Both are journal-based. Both overwrite in place. Both can fragment, although ext4 handles that a bit more gracefully through delayed allocation. Encryption arrived late in both worlds: EFS and BitLocker on the NTFS side, &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;fscrypt&lt;/span&gt;&lt;/code&gt; on the ext4 one. And neither gives you native snapshots; if you want those, you go outside the filesystem itself—VSS for Windows, LVM for Linux.&lt;/p&gt;

&lt;p&gt;In other words, both are defaults built for the real world: legacy constraints, predictable behaviour, and minimal drama. Architectural purity was never the point.&lt;/p&gt;

&lt;p&gt;The real difference is cultural. ext4 evolved incrementally and in the open, through the gradual evolution of ext2, ext3, and ext4. NTFS evolved by Microsoft decree, accumulating thirty years of Windows baggage along the way.&lt;/p&gt;

&lt;p&gt;Different ecosystem, different politics, similar result: dependable, boring, and exactly what millions of users need.&lt;/p&gt;

&lt;p&gt;ext4 is what you get when you evolve carefully instead of revolutionising recklessly. It is not sexy. It does not have ZFS’s checksums or APFS’s sealed-volume theatrics. It fragments, although delayed allocation helps. It lacks native snapshots.&lt;/p&gt;

&lt;p&gt;But here is what it does have: years of production hardening, predictable behaviour, and boring reliability. When you run &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;apt&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;install&lt;/span&gt;&lt;/code&gt; on a Debian server, you are not thinking about filesystem philosophy. You are thinking: “will this still work in five years?” ext4’s answer is usually &lt;strong&gt;yes&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I would not choose it for a NAS; ZFS wins there. I would not choose it for a laptop where tight OS integration matters; APFS wins there. But for a Linux server that just needs to serve files reliably, ext4 is still the safe bet.&lt;/p&gt;

&lt;p&gt;Nobody ever got fired for choosing ext4.&lt;/p&gt;

&lt;h2 id=&quot;apfs&quot;&gt;APFS&lt;/h2&gt;
&lt;p&gt;No comparison of modern filesystems would be complete without APFS — the &lt;strong&gt;Apple File System&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The reason I dragged all the others onto the stage first is simple: I wanted a map of the landscape before focusing on Apple’s answer to it. For this blog, what matters is not just how the wider IT world solves storage problems, but how Apple chooses to solve them — and, more importantly, how those choices shape the security model of the platform.&lt;/p&gt;

&lt;p&gt;That is why this long detour was necessary. To understand APFS properly, one must first understand what came before it, what problems other filesystems tried to solve, and what tradeoffs they embraced. Only then does it become possible to appreciate how deeply Apple built parts of its modern system architecture and defensive model around APFS.&lt;/p&gt;

&lt;p&gt;Broadly speaking, traditional filesystems tend to live inside a relatively rigid storage layout. You start with a disk, carve it into partitions, and then create a filesystem inside each partition. Each partition has a fixed size unless you explicitly resize it, and each filesystem tends to consume the space assigned to it. This model works, but it is static, awkward to resize, and not especially elegant once multiple operating systems, recovery partitions, or encrypted containers enter the picture.&lt;/p&gt;

&lt;p&gt;What the operating system actually mounts and uses are volumes or filesystems exposed through that structure. Those volumes are logically separate, and that separation is usually enforced by partition boundaries or by some additional abstraction layered on top.&lt;/p&gt;

&lt;p&gt;APFS takes a very different path.&lt;/p&gt;

&lt;h3 id=&quot;the-container-model&quot;&gt;The Container Model&lt;/h3&gt;
&lt;p&gt;Instead of carving a disk into rigid, fixed-size partitions, APFS introduces the idea of a &lt;strong&gt;container&lt;/strong&gt;. The closest rough analogy is a storage pool: not unlike a ZFS zpool, but designed for Apple’s world of single-disk systems — laptops, desktops, phones, tablets — rather than multi-disk servers.&lt;/p&gt;

&lt;p&gt;A physical disk or SSD can hold one or more APFS containers. Inside each container live one or more &lt;strong&gt;volumes&lt;/strong&gt;. These are not traditional fixed-size partitions. They share the available space dynamically from the container’s common pool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;: a 500 GB SSD might contain a single APFS container with three volumes:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;System&lt;/strong&gt; (the macOS read-only system volume)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Data&lt;/strong&gt; (user data, writable)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Preboot&lt;/strong&gt; (boot support files)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All three volumes draw from the same 500 GB pool. If the System volume needs 15 GB and the Data volume needs 300 GB, that is what they take — without pre-allocation, without rigid boundaries, and without manual resizing. Free space is shared across the container.&lt;/p&gt;

&lt;p&gt;The importance of this approach is obvious if we think back to the old partition-resize mess: ext4, NTFS, moving boundaries around, hoping nothing went wrong, and sometimes losing data in the process. APFS removes that entire class of stupidity. You do not resize volumes in the old sense. They simply consume space from the container until that shared pool is exhausted.&lt;/p&gt;

&lt;p&gt;This is a familiar idea in spirit: ZFS arrived at it in one direction, Apple in another. But APFS applies it with a very specific goal in mind — making modern storage layouts more flexible, less awkward to manage, and better suited to consumer devices.&lt;/p&gt;

&lt;h3 id=&quot;copy-on-write-cow&quot;&gt;Copy-on-Write (CoW)&lt;/h3&gt;
&lt;p&gt;Like ZFS, APFS is a &lt;strong&gt;copy-on-write&lt;/strong&gt; filesystem. That means it never overwrites old data in place. When something changes, APFS writes the new version to fresh blocks, updates the relevant pointers, and only later frees the old blocks.&lt;/p&gt;

&lt;p&gt;This approach changes the entire failure model. If the system crashes halfway through a write, the old data is still there. The new data may be incomplete, but the filesystem never ends up in that ugly half-updated limbo that older in-place filesystems have to clean up afterwards.&lt;/p&gt;

&lt;p&gt;It also means that &lt;strong&gt;snapshots&lt;/strong&gt; are almost trivial. Since the old blocks remain valid until they are explicitly released, taking a snapshot is basically a matter of freezing the current pointer state. No wholesale copying, no long wait, no drama.&lt;/p&gt;

&lt;p&gt;The same logic makes &lt;strong&gt;clones&lt;/strong&gt; cheap. If you duplicate a file or directory, APFS does not immediately duplicate the data blocks. It duplicates the references. The blocks remain shared until one side changes, and only then does CoW step in and split the data.&lt;/p&gt;

&lt;p&gt;Compared to ext4 or NTFS, this is a different world. Those filesystems overwrite in place, so snapshots require extra machinery such as LVM or VSS, and cloning means physically copying data. APFS gets both almost for free because CoW is part of the design, not an add-on.&lt;/p&gt;

&lt;h3 id=&quot;snapshots-and-clones&quot;&gt;Snapshots and Clones&lt;/h3&gt;
&lt;p&gt;In APFS, &lt;strong&gt;snapshots&lt;/strong&gt; are read-only views of the filesystem at a specific point in time. Apple uses them extensively. Time Machine, for example, no longer has to rely on the old HFS+ hard-link gymnastics; APFS gives it native snapshot support.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Clones&lt;/strong&gt; are equally practical. Duplicate a large file and the operation is nearly instantaneous, because APFS is not copying ten gigabytes block by block at that moment. It is just reusing what already exists. Only the modified blocks become new writes later on.&lt;/p&gt;

&lt;p&gt;This turns out to be extremely useful for system updates. macOS can clone the system state, apply an update to that cloned state, verify that everything is coherent, and then switch boot targets atomically. If something goes wrong, the old state is still there.&lt;/p&gt;

&lt;h3 id=&quot;encryption&quot;&gt;Encryption&lt;/h3&gt;
&lt;p&gt;One of the biggest differences between APFS and older filesystems is that encryption was not bolted on later. It was part of the design from the start.&lt;/p&gt;

&lt;p&gt;APFS supports &lt;strong&gt;per-volume encryption&lt;/strong&gt;, which means different volumes inside the same container can be protected independently. On modern Apple systems, key handling is tied to hardware security components such as the Secure Enclave, whether that lives in a T2-equipped Intel Mac or in Apple Silicon.&lt;/p&gt;

&lt;p&gt;Apple supports different encryption setups, from unencrypted volumes to single-key configurations and more granular schemes with per-file keys wrapped by higher-level volume keys, as used by FileVault.&lt;/p&gt;

&lt;p&gt;This is a very different story from ext4 or NTFS. ext4 gained &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;fscrypt&lt;/span&gt;&lt;/code&gt; years after ext4 already existed, and even then the model remained directory-tree-based rather than volume-wide. NTFS had EFS, which always felt awkward and fragile, and in practice BitLocker became the real answer. With APFS, encryption is not the weird optional feature lurking at the edge of the design. It is native, mature, and tightly coupled with the rest of Apple’s platform security.&lt;/p&gt;

&lt;h3 id=&quot;space-efficiency&quot;&gt;Space Efficiency&lt;/h3&gt;
&lt;p&gt;APFS is also much smarter than old-school partition thinking.&lt;/p&gt;

&lt;p&gt;Volumes inside the same container &lt;strong&gt;share free space dynamically&lt;/strong&gt;, so you do not have to pre-allocate rigid sizes and then regret them later. Space goes where it is needed.&lt;/p&gt;

&lt;p&gt;It also supports &lt;strong&gt;sparse files&lt;/strong&gt;, where unallocated ranges do not consume physical storage, and it has some support for &lt;strong&gt;compression&lt;/strong&gt; in Apple-specific contexts. This is not ZFS-style transparent filesystem-wide compression, but it is still part of how Apple squeezes efficiency out of storage for selected content and system resources.&lt;/p&gt;

&lt;h3 id=&quot;crash-consistency&quot;&gt;Crash Consistency&lt;/h3&gt;
&lt;p&gt;Because APFS is built around CoW and atomic pointer updates, it does not need journaling in the old ext4/NTFS sense.&lt;/p&gt;

&lt;p&gt;If a crash happens in the middle of a write, the old version of the data is still intact. The new version may be incomplete, but until the pointers are updated, the filesystem continues to reference the valid state. That is why APFS can usually mount immediately after a crash without the ritual of journal replay or the looming fear of a long &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;fsck&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This is one of the cleanest consequences of the design. ext4 and NTFS need journals because they overwrite in place. FFS with soft updates keeps consistency through ordering rules, but may still need background cleanup. APFS takes a different route: no journal, no replay, no leaked-space cleanup dance. The consistent state is already there.&lt;/p&gt;

&lt;h3 id=&quot;what-apfs-learned&quot;&gt;What APFS Learned&lt;/h3&gt;
&lt;p&gt;This is where all the previous filesystems become useful as background rather than as museum pieces.&lt;/p&gt;

&lt;p&gt;From &lt;strong&gt;BFS&lt;/strong&gt;, APFS seems to inherit a broad philosophical lesson: the filesystem is not just plumbing. It is part of the identity of the operating system. APFS does not expose metadata queries in the BeOS sense, but it absolutely behaves like a core platform component rather than a silent storage backend.&lt;/p&gt;

&lt;p&gt;From &lt;strong&gt;ZFS&lt;/strong&gt;, the inheritance is more concrete: CoW, snapshots, space sharing, and the idea that storage layout should be fluid rather than trapped inside rigid partition boundaries. But Apple adapted those ideas to a very different target. ZFS was built with servers and large storage systems in mind. APFS was built for laptops, phones, tablets, and tightly integrated consumer devices.&lt;/p&gt;

&lt;p&gt;From &lt;strong&gt;FFS&lt;/strong&gt;, APFS inherits a more general discipline: reliability matters, and a filesystem should solve real problems without degenerating into a monster. Apple did not copy BSD’s solutions directly, but the same taste for pragmatic engineering is visible.&lt;/p&gt;

&lt;p&gt;And from &lt;strong&gt;ext4&lt;/strong&gt; and &lt;strong&gt;NTFS&lt;/strong&gt;, APFS mostly learned what to avoid: in-place overwrites, bolted-on encryption, external snapshot machinery, and the general feeling of dragging decades of compatibility baggage into a world that no longer matches the assumptions of spinning disks and static layouts.&lt;/p&gt;

&lt;h3 id=&quot;philosophy&quot;&gt;Philosophy&lt;/h3&gt;
&lt;blockquote&gt;
  &lt;p&gt;Modern storage for modern devices: flash-optimised, encrypted by default, copy-on-write native, and designed as part of the OS security model.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Or, more bluntly:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;What happens when you design a filesystem for 2017 rather than 1997, and assume SSDs, Secure Enclaves, and platform hardening are simply part of the deal.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;operational-assumptions-5&quot;&gt;Operational Assumptions&lt;/h3&gt;
&lt;p&gt;APFS is designed for &lt;strong&gt;Apple devices&lt;/strong&gt;: Macs, iPhones, iPads, Apple Watches.&lt;/p&gt;

&lt;p&gt;It assumes &lt;strong&gt;flash storage first&lt;/strong&gt;. That does not mean it cannot exist on spinning disks, but its design clearly belongs to the SSD era: allocation strategy, cloning behaviour, snapshots, and general expectations all fit modern solid-state storage far better than old mechanical media.&lt;/p&gt;

&lt;p&gt;It also assumes the &lt;strong&gt;Apple ecosystem&lt;/strong&gt; around it: Secure Enclave-backed key handling, tight kernel integration, SIP, Sealed System Volumes, and the rest of the platform security stack.&lt;/p&gt;

&lt;p&gt;And, of course, it assumes you are living in Apple-land. APFS is not a portable filesystem in the cross-platform sense. Outside macOS and iOS-family systems, support is limited and usually partial.&lt;/p&gt;

&lt;h3 id=&quot;weaknesses-4&quot;&gt;Weaknesses&lt;/h3&gt;
&lt;p&gt;APFS is not magic.&lt;/p&gt;

&lt;p&gt;It is &lt;strong&gt;closed-source&lt;/strong&gt;, which means that deep understanding often depends on reverse engineering, experimentation, and reading between Apple’s lines. But we’re not OSS crusaders, so we can deal with this.&lt;/p&gt;

&lt;p&gt;It does &lt;strong&gt;not self-heal&lt;/strong&gt; the way ZFS can when redundancy and checksums are combined. If a block goes bad, APFS can detect problems in some contexts, but it will not magically reconstruct damaged data for you. Backups still matter.&lt;/p&gt;

&lt;p&gt;It is also a &lt;strong&gt;young filesystem&lt;/strong&gt; compared to old warhorses such as FFS, ext4, or ZFS. It shipped in 2017. That is enough time to be real, but not enough time to carry the same historical weight as filesystems that have been beaten up in production for decades.&lt;/p&gt;

&lt;p&gt;And finally, it is &lt;strong&gt;Apple-only&lt;/strong&gt; in any practical sense. That is not a technical flaw so much as a strategic choice, but it still matters.&lt;/p&gt;

&lt;h3 id=&quot;overall-commentary-5&quot;&gt;Overall Commentary&lt;/h3&gt;
&lt;p&gt;APFS is Apple’s answer to a simple question: what would a filesystem look like if you designed it for the hardware and threat model of the modern Apple ecosystem rather than for the compromises of the 1990s?&lt;/p&gt;

&lt;p&gt;It assumes flash storage instead of spinning rust. It assumes encryption is normal, not exotic. It assumes snapshots and clones should be native features, not awkward external tricks. And it assumes the filesystem is part of system hardening, not just a place where bytes happen to live.&lt;/p&gt;

&lt;p&gt;That is why APFS feels different. It does not just store files competently. It participates in how Apple secures the platform.&lt;/p&gt;

&lt;p&gt;Is it perfect? Obviously not. It is closed, young, Apple-specific, and less transparent than many of its predecessors. But it is also purpose-built for what Apple actually needed: a filesystem that works hand in glove with hardware-backed key management, operating system hardening, atomic updates, and modern device workflows.&lt;/p&gt;

&lt;p&gt;In &lt;strong&gt;Part 2&lt;/strong&gt;, we will look at the consequence of that choice: APFS is not just a storage layer. It is one of the building blocks of macOS hardening, through mechanisms such as Sealed System Volumes, firmlinks, and the broader logic of system integrity.&lt;/p&gt;

&lt;p&gt;BFS made the filesystem a &lt;strong&gt;user experience layer&lt;/strong&gt;.&lt;br /&gt;
ZFS made it a &lt;strong&gt;data integrity layer&lt;/strong&gt;.&lt;br /&gt;
APFS makes it a &lt;strong&gt;security boundary&lt;/strong&gt;.&lt;/p&gt;

&lt;h2 id=&quot;the-tables-that-google-loves-sooooo-much-when-indexing-your-website&quot;&gt;The tables that Google loves sooooo much when indexing your website&lt;/h2&gt;

&lt;h3 id=&quot;overall-comparison&quot;&gt;Overall comparison&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Feature&lt;/th&gt;
      &lt;th&gt;ZFS&lt;/th&gt;
      &lt;th&gt;APFS&lt;/th&gt;
      &lt;th&gt;NTFS&lt;/th&gt;
      &lt;th&gt;FFS/FFS2&lt;/th&gt;
      &lt;th&gt;ext4&lt;/th&gt;
      &lt;th&gt;BFS&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Copy-on-Write&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Yes&lt;/td&gt;
      &lt;td&gt;Yes&lt;/td&gt;
      &lt;td&gt;No&lt;/td&gt;
      &lt;td&gt;No&lt;/td&gt;
      &lt;td&gt;No&lt;/td&gt;
      &lt;td&gt;No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Snapshots (native)&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Yes&lt;/td&gt;
      &lt;td&gt;Yes&lt;/td&gt;
      &lt;td&gt;No&lt;/td&gt;
      &lt;td&gt;Bolt-on&lt;/td&gt;
      &lt;td&gt;No&lt;/td&gt;
      &lt;td&gt;No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Encryption (native)&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Later&lt;/td&gt;
      &lt;td&gt;Yes&lt;/td&gt;
      &lt;td&gt;EFS&lt;/td&gt;
      &lt;td&gt;No&lt;/td&gt;
      &lt;td&gt;fscrypt&lt;/td&gt;
      &lt;td&gt;No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Checksums (data)&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Yes&lt;/td&gt;
      &lt;td&gt;Metadata&lt;/td&gt;
      &lt;td&gt;No&lt;/td&gt;
      &lt;td&gt;No&lt;/td&gt;
      &lt;td&gt;No&lt;/td&gt;
      &lt;td&gt;No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Self-healing&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Yes&lt;/td&gt;
      &lt;td&gt;No&lt;/td&gt;
      &lt;td&gt;No&lt;/td&gt;
      &lt;td&gt;No&lt;/td&gt;
      &lt;td&gt;No&lt;/td&gt;
      &lt;td&gt;No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;ACLs&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;POSIX+&lt;/td&gt;
      &lt;td&gt;macOS&lt;/td&gt;
      &lt;td&gt;Windows&lt;/td&gt;
      &lt;td&gt;UFS2&lt;/td&gt;
      &lt;td&gt;Linux&lt;/td&gt;
      &lt;td&gt;Basic&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Portability&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;BSD/Linux&lt;/td&gt;
      &lt;td&gt;macOS&lt;/td&gt;
      &lt;td&gt;Partial&lt;/td&gt;
      &lt;td&gt;BSD&lt;/td&gt;
      &lt;td&gt;Partial&lt;/td&gt;
      &lt;td&gt;Haiku&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Use case&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;NAS/Server&lt;/td&gt;
      &lt;td&gt;Apple devices&lt;/td&gt;
      &lt;td&gt;Windows&lt;/td&gt;
      &lt;td&gt;BSD servers&lt;/td&gt;
      &lt;td&gt;Linux default&lt;/td&gt;
      &lt;td&gt;Multimedia&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;conservatively-estimated-failure-rate-my-bullshit-math&quot;&gt;Conservatively estimated failure rate (my bullshit math)&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Filesystem&lt;/th&gt;
      &lt;th&gt;Resize Operation&lt;/th&gt;
      &lt;th&gt;Estimated Failure Rate (Data Loss)&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;ext4&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Grow (mounted)&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;&amp;lt; 1%&lt;/strong&gt; (well-supported, journaled)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;ext4&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Shrink (unmounted)&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;5-8%&lt;/strong&gt; (higher risk, metadata relocation)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;NTFS&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Grow (Windows DM)&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;2-5%&lt;/strong&gt; (Microsoft tools are cautious)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;NTFS&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Shrink (3rd party)&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;10-15%&lt;/strong&gt; (unmovable files, fragmentation issues)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;FFS/UFS&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Grow (&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;growfs&lt;/span&gt;&lt;/code&gt;)&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;&amp;lt; 1%&lt;/strong&gt; (mature, stable)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;FFS/UFS&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Shrink (manual)&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;30-40%&lt;/strong&gt; (not officially supported)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;FAT32&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Any resize&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;15-20%&lt;/strong&gt; (no journaling, brittle metadata)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;comparison-ages&quot;&gt;Comparison ages&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Filesystem&lt;/th&gt;
      &lt;th&gt;Release Year&lt;/th&gt;
      &lt;th&gt;Age (2026)&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;FFS&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;1984&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;42 years&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;NTFS&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;1993&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;33 years&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;BFS&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;1997&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;29 years&lt;/strong&gt; (but BeOS died 2001)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;ZFS&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;2005&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;21 years&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;ext4&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;2008&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;18 years&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;APFS&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;2017&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;9 years&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;soft-updates-vs-journaling-vs-cow&quot;&gt;Soft Updates vs. Journaling vs. CoW&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Aspect&lt;/th&gt;
      &lt;th&gt;&lt;strong&gt;Soft Updates&lt;/strong&gt;&lt;/th&gt;
      &lt;th&gt;&lt;strong&gt;Journaling&lt;/strong&gt;&lt;/th&gt;
      &lt;th&gt;&lt;strong&gt;CoW (ZFS/APFS)&lt;/strong&gt;&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Write Overhead&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;1x (single write)&lt;/td&gt;
      &lt;td&gt;2x (journal + final)&lt;/td&gt;
      &lt;td&gt;1x (new blocks only)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Crash Consistency&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Always consistent&lt;/td&gt;
      &lt;td&gt;Always consistent&lt;/td&gt;
      &lt;td&gt;Always consistent&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Recovery Time&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Instant mount + background fsck&lt;/td&gt;
      &lt;td&gt;Instant (journal replay)&lt;/td&gt;
      &lt;td&gt;Instant (no fsck needed)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Space Leaks&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Possible (reclaimed later)&lt;/td&gt;
      &lt;td&gt;No&lt;/td&gt;
      &lt;td&gt;No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Snapshots&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Bolt-on (FreeBSD)&lt;/td&gt;
      &lt;td&gt;External (LVM)&lt;/td&gt;
      &lt;td&gt;Native (free)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Complexity&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Medium (dependency tracking)&lt;/td&gt;
      &lt;td&gt;Medium (journal management)&lt;/td&gt;
      &lt;td&gt;High (CoW + snapshots)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;conclusions&quot;&gt;Conclusions&lt;/h2&gt;
&lt;p&gt;This post lays out the groundwork for the next one: &lt;strong&gt;Apple Defences: the organisation of the filesystem&lt;/strong&gt;. I simply couldn’t give those concepts without an introduction of what led Apple to make some choices. That post will be very hands-on!&lt;/p&gt;

&lt;p&gt;See you next week. Until then, stay paranoid, and copy-on-write your notes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Want to understand how attackers bypass these protections?&lt;/strong&gt; I’m building a &lt;strong&gt;macOS Reverse Engineering course&lt;/strong&gt; that covers SIP internals, APFS forensics, and Mach-O binary analysis. Get in touch with me on Mastodon (my handle being @gbiondo on infosec.exchange) or simply drop me an email to work@bytearchitect.io.&lt;/p&gt;</content><author><name>Gabriel Biondo</name></author><category term="macos-security" /><category term="theory" /><category term="macos-structure" /><summary type="html">Explore the evolution of filesystems: from FFS and ZFS to APFS. Discover why modern storage is no longer just about data, but a core pillar of macOS platform security and hardware hardening.</summary></entry><entry><title type="html">Hardening macOS part 6: The Human Surface and Metadata Risks</title><link href="https://bytearchitect.io/macos-security/Hardening-macOS-part7-The-Human-Surface-and-Metadata-Risks/" rel="alternate" type="text/html" title="Hardening macOS part 6: The Human Surface and Metadata Risks" /><published>2026-04-14T00:00:00+02:00</published><updated>2026-04-14T00:00:00+02:00</updated><id>https://bytearchitect.io/macos-security/Hardening-macOS-part7-The-Human-Surface-and-Metadata-Risks</id><content type="html" xml:base="https://bytearchitect.io/macos-security/Hardening-macOS-part7-The-Human-Surface-and-Metadata-Risks/">&lt;h2 id=&quot;context&quot;&gt;Context&lt;/h2&gt;
&lt;p&gt;You may know it - you may not know it, but IT people often have funny ways to refer to users. I remember &lt;em&gt;lusers&lt;/em&gt; from the old, glorious days in which I was a sysadmin. But there are more, even sharper.&lt;/p&gt;

&lt;p&gt;It’s peculiar noticing how when I shifted from pure system administration to security management this mindset held - and actually was even more pervasive, if possible.&lt;/p&gt;

&lt;p&gt;Now as a “security expert”, I agree with the general mantra of the category, that appoints the human factor as the weaker link in the whole protection chain.&lt;/p&gt;

&lt;p&gt;It’s true. There you go: the problem quite often sits between the chair and the keyboard.&lt;/p&gt;

&lt;p&gt;But here’s the uncomfortable part: &lt;strong&gt;I’m the user too.&lt;/strong&gt; And so are you.&lt;/p&gt;

&lt;p&gt;We can harden the network layer, compartmentalise browsers, set up hardware tokens, encrypt everything twice — and then undo it all with a single careless click, a reused password, or a file shared with the wrong person.&lt;/p&gt;

&lt;p&gt;This post isn’t about tools. It’s about behaviour. The habits, shortcuts, and blind spots that make all the technical work pointless. And unlike the previous posts in this series, there’s no configuration file to fix this. It’s just you, your choices, and the uncomfortable awareness that &lt;em&gt;you’re&lt;/em&gt; the attack surface.&lt;/p&gt;

&lt;p&gt;Let’s talk about what that actually means. But we’ll discuss this &lt;em&gt;á la byte arquitechte&lt;/em&gt;, mes chers!&lt;/p&gt;

&lt;p&gt;This is the post in this series that is more generic - the ideas you find here can be applied on all OS’s. Better than Java or Python, babs, for here we deal with the greatest vulnerability of any system.&lt;/p&gt;
&lt;h2 id=&quot;the-main-exposure-the-user&quot;&gt;The main exposure: the user&lt;/h2&gt;
&lt;p&gt;Yes, we’ll talk about our behaviours, what we do (and should not!), how we do things,… basically, all the boring considerations that all paranoids fear to say out loud in their heads.&lt;/p&gt;

&lt;p&gt;I will try and look for my evolution as a (l)user.&lt;/p&gt;

&lt;h3 id=&quot;exercise&quot;&gt;Exercise:&lt;/h3&gt;
&lt;p&gt;Take a look at my Mastodon ProPic (infosec.exchange - handle: @gbiondo).  Can you realise where that photo was taken? No? let me give you some suggestions:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;google for “Black Sabbath Bridge”&lt;/li&gt;
  &lt;li&gt;cut the propic over one of the other images and do a Google Images search&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Yay, the answer is Birmingham. Brum. Mordor. Call it whatever.&lt;/p&gt;

&lt;p&gt;Now, this is deliberate - at least in my case. I have no ninja running after my head, but again - basic information that is easily obtained.&lt;/p&gt;

&lt;p&gt;You may think that if you post a picture of your room it has less information. Really? I am looking at my webcam now, and I see in the background some of my books. If someone wanted to profile me, these would give a greater hint than the aforementioned propic.&lt;/p&gt;

&lt;p&gt;Now, all this data has a collective name - we call it &lt;strong&gt;metadata&lt;/strong&gt;, the name already suggests that this is &lt;em&gt;data about data&lt;/em&gt; - and it makes sense, as we’ll shortly see.&lt;/p&gt;

&lt;h3 id=&quot;metadata-what-your-data-says-when-youre-not-talking&quot;&gt;Metadata: what your data says when you’re not talking&lt;/h3&gt;
&lt;p&gt;Metadata isn’t just in photos. It’s in everything you create - and quite often, also in &lt;em&gt;everything that passes through your devices&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Open a Word document you wrote last month. Right-click, Properties, Details.&lt;/p&gt;

&lt;p&gt;What do you see?&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Author:&lt;/strong&gt; your full name&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Company:&lt;/strong&gt; your employer (or worse — your client’s name if you’re a consultant)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Last modified:&lt;/strong&gt; timestamp revealing your timezone&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Total editing time:&lt;/strong&gt; how long you actually worked on it&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Software version:&lt;/strong&gt; “Microsoft Word 16.x on macOS 14.3”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You just documented yourself. Identity, employer, timezone, work habits, OS version — all embedded in the file without you typing a single word of it.&lt;/p&gt;

&lt;h4 id=&quot;exercise-1&quot;&gt;Exercise&lt;/h4&gt;
&lt;p&gt;If you don’t have it already, install &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;exiftool&lt;/span&gt;&lt;/code&gt; on your Mac:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;brew&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;exiftool&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then take a picture with your phone and download it to your computer. Then run:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;exiftool&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;~/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Desktop&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Photo3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;jpeg&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;and have fun! Just to give you the idea:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gnever&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;xREVENG3&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;~&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;exiftool&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;~/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Desktop&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Photo3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;jpeg&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GPS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;wc&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;err&quot;&gt; &lt;/span&gt;

&lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;17&lt;/span&gt;

&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gnever&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;xREVENG3&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;~&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;“Only”&lt;/em&gt; 17 pieces of information regarding where the picture has been taken!&lt;/p&gt;

&lt;p&gt;Try it a little bit - &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;exiftool&lt;/span&gt;&lt;/code&gt; works pretty much on all filetypes:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gnever&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;xREVENG3&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;~&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;exiftool&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Users&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gnever&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Desktop&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;topdown&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pdf&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ExifTool&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Version&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Number&lt;/span&gt;         &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;13.55&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;File&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Name&lt;/span&gt;                       &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;topdown&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pdf&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Directory&lt;/span&gt;                       &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Users&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gnever&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Desktop&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;File&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Size&lt;/span&gt;                       &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;42&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;kB&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;File&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Modification&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt;     &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2026&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;04&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;08&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;06&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;36&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;File&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Access&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt;           &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2026&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;04&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;06&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;05&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;03&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;File&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Inode&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Change&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt;     &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2026&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;04&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;08&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;06&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;36&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;File&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Permissions&lt;/span&gt;                &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rw&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;--&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;File&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Type&lt;/span&gt;                       &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;PDF&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;File&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Type&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Extension&lt;/span&gt;             &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pdf&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;MIME&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Type&lt;/span&gt;                       &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;application&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pdf&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Linearized&lt;/span&gt;                      &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;No&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Media&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Box&lt;/span&gt;                       &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;595.2756&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;841.8898&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Page&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Count&lt;/span&gt;                      &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;12&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;PDF&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Version&lt;/span&gt;                     &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;1.4&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Modify&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Date&lt;/span&gt;                     &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2026&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;04&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;08&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;05&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;36&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Z&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Producer&lt;/span&gt;                        &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;macOS&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Version&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;26.4&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Build&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;25E246&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Quartz&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;PDFContext&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Author&lt;/span&gt;                          &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Gabriele&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Biondo&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Title&lt;/span&gt;                           &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Untitled&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Creator&lt;/span&gt;                         &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Seven7hSense&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Create&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Date&lt;/span&gt;                     &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2026&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;04&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;08&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;05&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;36&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Z&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gnever&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;xREVENG3&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;~&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;exiftool&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Users&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gnever&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Desktop&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Dashboard&lt;/span&gt;\ &lt;span class=&quot;n&quot;&gt;_&lt;/span&gt;\ &lt;span class=&quot;n&quot;&gt;The&lt;/span&gt;\ &lt;span class=&quot;n&quot;&gt;Byte&lt;/span&gt;\ &lt;span class=&quot;n&quot;&gt;Architect&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;htmlonly&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;html&lt;/span&gt; 
&lt;span class=&quot;n&quot;&gt;ExifTool&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Version&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Number&lt;/span&gt;         &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;13.55&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;File&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Name&lt;/span&gt;                       &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Dashboard&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;The&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Byte&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Architect&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;htmlonly&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;html&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Directory&lt;/span&gt;                       &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Users&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gnever&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Desktop&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;File&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Size&lt;/span&gt;                       &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;35&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;kB&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;File&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Modification&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt;     &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2026&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;04&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;09&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;08&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;50&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;File&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Access&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt;           &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2026&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;04&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;09&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;08&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;51&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;File&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Inode&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Change&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt;     &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2026&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;04&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;09&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;08&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;50&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;File&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Permissions&lt;/span&gt;                &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rw&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;--&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;File&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Type&lt;/span&gt;                       &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;HTML&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;File&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Type&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Extension&lt;/span&gt;             &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;html&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;MIME&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Type&lt;/span&gt;                       &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;html&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Title&lt;/span&gt;                           &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Dashboard&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;The&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Byte&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Architect&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Description&lt;/span&gt;                     &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Hacking&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;business&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;…&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;business&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;good&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Robots&lt;/span&gt;                          &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;noindex&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;nofollow&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Viewport&lt;/span&gt;                        &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;device&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;initial&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scale&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;1.0&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;exiftool&lt;/span&gt;&lt;/code&gt; gives you an impressive quantity of data - for pictures, which is how I use it the most, it gives you:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;GPS coordinates&lt;/strong&gt; (latitude/longitude, accurate to meters)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Camera make and model&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Timestamp&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Lens focal length&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;Sometimes the &lt;strong&gt;camera serial number&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There was a time when that sunset you posted on social media from your balcony 
would have leaked your home address to anyone with &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;exiftool&lt;/span&gt;&lt;/code&gt; and thirty seconds 
of curiosity. These days, Meta strips EXIF data automatically before upload — 
but don’t assume every platform does the same.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This is metadata.&lt;/strong&gt; Not the content — the &lt;em&gt;context&lt;/em&gt;. And context is often more valuable than content.&lt;/p&gt;

&lt;p&gt;You can encrypt an email end-to-end with PGP. Perfect forward secrecy, zero-knowledge architecture, the works. The metadata still reveals:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Who you emailed&lt;/li&gt;
  &lt;li&gt;When&lt;/li&gt;
  &lt;li&gt;How often&lt;/li&gt;
  &lt;li&gt;Roughly from where&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s enough to map your entire social graph, infer relationships, track movements, and predict behaviour — without reading a single word of the actual message.&lt;/p&gt;

&lt;p&gt;The NSA has been refreshingly honest about this: &lt;em&gt;“We kill people based on metadata.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You’re probably not on a targeted killing list. But the principle stands. &lt;strong&gt;Metadata tells stories you didn’t mean to share.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When it comes to PDF, I find &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;qpdf&lt;/span&gt;&lt;/code&gt; a great tool. It removes metadata from PDFs:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;brew&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;qpdf&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;qpdf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;linearize&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;remove&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;unreferenced&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;resources&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pdf&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;output&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pdf&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;but nothing that &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;exiftool&lt;/span&gt;&lt;/code&gt; doesn’t do - so up to you selecting your bane:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;exiftool&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;all&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pdf&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If you prefer the GUI, look for &lt;strong&gt;ImageOptim&lt;/strong&gt; on macOS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For Word/LibreOffice documents:&lt;/strong&gt; File → Properties → clear author, company, revision history. Export to PDF. Strip that PDF too. Metadata survives format conversions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For photos you post publicly:&lt;/strong&gt; disable location services in your camera app. Or use &lt;strong&gt;Scrambled Exif&lt;/strong&gt; (Android) / &lt;strong&gt;Metapho&lt;/strong&gt; (iOS) to strip EXIF on your phone before upload.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And remember:&lt;/strong&gt; you can only strip metadata &lt;em&gt;before&lt;/em&gt; you publish. Once it’s indexed, cached, scraped — it’s permanent. You can’t retract GPS coordinates from an image that’s already in Google’s database.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;… and you believed it was “just a photo”.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Observe how the system and the applications give you enough rope to hang yourself: the metadata is just an artefact - a completely legit technology that can give you precious pieces of information on your data. Not being aware of it - or worse, not caring! - is a human behaviour. We’ll see this pattern quite often: a tool meant to give the users new possibilities end up being weaponizable against users.&lt;/p&gt;

&lt;h3 id=&quot;social-media-patterns&quot;&gt;Social media patterns&lt;/h3&gt;
&lt;p&gt;Nowadays it looks like if you are not on social media, if you don’t like social media, and if your behaviour is a bit different from the usual social media user, then there’s something wrong with you.&lt;/p&gt;

&lt;p&gt;Well, very Huxley-sh. But I am not the right guy to give judgements, here, for I find that environment toxic as hell. Plus, that is an over-structure. We cannot do much on perceptions.&lt;/p&gt;

&lt;p&gt;First we should define what is meant by social media. In my current mindset, all applications that allow you to interact with unknown people are social media. So, all that TikTok/FaceBook/Instawhatever business - but not only. Also OnlyFans/Tinder/GiveMeYourContactToIntercourseApp and all that dismal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The problem isn’t what you post. It’s the pattern.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You don’t need to dox yourself explicitly. Your behaviour does it for you.&lt;/p&gt;

&lt;p&gt;You post at 8:00 AM, 1:00 PM, and 6:00 PM every day? Your timezone is visible. Cross-reference with daylight in your photos and someone can narrow your location to a region.&lt;/p&gt;

&lt;p&gt;You post photos of your morning coffee, your office window view, your evening commute? You’ve just mapped your daily routine. A patient observer knows where you live, where you work, and what route you take between them.&lt;/p&gt;

&lt;p&gt;You complain about your boss on a pseudonymous account but use the same sentence structure, vocabulary quirks, and posting schedule as your real account? Stylometry connects the dots. &lt;del&gt;It’s not paranoia if they’re actually correlating your datasets.&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The problem isn’t individual posts. It’s the aggregate.&lt;/strong&gt; One photo is harmless. A hundred photos become a timeline. One opinion is noise. Fifty opinions become a profile.&lt;/p&gt;

&lt;h3 id=&quot;books-on-your-shelf-again&quot;&gt;Books on your shelf, again&lt;/h3&gt;

&lt;p&gt;Remember the webcam example from earlier? The books visible in the background of a video call can profile you more accurately than your LinkedIn bio.&lt;/p&gt;

&lt;p&gt;Someone screenshots your Zoom call. They zoom in on your bookshelf. They see:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;The Phoenix Project&lt;/em&gt; — you work in DevOps or IT management&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Thinking, Fast and Slow&lt;/em&gt; — you’re into behavioural economics or decision-making&lt;/li&gt;
  &lt;li&gt;Italian novels — you’re Italian or studied Italian literature&lt;/li&gt;
  &lt;li&gt;Security books, obviously — your field is clear&lt;/li&gt;
  &lt;li&gt;Perhaps, some controversial books (“Chaos Monkeys:…”? “Temporary Autonomous Zone”? Something more political? Anything religious? LGBT-related titles?)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They didn’t need your CV. Your environment told them.&lt;/p&gt;

&lt;p&gt;Now apply this to Instagram stories, TikTok backgrounds, YouTube home office tours. Every frame is a data point.&lt;/p&gt;

&lt;h3 id=&quot;what-you-actually-do-about-it&quot;&gt;What you actually do about it&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Delay posting.&lt;/strong&gt; Take the photo now. Post it three days later. Break the real-time correlation between your life and your feed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Randomise timing.&lt;/strong&gt; Use a scheduler if you want consistency without predictability. Don’t post at the exact moment something happens.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strip location context.&lt;/strong&gt; “Grabbed coffee this morning” is fine. “At the Starbucks on 5th and Main, same table as every Tuesday at 7:15 AM” is not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Separate identities properly.&lt;/strong&gt; If you run a pseudonymous account, treat it like a completely different person. Different tone. Different schedule. Different topics. Different &lt;em&gt;everything&lt;/em&gt;. And for the love of encryption, &lt;strong&gt;do not cross-post&lt;/strong&gt; the same content on both accounts within the same timeframe.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Assume correlation.&lt;/strong&gt; If you post on Twitter, LinkedIn, and Instagram at roughly the same time with similar phrasing, anyone with basic OSINT skills can link those accounts in under five minutes. If you don’t want them linked, don’t make it trivial.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Background hygiene.&lt;/strong&gt; Before you go live, stream, or post video — scan your background. Whiteboards with project names. Post-it notes with passwords (yes, I’ve seen this). Books that reveal more than you intended. Reflections in windows or screens showing your location. Get rid of those Your-Fave-Movement/Company/Band/Country flags. Get rid of everything that actually &lt;em&gt;talks about you&lt;/em&gt;. Create an aseptic environment. Yes, it’s frustrating and alienating.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Or don’t.&lt;/strong&gt; Blur your background. Use a virtual background. Or accept that you’re trading convenience for exposure and make peace with it.&lt;/p&gt;

&lt;p&gt;As I mentioned before: I am not the most equilibrated voice when it comes to social media. I see this business as too pervasive and toxic. The thing is - I tried not to be too paranoid in this discussion. I could have discussed the LinkedIn arena - which is where the most delicate information pop up. I didn’t. On purpose. Left for you as an exercise. Another exercise for you: observe the patterns: where does human behaviour ends, and technicalities start? Any difference with the Metadata?&lt;/p&gt;

&lt;h4 id=&quot;the-digital-twin-you-didnt-know-you-were-building&quot;&gt;The Digital Twin you didn’t know you were building&lt;/h4&gt;

&lt;p&gt;Here’s the uncomfortable part.&lt;/p&gt;

&lt;p&gt;All these breadcrumbs — posting times, books on your shelf, word choices, sentiment patterns, where you grab coffee, what you complain about — they’re not just data points for a hypothetical stalker.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;They’re training data.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Algorithms don’t need to hack into your house. They just need enough signal to build a model of you. A &lt;strong&gt;digital twin&lt;/strong&gt; that reacts to stimuli — ads, propaganda, nudges, recommendations — exactly like you would.&lt;/p&gt;

&lt;p&gt;You post at 8 AM? The algorithm knows when you’re most receptive. You share articles about privacy? It knows what makes you angry, what makes you click. You engage more on Tuesdays? It schedules content for Tuesdays.&lt;/p&gt;

&lt;p&gt;Your digital twin doesn’t need to be perfect. It just needs to be &lt;strong&gt;predictive enough&lt;/strong&gt; to:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Sell you things you didn’t know you wanted&lt;/li&gt;
  &lt;li&gt;Show you news that confirms what you already believe&lt;/li&gt;
  &lt;li&gt;Surface content that keeps you scrolling&lt;/li&gt;
  &lt;li&gt;Influence how you vote, what you fear, who you trust&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You’re not the customer. &lt;strong&gt;Your digital twin is the product.&lt;/strong&gt; And you built it for free.&lt;/p&gt;

&lt;p&gt;The irony? You thought you were just sharing your life. You were actually &lt;strong&gt;donating yourself to a prediction engine.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So here’s the real question: do you want that twin to exist? And if it already does — because let’s be honest, it probably does — how much are you still feeding it?&lt;/p&gt;

&lt;p&gt;Your digital twin is the product. And you built it for free. &lt;strong&gt;And it’s a high-fidelity model because, at our core, we are creatures of habit&lt;/strong&gt;. As far as I could see in my whole life: human beings love routines. Routines give you comfort. Credibility. Identity. You express yourself through your routines and habits. And this is wonderful, in a perfect world. In this world, these routine generate patterns. Patterns that can be exploited - and usually are exploited for profit. A not-so-mild form of manipulation, but it could be worse.&lt;/p&gt;

&lt;p&gt;As we’re talking Social Media and web, why not mentioning…&lt;/p&gt;

&lt;h2 id=&quot;social-login-convenience-is-a-hell-of-a-drug&quot;&gt;Social login: convenience is a hell of a drug&lt;/h2&gt;

&lt;p&gt;“Sign in with Google.”&lt;/p&gt;

&lt;p&gt;“Sign in with Facebook.”&lt;/p&gt;

&lt;p&gt;“Sign in with GitHub.”&lt;/p&gt;

&lt;p&gt;One click. No password to remember. No account creation form. Instant access.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Convenient as hell.&lt;/strong&gt; And that’s the problem.&lt;/p&gt;

&lt;p&gt;You just gave that service:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Your real name&lt;/li&gt;
  &lt;li&gt;Your email address&lt;/li&gt;
  &lt;li&gt;Potentially your profile picture&lt;/li&gt;
  &lt;li&gt;Access to your social graph (depending on permissions you didn’t read)&lt;/li&gt;
  &lt;li&gt;A link between that service and your Google/Facebook/GitHub account&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And now, every service you’ve ever “signed in with Google” to is tied to that one account.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Single point of failure, distributed everywhere.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your Google account gets compromised? Every service you signed into with Google is now compromised too. One breach, infinite exposure.&lt;/p&gt;

&lt;p&gt;Worse: you’ve just told Google (or Facebook, or GitHub) everywhere you have an account. They know which services you use, when you signed up, how often you log in. &lt;strong&gt;They’re tracking your digital footprint across the entire web&lt;/strong&gt; — and you gave them permission when you clicked that button.&lt;/p&gt;

&lt;h3 id=&quot;the-trust-problem&quot;&gt;The trust problem&lt;/h3&gt;

&lt;p&gt;Social login is built on a simple assumption: you trust the identity provider more than you trust yourself to manage passwords.&lt;/p&gt;

&lt;p&gt;For most people, that’s probably true. Google’s security is likely better than &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;Password123&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;!&lt;/span&gt;&lt;/code&gt; reused across forty sites.&lt;/p&gt;

&lt;p&gt;But here’s what you’re actually saying when you use social login:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;“I trust Google/Facebook/GitHub to never get breached.”&lt;/li&gt;
  &lt;li&gt;“I trust them to never misuse my login data.”&lt;/li&gt;
  &lt;li&gt;“I trust them to never change their terms of service in ways I don’t like.”&lt;/li&gt;
  &lt;li&gt;“I trust that if my account gets locked, banned, or suspended, I won’t lose access to everything I’ve ever signed into with it.”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last one? &lt;strong&gt;It happens.&lt;/strong&gt; Google bans accounts. Facebook suspends people. GitHub locks accounts for ToS violations. And when that happens, you lose access to every service that relied on that login.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You don’t own your identity anymore. They do.&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;what-you-actually-do-about-it-1&quot;&gt;What you actually do about it&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Don’t use social login.&lt;/strong&gt; Just don’t.&lt;/p&gt;

&lt;p&gt;Create an account the old-fashioned way. Use your password manager to generate a unique password. Enable 2FA on the service itself.&lt;/p&gt;

&lt;p&gt;Yes, it’s a PitA. Yes, it takes an extra thirty seconds. &lt;strong&gt;That’s the point.&lt;/strong&gt; That pain is a feature when the alternative is centralising your entire digital identity under one corporation’s control.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you already did:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Go through your connected apps settings:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Google:&lt;/strong&gt; &lt;a href=&quot;https://myaccount.google.com/permissions&quot;&gt;myaccount.google.com/permissions&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Facebook:&lt;/strong&gt; Settings → Apps and Websites&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; Settings → Applications → Authorized OAuth Apps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Revoke access to anything you don’t actively use. Then go to those services, create a proper account with a unique password, and break the link.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For developers:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Don’t offer &lt;em&gt;only&lt;/em&gt; social login. Give users the option to create a real account. Some of us actually care about this. &lt;del&gt;And some of us remember when OAuth was supposed to be about delegation, not identity consolidation.&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;Enough dystopia for this post. Let’s get back to what you expect me to tell you. Like credentials hygiene, for starters.&lt;/p&gt;

&lt;h3 id=&quot;credentials-hygiene&quot;&gt;Credentials hygiene&lt;/h3&gt;
&lt;h4 id=&quot;-password-reuse-the-attack-that-never-gets-old&quot;&gt;## Password reuse: the attack that never gets old&lt;/h4&gt;
&lt;p&gt;Everyone knows this one. &lt;em&gt;Everyone.&lt;/em&gt; Literally.&lt;/p&gt;

&lt;p&gt;Security trainings mention it. Articles warn about it. Your IT department sends passive-aggressive emails about it every quarter.&lt;/p&gt;

&lt;p&gt;And yet here we are.&lt;/p&gt;

&lt;p&gt;You use the same password for your email, your bank, and that random forum you signed up for in 2014 because you needed to download a PDF.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt; Because remembering fifty unique passwords is impossible, and you’re not a computer.&lt;/p&gt;

&lt;p&gt;Fair enough. The problem is: &lt;strong&gt;attackers know this too.&lt;/strong&gt;&lt;/p&gt;

&lt;h5 id=&quot;how-it-actually-works&quot;&gt;How it actually works&lt;/h5&gt;
&lt;p&gt;That forum you forgot about? It gets breached. The database leaks. Your email and password are now in a text file being sold for $3 on a Telegram channel.&lt;/p&gt;

&lt;p&gt;The attackers don’t try to crack your password. &lt;strong&gt;You already gave it to them.&lt;/strong&gt; They just try it everywhere else.&lt;/p&gt;

&lt;p&gt;This is called &lt;strong&gt;credential stuffing.&lt;/strong&gt; Automated bots take your leaked email and password, then try logging in to:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Gmail&lt;/li&gt;
  &lt;li&gt;Outlook&lt;/li&gt;
  &lt;li&gt;Your bank&lt;/li&gt;
  &lt;li&gt;Amazon&lt;/li&gt;
  &lt;li&gt;PayPal&lt;/li&gt;
  &lt;li&gt;Every major service they can think of&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you reused that password, one of those attempts succeeds.&lt;/p&gt;

&lt;p&gt;The pattern? Email compromised to password reset links for everything else (bank account, cloud storage, social media), done.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This is not theoretical.&lt;/strong&gt; Have I Been Pwned has logged over &lt;strong&gt;12 billion&lt;/strong&gt; breached credentials. The statistical probability that you’re &lt;em&gt;not&lt;/em&gt; in there? Low.&lt;/p&gt;

&lt;h3 id=&quot;the-human-problem&quot;&gt;The human problem&lt;/h3&gt;

&lt;p&gt;You know you shouldn’t reuse passwords. You do it anyway. Why?&lt;/p&gt;

&lt;p&gt;Because the alternative — remembering &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;Xk9&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mP2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;vQ7&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;!&lt;/span&gt;&lt;/code&gt; for your bank, &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;wL4&lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;#nR8&amp;amp;tY3%&lt;/span&gt;&lt;/code&gt; for your email, and &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;bF6&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hS1&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pM9&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;^&lt;/span&gt;&lt;/code&gt; for Netflix — is cognitively impossible.&lt;/p&gt;

&lt;p&gt;So you do what every human does: you create a &lt;strong&gt;system&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;MyPassword2014&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;!&lt;/span&gt;&lt;/code&gt; for old accounts.&lt;br /&gt;
&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;MyPassword2018&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;!&lt;/span&gt;&lt;/code&gt; for newer ones.&lt;br /&gt;
&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;MyPassword2024&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;!&lt;/span&gt;&lt;/code&gt; for this year.&lt;/p&gt;

&lt;p&gt;Predictable. Weak. Worse than random because it &lt;em&gt;feels&lt;/em&gt; secure.&lt;/p&gt;

&lt;p&gt;Or you use &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;BankPassword&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;!&lt;/span&gt;&lt;/code&gt;, &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;EmailPassword&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;!&lt;/span&gt;&lt;/code&gt;, &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;WorkPassword&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;!&lt;/span&gt;&lt;/code&gt; — which is just reuse with extra steps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The human brain is not built for this.&lt;/strong&gt; Passwords were designed for a world where you had three accounts, not three hundred.&lt;/p&gt;

&lt;h3 id=&quot;what-you-actually-do-about-it-2&quot;&gt;What you actually do about it&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Use a password manager.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Strongbox. Bitwarden. 1Password. KeePassXC. I don’t care which one. Pick one. Install it. Use it.&lt;/p&gt;

&lt;p&gt;Generate unique passwords for every service. Let the manager remember them. You only need to remember &lt;em&gt;one&lt;/em&gt; master password — make it long, make it strong, and never reuse it anywhere else.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Audit your breaches.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Go to &lt;a href=&quot;https://haveibeenpwned.com/&quot;&gt;haveibeenpwned.com&lt;/a&gt;. Enter your email addresses. If you’re in a breach, &lt;strong&gt;change those passwords immediately.&lt;/strong&gt; All of them. Even the ones from 2009 that you “don’t use anymore” — because you probably reused that password somewhere you &lt;em&gt;do&lt;/em&gt; still use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enable 2FA everywhere.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Even if your password leaks, 2FA stops the login cold. Prefer &lt;strong&gt;hardware tokens&lt;/strong&gt; (YubiKey) over SMS. SMS can be intercepted, SIM-swapped, social-engineered. A YubiKey sitting in your desk drawer cannot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rotate old credentials.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;API keys you generated two years ago and forgot about. SSH keys you haven’t touched since your last laptop. App-specific passwords for services you don’t use anymore. &lt;strong&gt;Clean them up.&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;the-honest-truth&quot;&gt;The honest truth&lt;/h3&gt;
&lt;p&gt;You &lt;em&gt;will&lt;/em&gt; reuse passwords. Not maliciously — just because you’re tired, you’re busy, and “this site doesn’t matter anyway.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That’s the site that gets breached.&lt;/strong&gt; Always.&lt;/p&gt;

&lt;p&gt;The goal isn’t perfection. The goal is: &lt;strong&gt;make credential stuffing unprofitable.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If your leaked password only works on one throwaway forum and nowhere else? The attackers move on. There are easier targets.&lt;/p&gt;

&lt;p&gt;But if your leaked password unlocks your email, and your email unlocks everything else? &lt;strong&gt;You just made their job trivial.&lt;/strong&gt;&lt;/p&gt;

&lt;h2 id=&quot;ssh-keys-without-passphrases-the-unlocked-front-door&quot;&gt;SSH keys without passphrases: the unlocked front door&lt;/h2&gt;
&lt;p&gt;You generated an SSH key. Good.&lt;/p&gt;

&lt;p&gt;You didn’t set a passphrase. Bad.&lt;/p&gt;

&lt;p&gt;Now that key is sitting in &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;o&quot;&gt;~/&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ssh&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;id_rsa&lt;/span&gt;&lt;/code&gt; (or &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;o&quot;&gt;~/&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ssh&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;id_ed25519&lt;/span&gt;&lt;/code&gt; if you’re modern), completely unencrypted. Anyone with access to your laptop — malware, physical theft, an unencrypted backup — can use it to access every server you’ve ever SSHed into.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;An SSH key without a passphrase is a plaintext credential.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And unlike a password you can change with a few clicks, revoking SSH keys means logging into every server, editing &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;o&quot;&gt;~/&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ssh&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;authorized_keys&lt;/span&gt;&lt;/code&gt;, and hoping you didn’t miss one.&lt;/p&gt;

&lt;h3 id=&quot;why-people-skip-passphrases&quot;&gt;Why people skip passphrases&lt;/h3&gt;
&lt;p&gt;Because typing a passphrase every time you SSH is annoying.&lt;/p&gt;

&lt;p&gt;You’re deploying code. You’re debugging production. You’re jumping between five servers in ten minutes. Stopping to type a passphrase each time breaks your flow.&lt;/p&gt;

&lt;p&gt;So you generate the key without one. Or you generate it with one, get annoyed after three days, and regenerate it without.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I get it.&lt;/strong&gt; Convenience wins. Always.&lt;/p&gt;

&lt;p&gt;But here’s what you’re actually doing: you’re turning your SSH key into a &lt;strong&gt;password stored in plaintext on disk.&lt;/strong&gt; The exact thing you’d never do with your email password, you’re doing with root access to your infrastructure.&lt;/p&gt;

&lt;h3 id=&quot;what-actually-happens-when-it-leaks&quot;&gt;What actually happens when it leaks&lt;/h3&gt;
&lt;p&gt;Let’s say your laptop gets stolen. Or you get hit with ransomware that exfiltrates &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;o&quot;&gt;~/&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ssh&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;/code&gt; before encrypting your disk. Or you restore from an unencrypted Time Machine backup that someone finds.&lt;/p&gt;

&lt;p&gt;The attacker now has:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Your private key (unencrypted)&lt;/li&gt;
  &lt;li&gt;Your &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;o&quot;&gt;~/&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ssh&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;/code&gt; file (which lists all your servers)&lt;/li&gt;
  &lt;li&gt;Your &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;o&quot;&gt;~/&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ssh&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;known_hosts&lt;/span&gt;&lt;/code&gt; file (which confirms which servers you’ve accessed)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They don’t need to crack anything. They just:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ssh &lt;span class=&quot;nt&quot;&gt;-i&lt;/span&gt; stolen_key user@your-production-server
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And they’re in. Root access. No password prompt. No 2FA. Just in.&lt;/p&gt;

&lt;h3 id=&quot;what-you-actually-do-about-it-3&quot;&gt;What you actually do about it&lt;/h3&gt;
&lt;h4 id=&quot;set-a-passphrase-when-you-generate-the-key&quot;&gt;Set a passphrase when you generate the key&lt;/h4&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ssh-keygen &lt;span class=&quot;nt&quot;&gt;-t&lt;/span&gt; ed25519 &lt;span class=&quot;nt&quot;&gt;-C&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;your_email@example.com&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;It will ask for a passphrase. &lt;strong&gt;Use one.&lt;/strong&gt; Make it strong. Store it in your password manager if you need to.&lt;/p&gt;

&lt;h4 id=&quot;already-have-keys-without-passphrases&quot;&gt;Already have keys without passphrases?&lt;/h4&gt;
&lt;p&gt;You can add one retroactively:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ssh-keygen &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; ~/.ssh/id_ed25519
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;It will prompt for the old passphrase (none) and the new one. Done.&lt;/p&gt;

&lt;h4 id=&quot;usessh-agentto-avoid-typing-it-constantly&quot;&gt;Use &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;ssh&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;agent&lt;/span&gt;&lt;/code&gt; to avoid typing it constantly&lt;/h4&gt;
&lt;p&gt;Once per session, unlock your key:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ssh-add ~/.ssh/id_ed25519
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Enter the passphrase once. The agent remembers it for the session. You SSH freely after that.&lt;/p&gt;

&lt;p&gt;On macOS, you can make it even smoother:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ssh-add &lt;span class=&quot;nt&quot;&gt;--apple-use-keychain&lt;/span&gt; ~/.ssh/id_ed25519
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This stores the passphrase in your macOS Keychain. You unlock it once (when you log in), and &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;ssh&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;agent&lt;/span&gt;&lt;/code&gt; handles the rest.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rotate old keys.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you’ve been using the same SSH key for five years, generate a new one. Remove the old public key from your servers’ &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;o&quot;&gt;~/&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ssh&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;authorized_keys&lt;/span&gt;&lt;/code&gt;. Treat keys like passwords — they expire.&lt;/p&gt;

&lt;h4 id=&quot;separate-keys-for-separate-contexts&quot;&gt;Separate keys for separate contexts&lt;/h4&gt;
&lt;p&gt;Work servers? &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;o&quot;&gt;~/&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ssh&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;work_ed25519&lt;/span&gt;&lt;/code&gt;.&lt;br /&gt;
Personal servers? &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;o&quot;&gt;~/&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ssh&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;personal_ed25519&lt;/span&gt;&lt;/code&gt;.&lt;br /&gt;
GitHub? &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;o&quot;&gt;~/&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ssh&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;github_ed25519&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If one key leaks, the blast radius is contained. Your &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;o&quot;&gt;~/&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ssh&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;/code&gt; can handle the routing:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;Host&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;github&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;com&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;IdentityFile&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;~/&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ssh&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;github_ed25519&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;Host&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;work&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;server&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;IdentityFile&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;~/&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ssh&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;work_ed25519&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;the-honest-truth-1&quot;&gt;The honest truth&lt;/h3&gt;
&lt;p&gt;You’ll generate a key without a passphrase “just for testing.” That key will still be in &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;o&quot;&gt;~/&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ssh&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;/code&gt; three years later, with access to servers you forgot existed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Clean your SSH directory.&lt;/strong&gt; Right now. Go look. You’ll find keys you don’t remember creating, for servers you don’t remember accessing.&lt;/p&gt;

&lt;p&gt;Delete them. Revoke their public keys from the servers. Start fresh.&lt;/p&gt;

&lt;p&gt;Because the alternative is: someone else finds them first.&lt;/p&gt;

&lt;h2 id=&quot;the-pattern-youve-probably-noticed&quot;&gt;The pattern you’ve probably noticed&lt;/h2&gt;
&lt;p&gt;Metadata. Social media patterns. Password reuse. SSH keys without passphrases. Social login.&lt;/p&gt;

&lt;p&gt;None of these are &lt;strong&gt;technical&lt;/strong&gt; failures. Your OS didn’t fail. Your browser didn’t fail. Your firewall is fine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You failed.&lt;/strong&gt; Or more accurately: &lt;strong&gt;human behaviour failed.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The tools work. The encryption works. The compartmentalisation works. But then you post a photo with GPS coordinates embedded. You reuse a password because it’s easier. You skip the SSH passphrase because typing it is annoying. You click “Sign in with Google” because it’s one less account to manage.&lt;/p&gt;

&lt;p&gt;And all the hardening, all the configuration, all the layered defence — &lt;strong&gt;gone.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is why security people are exhausted. It’s not the technology. Technology is solvable. &lt;strong&gt;Humans are not.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can patch software. You can’t patch behaviour.&lt;/p&gt;

&lt;p&gt;But here’s the thing: &lt;strong&gt;you can change it.&lt;/strong&gt; Not overnight. Not perfectly. But incrementally.&lt;/p&gt;

&lt;p&gt;Strip metadata before you share. Delay your posts. Use a password manager. Set passphrases on your SSH keys. Create proper accounts instead of social login.&lt;/p&gt;

&lt;p&gt;One habit at a time. One decision at a time.&lt;/p&gt;

&lt;p&gt;Because the alternative is: you’ll do all the technical work, set up all the defences, harden all the layers — and then leak your home address in a sunset photo’s EXIF data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The human factor is the weakest link. But it’s also the only one you can actually control.&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;In the next post: VeraCrypt and plausible deniability, oversharing in the workplace, security theater, when paranoia is actually justified, and how I actually work day-to-day. The behaviours that make or break everything we’ve built so far.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Stay paranoid — but stay sane.&lt;/em&gt;&lt;/p&gt;

&lt;hr /&gt;
&lt;h2 id=&quot;a-kind-request-for-you&quot;&gt;A kind request for you&lt;/h2&gt;
&lt;p&gt;I’m deciding what to write next. Which gap hurts you most — code signing internals, AppKit underdocumented patterns, or macOS threat detection? Hit me directly: &lt;a href=&quot;mailto:work@bytearchitect.dev&quot;&gt;work@bytearchitect.dev&lt;/a&gt;&lt;/p&gt;</content><author><name>Gabriel Biondo</name></author><category term="macos-security" /><category term="macos-hardening" /><summary type="html">Beyond tools: master your security by stripping metadata, securing SSH keys, and managing your digital twin. Learn why the human factor is the ultimate attack surface.</summary></entry><entry><title type="html">Reverse with me - Qardio necromancy - pt 2</title><link href="https://bytearchitect.io/macos-security/Reverse-with-me-Qardio-necromancy-2/" rel="alternate" type="text/html" title="Reverse with me - Qardio necromancy - pt 2" /><published>2026-03-30T00:00:00+02:00</published><updated>2026-03-30T00:00:00+02:00</updated><id>https://bytearchitect.io/macos-security/Reverse-with-me-Qardio-necromancy-2</id><content type="html" xml:base="https://bytearchitect.io/macos-security/Reverse-with-me-Qardio-necromancy-2/">&lt;p&gt;&lt;em&gt;Still I want to share with you my Reverse Engineering style. Although I originally planned to write some more “hardening macOS” stuff, lately I am quite tired and I want to do only what it feels good to. Really - need some time off. But that’s another thing.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;So, still measuring how the gravity impacts on aesthetics - or in a more understandable fashion - the weight/scale problem.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you are too lazy to read the previous post &lt;a href=&quot;https://bytearchitect.io/security-reversing/Reverse-with-me-Qardio-necromancy/&quot;&gt;Reverse with me - Qardio necromancy&lt;/a&gt;too bad! It’s all there! But let me summarize quickly what we understood:&lt;/em&gt;&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Property&lt;/th&gt;
      &lt;th&gt;Value&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Device name&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;QardioBase&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Device UUID&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;DDD101E2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5809&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1322&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FE7&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CAD62DC14121&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Bluetooth version&lt;/td&gt;
      &lt;td&gt;4.1&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;BDA/MAC Address&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A3&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Proprietary Service UUID&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;C8219E89&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;93E0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4169&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A3DC&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;EA7959E866AF&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Communication&lt;/td&gt;
      &lt;td&gt;Bidirectional&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Notify characteristics&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;mh&quot;&gt;0x0019&lt;/span&gt;&lt;/code&gt;, &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;mh&quot;&gt;0x001c&lt;/span&gt;&lt;/code&gt;, &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;mh&quot;&gt;0x002d&lt;/span&gt;&lt;/code&gt;, &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;mh&quot;&gt;0x0030&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Read characteristics&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;mh&quot;&gt;0x000e&lt;/span&gt;&lt;/code&gt;, &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;mh&quot;&gt;0x000c&lt;/span&gt;&lt;/code&gt;, &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;mh&quot;&gt;0x0028&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Write characteristics&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;mh&quot;&gt;0x002e&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Communication media&lt;/td&gt;
      &lt;td&gt;BlueTooth, IP Connection&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;hr /&gt;

&lt;p&gt;Now, where were we? Right. We had the UUID, the characteristics, the MAC. We knew the device talked. We just didn’t know what it was saying.&lt;/p&gt;

&lt;h3 id=&quot;the-frida-wall-and-the-change-of-ways&quot;&gt;The Frida Wall and the Change of Ways&lt;/h3&gt;
&lt;p&gt;The obvious next step was the iOS binary. QardioBase is still installed on an old iPhone — the last survivor of the app’s existence on this planet. So we reached for Frida.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;frida &lt;span class=&quot;nt&quot;&gt;-U&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; Qardio
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;Failed&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;attach&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;unable&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;attach&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;the&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;specified&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;process&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;FairPlay. The app is signed, the iPhone is not jailbroken, and that’s the end of that conversation. Frida can attach to processes signed with your own developer certificate — not to App Store binaries on a non-jailbroken device. I could have jailbroken the phone, but hey, that’s too easy - it’d be like DoSsing someone. If you DoS someone you’re no hacker - you’re a kiddie. It’s a matter of class, innit?&lt;/p&gt;

&lt;p&gt;So I changed approach.&lt;/p&gt;

&lt;h3 id=&quot;sniffing-the-air-the-gatt-sequence&quot;&gt;Sniffing the Air: The GATT Sequence&lt;/h3&gt;
&lt;p&gt;The binary was locked. The device wasn’t.&lt;/p&gt;

&lt;p&gt;Two routes:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;what I discovered in iOS logs&lt;/li&gt;
  &lt;li&gt;NRF52840-DONGLE + BlackArch + Wireshark&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But I am the changer of ways, therefore here you go: another shiny route! Use the dongle, starting from the elements I’ve seen in the first probe (iOS logs). Capture as many scale states as possible, and document them.&lt;/p&gt;

&lt;p&gt;So, since this is going to be a long and painful exercise, but the real value is only understanding ONE operation, let’s focus on getting my weight, solely. All the other aspects and functionalities will be obtained in exactly the same way, and they’re left as an exercise for the reader! (sorry - I couldn’t help but writing this horrible sentence. If you’ve had some math, chances are you’ve seen that sentence that the teachers use to torture the students. After years of reading it, now it was my time to write it. I was officially excited!)&lt;/p&gt;

&lt;p&gt;Back to our business - Weight. One operation, one goal.&lt;/p&gt;

&lt;p&gt;Here’s what we’re looking for: the moment the scale transmits a measurement. From the iOS logs we already knew the cast: a proprietary service (&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;C8219E89&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;93E0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4169&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A3DC&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;EA7959E866AF&lt;/span&gt;&lt;/code&gt;), a handful of characteristics, bidirectional communication. The dongle gives us the same picture, but from the air — no iPhone required, no app required, just radio.&lt;/p&gt;

&lt;p&gt;The sequence, as captured, goes like this:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;The scale advertises. Continuously. It’s looking for someone to talk to.&lt;/li&gt;
  &lt;li&gt;A client connects and discovers the GATT services.&lt;/li&gt;
  &lt;li&gt;The client subscribes to notifications on the STATE characteristic (&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;A78AF805&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;&lt;/code&gt;).&lt;/li&gt;
  &lt;li&gt;The scale emits STATE updates. When STATE hits &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;/code&gt;, a measurement is ready.&lt;/li&gt;
  &lt;li&gt;The client reads the MEASUREMENT characteristic (&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;B24F98BE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;&lt;/code&gt;).&lt;/li&gt;
  &lt;li&gt;The scale responds with a JSON payload.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That’s it. That’s the entire protocol for reading weight. No authentication, no encryption, no handshake beyond standard GATT. Qardio built a scale that hands you your data if you simply ask politely.&lt;/p&gt;

&lt;p&gt;Which I did.&lt;/p&gt;

&lt;h3 id=&quot;talk-is-cheap-show-me-the-swift-code&quot;&gt;Talk is cheap, show me the Swift code&lt;/h3&gt;
&lt;p&gt;I wrote a simple swift project - I am not sure I will transform this one into a fully fledged iOS app (that’s more a “No” than a “Yes”, but if you wanna do it, don’t hesitate to get in touch with me - I’ll gladly share this code and all the reversing artefacts with you).&lt;/p&gt;

&lt;p&gt;Just the &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;AppDelegate&lt;/span&gt;&lt;/code&gt; - then adding a few Entitlements, and here we go!&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;//&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;//&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;AppDelegate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;swift&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;//&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;QardioBase&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;//&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;//&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;Created&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;by&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Gabriele&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Biondo&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;on&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;28&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;03&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;2026.&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;//&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;Cocoa&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;CoreBluetooth&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;QARDIO_SERVICE&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CBUUID&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;C8219E89-93E0-4169-A3DC-EA7959E866AF&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CHAR_STATE&lt;/span&gt;     &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CBUUID&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;A78AF805-8F3F-4E8F-A964-318B768BC38C&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CHAR_ENG&lt;/span&gt;       &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CBUUID&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;9F3F4E1B-37D7-4F95-B374-CF585D808BEB&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CHAR_MEAS&lt;/span&gt;      &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CBUUID&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;B24F98BE-9CD4-4F82-B935-01F18F104EDE&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;AppDelegate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;NSObject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;NSApplicationDelegate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CBCentralManagerDelegate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CBPeripheralDelegate&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;central&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CBCentralManager&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;!&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;peripheral&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CBPeripheral&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;?&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;engChar&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CBCharacteristic&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;?&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;measChar&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CBCharacteristic&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;?&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;NSWindow&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;?&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;applicationDidFinishLaunching&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;notification&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Notification&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;central&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CBCentralManager&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;delegate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;queue&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;o&quot;&gt;//&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MARK&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Central&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;centralManagerDidUpdateState&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;central&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CBCentralManager&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;guard&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;central&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;state&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;poweredOn&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;BLE non disponibile: \(central.state.rawValue)&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;BLE pronto, scansione in corso...&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;central&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scanForPeripherals&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;withServices&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;QARDIO_SERVICE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;centralManager&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;central&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CBCentralManager&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;didDiscover&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;peripheral&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CBPeripheral&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                        &lt;span class=&quot;n&quot;&gt;advertisementData&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Any&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rssi&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;RSSI&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;NSNumber&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Trovato: \(peripheral.name ?? &quot;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;unknown&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;) \(peripheral.identifier)&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;peripheral&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;peripheral&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;central&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;stopScan&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;central&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;connect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;peripheral&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;centralManager&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;central&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CBCentralManager&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;didConnect&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;peripheral&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CBPeripheral&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Connesso a \(peripheral.name ?? &quot;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;device&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;)&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;peripheral&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;delegate&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;peripheral&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;discoverServices&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;QARDIO_SERVICE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;o&quot;&gt;//&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MARK&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Peripheral&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;peripheral&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;peripheral&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CBPeripheral&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;didDiscoverServices&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Error&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;guard&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;service&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;peripheral&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;services&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;first&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Servizio trovato: \(service.uuid)&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;peripheral&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;discoverCharacteristics&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CHAR_STATE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CHAR_ENG&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CHAR_MEAS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;service&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;peripheral&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;peripheral&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CBPeripheral&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;didDiscoverCharacteristicsFor&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;service&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CBService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Error&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;char&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;service&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;characteristics&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;??&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Caratteristica: \(char.uuid)&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;char&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;uuid&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CHAR_ENG&lt;/span&gt;  &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;engChar&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;char&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;peripheral&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;setNotifyValue&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;char&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;char&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;uuid&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CHAR_STATE&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;peripheral&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;setNotifyValue&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;char&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;char&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;uuid&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CHAR_MEAS&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;measChar&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;char&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;peripheral&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;peripheral&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CBPeripheral&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;didUpdateValueFor&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;characteristic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CBCharacteristic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Error&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;guard&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;characteristic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;characteristic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;uuid&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CHAR_STATE&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;state&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;STATE: \(state)&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;state&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Configuration mode — abilito engineering...&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;enableConfig&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;state&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Misura pronta — leggo...&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;readMeasurement&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;characteristic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;uuid&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CHAR_ENG&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;ENG raw: \(data.map { String(format: &quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;02&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;, $0) }.joined(separator: &quot;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;))&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;count&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Config mode confermata&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;readMeasurement&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;characteristic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;uuid&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CHAR_MEAS&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;json&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;encoding&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;utf8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;MEASUREMENT: \(json)&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;o&quot;&gt;//&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MARK&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Commands&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;enableConfig&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;guard&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;char&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;engChar&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;p&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;peripheral&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cmd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;UInt8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x01&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x01&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;writeValue&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cmd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;char&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;withResponse&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;readMeasurement&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;guard&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;char&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;measChar&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;p&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;peripheral&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;readValue&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;char&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Again: using a project is overkill - but it was kind of faster.&lt;/p&gt;

&lt;p&gt;Finger crossed, I run this guy and I prepare to weight myself. I obtain this output:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;BLE&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pronto&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scansione&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;corso&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Trovato&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;QardioBase&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;F9275DED&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C0DC&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;56&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D972&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D2FCB657C4B&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Connesso&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;QardioBase&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Servizio&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;trovato&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;C8219E89&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;93E0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4169&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A3DC&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;EA7959E866AF&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Caratteristica&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;A78AF805&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F3F&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;4E8&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A964&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;318&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;B768BC38C&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Caratteristica&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;B24F98BE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CD4&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F82&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;B935&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F18F104EDE&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Caratteristica&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F3F4E1B&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;37&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D7&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F95&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;B374&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CF585D808BEB&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;08&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;21&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;70&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;28&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c9&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;71&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;38&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;44&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;44&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fc&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c5&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;49&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;74&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;38&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;44&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;44&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;45&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;04&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c9&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;76&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;44&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;44&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;38&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c5&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;06&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;49&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;79&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;08&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;04&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;45&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;09&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;49&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;45&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;49&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;38&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;54&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;54&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;18&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;45&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c9&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c5&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a1&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;71&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;38&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;44&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;44&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fc&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;21&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;74&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;40&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;40&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;04&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a1&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;76&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;38&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;54&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;54&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;18&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;06&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;21&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;79&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;48&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;54&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;24&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;49&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;70&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;28&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;45&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c9&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;71&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;38&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;44&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;44&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fc&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c5&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;49&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;74&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;38&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;44&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;44&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;45&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;04&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c9&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;76&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;44&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;44&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;38&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c5&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;06&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;49&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;79&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;08&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;04&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;45&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;09&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;49&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;45&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;49&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;38&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;54&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;54&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;18&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;45&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c9&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c5&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a1&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;71&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;38&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;44&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;44&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fc&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;21&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;74&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;40&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;40&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;04&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a1&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;76&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;38&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;54&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;54&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;18&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;06&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;21&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;79&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;48&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;54&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;24&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;09&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;21&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;44&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;80&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;05&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;06&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;STATE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Misura&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pronta&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;—&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;leggo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;MEASUREMENT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;114537690006011751348217&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;weight&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;76.0&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;bmi&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;19.3&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;z&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;2031&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;fat&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;57&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;tbw&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;31&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;bmc&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;3&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;mt&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;9&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;sm&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;17&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;algorithm&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;0&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;user&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;gabriel&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;userid&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;blah&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c9&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;72&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;81&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;61&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;19&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;07&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c5&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;02&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;49&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;76&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;70&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;09&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;90&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;60&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;45&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;06&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c9&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;79&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c5&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;09&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c9&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;82&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;82&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c5&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;15&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;76&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;28&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;44&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;11&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;06&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;95&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;78&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;38&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;44&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;44&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fc&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;91&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;08&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;80&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;49&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;73&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;09&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;09&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;09&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;91&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;60&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;45&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;03&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c9&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;76&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;81&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;61&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;19&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;07&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c5&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;06&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;49&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;06&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;86&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;60&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;18&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;86&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;80&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;45&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;95&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;75&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;05&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;91&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;05&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;15&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;77&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;38&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;44&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;44&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;11&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;07&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;95&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;79&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;44&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;91&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;09&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;80&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b5&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;71&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;38&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;44&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;44&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fc&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b1&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;35&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;74&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;38&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;44&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;44&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;31&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;04&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b5&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;76&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;44&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;44&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;38&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b1&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;06&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;35&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;79&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;08&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;04&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;31&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;09&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;35&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;31&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;35&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;38&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;54&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;54&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;18&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;31&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b5&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b1&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;80&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c3&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;07&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;43&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;08&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bf&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;07&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;08&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;80&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ec&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c9&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;73&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;48&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;54&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;24&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c5&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;03&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c9&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;75&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;38&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;44&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;44&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c5&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;05&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;49&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;78&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;20&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;40&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;45&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;08&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c9&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;38&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;54&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;54&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;18&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c5&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;21&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;73&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;38&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;54&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;54&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;18&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;03&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a1&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;75&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;08&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;04&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;05&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a1&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;77&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;08&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;04&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;07&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a1&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;79&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;38&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;44&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;44&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;38&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;09&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;21&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;08&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;04&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;80&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;05&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;STATE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ec&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;61&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;73&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;80&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;80&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;80&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;41&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;73&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;21&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;73&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;30&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;40&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;80&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;80&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;40&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;73&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;02&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;02&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;02&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;02&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;02&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;02&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;02&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;02&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;80&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;05&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;STATE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;12&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;eb&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;BLE&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;non&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;disponibile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;BLE&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pronto&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scansione&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;corso&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;BLE&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;non&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;disponibile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;BLE&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pronto&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scansione&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;corso&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now, about those &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;ENG&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw&lt;/span&gt;&lt;/code&gt; packets.&lt;/p&gt;

&lt;p&gt;The ENGINEERING characteristic is chatty. Very chatty. While you’re standing on the scale, it streams a continuous flow of binary data — sensor readings, state transitions, internal counters. It’s the scale thinking out loud.&lt;/p&gt;

&lt;p&gt;The packets come in pairs — a data packet followed by an acknowledgement:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;c9&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;71&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;38&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;44&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;44&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fc&lt;/span&gt;   &lt;span class=&quot;err&quot;&gt;←&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;c5&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;   &lt;span class=&quot;err&quot;&gt;←&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ack&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Byte 0 varies in a pattern that looks like a bitmask — &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;mi&quot;&gt;61&lt;/span&gt;&lt;/code&gt;, &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;mi&quot;&gt;41&lt;/span&gt;&lt;/code&gt;, &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;mi&quot;&gt;21&lt;/span&gt;&lt;/code&gt;, &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt;&lt;/code&gt; in sequence, which in binary is:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;mi&quot;&gt;01100001&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;01000001&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;00100001&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;00000001&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;A bit shifting down. Probably indicating which sensor segment is reporting. Byte 1 is consistently &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;mi&quot;&gt;73&lt;/span&gt;&lt;/code&gt; (115 decimal) across an entire block — likely a session or frame identifier.&lt;/p&gt;

&lt;p&gt;The state transitions are readable:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;05&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;03&lt;/span&gt;   &lt;span class=&quot;err&quot;&gt;→&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;STATE&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;  &lt;span class=&quot;err&quot;&gt;—&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;user&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;stepping&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;on&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;05&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;06&lt;/span&gt;   &lt;span class=&quot;err&quot;&gt;→&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;STATE&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;  &lt;span class=&quot;err&quot;&gt;—&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;measurement&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ready&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;05&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;   &lt;span class=&quot;err&quot;&gt;→&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;STATE&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;  &lt;span class=&quot;err&quot;&gt;—&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;idle&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;05&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;   &lt;span class=&quot;err&quot;&gt;→&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;STATE&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;12&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;—&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;post&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;measurement&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;There’s also this, appearing just before STATE 6:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a1&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ff&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Bytes &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;a1&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ff&lt;/span&gt;&lt;/code&gt; — interpreted as a signed 24-bit little-endian integer — give &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;8287&lt;/span&gt;&lt;/code&gt;. Not a weight in kilograms. Almost certainly a raw ADC reading from the load cell, relative to tare. The conversion to kilograms requires a calibration factor and offset that live in the firmware. I don’t have those, and frankly I don’t need them.&lt;/p&gt;

&lt;p&gt;Because here’s the interesting design choice Qardio made: the ENGINEERING channel is effectively obscured by complexity — raw sensor data, binary protocol, no documentation. The MEASUREMENT channel, on the other hand, is a JSON string in plain text.&lt;/p&gt;

&lt;h3 id=&quot;interpreting-the-json-or-why-you-shouldnt-wear-socks&quot;&gt;Interpreting the JSON (or: Why you shouldn’t wear socks)&lt;/h3&gt;
&lt;p&gt;They made the internals hard to read and the output trivial to read. Which means that for our purposes — resurrecting the scale — I can ignore everything above and focus entirely on what arrives on &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;B24F98BE&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;114537690006011751348217&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;weight&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;76.0&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;bmi&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;19.3&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;z&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;2031&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;fat&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;57&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;tbw&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;31&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;bmc&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;3&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;mt&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;9&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;sm&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;17&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;algorithm&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;0&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;user&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;gabriel&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;userid&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;blah&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Dafuq?&lt;/p&gt;

&lt;p&gt;I am not 76 kg - far from that. But it has a meaning, I didn’t really weigh myself in the right manner (I had my center of gravity outside the scale, to use the keyboard)&lt;/p&gt;

&lt;p&gt;I am definitely not Jabba the Hut, and the other values are not mine - actually any doctor would avoid a patient with those figures…&lt;/p&gt;

&lt;p&gt;Now, BMI is the body mass index. It’s a derived metric. Since it’s based on the weight, which is rubbish, this is rubbish as well (but you could infer my height. I don’t care, please do. You would be fascinated.)&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;z&lt;/span&gt;&lt;/code&gt; is the bioelectrical impedance (in Ohm). Long story short - the scale sends an imperceptible electric signal through the feet, measuring the impedance of the organic tissues. Water conducts, fat does not. Simple physics. Now 2031 Ω is total rubbish. Normally, an adult in good health, without bionic transplants nor alien eggs inside him, has a body impedance ranging between 400 and 600 Ω, depending on side conditions such as height, muscles, hydration. 2031 Ohm is 3 to 4 times the expected value. A bit of logic tells us that this is the classic scenario in which there is no contact - or contact is hindered somehow and…&lt;/p&gt;

&lt;p&gt;… oh, ffs! The socks. I weighted myself with socks on.&lt;/p&gt;

&lt;p&gt;This reverberates on all values:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;tbw&lt;/span&gt;&lt;/code&gt;  total body water, 31% - this is probably the result of being in a desert for weeks! A healthy adult has values that are easily twice this one.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;bmc&lt;/span&gt;&lt;/code&gt; body mineral contents. 3 kg - well that can be plausible. This metric is less impacted by impedance.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;mt&lt;/span&gt;&lt;/code&gt; - muscle tissue. 9 kg over 76 would mean that who jumped on the scale had been on a bed for months - it’d be a severe condition. Not plausible.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;sm&lt;/span&gt;&lt;/code&gt; - skeletal muscle - same as above.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What happened there: high impedance implies that the signal doesn’t flow through. In turn the software interprets the data as “no water” therefore compensating with “lots of fat”. The rest? Clusterfuck.&lt;/p&gt;

&lt;p&gt;I wanted to retroengineer a scale, I ended up doing physics - which is not exactly my passion.&lt;/p&gt;

&lt;p&gt;Now, I have enough material to do a few more tests and draw my conclusions. In principle:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;I need to restart this mac. PitA, but sometimes, on development phases, CoreBluetooth on Mac goes cuckoo.&lt;/li&gt;
  &lt;li&gt;I want to take a clean measurement.&lt;/li&gt;
  &lt;li&gt;If this last operation shall confirm my weight - which it should by the way, for the values I saw in the scale’s display are the same I reported in the JSON record - I would be ready to go to write the App. If I ever decide to do so&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I am already very satisfied of how the analysis progressed.&lt;/p&gt;

&lt;h3 id=&quot;lesson-learnt-the-engineering-labyrinth-vs-the-open-backdoor&quot;&gt;Lesson learnt: The Engineering Labyrinth vs. The Open Backdoor&lt;/h3&gt;
&lt;p&gt;There is a profound, almost comical lesson buried in this exercise.&lt;/p&gt;

&lt;p&gt;The ENGINEERING characteristic (&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F3F4E1B&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;&lt;/code&gt;) is what I’d call the &lt;em&gt;Debug Stream&lt;/em&gt;. Loud, chatty, binary pairs flying at you constantly. Byte masks shifting down — &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;mi&quot;&gt;61&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;41&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;21&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt;&lt;/code&gt;. ACKs everywhere. It looks serious. It looks like someone knew what they were doing.&lt;/p&gt;

&lt;p&gt;And inside that stream, you’re staring at raw physics — values like &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;8287&lt;/span&gt;&lt;/code&gt;, which are ADC integers relative to a tare offset. To make sense of them you’d need the calibration math from the firmware. Good luck with that.&lt;/p&gt;

&lt;p&gt;So you’d be forgiven for thinking the system is impenetrable.&lt;/p&gt;

&lt;p&gt;Then you look at the MEASUREMENT characteristic (&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;B24F98BE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Plain UTF-8 JSON. &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;weight&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;76.0&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;/code&gt;. No custom parser. No bit-banging. Just a string.&lt;/p&gt;

&lt;p&gt;Qardio built a high-tech moat around the sensors and left the master key under the doormat — because it was easier for the app developers to consume a JSON object than to deal with raw hex blobs. The scale does all the heavy lifting at the edge, calculates everything, and then hands you the result on a silver platter. In plain text.&lt;/p&gt;

&lt;p&gt;IoT security is rarely a solid wall. It’s usually a series of random obstacles. If you obsess over the engineering noise, you’ll think the system is impenetrable. Follow the data to where the app actually consumes it, and the emperor is naked.&lt;/p&gt;

&lt;p&gt;The ENGINEERING channel is smoke and mirrors — intimidating, close to the silicon, deeply unreadable. A few handles away, the MEASUREMENT channel screams the truth in plain text.&lt;/p&gt;

&lt;p&gt;Over-engineering on the inside. Poverty of design on the outside.&lt;/p&gt;

&lt;p&gt;For a reverser, it’s the Promised Land.&lt;/p&gt;

&lt;p&gt;Catcha next time - til then, stay paranoid. And fit, possibly…&lt;/p&gt;</content><author><name>Gabriel Biondo</name></author><category term="macos-security" /><summary type="html">Frida failed, so I sniffed the air. The QardioBase2 hides raw data in a binary labyrinth but leaves the master key under the mat: plain text JSON measurements. Reverse engineering at its finest.</summary></entry><entry><title type="html">Reverse with me - Qardio necromancy</title><link href="https://bytearchitect.io/security-reversing/Reverse-with-me-Qardio-necromancy/" rel="alternate" type="text/html" title="Reverse with me - Qardio necromancy" /><published>2026-03-24T00:00:00+01:00</published><updated>2026-03-24T00:00:00+01:00</updated><id>https://bytearchitect.io/security-reversing/Reverse-with-me-Qardio-necromancy</id><content type="html" xml:base="https://bytearchitect.io/security-reversing/Reverse-with-me-Qardio-necromancy/">&lt;p&gt;*Last week I didn’t publish, sorry. There’s a reason.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I am not the guy who uses the FartingCat (ChatGPT, in french, sounds like “chat, j’ai peté”, which means “cat, I farted”) to write posts on Linkedin, sorry. Why should one be willing to read something that the alleged author didn’t bother writing?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Plus, my audience is not Linkedin - and I don’t do rubbish to be regular. My bowels already are.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;the-problem&quot;&gt;The problem&lt;/h2&gt;
&lt;p&gt;Like many IT people, I despise technology.&lt;/p&gt;

&lt;p&gt;You come at my place? still you’d find analog stereo, real keys, dumb appliances, dumb neighbours that don’t mind their own business, and all the like. I have the place where I work (“Hangar 18”) which is something different, but my &lt;em&gt;sancta sanctorum&lt;/em&gt; is strictly analog.&lt;/p&gt;

&lt;p&gt;Well, not entirely. A few years ago I received this “QardioBase2 WiFi Smart Scale and Body Analyzer: monitor weight, BMI and body composition, easily store, track and share data. Free app for iOS, Android, Kindle. Works with Apple Health” (as Amazon describes it). Apple Health integration? Never bothered. But for sure, it had quite a good app.&lt;/p&gt;

&lt;p&gt;Lately I wanted to install the app on a new iPhone 17, just to realise that the app in the App Store was not present anymore. After the usual swearing, I started digging a little bit on the internet to find that someone has programmed &lt;a href=&quot;https://ptylr.com/posts/2025-09-28-librearm-breathing-new-life-into-qardioarm-devices&quot;&gt;LibreArm&lt;/a&gt; - a free version for the QardioArm device, but it is a different thing. I fortunately have another device for blood pressure measurements.&lt;/p&gt;

&lt;p&gt;The problem was still there then. So… so as mr. Taylor did some (great) necromancy on the blood pressure device, why not to do the same on the scale? From now onwards, I’ll call that post &lt;em&gt;the Post&lt;/em&gt;.&lt;/p&gt;

&lt;h2 id=&quot;the-high-level-plan&quot;&gt;The high-level plan&lt;/h2&gt;
&lt;p&gt;Reverse that zombie, bring it back to life. Write an app. Become rich and famous.&lt;/p&gt;

&lt;p&gt;Ok, that’s the rubbish. High level plans and Executive summaries must be there, so let’s fill them in accordingly.&lt;/p&gt;

&lt;h2 id=&quot;the-real-plan&quot;&gt;The real plan&lt;/h2&gt;
&lt;p&gt;Although I already know a lot about that scale, I want to treat this as a black box.&lt;/p&gt;

&lt;h3 id=&quot;open-questions&quot;&gt;Open questions&lt;/h3&gt;
&lt;ol&gt;
  &lt;li&gt;Does it use wifi (and it asks you to connect to the internet, when initialising. Why?).&lt;/li&gt;
  &lt;li&gt;Does it use BLE?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;working hypothesis: it uses both&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Is there any form of encryption in the communications? how does it work?&lt;/li&gt;
  &lt;li&gt;how many internal states does the scale have? what internal states does the scale have?&lt;/li&gt;
  &lt;li&gt;is the communication bi-directional?&lt;/li&gt;
  &lt;li&gt;Assuming we can get a hold of the communication: what is the format of data?
    &lt;ol&gt;
      &lt;li&gt;endianness&lt;/li&gt;
      &lt;li&gt;data structures&lt;/li&gt;
      &lt;li&gt;measurement units&lt;/li&gt;
      &lt;li&gt;headers?&lt;/li&gt;
      &lt;li&gt;other weirdness?&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And it’s pretty much it. Don’t be fooled by the relatively low number of questions - they are not so straightforward to answer.&lt;/p&gt;

&lt;h3 id=&quot;resources&quot;&gt;Resources&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;we have an old copy of the App, so we could disassemble it straight away. Good luck, it’d take eons. But it’s always a good resource to have - especially in later stages.&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;the post&lt;/em&gt;. There’s also some code. Although it does not solve our problems, it can be of inspiration.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;understanding-communications&quot;&gt;Understanding communications&lt;/h3&gt;
&lt;p&gt;It’s easier to start with BLE. At least, it’s a 1-1 communication. In the Hangar I have like a dozen of wifi networks and honestly I cannot remember into which one I enrolled the scale. It’ll be a nightmare of jumping and getting down from the scale. Taking notes will be my Cardio training.&lt;/p&gt;

&lt;p&gt;So - old, good passive sniffing over-the-air. Packet logger should be sufficient. I know that sometimes it has its idiosyncrasies with the bluetooth chip - would that be the case, we’ll use the iPhone and log BLE traffic. We’ll cross that bridge.&lt;/p&gt;

&lt;p&gt;Then wifi. While writing the previous paragraph I had the enlightenment: it suffices steer the internet traffic of the iPhone through an http proxy - hoping that these guys don’t use another exotic protocol. But I am kind of sure they don’t.&lt;/p&gt;

&lt;p&gt;Certificate pinning is a thing — we’ll deal with it if we find it.&lt;/p&gt;

&lt;p&gt;We’ll be able to draw our first set of conclusions, hopefully answering questions 1 and 2.&lt;/p&gt;

&lt;p&gt;Then it’ll be the encryption carousel. I really hope there’s none - it would have been mentioned in &lt;em&gt;the post&lt;/em&gt; - but we really need to understand this. Let’s be ready for it. My dream? Caesar’s cypher, with n=1! That’d address question 3 - from here onwards, the remaining part is just a matter of assigning semantics to raw data.&lt;/p&gt;

&lt;h2 id=&quot;preparing-the-playground&quot;&gt;Preparing the playground&lt;/h2&gt;

&lt;h3 id=&quot;ios&quot;&gt;iOS&lt;/h3&gt;
&lt;p&gt;Well, I need to have detailed logs from the iPhone - hopefully that will be enough, worst case they’ll help a lot. Either way, I want verbose bluetooth logs - and to obtain these, I need a configuration profile. Without the latter, iOS would log only high level events. Good, but not good enough.&lt;/p&gt;

&lt;p&gt;With this profile installed, &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt;&lt;/code&gt; will log pretty much everything: service discoveries, GATT characteristics, and the like.&lt;/p&gt;

&lt;p&gt;So i point the iPhone browser to https://developer.apple.com/bug-reporting/profiles-and-logs/. Bluetooth section. It’s a trivial install.&lt;/p&gt;

&lt;h3 id=&quot;mac&quot;&gt;Mac&lt;/h3&gt;
&lt;p&gt;Mac and iPhone will be connected via USB (USB C, in my case). Not a big deal.&lt;/p&gt;

&lt;p&gt;Mac will not need any special program apart from the venerable &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;Console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;qardio-scale&quot;&gt;Qardio scale&lt;/h3&gt;
&lt;p&gt;It suffices having the scale nearby. It’s about 1 m. away.&lt;/p&gt;

&lt;h2 id=&quot;reversing-the-connection&quot;&gt;Reversing the connection&lt;/h2&gt;
&lt;p&gt;I first do some connection tests - all works fine (I am impressed. Lately working with Apple internals is what elicits my blasphemous tuscanian nature the most…). I happen to see the pieces of data I almost forgot, like&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;debug&lt;/span&gt;	&lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;09&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;01.586286&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;Device&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;found&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CBDevice&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;FC3BB896&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;15E5&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D2CB&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C421&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;B43EBFE669F&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BDA&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;EA&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CB&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Nm&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;QardioARM&apos;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;in fact, the “old” phone is paired also with a QardioARM device (blood pressure meter - the one mentioned in &lt;em&gt;the post&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;I also see that my airpods have three serial numbers:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;Device&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;found&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CBDevice&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;F77B65FB&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;982E-8692&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A128&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;40&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ADBAB4F526&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BDA&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;30&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;75&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;18&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;09&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Nm&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;Gabriel&apos;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;AirPods&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Pro&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;, SN &apos;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;REDACTED1&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;, SN Left&apos;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;REDACTED2&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;, SN Right &apos;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;REDACTED3&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;one per each speaker, and the last one for the case. Apple tracks everything. Also ears.&lt;/p&gt;

&lt;p&gt;Then I also saw &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;com&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;apple&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;icloud&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;searchpartyd&lt;/span&gt;&lt;/code&gt; passing by. This is supposedly the “Find my” process. Apple knows when I find my weight :)&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;com&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;apple&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;internal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;carkitd&lt;/span&gt;&lt;/code&gt; - CarPlay. My car wants to know my weight…&lt;/p&gt;

&lt;p&gt;Well, apart all these stupid jokes, it seems that everything works fine and therefore, we can begin the real thing.&lt;/p&gt;

&lt;h3 id=&quot;the-test&quot;&gt;The test&lt;/h3&gt;
&lt;p&gt;The test plan is trivial. It will be sufficient to:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;select the right device in Console.app&lt;/li&gt;
  &lt;li&gt;launch the Qardio app on the iPhone&lt;/li&gt;
  &lt;li&gt;wait a bit - there could be precious handshaking information passing through&lt;/li&gt;
  &lt;li&gt;step on the scale&lt;/li&gt;
  &lt;li&gt;waiting for it to measure my weight&lt;/li&gt;
  &lt;li&gt;step off&lt;/li&gt;
  &lt;li&gt;keeping the app alive whilst waiting for the app to save data somewhere (we’ll see where afterwards) and feeling guilty for the weight - that’s always a good thing to do.&lt;/li&gt;
  &lt;li&gt;wait for some more time - there could be further delayed interactions.&lt;/li&gt;
  &lt;li&gt;quitting the app on the iphone&lt;/li&gt;
  &lt;li&gt;stopping the capture.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In principle, one could do this also from the terminal, but this time i went for Console. Truth is, Console.app is faster to set up for a first pass.&lt;/p&gt;

&lt;p&gt;We need to accept the fact that this first run can only be very approximate.&lt;/p&gt;

&lt;p&gt;At a first glance, I see three processes appearing during the measurement: &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt;&lt;/code&gt;, &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;wifid&lt;/span&gt;&lt;/code&gt;, and &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;Qardio&lt;/span&gt;&lt;/code&gt;. I start suspecting that my working hypothesis is true, but proving this requires more sound analyses.&lt;/p&gt;

&lt;p&gt;Fortunately, Console supports textual copy-paste. And &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;grep&lt;/span&gt;&lt;/code&gt; is our friend.&lt;/p&gt;

&lt;p&gt;First, I start with &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;

&lt;h4 id=&quot;bluetooth&quot;&gt;Bluetooth&lt;/h4&gt;
&lt;p&gt;As I said - &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;grep&lt;/span&gt;&lt;/code&gt; is my friend, therefore I create a file with only &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt;&lt;/code&gt; events:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gnever&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;xREVENG3&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Desktop&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;alh&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;nd&lt;/span&gt;\ &lt;span class=&quot;n&quot;&gt;Qardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;txt&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rw&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gnever&lt;/span&gt;&lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;n&quot;&gt;staff&lt;/span&gt;&lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;11&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;M&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;22&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Mar&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;31&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;nd&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Qardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;txt&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gnever&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;xREVENG3&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Desktop&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;bluetoothd&quot;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;2nd Qardio.txt&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;qardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;txt&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gnever&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;xREVENG3&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Desktop&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;alh&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;qardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;txt&lt;/span&gt;&lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rw&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gnever&lt;/span&gt;&lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;n&quot;&gt;staff&lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;106&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;K&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;22&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Mar&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;17&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;24&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;qardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;txt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Quite manageable. Navigating with a text editor this last file, I see some interesting facts, like:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;peripheral’s name&lt;/li&gt;
  &lt;li&gt;peripheral’s MAC&lt;/li&gt;
  &lt;li&gt;its UUID&lt;/li&gt;
  &lt;li&gt;and the Bluetooth version.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One step at a time.&lt;/p&gt;

&lt;h5 id=&quot;devices-name&quot;&gt;Device’s name&lt;/h5&gt;
&lt;p&gt;This reminds me of all those crappy movies ripped off from “The Exorcist” where the priest wants the name of the entity… however, let’s do it.&lt;/p&gt;

&lt;p&gt;The first approach one can conceive is to start querying this database of logs, hoping to have the right enlightenment - and in fact, reversing has this trial-and-errors nature, after all.&lt;/p&gt;

&lt;p&gt;But hey, here we are talking bluetooth, and the protocol has well defined phases, so let’s start with something that hopefully gives us quick results. The crucial phase in the whole bluetooth transaction is &lt;strong&gt;pairing&lt;/strong&gt; - so why  not…&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gnever&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;xREVENG3&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Desktop&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pair&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;qardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;txt&lt;/span&gt;&lt;span class=&quot;err&quot;&gt; &lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;debug&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;35.983020&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Device&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;found&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CBDevice&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;FC3BB896&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;15E5&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D2CB&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C421&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;B43EBFE669F&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BDA&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;EA&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CB&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Nm&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;QardioARM&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DsFl&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x800000&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Pairing&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DvF&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x2000&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BLEPaired&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CF&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x0&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;unchanged&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;debug&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;36.023122&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Device&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;found&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CBDevice&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;FC3BB896&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;15E5&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D2CB&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C421&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;B43EBFE669F&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BDA&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;EA&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CB&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Nm&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;QardioARM&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DsFl&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x800000&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Pairing&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DvF&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x2000&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BLEPaired&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CF&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x0&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;unchanged&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;debug&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;27&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;23.591469&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Device&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;found&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CBDevice&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;FC3BB896&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;15E5&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D2CB&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C421&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;B43EBFE669F&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BDA&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;EA&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CB&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Nm&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;QardioARM&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DsFl&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x800000&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Pairing&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DvF&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x2000&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BLEPaired&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CF&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x0&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;unchanged&lt;/span&gt;

&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gnever&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;xREVENG3&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Desktop&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pair&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;qardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;txt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;wc&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;l&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Too optimistic of me. Especially when you have two Qardio devices connected to the phone. We need a better way to get to the data we want. Perhaps looking for &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;device&lt;/span&gt;&lt;/code&gt; could help:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gnever&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;xREVENG3&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Desktop&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;device&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;qardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;txt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;vi&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;QardioARM&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;wc&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;l&lt;/span&gt;

&lt;span class=&quot;err&quot;&gt;  &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;218&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Good news. We also know one thing about the scale: its name! It’s in its box, after all :) Therefore we can try also:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gnever&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;xREVENG3&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Desktop&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;device&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;qardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;txt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;vi&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;QardioARM&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;qardiobase&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;wc&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;l&lt;/span&gt;

&lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;30&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Let’s see if this was a good intuition.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gnever&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;xREVENG3&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Desktop&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;device&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;qardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;txt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;vi&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;QardioARM&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;qardiobase&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;debug&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;35.833276&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Found&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;device&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;DDD101E2-5809-1322-6FE7-CAD62DC14121 Public 5C:D6:1F:C4:1C:A3 RSSI:-82 with data:&quot;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;QardioBase&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;, RSSI: 0 dB (non-saturated), Tx: -2 dB, Service UUIDs: C8219E89-93E0-4169-A3DC-EA7959E866AF, connectable, sourceCore: MainCore, IsELNAOn: 0, IsPassup: 0, IsFromSCCompensation0, IsCoexDenied0,  Setting name to QardioBase

info 16:26:35.833937+0000 bluetoothd Device found new: CBDevice DDD101E2-5809-1322-6FE7-CAD62DC14121, BDA 5C:D6:1F:C4:1C:A3, Nm &apos;QardioBase&apos;, DvF 0x40000000000 &amp;lt; Connectable &amp;gt;, RSSI -82, Ch 39, AdTsMC &amp;lt;1293840675&amp;gt;, CF 0x80204000000 &amp;lt; New RSSI Attributes &amp;gt;

default 16:26:35.835410+0000 bluetoothd Device connecting - {cbuuid: DDD101E2-5809-1322-6FE7-CAD62DC14121, devicename: QardioBase, result: 0, adv-addr: 5C:D6:1F:C4:1C:A3-Public, resolved-addr: }

...

default 16:26:38.112385+0000 bluetoothd The device &quot;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DDD101E2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5809&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1322&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FE7&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CAD62DC14121&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot; is named &quot;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;QardioBase&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;

...

default 16:27:15.772599+0000 bluetoothd Device disconnected - {cbuuid: DDD101E2-5809-1322-6FE7-CAD62DC14121, devicename: QardioBase, lmHandle: 0x55, adv-addr: 5C:D6:1F:C4:1C:A3-Public, resolved-addr: , result: 313}

debug 16:27:15.779532+0000 bluetoothd Device found: CBDevice DDD101E2-5809-1322-6FE7-CAD62DC14121, BDA 5C:D6:1F:C4:1C:A3, Nm &apos;QardioBase&apos;, DvF 0x40000200000 &amp;lt; Central Connectable &amp;gt;, CnS 0x400000 &amp;lt; BLE &amp;gt;, BTv 4.1, CF 0x800200000 &amp;lt; Connections DiscoveryFlags &amp;gt;, unchanged

....

debug 16:27:18.325975+0000 bluetoothd Device found: CBDevice DDD101E2-5809-1322-6FE7-CAD62DC14121, BDA 5C:D6:1F:C4:1C:A3, Nm &apos;QardioBase&apos;, DvF 0x40000200000 &amp;lt; Central Connectable &amp;gt;, CnS 0x400000 &amp;lt; BLE &amp;gt;, BTv 4.1, CF 0x800200000 &amp;lt; Connections DiscoveryFlags &amp;gt;, unchanged

default 16:27:18.326843+0000 bluetoothd Device lost: CBDevice DDD101E2-5809-1322-6FE7-CAD62DC14121, BDA 5C:D6:1F:C4:1C:A3, Nm &apos;QardioBase&apos;, DvF 0x40000200000 &amp;lt; Central Connectable &amp;gt;, CnS 0x400000 &amp;lt; BLE &amp;gt;, BTv 4.1, CF 0x800200000 &amp;lt; Connections DiscoveryFlags &amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Quite dense:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;these logs show that we have found the device name: &lt;del&gt;Pazuzu&lt;/del&gt; &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;QardioBase&lt;/span&gt;&lt;/code&gt; and its UUID: &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;DDD101E2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5809&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1322&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FE7&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CAD62DC14121&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;As for the what happened - what I highlighted shows the following:
    &lt;ol&gt;
      &lt;li&gt;the device has been detected (16:26:35)&lt;/li&gt;
      &lt;li&gt;connection has been confirmed (16:26:38). iOS has confirmed the name via GAP.&lt;/li&gt;
      &lt;li&gt;connection has been lost (16:27:11) - &lt;em&gt;actually I don’t remember what happened. It may be a program issue - should be investigated&lt;/em&gt;&lt;/li&gt;
      &lt;li&gt;16:27:15: device connected again&lt;/li&gt;
      &lt;li&gt;16:27:18: another disconnection… Blah!&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So, long story short, we have:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Property&lt;/th&gt;
      &lt;th&gt;Value&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Device name&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;QardioBase&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Device UUID&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;DDD101E2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5809&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1322&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FE7&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CAD62DC14121&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;which is already a good beginning.&lt;/p&gt;

&lt;p&gt;Taking a deeper look into the logs pasted above, we see the presence of the string &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;BDA&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A3&lt;/span&gt;&lt;/code&gt;. &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;BDA&lt;/span&gt;&lt;/code&gt; is how Apple delineates a Bluetooth Device Address - in other words, the MAC Address of the Bluetooth Device.&lt;/p&gt;

&lt;p&gt;Furthermore, in this log entry we saw before:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;debug&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;27&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;15.779532&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Device&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;found&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CBDevice&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DDD101E2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5809&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1322&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FE7&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CAD62DC14121&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BDA&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Nm&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;QardioBase&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DvF&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x40000200000&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Central&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Connectable&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CnS&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x400000&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BLE&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BTv&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;4.1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CF&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x800200000&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Connections&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DiscoveryFlags&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;unchanged&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;there appears the string &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;BTv&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;4.1&lt;/span&gt;&lt;/code&gt; - this is a simple declaration from the device, that declares its Bluetooth version as 4.1. It’s not crucial for us, but it’s good to know.&lt;/p&gt;

&lt;p&gt;Therefore, we can update the table as follows:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Property&lt;/th&gt;
      &lt;th&gt;Value&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Device name&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;QardioBase&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Device UUID&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;DDD101E2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5809&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1322&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FE7&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CAD62DC14121&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Bluetooth version&lt;/td&gt;
      &lt;td&gt;4.1&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;BDA/MAC Address&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A3&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;I realise I mentioned &lt;strong&gt;GAP&lt;/strong&gt; assuming that every reader knows what it is.&lt;/p&gt;

&lt;p&gt;Unfortunately, reversing BlueTooth devices requires knowing the protocol, which is not the most frequent asset of pentesters/reversers (as for me: the only times I played with BT before was when I wanted to stop my former girlfriend playing like 20 times in a row the same song on a bluetooth loudspeaker. Then, I simply decided to pour some water onto the loudspeaker - easier).&lt;/p&gt;

&lt;p&gt;For those who aren’t BlueTooth hardcore techies - GAP stands for &lt;strong&gt;Generic Access Profile&lt;/strong&gt;. It’s a BLE profile defining how a devices announces itself/it’s discoverable to the other ones. In short, GAP defines the protocols for advertising (how the devices shares its name and its services), discovery (how a central finds the devices nearby), and connection establishment (basic procedures to connect). In our case, when we saw &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;Setting&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;QardioBase&lt;/span&gt;&lt;/code&gt; and &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;The&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;device&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;named&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;QardioBase&quot;&lt;/span&gt;&lt;/code&gt;, the name has been read via GAP, by the Generic Access Service (&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;mh&quot;&gt;0x1800&lt;/span&gt;&lt;/code&gt;). This last service is standardised and mandatory on all BLE devices.&lt;/p&gt;

&lt;p&gt;So some more theory required here. I promise I’ll keep it as short as possible.&lt;/p&gt;

&lt;p&gt;If GAP is concerned with how to find and connect to devices, GATT focuses on the interaction with them. We have already seen &lt;em&gt;use cases&lt;/em&gt; (e.g. - “blood pressure monitor”); &lt;em&gt;services&lt;/em&gt; which is a bunch related data grouped together by UUID; &lt;em&gt;characteristics&lt;/em&gt;, the atomic datum or command within a service - identified  by UUID as well; and a &lt;em&gt;descriptor&lt;/em&gt; which is metadata regarding characteristics.&lt;/p&gt;

&lt;p&gt;From this perspective, a BLE device can be seen as a GATT DataBase which exposes services and characteristics that the central (in my case, the old iPhone) reads, writes, subscribes, and interacts with.&lt;/p&gt;

&lt;p&gt;Let’s try this query and see what we get:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gnever&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;xREVENG3&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Desktop&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;service\|uuid&quot;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;qardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;txt&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;DDD101E2&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;iv&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;qardioarm&quot;&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;debug&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;35.833276&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Found&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;device&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;DDD101E2-5809-1322-6FE7-CAD62DC14121 Public 5C:D6:1F:C4:1C:A3 RSSI:-82 with data:&quot;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;QardioBase&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;, RSSI: 0 dB (non-saturated), Tx: -2 dB, Service UUIDs: C8219E89-93E0-4169-A3DC-EA7959E866AF, connectable, sourceCore: MainCore, IsELNAOn: 0, IsPassup: 0, IsFromSCCompensation0, IsCoexDenied0,  Setting name to QardioBase

default 16:26:35.834150+0000 bluetoothd App connecting - {cbuuid: DDD101E2-5809-1322-6FE7-CAD62DC14121, bundle: com.getqardio.Qardio}

default 16:26:35.835410+0000 bluetoothd Device connecting - {cbuuid: DDD101E2-5809-1322-6FE7-CAD62DC14121, devicename: QardioBase, result: 0, adv-addr: 5C:D6:1F:C4:1C:A3-Public, resolved-addr: }

debug 16:26:35.880693+0000 bluetoothd Found device &quot;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DDD101E2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5809&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1322&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FE7&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CAD62DC14121&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Public&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A3&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;RSSI&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;83&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;QardioBase&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;RSSI&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dB&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;non&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;saturated&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Tx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dB&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Service&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;UUIDs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;C8219E89&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;93E0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4169&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A3DC&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;EA7959E866AF&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;connectable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sourceCore&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MainCore&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IsELNAOn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IsPassup&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IsFromSCCompensation0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IsCoexDenied0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Setting&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;QardioBase&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;35.977813&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Device&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ready&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cbuuid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DDD101E2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5809&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1322&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FE7&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CAD62DC14121&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;devicename&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;QardioBase&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lmHandle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x55&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;adv&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A3&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Public&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;resolved&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;35.980199&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;App&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ready&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cbuuid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DDD101E2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5809&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1322&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FE7&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CAD62DC14121&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bundle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;com&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getqardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Qardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;transport&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;le&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;27&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;15.772599&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Device&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;disconnected&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cbuuid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DDD101E2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5809&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1322&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FE7&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CAD62DC14121&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;devicename&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;QardioBase&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lmHandle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x55&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;adv&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A3&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Public&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;resolved&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;313&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;27&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;15.775114&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;App&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;disconnected&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cbuuid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DDD101E2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5809&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1322&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FE7&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CAD62DC14121&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bundle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;com&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getqardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Qardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;reconnecting&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;N&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;debug&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;27&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;15.814510&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Found&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;device&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;DDD101E2-5809-1322-6FE7-CAD62DC14121 Public 5C:D6:1F:C4:1C:A3 RSSI:-88 with data:&quot;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;QardioBase&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;, RSSI: 0 dB (non-saturated), Tx: -2 dB, Service UUIDs: C8219E89-93E0-4169-A3DC-EA7959E866AF, connectable, sourceCore: MainCore, IsELNAOn: 0, IsPassup: 0, IsFromSCCompensation0, IsCoexDenied0,  Setting name to QardioBase

default 16:27:15.817358+0000 bluetoothd App connecting - {cbuuid: DDD101E2-5809-1322-6FE7-CAD62DC14121, bundle: com.getqardio.Qardio}

default 16:27:15.821300+0000 bluetoothd Device connecting - {cbuuid: DDD101E2-5809-1322-6FE7-CAD62DC14121, devicename: QardioBase, result: 0, adv-addr: 5C:D6:1F:C4:1C:A3-Public, resolved-addr: }

debug 16:27:15.840575+0000 bluetoothd Found device &quot;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DDD101E2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5809&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1322&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FE7&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CAD62DC14121&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Public&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A3&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;RSSI&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;85&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;QardioBase&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;RSSI&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dB&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;non&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;saturated&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Tx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dB&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Service&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;UUIDs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;C8219E89&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;93E0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4169&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A3DC&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;EA7959E866AF&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;connectable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sourceCore&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MainCore&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IsELNAOn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IsPassup&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IsFromSCCompensation0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IsCoexDenied0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Setting&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;QardioBase&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;27&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;15.967087&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Device&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ready&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cbuuid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DDD101E2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5809&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1322&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FE7&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CAD62DC14121&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;devicename&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;QardioBase&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lmHandle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x59&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;adv&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A3&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Public&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;resolved&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;27&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;15.970037&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;App&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ready&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cbuuid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DDD101E2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5809&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1322&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FE7&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CAD62DC14121&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bundle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;com&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getqardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Qardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;transport&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;le&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;27&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;18.297794&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Device&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;disconnected&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cbuuid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DDD101E2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5809&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1322&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FE7&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CAD62DC14121&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;devicename&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;QardioBase&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lmHandle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x59&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;adv&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A3&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Public&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;resolved&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;307&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;27&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;18.322684&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;App&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;disconnected&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cbuuid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DDD101E2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5809&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1322&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FE7&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CAD62DC14121&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bundle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;com&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getqardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Qardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;reconnecting&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;N&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This response already gives us the &lt;em&gt;services&lt;/em&gt; part of GATT: &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;C8219E89&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;93E0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4169&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A3DC&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;EA7959E866AF&lt;/span&gt;&lt;/code&gt;. How can I tell that this UUID is the proprietary service UUID? Well, it’s 128 bits, and services standardised by the BT SIG use 16-bit UUIDs. Therefore, a long UUID is a proprietary service - generated by device’s manufacturers for their custom services.&lt;/p&gt;

&lt;p&gt;Other services will emerge from the GATT service discovery — more on that shortly.&lt;/p&gt;

&lt;p&gt;Another interesting query will be:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gnever&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;xREVENG3&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Desktop&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;service&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;qardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;txt&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;default&lt;/span&gt;	&lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;35.980330&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;Received&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;XPC&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;message&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;CBMsgIdPeripheralDiscoverServices&quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;session&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;com.getqardio.Qardio-central-791-158&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;debug&lt;/span&gt;	&lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;36.021058&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;Sending&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;XPC&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;message&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;CBMsgIdPeripheralServicesDiscovered&quot;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;session&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;com.getqardio.Qardio-central-791-158&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;default&lt;/span&gt;	&lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;36.021406&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;Received&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;XPC&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;message&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;CBMsgIdServiceDiscoverCharacteristics&quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;session&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;com.getqardio.Qardio-central-791-158&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;debug&lt;/span&gt;	&lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;36.022288&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;Sending&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;XPC&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;message&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;CBMsgIdServiceCharacteristicsDiscovered&quot;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;session&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;com.getqardio.Qardio-central-791-158&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;default&lt;/span&gt;	&lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;36.021586&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;Received&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;XPC&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;message&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;CBMsgIdServiceDiscoverCharacteristics&quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;session&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;com.getqardio.Qardio-central-791-158&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;debug&lt;/span&gt;	&lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;36.022939&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;Sending&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;XPC&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;message&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;CBMsgIdServiceCharacteristicsDiscovered&quot;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;session&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;com.getqardio.Qardio-central-791-158&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;default&lt;/span&gt;	&lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;36.022435&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;Received&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;XPC&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;message&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;CBMsgIdServiceDiscoverCharacteristics&quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;session&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;com.getqardio.Qardio-central-791-158&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;debug&lt;/span&gt;	&lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;36.027683&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;Sending&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;XPC&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;message&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;CBMsgIdServiceCharacteristicsDiscovered&quot;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;session&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;com.getqardio.Qardio-central-791-158&quot;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gnever&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;xREVENG3&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Desktop&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;When the app interrogates the device for services, &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt;&lt;/code&gt; responds (&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;ServicesDiscovered&lt;/span&gt;&lt;/code&gt;) and for each found service, the app sends requests to get the characteristics (&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;DiscoverCharacteristics&lt;/span&gt;&lt;/code&gt;) - &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt;&lt;/code&gt; responds with &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;CharacteristicsDiscovered&lt;/span&gt;&lt;/code&gt;. Three rounds of characteristics discovery imply three services.&lt;/p&gt;

&lt;p&gt;The only visible UUID is the one we found before.&lt;/p&gt;

&lt;p&gt;Time to dig into the characteristics. Let’s go with the most natural &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;grep&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gnever&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;xREVENG3&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Desktop&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;characteristic&quot;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;qardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;txt&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;default&lt;/span&gt;	&lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;36.028928&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;Received&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;XPC&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;message&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;CBMsgIdCharacteristicNotifyValue&quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;session&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;com.getqardio.Qardio-central-791-158&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;default&lt;/span&gt;	&lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;36.028996&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;Received&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;XPC&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;message&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;CBMsgIdCharacteristicNotifyValue&quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;session&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;com.getqardio.Qardio-central-791-158&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;default&lt;/span&gt;	&lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;36.028996&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;Received&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;XPC&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;message&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;CBMsgIdCharacteristicNotifyValue&quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;session&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;com.getqardio.Qardio-central-791-158&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;default&lt;/span&gt;	&lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;36.028996&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;Received&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;XPC&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;message&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;CBMsgIdCharacteristicNotifyValue&quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;session&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;com.getqardio.Qardio-central-791-158&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;default&lt;/span&gt;	&lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;36.029194&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;Received&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;XPC&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;message&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;CBMsgIdCharacteristicReadValue&quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;session&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;com.getqardio.Qardio-central-791-158&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;default&lt;/span&gt;	&lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;36.029215&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;Received&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;XPC&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;message&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;CBMsgIdCharacteristicReadValue&quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;session&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;com.getqardio.Qardio-central-791-158&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;default&lt;/span&gt;	&lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;36.029230&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;Received&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;XPC&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;message&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;CBMsgIdCharacteristicWriteValue&quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;session&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;com.getqardio.Qardio-central-791-158&quot;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gnever&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;xREVENG3&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Desktop&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;After the discovery phase, the app subscribes four characteristics for notifications (&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;NotifyValue&lt;/span&gt;&lt;/code&gt; four times); reads two characteristics (&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;ReadValue&lt;/span&gt;&lt;/code&gt; twice), and writes on one (&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;WriteValue&lt;/span&gt;&lt;/code&gt; - a single instance). This addresses question 5, about the directions of the data flow (namely - it’s bidirectional).&lt;/p&gt;

&lt;p&gt;The final step is obtaining the specific handles of the characteristics:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gnever&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;xREVENG3&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Desktop&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;subscribing\|reading value\|writing value&quot;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;qardiobase&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;only&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;txt&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;default&lt;/span&gt;	&lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;36.028965&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;Subscribing&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;updates&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;characteristic&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;handle&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x0019&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;on&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;device&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;DDD101E2-5809-1322-6FE7-CAD62DC14121&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;default&lt;/span&gt;	&lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;36.029011&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;Subscribing&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;updates&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;characteristic&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;handle&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x001c&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;on&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;device&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;DDD101E2-5809-1322-6FE7-CAD62DC14121&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;default&lt;/span&gt;	&lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;36.029028&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;Subscribing&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;updates&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;characteristic&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;handle&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x002d&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;on&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;device&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;DDD101E2-5809-1322-6FE7-CAD62DC14121&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;default&lt;/span&gt;	&lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;36.029169&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;Subscribing&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;updates&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;characteristic&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;handle&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x0030&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;on&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;device&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;DDD101E2-5809-1322-6FE7-CAD62DC14121&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;default&lt;/span&gt;	&lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;36.029206&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;Reading&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;characteristic&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;handle&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x000e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;char&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;handle&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x000d&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;on&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;device&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;DDD101E2-5809-1322-6FE7-CAD62DC14121&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;default&lt;/span&gt;	&lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;36.029222&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;Reading&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;characteristic&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;handle&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x000c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;char&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;handle&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x000b&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;on&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;device&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;DDD101E2-5809-1322-6FE7-CAD62DC14121&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;default&lt;/span&gt;	&lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;36.029267&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;Writing&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;response&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;characteristic&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;handle&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x002e&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;on&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;device&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;DDD101E2-5809-1322-6FE7-CAD62DC14121&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;default&lt;/span&gt;	&lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;38.832947&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;Writing&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;without&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;response&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;characteristic&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;handle&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x002e&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;on&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;device&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;DDD101E2-5809-1322-6FE7-CAD62DC14121&quot;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;default&lt;/span&gt;	&lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;54.916492&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;bluetoothd&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;Reading&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;characteristic&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;handle&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x0028&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;char&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;handle&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x0027&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;on&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;device&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;DDD101E2-5809-1322-6FE7-CAD62DC14121&quot;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gnever&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;xREVENG3&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Desktop&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Observe that &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;mh&quot;&gt;0x002e&lt;/span&gt;&lt;/code&gt; is written twice: the first time &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;response&lt;/span&gt;&lt;/code&gt; and then &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;without&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;response&lt;/span&gt;&lt;/code&gt;. Moreover, &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;mh&quot;&gt;0x0028&lt;/span&gt;&lt;/code&gt; is read way later - almost 20 seconds after the connection.&lt;/p&gt;

&lt;p&gt;Therefore, at the end of this phase, the table becomes:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Property&lt;/th&gt;
      &lt;th&gt;Value&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Device name&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;QardioBase&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Device UUID&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;DDD101E2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5809&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1322&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FE7&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CAD62DC14121&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Bluetooth version&lt;/td&gt;
      &lt;td&gt;4.1&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;BDA/MAC Address&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A3&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Proprietary Service UUID&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;C8219E89&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;93E0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4169&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A3DC&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;EA7959E866AF&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Communication&lt;/td&gt;
      &lt;td&gt;Bidirectional&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Characteristics&lt;/td&gt;
      &lt;td&gt;NotifyValue x4, &lt;br /&gt;ReadValue x2, &lt;br /&gt;WriteValue x1&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Notify characteristics&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;mh&quot;&gt;0x0019&lt;/span&gt;&lt;/code&gt;, &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;mh&quot;&gt;0x001c&lt;/span&gt;&lt;/code&gt;, &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;mh&quot;&gt;0x002d&lt;/span&gt;&lt;/code&gt;, &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;mh&quot;&gt;0x0030&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Read characteristics&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;mh&quot;&gt;0x000e&lt;/span&gt;&lt;/code&gt;, &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;mh&quot;&gt;0x000c&lt;/span&gt;&lt;/code&gt;, &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;mh&quot;&gt;0x0028&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Write characteristics&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;mh&quot;&gt;0x002e&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;… and we’re done with BLE. Now, the &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;wifid&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;

&lt;h4 id=&quot;wifid&quot;&gt;wifid&lt;/h4&gt;
&lt;p&gt;The first query - quite naive - is:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gnever&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;xREVENG3&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Desktop&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;qardio&quot;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;2nd Qardio.txt&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;wifid&lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt; &lt;span class=&quot;err&quot;&gt; &lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;debug&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;32.947741&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;runningboardd&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Sending&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;state&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0xb054475d0&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;com&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getqardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Qardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CE6D7FBD&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;90&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F3&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4114&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F4E&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D9080896142&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;osservice&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;com&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;apple&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;wifid&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;53&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;32.949071&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;wifid&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Received&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;state&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;update&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;791&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;com&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getqardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Qardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CE6D7FBD&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;90&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F3&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4114&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F4E&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D9080896142&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;running&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;active&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Visible&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;info&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;32.949251&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;wifid&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Update&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;delivered&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;com&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getqardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Qardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CE6D7FBD&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;90&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F3&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4114&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F4E&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D9080896142&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;791&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;taskState&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;debug&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;35.837357&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;runningboardd&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Sending&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;state&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0xb054459d0&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;com&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getqardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Qardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CE6D7FBD&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;90&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F3&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4114&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F4E&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D9080896142&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;osservice&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;com&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;apple&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;wifid&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;53&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;35.838378&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;wifid&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Received&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;state&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;update&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;791&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;com&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getqardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Qardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CE6D7FBD&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;90&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F3&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4114&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F4E&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D9080896142&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;running&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;active&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Visible&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;info&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;35.838505&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;wifid&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Update&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;delivered&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;com&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getqardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Qardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CE6D7FBD&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;90&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F3&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4114&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F4E&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D9080896142&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;791&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;taskState&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;50.441823&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;wifid&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WiFiDeviceManagerCatsSetLowLatencyApp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CATSUpdate&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;en0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fgApp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;com&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getqardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Qardio&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mh&quot;&gt;0x0&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rc&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;52.673213&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;wifid&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WiFiDeviceManagerCatsSetLowLatencyApp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CATSUpdate&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;en0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fgApp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;com&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getqardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Qardio&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mh&quot;&gt;0x0&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rc&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;debug&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;27&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;07.935585&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;runningboardd&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Sending&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;state&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0xb05444ee0&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;com&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getqardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Qardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CE6D7FBD&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;90&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F3&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4114&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F4E&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D9080896142&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;osservice&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;com&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;apple&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;wifid&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;53&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;27&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;07.936119&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;wifid&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Received&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;state&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;update&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;791&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;com&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getqardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Qardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CE6D7FBD&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;90&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F3&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4114&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F4E&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D9080896142&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;running&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;active&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Visible&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;info&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;27&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;07.936348&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;wifid&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Update&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;delivered&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;com&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getqardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Qardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CE6D7FBD&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;90&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F3&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4114&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F4E&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D9080896142&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;791&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;taskState&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;27&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;10.247198&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;wifid&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WiFiDeviceManagerCatsSetLowLatencyApp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CATSUpdate&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;en0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fgApp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;com&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getqardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Qardio&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mh&quot;&gt;0x0&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rc&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;debug&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;27&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;10.905860&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;runningboardd&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Sending&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;state&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0xb05447e90&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;com&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getqardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Qardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CE6D7FBD&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;90&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F3&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4114&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F4E&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D9080896142&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;osservice&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;com&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;apple&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;wifid&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;53&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;27&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;10.906356&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;wifid&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Received&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;state&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;update&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;791&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;com&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getqardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Qardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CE6D7FBD&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;90&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F3&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4114&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F4E&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D9080896142&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;running&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;active&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Visible&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;info&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;27&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;10.906620&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;wifid&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Update&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;delivered&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;com&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getqardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Qardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CE6D7FBD&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;90&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F3&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4114&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F4E&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D9080896142&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;791&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;taskState&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;27&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;11.840672&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;wifid&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WiFiDeviceManagerCatsSetLowLatencyApp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CATSUpdate&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;en0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fgApp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;com&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getqardio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Qardio&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mh&quot;&gt;0x0&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rc&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This per se confirms that the app has two lines of communication - BlueTooth and WiFi. Neat. &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;wifid&lt;/span&gt;&lt;/code&gt; knows that Qardio is in foreground (&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;running&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;active&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Visible&lt;/span&gt;&lt;/code&gt;, &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;taskState&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;/code&gt;) and gives it priority on the network itself (&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;CATSUpdate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LowLatencyApp&lt;/span&gt;&lt;/code&gt;), but there is no connection whatsoever shown here. A deeper analysis wouldn’t show anything special, at the &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;wifid&lt;/span&gt;&lt;/code&gt; level - at least, not now - so we move to the &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;Qardio&lt;/span&gt;&lt;/code&gt; entries.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Property&lt;/th&gt;
      &lt;th&gt;Value&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Device name&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;QardioBase&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Device UUID&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;DDD101E2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5809&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1322&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FE7&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CAD62DC14121&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Bluetooth version&lt;/td&gt;
      &lt;td&gt;4.1&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;BDA/MAC Address&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A3&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Proprietary Service UUID&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;C8219E89&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;93E0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4169&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A3DC&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;EA7959E866AF&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Communication&lt;/td&gt;
      &lt;td&gt;Bidirectional&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Notify characteristics&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;mh&quot;&gt;0x0019&lt;/span&gt;&lt;/code&gt;, &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;mh&quot;&gt;0x001c&lt;/span&gt;&lt;/code&gt;, &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;mh&quot;&gt;0x002d&lt;/span&gt;&lt;/code&gt;, &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;mh&quot;&gt;0x0030&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Read characteristics&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;mh&quot;&gt;0x000e&lt;/span&gt;&lt;/code&gt;, &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;mh&quot;&gt;0x000c&lt;/span&gt;&lt;/code&gt;, &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;mh&quot;&gt;0x0028&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Write characteristics&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;mh&quot;&gt;0x002e&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Communication media&lt;/td&gt;
      &lt;td&gt;BlueTooth, IP Connection&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h4 id=&quot;qardio&quot;&gt;Qardio&lt;/h4&gt;
&lt;p&gt;A deeper look into the &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;Qardio&lt;/span&gt;&lt;/code&gt; entries tells the rest of the story:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gnever&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;xREVENG3&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Desktop&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;tcp_disconnect\|nw_connection&quot;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;2nd Qardio.txt&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;iv&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;necp&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;head&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;20&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;info&lt;/span&gt;    &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;26.538347&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;Qardio&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;nw_connection_create_with_id&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C70&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;create&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;connection&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Hostname&lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;#d6701f48:443
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;info&lt;/span&gt;    &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;26.538652&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;Qardio&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;nw_connection_endpoint_report&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C70&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Hostname&lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;#d6701f48:443 waiting parent-flow (satisfied (Path is satisfied), interface: en0[802.11], ipv4, dns, uses wifi, LQM: good)]
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;26.538738&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;Qardio&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;nw_connection_report_state_with_handler_on_nw_queue&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C70&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;reporting&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;state&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;preparing&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;info&lt;/span&gt;    &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;26.600951&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;Qardio&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;nw_protocol_tcp_disconnect&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C70&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;1.1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;input&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;protocol&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;initiated&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;disconnect&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;26.601155&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;Qardio&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;nw_connection_report_state_with_handler_on_nw_queue&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C70&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;reporting&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;state&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cancelled&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;info&lt;/span&gt;    &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;26.601443&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0000&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;Qardio&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;nw_connection_create_with_id&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;C71&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;create&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;connection&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Hostname&lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;#d6701f48:443
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gnever&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;xREVENG3&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Desktop&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The WiFi path is perfectly healthy — &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;Path&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;satisfied&lt;/span&gt;&lt;/code&gt;, &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;LQM&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;good&lt;/span&gt;&lt;/code&gt;, &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;uses&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;wifi&lt;/span&gt;&lt;/code&gt;. The app is reaching out to a backend over HTTPS (port 443), hostname redacted by iOS. But every single connection goes straight from &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;preparing&lt;/span&gt;&lt;/code&gt; to &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;cancelled&lt;/span&gt;&lt;/code&gt;, and the app immediately retries — C69, C70, C71, and so on, for the entire duration of the session.&lt;/p&gt;

&lt;p&gt;The conclusion is straightforward: the Qardio backend is unreachable. The servers are gone. The company went bankrupt, and the lights went out. This also explains the save error we saw during the tests — the scale measured, the app tried to sync, and got nothing back.&lt;/p&gt;

&lt;p&gt;For our purposes, this is actually fine. We don’t need the backend — we just need the scale.&lt;/p&gt;

&lt;h2 id=&quot;conclusions&quot;&gt;Conclusions&lt;/h2&gt;
&lt;p&gt;Reversing rarely needs super-weapons. The whole exercise could have been done with a mint machine (no, no Linux Mint. Mint, as in fresh. Although I could have done this also with my Linux laptop, huh).&lt;/p&gt;

&lt;p&gt;This phase - which I led as a mix between forensics and discovery activities - is quite boring. Was it inconclusive? Kind of. I hoped that all data flew unredacted between the scale and the phone - but that’s reasonably impossible. Legal reasons, largely prevent this kind of things. Me, wishful thinking…&lt;/p&gt;

&lt;p&gt;The next step? well, I need that scale. Therefore I will reverse the app. What else?&lt;/p&gt;

&lt;p&gt;Obviously, this kind of activities is time consuming. The mantra still holds - I don’t publish because I must, I publish because I have something to say. It will take some time before you see the second part of this post - but as I said: I need a scale, therefore I will reverse that app. With time, indeed.&lt;/p&gt;

&lt;p&gt;I hope you enjoyed this, and that you got a glimpse into the modus operandi of a reverser.&lt;/p&gt;

&lt;p&gt;Have fun, reverse your sockets and socks, and be paranoid!&lt;/p&gt;</content><author><name>Gabriel Biondo</name></author><category term="security-reversing" /><category term="reverse-engineering" /><summary type="html">The Qardio app is gone, leaving the QardioBase2 scale a &quot;zombie.&quot; Follow my journey through iOS BLE logs, GATT discovery, and broken WiFi backends to bring this hardware back to life.</summary></entry><entry><title type="html">Bypassing MFA with Reverse Proxies: Building a Rust-based Firefox Extension to Kill AitM Phishing</title><link href="https://bytearchitect.io/network-security/Bypassing-MFA-with-Reverse-Proxies-Building-a-Rust-based-Firefox-Extension-to-Kill-AitM-Phishing/" rel="alternate" type="text/html" title="Bypassing MFA with Reverse Proxies: Building a Rust-based Firefox Extension to Kill AitM Phishing" /><published>2026-03-09T00:00:00+01:00</published><updated>2026-03-09T00:00:00+01:00</updated><id>https://bytearchitect.io/network-security/Bypassing-MFA-with-Reverse-Proxies-Building-a-Rust-based-Firefox-Extension-to-Kill-AitM-Phishing</id><content type="html" xml:base="https://bytearchitect.io/network-security/Bypassing-MFA-with-Reverse-Proxies-Building-a-Rust-based-Firefox-Extension-to-Kill-AitM-Phishing/">&lt;p&gt;&lt;em&gt;A couple of weeks ago, I described the Adversary in the Middle (AitM) family of attacks on this post: &lt;a href=&quot;https://bytearchitect.io/network-security/Starkiller-Phishing-Kit-Why-MFA-Fails-Against-Real-Time-Reverse-Proxies/&quot;&gt;Starkiller Phishing Kit: Why MFA Fails Against Real-Time Reverse Proxies&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Enticed by the structure of the attack itself, the first thing that came into my mind was: how can we protect a regular internet user? Someone who does not care about “threat agents” and “threat models”, but simply wants to use their machine to pay a parking ticket without giving the credentials of their bank to some weird guy three thousand kilometers away?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Here we go - I started my RustRover, and off I went coding.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;So, no macOS hardening today. It’ll be back soon.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;I always found the idea of writing an extension for a browser a challenge, because:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;I hate JavaScript. With a passion.&lt;/li&gt;
  &lt;li&gt;I tried several ones - very few have a real meaning.&lt;/li&gt;
  &lt;li&gt;In general, they enlarge attack surfaces.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nevertheless, with the idea of thwarting an attack aimed at an user that is culturally unprepared against it, and potentially unprotected, the only logical place where the protection could happen is the browser.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Obtorto collo&lt;/em&gt; I started reading some documentation. I discovered that the world of browsers is quite heterogeneous and there is nothing such as standards.&lt;/p&gt;

&lt;h3 id=&quot;firefox&quot;&gt;Firefox&lt;/h3&gt;
&lt;p&gt;To avoid the dispersion of my (very little amount, nowadays) resources, I decided to focus only on &lt;em&gt;one&lt;/em&gt; browser - the one I like the most: Firefox. The good news is that several other browsers I use (LibreWolf, Mullvad) are Firefox Based - so write once, run in many places. Good.&lt;/p&gt;

&lt;p&gt;I was tempted to support also Chrome and Safari.&lt;/p&gt;

&lt;p&gt;Firefox exposes more APIs than Chrome, including the access to &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;webRequest&lt;/span&gt;&lt;/code&gt;. With blocking. Turns out that Chrome has decommissioned this feature in MV3. MV3 is also where Chrome has removed the support for &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;webRequestBlocking&lt;/span&gt;&lt;/code&gt; which is - incidentally - what I plan to use to block requests. Finally, there’s the legend that Chrome developers have to fork over 5 bucks to Mountain View just to get started. I wasn’t in the mood to find out if it’s true.&lt;/p&gt;

&lt;p&gt;As for Safari - Safari is the outsider. I like it - I already said it a few times, but Apple does not make developer’s life easy. Believe me - they just don’t. Safari extensions must be distributed within the App Store, within a macOS app wrapper. Signed, notarised, Apple reviewed. For a free tool, that’s overkill. Several limitations on the API seal the deal - some API I planned to use may not be there. So… So the answer for Apple Users must be something else (which I am writing, but that’s material for another discussion).&lt;/p&gt;

&lt;h3 id=&quot;tba-lore---whats-in-a-name-electriceye&quot;&gt;TBA Lore - what’s in a name: ElectricEye&lt;/h3&gt;
&lt;p&gt;If you strolled for some time on this blog, you know that I often use Heavy Metal, Maths, or paradox references. It’s just a matter of avoid christening something like &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;exceptional&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;extension&lt;/span&gt;&lt;/code&gt; - which I find boring.&lt;/p&gt;

&lt;p&gt;My first two programs are named after a Black Sabbath and a Megadeth song. Aradia’s workflow is modeled after Mercyful Fate’s “Come to the Sabbath” lyrics. My cat’s name is Sabbath and no, I don’t use that name in my passwords, save your time.&lt;/p&gt;

&lt;p&gt;Long story short, this time was Judas Priest’s Electric Eye&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I’m made of metal&lt;br /&gt;
My circuits gleam&lt;br /&gt;
I am perpetual&lt;br /&gt;
I keep the country clean&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Hopefully this guy will keep “Zia Maria”’s transactions clean. And safe. While the attacker strives to be an invisible spy, &lt;strong&gt;EE&lt;/strong&gt; is the eye that peers deeper—spotting the proxy before it can ever touch Zia Maria’s data.&lt;/p&gt;
&lt;h2 id=&quot;technical-analysis&quot;&gt;Technical Analysis&lt;/h2&gt;

&lt;h3 id=&quot;the-blueprint---how-ee-works&quot;&gt;The blueprint - how EE works&lt;/h3&gt;
&lt;p&gt;First, and foremost, how it &lt;em&gt;does not&lt;/em&gt; work.&lt;/p&gt;

&lt;p&gt;I am not a fan of blacklist. They’re inherently broken. If IT Security has a mantra, it is “Kill ‘em all, let God sort them out”, or better “Block ‘em all, allow only few well-known good ones”.&lt;/p&gt;

&lt;p&gt;Blacklists are broken by design. While you strive to find all the domains in which I deploy my evil proxies, I spawn 5 more. 10 more. The only limit is the cost of buying them - but again: I saw domains available for $3…&lt;/p&gt;

&lt;p&gt;Long story short - a blacklist would be late. Always.&lt;/p&gt;

&lt;p&gt;There must be a better approach - and the better approach is always about &lt;em&gt;structure&lt;/em&gt;. The Nature of Things never lies.&lt;/p&gt;

&lt;p&gt;A web page works mainly at three levels: DNS, HTTP headers, DOM. There’s a fourth layer in the AitM attack: TLS. In each of these, the AitM leaves breadcrumbs that can be followed. Precious hints.&lt;/p&gt;

&lt;p&gt;Several independent layers that must converge to a precise set of circumstances to confirm an AitM. Miss one — no problem. Miss all of them? That’s your attacker.&lt;/p&gt;

&lt;h4 id=&quot;dns---the-url&quot;&gt;DNS - the URL&lt;/h4&gt;
&lt;p&gt;Here my analysis is quite simple:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;High entropy&lt;/strong&gt;: an algorithmically generated domain name such as &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;xk4f9q2m&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;evil&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;com&lt;/span&gt;&lt;/code&gt; have high entropy. Surely, way higher than &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;bancaintesa&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;it&lt;/span&gt;&lt;/code&gt; or &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;vodafone&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;co&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;uk&lt;/span&gt;&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Punycode / homograph&lt;/strong&gt;: &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;аrаdia&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;zone&lt;/span&gt;&lt;/code&gt; vs. &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;aradia&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;zone&lt;/span&gt;&lt;/code&gt;. Can you spot the difference? let’s look at the bytes:&lt;/li&gt;
&lt;/ul&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;String&lt;/th&gt;
      &lt;th&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;xxd&lt;/span&gt;&lt;/code&gt;&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;аrаdia&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;zone&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;mi&quot;&gt;00000000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d0b0&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;72&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d0&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b064&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;6961&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;2e7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f6e&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;65&lt;/span&gt;    &lt;span class=&quot;p&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dia&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;zone&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;aradia&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;zone&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;mi&quot;&gt;00000000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;6172&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;6164&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;6961&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;2e7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f6e&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;65&lt;/span&gt;         &lt;span class=&quot;n&quot;&gt;aradia&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;zone&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Good luck spotting out that thing only with your eyes.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Typosquatting&lt;/strong&gt;: a simpler variant of the homograph attack: &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;apple&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;com&lt;/span&gt;&lt;/code&gt; vs. &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;app1e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;com&lt;/span&gt;&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Subdomain anomalies&lt;/strong&gt;: &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;stats&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pure&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;evil&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;online&lt;/span&gt;&lt;/code&gt; - a subdomain that has nothing to do with the root domain.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;http-layer&quot;&gt;HTTP Layer&lt;/h3&gt;
&lt;p&gt;I am a pentester. Or I used to be that before I undertook “the way of the exploiting fist” - but the mindset is framed in blood. As a pentester, you first look at the structure of the HTTP header. If you don’t you’re not a nice guy.&lt;/p&gt;

&lt;p&gt;There’s a plethora of checks that one may wanna do to see “how secure” an HTTP transaction can be. Some apply, some don’t. The thing is - quite often also good people misconfigure their web servers, and I did not want to increase the level of noise.&lt;/p&gt;

&lt;p&gt;I went for a few choices. Simple ones:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Missing CSP&lt;/strong&gt;: A “Free-for-all” script injection. With no CSP, any browser will blindly trust whatever is loaded. A properly crafted CSP could prevent the browser from sending data to unauthorised domains, or loading external scripts required by the kit. If missing, the AitM proxy has a good time manipulating DOM and stealing cookies. Plus, no CSP (&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;frame&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ancestors&lt;/span&gt;&lt;/code&gt;) means that inserting an iframe is easy as stealing ZiaMaria’s cookies. Both Browser’s and cookies in the jar-oh!&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Missing HSTS&lt;/strong&gt;: HSTS (HTTP Strict Transport Security) is what protects from Downgrade Attacks (or SSL Stripping), and session hijacking. Zia Maria would end up sending her data over unencrypted media. No-no!&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Proxy headers&lt;/strong&gt; - such as &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Forwarded&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;For&lt;/span&gt;&lt;/code&gt;, &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;Via&lt;/span&gt;&lt;/code&gt;, &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Real&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IP&lt;/span&gt;&lt;/code&gt;. Proxy breadcrumbs. Fingerprints. Call ‘em whatever.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;tls-layer&quot;&gt;TLS Layer&lt;/h3&gt;
&lt;p&gt;TLS is where things get interesting.&lt;/p&gt;

&lt;p&gt;An AitM proxy sits between you and the server. This means two separate TLS handshakes: one with the victim, one with the legitimate server. The proxy negotiates both — and it negotiates them with its own capabilities, not the server’s. This leaves traces.&lt;/p&gt;

&lt;p&gt;The most reliable signal I implemented is certificate age. AitM kits are opportunistic by nature — domains are bought, Let’s Encrypt certificates are generated, the kit is deployed. Fast. The whole infrastructure can be up in hours. A certificate that is less than 72 hours old on a domain claiming to be your bank is… suspicious. Very.&lt;/p&gt;

&lt;p&gt;Is a fresh certificate a definitive proof of an AitM? No. Legitimate services rotate certificates too: ChatGPT scored a borderline 0.45 in my tests for exactly this reason. But combined with other signals, it becomes a meaningful contribution to the overall risk score.&lt;/p&gt;

&lt;p&gt;The other theoretical signals: CA anomalies, cipher suite mismatches, TLS version downgrade. These are on the roadmap. For now, certificate age does the heavy lifting.&lt;/p&gt;

&lt;h3 id=&quot;dom-layer&quot;&gt;DOM Layer&lt;/h3&gt;
&lt;p&gt;This is the one that seals the deal.&lt;/p&gt;

&lt;p&gt;DNS, HTTP headers, TLS. All useful signals. But a well-configured AitM proxy can get most of them right. Strip the proxy headers, use a aged domain, forward the security headers. Sophisticated kits do exactly that.&lt;/p&gt;

&lt;p&gt;The DOM, however, is harder to fake.&lt;/p&gt;

&lt;p&gt;Evilginx, and most AitM kits for what matters, work by proxying the legitimate site in real time. The HTML comes from the real server, gets modified on the fly, and is served to the victim. The problem is that rewriting every single URL in the DOM is hard. Expensive. Error-prone. Most kits don’t bother, or better, don’t bother completely.&lt;/p&gt;

&lt;p&gt;The result? The browser is on &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;stats&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pure&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;evil&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;online&lt;/span&gt;&lt;/code&gt;. But the DOM is full of references to &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;aradia&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;zone&lt;/span&gt;&lt;/code&gt;. Links, form actions, canonical tags, &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;og&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;url&lt;/span&gt;&lt;/code&gt;. The real domain bleeds through.&lt;/p&gt;

&lt;p&gt;Electric Eye’s content script scans the DOM continuously — with a &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;MutationObserver&lt;/span&gt;&lt;/code&gt;, throttled at 500ms to avoid killing performance. When the ratio of links pointing to a different domain crosses a threshold, &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;DomainMismatch&lt;/span&gt;&lt;/code&gt; fires. Weight: &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;mf&quot;&gt;0.50&lt;/span&gt;&lt;/code&gt;. Confidence: proportional to the ratio.&lt;/p&gt;

&lt;p&gt;On a clean site — Repubblica, Google, Apple — this signal never fires. On &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;stats&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pure&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;evil&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;online&lt;/span&gt;&lt;/code&gt; proxying &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;aradia&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;zone&lt;/span&gt;&lt;/code&gt; — it fires immediately. Combined with the other signals, the score hits 1.00. Critical. Hold your horses!&lt;/p&gt;

&lt;h3 id=&quot;risk-scoring&quot;&gt;Risk scoring&lt;/h3&gt;
&lt;p&gt;Aradia, EE, and Unveiler (yet to come, but you’ll hear this name quite soon) mechanism is quite easy: events rise signals. Signals are modelled into numbers. Numbers become risk ratios. Risk ratios become decision rationale.&lt;/p&gt;

&lt;p&gt;I deliberately avoided to bluntly block suspicious connections. I just decided to have a popup telling you a risk ratio. And if you’re not colorblind nor dyscalculic (which I am, by the way. Dyscalculic, I mean), you can decide if proceeding on navigation or doing your banking differently.&lt;/p&gt;

&lt;p&gt;The model is not complex. It is a simple multiplicative model with corrections, because additive models tend to amplify background noises. Easy Peasy.&lt;/p&gt;

&lt;p&gt;If risk is usually modelled as &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;likelihood&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;×&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;impact&lt;/span&gt;&lt;/code&gt;, here I decided to model risk factor as &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;weight&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;×&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;confidence&lt;/span&gt;&lt;/code&gt;. For now, the model holds.&lt;/p&gt;

&lt;h2 id=&quot;lets-oxidate-their-gluteus-maximus&quot;&gt;Let’s oxidate their &lt;em&gt;gluteus maximus&lt;/em&gt;!&lt;/h2&gt;
&lt;p&gt;Rust.&lt;/p&gt;

&lt;p&gt;No discussion. The engine had to be written in a serious language that compiles into WASM. I could do C++ but I tend to avoid it, lately. Traumatised by its string management, despite the improvements in the latest versions.&lt;/p&gt;

&lt;p&gt;JavaScript was not a choice. Sure as death and taxes, it’d enlarge the attack surface. No-no.&lt;/p&gt;

&lt;p&gt;Engine written in pure Rust. No frills, no weird unsafe stuff. Pure Rust. And it works fine.&lt;/p&gt;

&lt;p&gt;There is some JavaScript, indeed. The glue I needed to pass data to WASM. That’s what JS is for. Someone said that “tongue is that sexual organ that some perverts use to talk”. Likewise, JS is that glueish language that some perverts use to program.&lt;/p&gt;

&lt;h2 id=&quot;demo-ish&quot;&gt;Demo-ish&lt;/h2&gt;
&lt;p&gt;I plan to do a video with this, unfortunately 1 minute of video requires 10 minutes of takes and this is a low-priority task for me.&lt;/p&gt;

&lt;p&gt;I hope you can appreciate the efforts nevertheless.&lt;/p&gt;

&lt;p&gt;On a “normal” website, EE works almost transparently. See the images below, for instance.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/AITMabout-debugging.png&quot; alt=&quot;About:Debugging&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Has a meaning: there is no data here. Let’s see something more complex - my websites:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/AITM_TBA.png&quot; alt=&quot;bytearchitect.io&quot; /&gt;&lt;/p&gt;

&lt;p&gt;and:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/AITM_ARADIA.png&quot; alt=&quot;aradia.zone&quot; /&gt;&lt;/p&gt;

&lt;p&gt;These show that cobbler’s children are the worst shod. I am complaining about a CSP I don’t put in my websites. What a dork I am.&lt;/p&gt;

&lt;p&gt;But these values are good. Take for instance also&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/AITM_APPLE.png&quot; alt=&quot;apple.com&quot; /&gt;&lt;/p&gt;

&lt;p&gt;or&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/AITM_PAYPAL.png&quot; alt=&quot;paypal.com&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Then, let’s be mean. I spun up a VPS and configured it like this:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ssh root@&lt;span class=&quot;nv&quot;&gt;$VPS_IP&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; ~/evilginx2
./build/evilginx &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; phishlets/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;and from there:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;config&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;domain&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pure&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;evil&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;online&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;config&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ipv4&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;VPS_IP&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;phishlets&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hostname&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;aradia&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pure&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;evil&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;online&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;phishlets&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;enable&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;aradia&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;lures&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;create&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;aradia&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;lures&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now let’s assume that Zia Maria wants my SWAF (SwampWAF) and receives a phishy email steering her to a malicious domain. That’s what EE could do for her:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/ARADIA_AITM_OK.png&quot; alt=&quot;Aradia 1&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/ARADIA_AITM_OK_1.png&quot; alt=&quot;Aradia 2&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/ARADIA_AITM_OK_2.png&quot; alt=&quot;Aradia 3&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You can see a slight discrepancy between the values (the first one is lower). That’s the magic of DOM analysis: the higher the number of links in the page, the higher the chance that some of them are not rewritten. And - BANG! - I spot you out!&lt;/p&gt;

&lt;p&gt;There is a grey area - I am still working on it. Take Amazon:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/AITM_AMAZON.png&quot; alt=&quot;Amazon&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Here signals are/can be quite misleading:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;High entropy&lt;/strong&gt;: &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;amazon&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;com&lt;/span&gt;&lt;/code&gt; has a very low entropy, but the guys spin up subdomains and dynamically generated URLs. A real nightmare.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;CSP/HSTS missing&lt;/strong&gt;: Cobbler’s children, again.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;ProxyHeaderDetected&lt;/span&gt;&lt;/code&gt;&lt;/strong&gt; - dominating factor. Blame mr. CloudFront.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As I said, this is something I am still working on. A neater model.&lt;/p&gt;
&lt;h2 id=&quot;current-status&quot;&gt;Current status&lt;/h2&gt;
&lt;p&gt;&lt;del&gt;I submitted the first version to the Mozilla Add-ons store. I am totally unaware of Mozilla’s timelines — but in general, it takes a week or so for an extension to be approved. I don’t expect Mozilla to be any faster.&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;&lt;del&gt;As soon as it’s out, I’ll post the link. In the meantime, if you want to play with it, write me at &lt;a href=&quot;mailto:hello@aradia.zone&quot;&gt;hello@aradia.zone&lt;/a&gt; and I’ll send you a copy directly. Spamming a hacker is not a very smart move in a world made of technology. Just saying — to wake up the hamster in your head.&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;Here the download link:
https://addons.mozilla.org/en-US/firefox/addon/electric-eye/&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Electric Eye is not a silver bullet. No tool is.&lt;/p&gt;

&lt;p&gt;What it is, is a different approach. Instead of chasing domains and updating blacklists, it looks at behaviour. At structure. At the things that an AitM proxy cannot easily hide — because hiding them means breaking the attack itself.&lt;/p&gt;

&lt;p&gt;The false positive rate is low. The true positive rate, against a real Evilginx deployment, is 1.00. That’s not a coincidence — that’s the DOM bleeding through.&lt;/p&gt;

&lt;p&gt;There is work still to do. The CDN grey area needs a neater model. The TLS signals are partially roadmap. And a video demo is coming — eventually, when I find 10 consecutive minutes of patience.&lt;/p&gt;

&lt;p&gt;But Zia Maria is already safer than she was last week. And that’s enough for now.&lt;/p&gt;

&lt;h2 id=&quot;more-is-coming-stay-paranoid-have-fun-and-keep-your-horses-held&quot;&gt;More is coming. Stay paranoid, have fun… and keep your horses held!&lt;/h2&gt;</content><author><name>Gabriel Biondo</name></author><category term="network-security" /><category term="aradia" /><category term="Electric-Eye" /><category term="Rust" /><summary type="html">MFA is not enough. Discover Electric Eye: a Rust-powered Firefox extension that detects AitM proxies and Reverse Proxies in real-time by sniffing DOM leaks and HTTP headers. Stay paranoid.</summary></entry><entry><title type="html">Hardening macOS 5: Secure Email Clients, Providers, and Encryption Tools</title><link href="https://bytearchitect.io/macos-security/MacOS-Hardening-6-email-and-pgp/" rel="alternate" type="text/html" title="Hardening macOS 5: Secure Email Clients, Providers, and Encryption Tools" /><published>2026-03-02T00:00:00+01:00</published><updated>2026-03-02T00:00:00+01:00</updated><id>https://bytearchitect.io/macos-security/MacOS-Hardening-6-email-and-pgp</id><content type="html" xml:base="https://bytearchitect.io/macos-security/MacOS-Hardening-6-email-and-pgp/">&lt;p&gt;&lt;em&gt;Last week I didn’t release any post on hardening macOS — sorry about that. I thought my witchcraft with network security was over; reality shows I was wrong. This AitM stuff drains my time, and I’m not the guy who releases weak stuff.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you’re curious: I’m about to release a browser extension for all major platforms — Chromium, Firefox, and Safari — to help protect users. Mid or end of March 2026.&lt;/em&gt;&lt;/p&gt;

&lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;_Apart from that: today we talk communications. For a Cy[b&lt;/td&gt;
      &lt;td&gt;ph]erpunk like myself, talking about communications is walking on eggshells. The risks are being too verbose and being too opinionated. If there’s anything like “talking politics at the pub” within the security scene, well — talking about communications is a great way to start a fight. And no, I don’t want to do politics._&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;&lt;em&gt;So this will be a weird post. I’m telling you upfront.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;previous-posts-on-this-series&quot;&gt;Previous posts on this series&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://bytearchitect.io/macos-security/macOS-Hardening-a-new-series/&quot;&gt;macOS Hardening: a new series&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://bytearchitect.io/macos-security/First-hardening-of-the-network-layer/&quot;&gt;First hardening of the network layer&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://bytearchitect.io/macos-security/Hardening-macOS-pt.3-Browsers/&quot;&gt;Hardening macOS pt.3: Browsers compartmentalisation&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://bytearchitect.io/macos-security/Hardening-macOS-pt.4-Secrets-management/&quot;&gt;Hardening macOS 4: Secrets Management &amp;amp; Hardware Security Keys&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;the-postman-always-reads-twice&quot;&gt;The postman always reads twice&lt;/h2&gt;
&lt;p&gt;Before we talk about tools, let’s establish something uncomfortable: email was never designed to be private. It was designed to be delivered. The privacy part was an afterthought — and it shows.&lt;/p&gt;

&lt;p&gt;When you send an email, it hops between servers. Each hop is an opportunity. Your client sends it to your provider’s server. Your provider’s server talks to the recipient’s provider’s server. The recipient’s client picks it up. At each step, someone with access to those servers can read your message. Whether they do is a matter of policy, law, and opportunity — none of which you control.&lt;/p&gt;

&lt;p&gt;This is not paranoia. This is how SMTP works. It has worked this way since 1982.&lt;/p&gt;

&lt;p&gt;With that cheerful thought in mind, let’s talk about your options.&lt;/p&gt;

&lt;h3 id=&quot;email-clients-the-tool-you-actually-touch&quot;&gt;Email clients: the tool you actually touch&lt;/h3&gt;
&lt;p&gt;Your email client is the interface between you and your messages. It doesn’t determine who can read your email on the server side — that’s your provider’s job — but it determines how you interact with your mail, whether encryption is practical, and whether you’ll actually use it.&lt;/p&gt;

&lt;p&gt;The main contenders on macOS:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Client&lt;/th&gt;
      &lt;th&gt;Platform&lt;/th&gt;
      &lt;th&gt;GPG support&lt;/th&gt;
      &lt;th&gt;Cost&lt;/th&gt;
      &lt;th&gt;Notes&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Apple Mail&lt;/td&gt;
      &lt;td&gt;macOS/iOS&lt;/td&gt;
      &lt;td&gt;Plugin required (paid)&lt;/td&gt;
      &lt;td&gt;Free&lt;/td&gt;
      &lt;td&gt;Excellent UX, deep Apple integration&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Canary Mail&lt;/td&gt;
      &lt;td&gt;macOS/iOS&lt;/td&gt;
      &lt;td&gt;Native, free&lt;/td&gt;
      &lt;td&gt;Free/Pro&lt;/td&gt;
      &lt;td&gt;Apple Mail-like experience, my choice&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Thunderbird&lt;/td&gt;
      &lt;td&gt;Linux/macOS/Windows&lt;/td&gt;
      &lt;td&gt;Native&lt;/td&gt;
      &lt;td&gt;Free&lt;/td&gt;
      &lt;td&gt;Solid, cross-platform, telemetry uninspected&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Outlook&lt;/td&gt;
      &lt;td&gt;macOS/Windows&lt;/td&gt;
      &lt;td&gt;Supported&lt;/td&gt;
      &lt;td&gt;Microsoft 365&lt;/td&gt;
      &lt;td&gt;Good on Windows, loses context on Mac&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;&lt;strong&gt;Apple Mail&lt;/strong&gt; is the obvious choice for most Apple users. The experience is excellent, the integration with the rest of your devices is seamless, and it does everything you’d expect. The only limitation worth mentioning: GPG support requires a paid plugin. If you don’t need GPG, this isn’t a limitation at all — it’s probably the right choice for you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Thunderbird&lt;/strong&gt; I used it for years. It’s solid, open source, cross-platform, and handles GPG natively. I’ll be honest: I’ve never properly audited its telemetry, which is a gap I’m not proud of. But if you’re on Linux — which, if you’re running a pentest setup on Arch, you are — Thunderbird is your realistic option. Not because it’s perfect, but because it works and nothing else competes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Outlook&lt;/strong&gt; deserves a more nuanced take than it usually gets. On Windows, in a Microsoft-heavy environment, it’s genuinely good. It works. The GPG support exists, even if it was cumbersome for a while. On Mac, it’s a nice-looking application that makes less sense the more you think about it. The G-Suite and other cross-platform alternatives exist. The Outlook mobile apps on iOS and Android are mediocre. And if you’re honest with yourself, you probably end up using webmail anyway. Good, but you have to want it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Canary Mail&lt;/strong&gt; is my choice. It looks and feels like Apple Mail, supports encryption natively without extra cost, and works consistently across macOS and iOS. The reason I didn’t choose Apple Mail is simple: when I made my decision, I wanted GPG support without paying extra. Canary gave me that. It’s not a dramatic choice — it’s a pragmatic one.&lt;/p&gt;

&lt;p&gt;A note on multi-platform setups: if you run macOS and Linux, as I do, you’ll end up with Canary on the Mac and Thunderbird on Linux. Not because one is better — because that’s what the ecosystem gives you.&lt;/p&gt;

&lt;h3 id=&quot;email-providers-the-contract-you-sign-with-your-data&quot;&gt;Email providers: the contract you sign with your data&lt;/h3&gt;
&lt;p&gt;Your client is the tool. Your provider is the contract. You can have the most privacy-conscious client in existence, but if your provider reads your email on the server side, you’re decorating a glass room.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Google&lt;/strong&gt; has built one of the most impressive productivity suites in existence. The engineering is genuine, the tools are excellent, and some of the third-party integrations built on top of G-Suite are genuinely clever. I have a Gmail account. Several, actually. Like most people.&lt;/p&gt;

&lt;p&gt;The trade-off is equally genuine: Google knows everything about you. Everything. Your email, your calendar, your location, your searches, your documents. They are an American company, subject to the Patriot Act — which means a government request for your data doesn’t require your knowledge or consent. This isn’t conspiracy theory. It’s US law. Choose accordingly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Microsoft&lt;/strong&gt; makes excellent software. Office is a formidable suite. VSCode is one of the best editors available — and it’s free, which is almost suspicious. F# is a beautiful language. The list goes on.&lt;/p&gt;

&lt;p&gt;As an email provider, however, my answer is no. Years ago, Microsoft accessed an employee’s mailbox before terminating them — a move that, regardless of scale, said something about the culture. Setting up a Microsoft 365 organisation is an exercise in patience that borders on self-harm. And the American jurisdiction problem applies here too, in full.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Apple&lt;/strong&gt; tries harder than the other two on privacy, and the effort is visible. Hide My Email is a genuinely useful feature — the idea of generating disposable aliases to protect your real address is sound practice. The execution, however, has limits: five aliases only, and — the detail that stings — disabling an alias doesn’t stop mail from arriving on it. For serious compartmentalisation, five aliases isn’t enough. For casual use, it’s fine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Proton&lt;/strong&gt; is based in Switzerland. The Swiss jurisdiction is not subject to the Patriot Act, and Proton has fought legal battles to protect user data. Client-side encryption means that Proton, technically, cannot read your email — the decryption happens on your device. It has grown into a full ecosystem: mail, VPN, calendar, drive, password manager. The VPN, if you’re on a higher tier, is among the best available.&lt;/p&gt;

&lt;p&gt;The downside: Proton will charge you for anything beyond the basics, and the tiers escalate quickly. It’s not free if you want to use it seriously. Dear Patriot Act — not today.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tuta&lt;/strong&gt; is German. Hannover, specifically — subject to GDPR and German privacy law, which goes further than most. Like Proton, it offers client-side encryption. Unlike Proton, it is uncompromising to the point of being brutal: lose your recovery key, lose everything. No reset. No support ticket that saves you. This is a feature, not a bug — but it requires that you know what you’re doing. If you’ve read this far in this series, you probably do.&lt;/p&gt;

&lt;p&gt;&lt;del&gt;&lt;strong&gt;Note to self&lt;/strong&gt;: &lt;em&gt;being so nice to everyone will bring me a slow, painful death&lt;/em&gt;.&lt;/del&gt;
&lt;strong&gt;Note for the reader&lt;/strong&gt;: &lt;em&gt;As you may see, I tried to supply you with a factual and non-opinionated review of the main email providers out there. &lt;del&gt;Nothing new, but how can someone write anything new when trying to be nice to the world?&lt;/del&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h4 id=&quot;what-i-plan-to-do&quot;&gt;What I plan to do&lt;/h4&gt;
&lt;p&gt;When I find some time, I will spin up a VPS on 1984.hosting. Put a serious OpenBSD box. An even serious-er MTA. Send all logs to &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dev&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;null&lt;/span&gt;&lt;/code&gt;. And forget about all this.&lt;/p&gt;

&lt;h3 id=&quot;a-note-for-my-italian-readers&quot;&gt;A note for my Italian readers&lt;/h3&gt;
&lt;p&gt;Italy has a thing called &lt;strong&gt;PEC&lt;/strong&gt; — &lt;em&gt;Posta Elettronica Certificata&lt;/em&gt;, or Certified Electronic Mail. It sounds serious. It has “certified” in the name. The government made it mandatory for professionals, businesses, and public administration. You pay for it annually. There are accredited providers. There are regulations. There are audits. There is an entire bureaucratic ecosystem built around it.&lt;/p&gt;

&lt;p&gt;&lt;del&gt;That is the theory. In practical terms, after years of Italian-ity, this is my reading: cousinocracy. In Italy, the cousin is a deity-like character. You write superb websites and want to be paid accordingly? Your customers will always have a cousin who does the same for half the price. You’re a great electrician? Well, your customer’s cousin is surely better than you. And when it comes to politics — sorry to say it bluntly, but blunt I am — politicians usually do favours for their &lt;em&gt;cousins&lt;/em&gt;. Perhaps because they owe them a lot. Like their seat.&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;What does it actually do? It certifies that your email was delivered. That’s it. The content travels in plaintext. No encryption. No integrity protection. No confidentiality whatsoever. It’s a glorified read receipt — the digital equivalent of sending a letter via registered post, except the postman can read everything inside, photocopy it, and nobody considers this a problem.&lt;/p&gt;

&lt;p&gt;Meanwhile, PGP has been freely available since 1991. It actually encrypts your content. It works internationally. It costs nothing. Phil Zimmermann almost went to prison for releasing it, because governments understood that real encryption was a threat to their ability to snoop. Italy looked at all of this, looked at decades of cryptographic progress, and decided: &lt;em&gt;no thanks. We’ll build our own thing, make it mandatory by law, hand the market to a handful of accredited providers, and call it security.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The result is a system that protects nobody’s privacy, generates revenue for a cosy oligopoly of providers, and gives Italian professionals the warm feeling of compliance without any of the actual security. Brilliant, really. In the most depressing way possible.&lt;/p&gt;

&lt;p&gt;If you ever needed a textbook example of security theater institutionalised by law, &lt;em&gt;benvenuti in Italia&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;For what it’s worth: find the cheapest provider. They all do the same nothing.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;pgp-the-standard-nobody-loves-and-everyone-uses&quot;&gt;PGP: the standard nobody loves and everyone uses&lt;/h2&gt;
&lt;p&gt;PGP — Pretty Good Privacy — has been the de facto standard for email encryption since 1991. It’s not the most elegant solution. The key management is arcane, the web of trust is effectively dead, and the user experience hasn’t aged particularly well. But it works, it’s interoperable, and — crucially — it’s what your counterpart probably supports, if they support anything at all.&lt;/p&gt;

&lt;p&gt;In practice, PGP gives you two tools: encryption and signing. Encryption hides the content of your message from anyone without the recipient’s private key. Signing proves that the message came from you and hasn’t been tampered with. They are different operations, and you don’t always need both.&lt;/p&gt;

&lt;p&gt;A word on using them: resist the temptation to encrypt and sign everything by default. It sounds like the maximally secure approach, but in practice it means entering your passphrase on every message. Which means either a weak passphrase — because you’re entering it fifty times a day — or a saved passphrase somewhere that isn’t your password manager. Neither is what you want. Use encryption and signing when they matter. That’s what they’re for.&lt;/p&gt;

&lt;p&gt;Canary Mail, for what it’s worth, handles this well — it asks you explicitly what you want to do with each message, on both macOS and iOS. That pain is a feature.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Are there better alternatives?&lt;/strong&gt; Technically, yes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Age&lt;/strong&gt; is a modern encryption tool — simpler, cleaner, better algorithms. But it’s designed for files and data, not email. No equivalent ecosystem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;S/MIME&lt;/strong&gt; is the enterprise alternative — certificate-based rather than web-of-trust-based, better integrated into corporate email clients. Requires a CA, costs money, and is more closed than PGP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Signal Protocol&lt;/strong&gt; is cryptographically superior for messaging — perfect forward secrecy, double ratchet algorithm. But it’s for chat, not email.&lt;/p&gt;

&lt;p&gt;The honest answer: PGP is the standard not because it’s the best, but because it’s the one your counterpart might actually have. In encryption, as in so many things, interoperability beats theoretical perfection.&lt;/p&gt;

&lt;h2 id=&quot;chat-you-dont-choose-your-app--your-contacts-do&quot;&gt;Chat: you don’t choose your app — your contacts do&lt;/h2&gt;
&lt;p&gt;I’ll be honest: I’m not a chat person. Chat is an invasion. It’s an abuse of your time, dressed up as convenience. If you DM me, don’t expect a prompt answer. Or a kind one. But I will answer.&lt;/p&gt;

&lt;p&gt;With that established: the landscape is what it is.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Signal&lt;/strong&gt; is the pragmatic choice. End-to-end encrypted by default, open source, audited, minimal metadata collection. The Signal Protocol is genuinely good cryptography. The usability is acceptable. Enough people use it to make it useful — which, in secure messaging, is the critical variable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WhatsApp&lt;/strong&gt; is end-to-end encrypted, technically. It also belongs to Meta, which has demonstrated, repeatedly and comprehensively, that your privacy is not the product they’re selling — you are. The encryption protects the content in transit. The metadata, the social graph, the usage patterns — those are a totally different matter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Telegram&lt;/strong&gt; has a reputation for privacy that significantly exceeds its actual privacy properties. Standard chats are not end-to-end encrypted — they’re encrypted in transit, stored on Telegram’s servers. Only “Secret Chats” are end-to-end encrypted, and most people never use them. The recent legal troubles of its founder add context that each reader can weigh for themselves.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SimpleX Chat&lt;/strong&gt; is, technically, the best answer in this space. No user identifiers — no phone number, no username. Decentralised. You can run your own relay server. Metadata minimisation that takes the problem seriously. Audited and open source. I mention it in my manual as the right answer to the question nobody around you is asking. I use it. So does one other person I know.&lt;/p&gt;

&lt;p&gt;This is the fundamental problem with secure messaging: it requires both parties to participate. You can make the right choice and find yourself talking to nobody. The most secure messaging app in the world is useless if your contacts are on WhatsApp.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The times of Messenger are over. The fragmentation is total. Pick Signal for the people who’ll use it, and make your peace with the rest.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Next time, we go deeper — and further from the keyboard. No tools, no configurations, no checklists. Just behaviour. The human factor is the one layer no software can harden for you, and the one layer most guides conveniently ignore.&lt;/p&gt;

&lt;p&gt;Until then: stay paranoid, but have fun.&lt;/p&gt;</content><author><name>Gabriel Biondo</name></author><category term="macos-security" /><category term="macos-hardening" /><summary type="html">Is email privacy a myth? From PGP and SMTP risks to why Italy’s PEC is just security landscape. A cynical guide to choosing the right providers, clients, and chat apps.</summary></entry><entry><title type="html">Starkiller Phishing Kit: Why MFA Fails Against Real-Time Reverse Proxies</title><link href="https://bytearchitect.io/network-security/Starkiller-Phishing-Kit-Why-MFA-Fails-Against-Real-Time-Reverse-Proxies/" rel="alternate" type="text/html" title="Starkiller Phishing Kit: Why MFA Fails Against Real-Time Reverse Proxies" /><published>2026-02-24T00:00:00+01:00</published><updated>2026-02-24T00:00:00+01:00</updated><id>https://bytearchitect.io/network-security/Starkiller-Phishing-Kit-Why-MFA-Fails-Against-Real-Time-Reverse-Proxies</id><content type="html" xml:base="https://bytearchitect.io/network-security/Starkiller-Phishing-Kit-Why-MFA-Fails-Against-Real-Time-Reverse-Proxies/">&lt;p&gt;&lt;em&gt;Sorry, no Hardening macOS this week.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I actually wanted to, but my attention was caught on something else, somehow more urgent. Originally I wanted to limit this blog to Apple and BSD-related contents, but this attack deserves all my attention for a simple reason:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;IT IS BEAUTIFUL&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;*As much as I despise cybercriminals, I think that these mofos are really what pushes the Internet forward.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;And when an attack is well crafted,&lt;/em&gt; chapeau!&lt;em&gt;, let’s admit it!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Don’t worry, Hardening (and also Reversing 101) will come back next week!&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;This week, &lt;a href=&quot;https://www.darkreading.com/threat-intelligence/starkiller-phishing-kit-mfa&quot;&gt;Dark Reading reported&lt;/a&gt; on a phishing-as-a-service platform called &lt;strong&gt;Starkiller&lt;/strong&gt;, disclosed by researchers at &lt;a href=&quot;https://abnormal.ai/blog/starkiller-phishing-kit&quot;&gt;Abnormal AI&lt;/a&gt;. Krebs &lt;a href=&quot;https://krebsonsecurity.com/2026/02/starkiller-phishing-service-proxies-real-login-pages-mfa/&quot;&gt;picked it up too&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you haven’t read the article, go read it. I’ll wait.&lt;/p&gt;

&lt;p&gt;Done? Good. Now let me tell you why this thing kept me up past my usual 3:30 AM. If you haven’t, fear not - I’ll fill you in.&lt;/p&gt;

&lt;p&gt;The new kid in town is actually a new generation of phishing-as-a-service (PaaS) platforms. This new kid has radically changed the phishing threat model (finally, I’d say. It was sooo 90ish using “Employee security training” as the panacea for everything… but they won’t learn): these platforms do not create fake login pages - they actually &lt;strong&gt;proxy the real ones&lt;/strong&gt; in real time. Aim’s capturing credentials, MFA tokens, session cookies - the whole landscape of boring things. What makes this different is the flow: the user authenticates for real, and credentials are stolen in transit, contextually, as the session happens.&lt;/p&gt;

&lt;p&gt;Traditional defences such as domain blacklisting, static page analysis, and obviously MFA pathetically fail to AitM (which, by the way, means Adversary in the Middle. Because the Man in the Middle was not an adversary, clearly…).&lt;/p&gt;

&lt;p&gt;Let’s not panic, anyway. We know there’s no perfect defence… but there’s no perfect attack either.&lt;/p&gt;
&lt;h2 id=&quot;technical-analysis&quot;&gt;Technical Analysis&lt;/h2&gt;

&lt;h3 id=&quot;the-old-phashioned-phishing&quot;&gt;The &lt;em&gt;old-phashioned&lt;/em&gt; phishing&lt;/h3&gt;
&lt;p&gt;The usual way to mount a phishing attack was kind of boring: the attacker created a static HTML page, a clone of the actual login page. The user then enters credentials, which are captured. Later on, the credentials get replayed.&lt;/p&gt;

&lt;p&gt;It goes without saying that here MFA constitutes a great defence.&lt;/p&gt;

&lt;p&gt;These cloned pages go stale quickly, look imperfect, and are easily fingerprinted by security vendors.&lt;/p&gt;

&lt;h3 id=&quot;the-new-way&quot;&gt;The New Way&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;The attacker&lt;/strong&gt; runs a &lt;strong&gt;reverse proxy&lt;/strong&gt;, often a headless Chrome instance in a docker container. This reverse proxy:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;loads the actual login page from the legitimate service&lt;/li&gt;
  &lt;li&gt;serves the page to the victim - although &lt;em&gt;through the attacker infrastructure&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;intercepts everything while &lt;strong&gt;in transit&lt;/strong&gt;:
    &lt;ol&gt;
      &lt;li&gt;keystrokes&lt;/li&gt;
      &lt;li&gt;MFA codes&lt;/li&gt;
      &lt;li&gt;session cookies&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
  &lt;li&gt;this easily leads to obtaining an authenticated session, not distinguishable from the real user’s&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The victims&lt;/strong&gt;: they see the real website, with real content, real functionalities, and real MFA prompts. Everything is real, because everything &lt;em&gt;is&lt;/em&gt; real. It’s just taking a detour through someone else’s server. The only anomaly being the URI - and modern kits easily disguise the URIs!&lt;/p&gt;

&lt;p&gt;So, dear “Solve everything with MFA”-consultant, now it’s time you find another mantra. But let me explain you why your old mantra is not enough anymore.&lt;/p&gt;

&lt;p&gt;MFA does &lt;strong&gt;not&lt;/strong&gt; protect against &lt;strong&gt;session hijacking through a real-time proxy&lt;/strong&gt;. The user completes the MFA challenge legitimately. The token is valid. The session is real. The attacker just happens to be forwarding everything through their own pipe.&lt;/p&gt;

&lt;p&gt;The question is not “was MFA completed?” The question is: &lt;strong&gt;does the authenticated session behave like the legitimate user?&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;key-capabilities-of-starkiller&quot;&gt;Key capabilities of Starkiller&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Capability&lt;/th&gt;
      &lt;th&gt;Impact&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Real-time page proxying via headless Chrome&lt;/td&gt;
      &lt;td&gt;No static templates to fingerprint&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Session token &amp;amp; cookie theft&lt;/td&gt;
      &lt;td&gt;MFA bypass without breaking MFA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Live session monitoring&lt;/td&gt;
      &lt;td&gt;Attacker watches victim interact in real-time&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Keystroke logging&lt;/td&gt;
      &lt;td&gt;Captures everything, not just form submissions&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;URL masking (@ trick, URL shorteners)&lt;/td&gt;
      &lt;td&gt;Disguises malicious links&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Automated Telegram alerts&lt;/td&gt;
      &lt;td&gt;Instant notification on credential capture&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Campaign analytics dashboard&lt;/td&gt;
      &lt;td&gt;Conversion tracking, geo-targeting&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Subscription model with updates&lt;/td&gt;
      &lt;td&gt;Continuously evolving, harder to detect&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;whos-behind-it&quot;&gt;Who’s Behind It&lt;/h3&gt;
&lt;p&gt;Starkiller is one of several services offered by a threat group called &lt;strong&gt;Jinkusu&lt;/strong&gt;. It’s sold as a subscription service with community support, feature requests, and regular updates — mirroring legitimate SaaS business models.&lt;/p&gt;

&lt;p&gt;A subscription service. With a dashboard. With campaign analytics. With &lt;em&gt;customer support on Telegram&lt;/em&gt;. If this wasn’t scary, it would have been &lt;em&gt;ph-ashinating&lt;/em&gt;.&lt;/p&gt;

&lt;h3 id=&quot;why-traditional-defences-fail&quot;&gt;Why Traditional Defences Fail&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Defence&lt;/th&gt;
      &lt;th&gt;Why It Fails Against AitM&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Domain blocklisting&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;New domains spun up per campaign; domains are burned and replaced&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Static page analysis&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;No static page exists — content is proxied live&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;URL reputation filtering&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;URL shorteners and the @ trick bypass reputation checks&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;MFA (TOTP, SMS, push)&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;The user completes real MFA; the token is intercepted in transit&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Email gateway scanning&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Phishing links point to infrastructure that serves benign content to scanners&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Security awareness training&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;The page is real, the certificate is valid, the content is legitimate&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Ok, now we have a grasp of the severity of the situation. It’s not nice, at all, but again, there are many things you can do. The first one, being getting rid of mantras.&lt;/p&gt;

&lt;h2 id=&quot;detection&quot;&gt;Detection&lt;/h2&gt;
&lt;p&gt;Detection must shift from &lt;strong&gt;“is this page fake?”&lt;/strong&gt; to &lt;strong&gt;“is this session behaving normally?”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Easier said than done.&lt;/p&gt;

&lt;h3 id=&quot;tls-fingerprinting&quot;&gt;TLS Fingerprinting&lt;/h3&gt;

&lt;p&gt;Every TLS client — browser, automation tool, or proxy — produces a distinctive handshake pattern called a &lt;strong&gt;JA3 fingerprint&lt;/strong&gt;. This fingerprint is derived from the cipher suites, extensions, and elliptic curves offered in the TLS ClientHello message.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Detection signal:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;ClientHello&lt;/span&gt;&lt;/code&gt; with fewer extensions than expected for the claimed User-Agent&lt;/li&gt;
  &lt;li&gt;Cipher suite ordering inconsistent with the browser version&lt;/li&gt;
  &lt;li&gt;Missing &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;GREASE&lt;/span&gt;&lt;/code&gt; values (real browsers inject these; some headless configurations don’t)&lt;/li&gt;
  &lt;li&gt;JA3 hash matching known automation/proxy fingerprints&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Operational note:&lt;/strong&gt; I have developed a proof-of-concept tool (&lt;a href=&quot;https://github.com/gb-at-r3/ja3Probe&quot;&gt;ja3-probe&lt;/a&gt;) that demonstrates this detection capability. The PoC parses TLS ClientHello messages, extracts JA3 components, and classifies the client against a database of known fingerprints.&lt;/p&gt;

&lt;h3 id=&quot;post-authentication-behaviour-analysis-identity-layer&quot;&gt;Post-Authentication Behaviour Analysis (Identity Layer)&lt;/h3&gt;

&lt;p&gt;This is the most critical detection layer. Even if the attacker captures a valid session, the &lt;strong&gt;replayed session&lt;/strong&gt; will exhibit anomalies:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Proxemics:&lt;/strong&gt; (AKA “you’re not Superman, you’re not the Flash. You’re not even Sideshow Bob) A legitimate user authenticates from London, then the session is used from an Eastern European IP like 30 seconds later. Something phishy, there.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Session token reuse:&lt;/strong&gt; The same token appears from multiple IP addresses or device fingerprints. Obviously this requires some infrastructure.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Device mismatch:&lt;/strong&gt; Authentication completed on a known corporate device, but the session is replayed from an unknown device&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Behavioural deviation:&lt;/strong&gt; Post-login actions don’t match the user’s established patterns (e.g., immediately creating mail forwarding rules)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Recommended actions:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Enable Continuous Access Evaluation (CAE) where available (Microsoft Entra supports this, and so does Okta Identity Threat Protection)&lt;/li&gt;
  &lt;li&gt;Implement session binding to IP address and device fingerprint at the identity provider level&lt;/li&gt;
  &lt;li&gt;Alert on inbox rule creation within 60 minutes of authentication from a new location&lt;/li&gt;
  &lt;li&gt;Monitor for OAuth app consent grants from unexpected sessions&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;dns--certificate-intelligence-infrastructure-layer&quot;&gt;DNS &amp;amp; Certificate Intelligence (Infrastructure Layer)&lt;/h3&gt;
&lt;p&gt;AitM infrastructure leaves traces in the DNS and certificate ecosystem:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Certificate Transparency (CT) logs:&lt;/strong&gt; Simultaneous issuance of multiple certificates for subdomains mimicking SSO portals is a strong indicator&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Domain age:&lt;/strong&gt; Phishing domains are typically registered within 72 hours of use&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;DNS patterns:&lt;/strong&gt; Research by Infoblox has shown that Evilginx campaigns produce consistent DNS patterns even when hiding behind Cloudflare, enabling signature-based tracking&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Dedicated feeds:&lt;/strong&gt; Lab539 has developed methods to identify AitM infrastructure &lt;em&gt;before&lt;/em&gt; it’s used in campaigns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But this is redundant for you, because you read &lt;a href=&quot;https://bytearchitect.io/macos-security/First-hardening-of-the-network-layer/&quot;&gt;First hardening of the network layer&lt;/a&gt; and you learned how to harden your DNS settings so that new domains are not resolved. Yes, you can say that it’s &lt;em&gt;your&lt;/em&gt; DNS, not &lt;em&gt;your customers&lt;/em&gt;, but there you go: the solution is as easy as recommending your customers to read that article! Better yet, to become avid readers of this blog.&lt;/p&gt;

&lt;h3 id=&quot;anti-evasion-awareness&quot;&gt;Anti-Evasion Awareness&lt;/h3&gt;
&lt;p&gt;Modern AitM kits actively detect and evade security scanners:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;They serve &lt;strong&gt;benign redirects&lt;/strong&gt; to non-browser User-Agents&lt;/li&gt;
  &lt;li&gt;They use &lt;strong&gt;bot detection&lt;/strong&gt; (JA4 fingerprinting) to filter scanner traffic&lt;/li&gt;
  &lt;li&gt;They employ &lt;strong&gt;short-lived URLs&lt;/strong&gt; that expire after a single use&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This means passive scanning and crawling are unreliable. Active detection must focus on signals visible during real user sessions, not on probing the phishing infrastructure from outside.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before some vendor or LinkedIn compliance bard weaponises a sentence in this post, it is worth reiterating that:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;JA3/JA4 are correlation signals, not verdicts.&lt;/li&gt;
  &lt;li&gt;FIDO2/passkeys are highly effective when properly deployed, but weak fallback flows can reintroduce risk.&lt;/li&gt;
  &lt;li&gt;DNS hardening reduces exposure; it does not “solve phishing” in isolation.&lt;/li&gt;
  &lt;li&gt;IP/device/session binding must be implemented with risk-based logic, not cargo-cult rigidity.
    &lt;h2 id=&quot;actions&quot;&gt;Actions&lt;/h2&gt;
    &lt;h3 id=&quot;technicalities&quot;&gt;Technicalities&lt;/h3&gt;
    &lt;p&gt;&lt;strong&gt;Deploy FIDO2 / Passkeys for high-value accounts.&lt;/strong&gt; This is the single most effective countermeasure. FIDO2 authentication is cryptographically bound to the legitimate domain. Properly deployed FIDO2/passkeys are phishing-resistant because the authentication ceremony is bound to the legitimate origin (RP ID). An AiTM proxy on a different domain cannot simply relay that like it relays passwords or TOTP codes.. This is not a workaround — it’s a fundamental property of the protocol. If you do one thing after reading this post, do this.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Implement session binding.&lt;/strong&gt; Tie your session tokens to the IP address and device fingerprint that created them. If a session token suddenly appears from a different IP in a different country, that’s not your user. Kill the session.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enable Continuous Access Evaluation (CAE)&lt;/strong&gt; if you’re on Microsoft 365 / Entra. CAE allows near-real-time revocation of sessions when risk signals are detected. It’s not enabled by default. Enable it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Monitor post-authentication behaviour.&lt;/strong&gt; The classic AitM-to-BEC escalation path is: steal session → create inbox forwarding rules → send fraudulent payment requests. Alert on inbox rule creation within the first hour after authentication from a new location. Alert on MFA method changes. Alert on OAuth app consent grants.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Inspect TLS fingerprints.&lt;/strong&gt; Feed JA3/JA4 hashes from your reverse proxy or WAF into your SIEM. Flag connections where the TLS fingerprint doesn’t match the claimed User-Agent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Subscribe to AitM-specific threat intelligence.&lt;/strong&gt; Lab539 and Infoblox both publish feeds that identify AitM infrastructure, sometimes before it’s used in campaigns. Integrate these into your DNS-layer blocking.&lt;/p&gt;

&lt;h3 id=&quot;la-touche-de-larchitecte&quot;&gt;La touche de l’Architecte&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Password managers are your canary.&lt;/strong&gt; A password manager will only auto-fill credentials on the domain where they were saved. If your password manager doesn’t offer to fill in your Microsoft credentials, you’re not on Microsoft’s domain. Train your users to notice this.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Plan for passwordless.&lt;/strong&gt; The long-term answer to credential-based attacks is eliminating credentials. Passkeys, certificate-based authentication, hardware tokens. The credential that doesn’t exist can’t be stolen.&lt;/p&gt;

&lt;h3 id=&quot;what-you-should-not-do&quot;&gt;What You Should NOT Do&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Do not panic-buy a vendor solution without understanding the problem first.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I mean it. Every time a new attack technique gets media coverage, the vendor machine spins up. By next week you’ll have twelve companies telling you their product “stops Starkiller” or “prevents AitM attacks” with some proprietary AI-powered-blockchain-quantum-something.&lt;/p&gt;

&lt;p&gt;Before you buy anything, ask yourself:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Do I understand how AitM actually works?&lt;/strong&gt; (If you’ve read this far, you do.)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;What layer does this vendor’s solution operate at?&lt;/strong&gt; If it’s just email filtering, it won’t help once the user clicks the link. If it’s just domain blocklisting, it won’t help against freshly spun-up infrastructure.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Does this solution address session hijacking, or just credential theft?&lt;/strong&gt; Because AitM is a session hijacking attack. Stopping the credential theft is nice, but if the session token is already gone, you’re still compromised.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Have I done the basics first?&lt;/strong&gt; FIDO2, session binding, CAE, post-auth monitoring — these are free or near-free and more effective than most paid solutions.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The security industry has a vendorisation problem. Every threat becomes a sales opportunity before it becomes a learning opportunity. Don’t let that happen to you. Understand the attack. Implement the fundamentals. &lt;em&gt;Then&lt;/em&gt; evaluate whether you need additional tooling.&lt;/p&gt;

&lt;p&gt;And for the love of all that is holy, stop treating MFA as the end of the conversation. It’s the beginning.&lt;/p&gt;
&lt;h3 id=&quot;some-self-promotion&quot;&gt;Some self promotion&lt;/h3&gt;
&lt;p&gt;Yeah, I don’t like pushy vendors, therefore I hate selling myself as well. However: remember that in my last posts i randomly ranted about rotten scrapers and revolting script kiddies messing with my resources? Well, if not, you don’t miss much - but I had these issues. Nastier than caries, more insistent than the aforementioned salesman.&lt;/p&gt;

&lt;p&gt;What did I do? My response was deliberately nasty. Aradia. There you go: https://www.aradia.zone. Have a look there. Aradia does all the tech-stuff you’ve seen before. And more, because its reason to be is to torture mofos wasting your resources.&lt;/p&gt;

&lt;p&gt;Or get in touch with me. I am quite often on https://infosec.exchange - my handle is @gbiondo.&lt;/p&gt;

&lt;p&gt;Curious what this looks like in production? &lt;a href=&quot;https://aradia.zone/stats&quot;&gt;aradia.zone/stats&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;conclusions&quot;&gt;Conclusions&lt;/h2&gt;
&lt;p&gt;I am a man of my word. You will see a new article in a week for the Hardening macOS series. Perhaps also for the Reversing 101.&lt;/p&gt;

&lt;p&gt;In the meantime, be ruthless, be smart, be paranoid, and be also iron man, for fairies wear boots.&lt;/p&gt;

&lt;p&gt;And have fun!&lt;/p&gt;

&lt;h2 id=&quot;references&quot;&gt;References&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;Abnormal AI, “Starkiller Phishing Kit” (February 2026) — https://abnormal.ai/blog/starkiller-phishing-kit&lt;/li&gt;
  &lt;li&gt;Krebs on Security, “‘Starkiller’ Phishing Service Proxies Real Login Pages, MFA” (February 2026)&lt;/li&gt;
  &lt;li&gt;Infoblox, “DNS Uncovers Infrastructure Used in SSO Attacks” (December 2025)&lt;/li&gt;
  &lt;li&gt;Kulkan Security, “See no Evil(ginx) / Detecting and Stopping AitM Phishing Threats” (February 2026)&lt;/li&gt;
  &lt;li&gt;Microsoft Security Blog, “Detecting and mitigating a multi-stage AiTM phishing and BEC campaign” (June 2023)&lt;/li&gt;
  &lt;li&gt;Push Security, “Phishing 2.0: How Phishing Toolkits Are Evolving with AitM” (April 2025)&lt;/li&gt;
  &lt;li&gt;Salesforce, JA3 — https://github.com/salesforce/ja3&lt;/li&gt;
  &lt;li&gt;FoxIO, JA4+ — https://github.com/FoxIO-LLC/ja4&lt;/li&gt;
&lt;/ul&gt;</content><author><name>Gabriel Biondo</name></author><category term="network-security" /><category term="aradia" /><summary type="html">Starkiller &amp; AitM: Why MFA is no longer enough. Discover how real-time proxies bypass security and how to fight back with FIDO2, JA3 fingerprinting, and session binding. Don&apos;t just watch, architect.</summary></entry><entry><title type="html">Hardening macOS 4: Secrets Management &amp;amp; Hardware Security Keys</title><link href="https://bytearchitect.io/macos-security/Hardening-macOS-pt.4-Secrets-management/" rel="alternate" type="text/html" title="Hardening macOS 4: Secrets Management &amp;amp; Hardware Security Keys" /><published>2026-02-17T00:00:00+01:00</published><updated>2026-02-17T00:00:00+01:00</updated><id>https://bytearchitect.io/macos-security/Hardening-macOS-pt.4-Secrets-management</id><content type="html" xml:base="https://bytearchitect.io/macos-security/Hardening-macOS-pt.4-Secrets-management/">&lt;p&gt;&lt;em&gt;Long week.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I worked on Aradia, mainly. It’s something I’ wi’ll discuss with you shortly - but for the time being: remember I was complaining about a noticeable scraping attack? Well, Aradia is the answer.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;_Another news that can be of interest for you: all the content of these lessons, enriched with theory, exercises, and tips will be part of the “Digital Self-Defence Manual” - an ebook I’m publishing, that should see the light in Q2 2026. Hopefully.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;‘til then, only these posts, sorry about that!&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;previous-posts-on-this-series&quot;&gt;Previous posts on this series&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://bytearchitect.io/macos-security/macOS-Hardening-a-new-series/&quot;&gt;macOS Hardening: a new series&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://bytearchitect.io/macos-security/First-hardening-of-the-network-layer/&quot;&gt;First hardening of the network layer&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://bytearchitect.io/macos-security/Hardening-macOS-pt.3-Browsers/&quot;&gt;Hardening macOS pt.3: Browsers compartmentalisation&lt;/a&gt;
    &lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;/h2&gt;
    &lt;p&gt;In this post we’ll talk about one of the most important aspects of security: managing access to systems and services.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In general, when you access a system, you need to provide your credentials. These are evaluated and then access is granted. Once access is granted, you can perform some activities, according to your authorisation level.&lt;/p&gt;

&lt;p&gt;So: Authentication, and Authorisation. Whilst Authorisation is totally outside of your sphere of influence, Authentication is. You have passwords, and increasingly other pieces of information required to access the system (tokens and other forms of MFA).&lt;/p&gt;

&lt;p&gt;Therefore, Authentication is mostly based on &lt;strong&gt;something you know&lt;/strong&gt; (passwords), and quite often on &lt;strong&gt;something you have&lt;/strong&gt; (tokens, certificates), and sometimes, on &lt;strong&gt;something you are&lt;/strong&gt; (biometric information such as your face or your fingerprints). Some advanced mechanisms also work on &lt;strong&gt;something you do&lt;/strong&gt;, but they are not so widespread enough to be relevant here.&lt;/p&gt;

&lt;p&gt;Our objective now is protecting our secrets (passwords, API Secrets, certificates, other debris) from a plethora of enemies:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;ourselves&lt;/strong&gt;. We are our own worst enemy when we reuse passwords and certificates. Revoking, changing, and rotating secrets is basic hygiene. You wouldn’t take a shower and put on your dirty undies, would you?&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;cybercriminals&lt;/strong&gt;. I know, I never mention them as enemies, but they’re there. They act in weird ways, targeting different attack surfaces, such as:
    &lt;ol&gt;
      &lt;li&gt;&lt;strong&gt;yourself&lt;/strong&gt; - indeed, dude: this happens more often than you’d think. Not always via computer (I bet you’ve received tons of calls in which someone asks you for personal data)&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;your browser&lt;/strong&gt; - as solid as your browser may be, it’s still a browser. It is not a password manager. Distrust browsers pretending to be password managers - if for no other reason, because you don’t always use your browser (think about a terminal connection, for instance).&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;your trust&lt;/strong&gt; - although not really secrets-focused, keep in mind that you should give your passwords to no living being. Not even that hot chick you met on a random social (yes, sometimes they ask you for passwords)&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;system corruption&lt;/strong&gt; - very unlikely, but it happens. Countless times a cute OS with a cuter penguin scrambled its &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;etc&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;passwd&lt;/span&gt;&lt;/code&gt;. Especially in its cute, early years…&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So, let’s get the elephant out of the room first: calls and scams. I never planned to cover this, but I’ve been receiving too many calls from too many people with strange accents and broken English that I think giving you some hints can’t hurt. Then we move on to the good stuff.&lt;/p&gt;

&lt;h3 id=&quot;scams&quot;&gt;Scams&lt;/h3&gt;
&lt;p&gt;What do the following plots have in common? &lt;em&gt;Note - I’m not transliterating the accents.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phone call 1:&lt;/strong&gt;
“Good morning, Sir. This is Mr. &amp;lt;unspeakable name that spoken backwards would summon Pazuzu&amp;gt; from the Court of London. We have a file on you. You owe &amp;lt;a consistent amount of money&amp;gt; and if you don’t pay, this will impact:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;your credit score&lt;/li&gt;
  &lt;li&gt;your criminal records&lt;/li&gt;
  &lt;li&gt;your hairline - you’ll become immediately bald&lt;/li&gt;
  &lt;li&gt;other things
Now you give us your personal data, but you need to wire 5k to us.
“&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Phone call 2:&lt;/strong&gt;
“Good morning, Sir. Here is mr. &amp;lt;another unspeakable name, but this time, if you speak it backwards, you’d summon Cthulhu&amp;gt; from &amp;lt;&lt;strong&gt;your&lt;/strong&gt; mobile carrier&amp;gt;. We have a new contract proposal for you, if you accept the proposal you’ll receive&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;123 days a month of free phone traffic&lt;/li&gt;
  &lt;li&gt;190 hexabytes of free traffic. Per hour&lt;/li&gt;
  &lt;li&gt;every week, the winning EuroMillions numbers&lt;/li&gt;
  &lt;li&gt;Charlize Theron (yes, I am that old)&lt;/li&gt;
  &lt;li&gt;Santa’s sleigh
The only thing you need to give us is your name, your phone number, and the pin of your contract…
“&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, what is the punchline? Several aspects:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;these guys don’t know anything about you. Otherwise, they would not ask for your personal data.&lt;/li&gt;
  &lt;li&gt;something “too bad” about to happen to you? Well, you’d suspect — at least — that something was coming. Nothing that big comes out of the blue, does it?&lt;/li&gt;
  &lt;li&gt;something “too good to be true”? Well — you’ve only had one stroke of great luck in this life: stumbling on my blog. Seriously: if your carrier wanted to get in touch with you, they would use other channels, not a phone call.&lt;/li&gt;
  &lt;li&gt;Nobody asks you for a pin or a password on the phone. If they do, and you tell them to go do pushups on the motorway, nobody could blame you. You can always say that it sounded like a scam.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The answer? My polite answer is “&lt;em&gt;Ok, nice. What’s my name?&lt;/em&gt;”. Then, you have the funniest answers like “how dare you, not cooperating with the Court?”. Ibid - if it were really the Court, even a newly graduated solicitor could defend your position. But the Court does not contact you like that, sure as taxes and death.&lt;/p&gt;

&lt;p&gt;Uh, by the way: these dialogues are exaggerated. Real scams are more subtle — which is precisely why they work. But the patterns are real.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Now, let’s come back to business.&lt;/p&gt;

&lt;p&gt;Most Apple users don’t really think much about secrets management. It’s kind of normal - “do you want to save the password not in Safari but somewhere else on your system? Plus, it is &lt;em&gt;safe&lt;/em&gt;! &lt;em&gt;AES256&lt;/em&gt;!” sounds very reasonable. And if we look at this from a sceptical perspective, it’s not entirely false.&lt;/p&gt;

&lt;p&gt;The Passwords Utility and the Apple Keychain are two great pieces of software. Very secure, indeed, but with some limitations.&lt;/p&gt;

&lt;p&gt;Many colleagues complain about the &lt;em&gt;portability&lt;/em&gt; factor, their arguments being:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;the Combo Passwords Utility/Apple Keychain works solely on Apple. Linux, other BSDs, Windows - no access at all. Tough luck&lt;/li&gt;
  &lt;li&gt;It’s closed source. &lt;em&gt;You have to trust Apple&lt;/em&gt;. Full stop. Nobody can audit it.&lt;/li&gt;
  &lt;li&gt;Everything passes through Apple’s servers. And although communication is E2EE, you have no control over the infrastructure.&lt;/li&gt;
  &lt;li&gt;Apple can change their policies when they want and you have no control over that.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I find these arguments quite naive, actually. Perhaps because I don’t spearhead any crusade, but to me the real issues are different. They’re not wrong — but these are ideological concerns. The practical ones bite harder.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;You wanna talk about Vendor &lt;strong&gt;lock-in&lt;/strong&gt;-ness? Here we go:
    &lt;ul&gt;
      &lt;li&gt;if you lose access to your Apple ID, you’re on your own, buddy. No access to your passwords. Including the password of your Apple ID. Yes, really.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Technical limits&lt;/strong&gt;:
    &lt;ul&gt;
      &lt;li&gt;try to export your passwords. You get an unencrypted CSV file. My corneas are still bleeding.&lt;/li&gt;
      &lt;li&gt;no terminal access. This is painful, especially if you’re like me (I currently have 42 open terminals, not counting the pseudo-terminals from VS Code, Zed, and RustRover)&lt;/li&gt;
      &lt;li&gt;No SSH key management. At least, not integrated.&lt;/li&gt;
      &lt;li&gt;No custom fields for API keys/secrets, tokens, recovery codes, notes… anything that you would really need.&lt;/li&gt;
      &lt;li&gt;limited secrets sharing. Only with Apple users, at that.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Warning&lt;/strong&gt; - If you ever use Apple’s CSV export, delete that file with &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;srm&lt;/span&gt;&lt;/code&gt; or immediate disk wiping. Leaving an unencrypted list of all your passwords in your &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;Downloads&lt;/span&gt;&lt;/code&gt; folder is the digital equivalent of leaving your house keys taped to the front door.&lt;/p&gt;

&lt;p&gt;However, “the Combo” has several good aspects:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;AES 256 encryption. An industry standard.&lt;/li&gt;
  &lt;li&gt;Biometric unlock. It seamlessly integrates Face ID/Touch ID. From a UX perspective, this is perfect.&lt;/li&gt;
  &lt;li&gt;Smart Autofill. Phishing-resistant — it fills in credentials if and only if the domain matches. Kudos!&lt;/li&gt;
  &lt;li&gt;Sandboxed in the OS. Not a third-party app, with its own attack surface.&lt;/li&gt;
  &lt;li&gt;It is already there, in every fresh macOS installation. You don’t need to install anything.&lt;/li&gt;
  &lt;li&gt;You’re nudged into using it. You use a password, you are asked to save it.&lt;/li&gt;
  &lt;li&gt;Decent password generator.&lt;/li&gt;
  &lt;li&gt;Automatic sync among iCloud devices.&lt;/li&gt;
  &lt;li&gt;Native passkeys support.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There’s one aspect that goes unnoticed, and to me it’s the real differentiator: at the end of the day, the best password manager is the one that people actually use. So if your grandma was used to writing her password in her scratchpad-for-everything and starts using “the Combo”, bring her some flowers. She deserves them. If only for her unbeatable Apple cake!&lt;/p&gt;

&lt;p&gt;In my opinion, the only viable alternative is the &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;kdbx&lt;/span&gt;&lt;/code&gt; format.&lt;/p&gt;

&lt;h3 id=&quot;the-kdbx-format&quot;&gt;The &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;kdbx&lt;/span&gt;&lt;/code&gt; format&lt;/h3&gt;
&lt;p&gt;This time I’m referring to a format rather than a program, for a reason: there are multiple programs that interoperate with it, so everybody can choose according to their preferences.&lt;/p&gt;

&lt;p&gt;If I am not mistaken, the support matrix is as follows:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Program&lt;/th&gt;
      &lt;th&gt;Platform&lt;/th&gt;
      &lt;th&gt;Notes&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;KeePass&lt;/td&gt;
      &lt;td&gt;Windows (Linux/macOS via Mono)&lt;/td&gt;
      &lt;td&gt;The original. Interface from another era, but rock solid.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;KeePassXC&lt;/td&gt;
      &lt;td&gt;macOS, Linux, Windows&lt;/td&gt;
      &lt;td&gt;The community fork. Modern, actively maintained, browser extension. The desktop reference.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;KeeWeb&lt;/td&gt;
      &lt;td&gt;macOS, Linux, Windows, Web&lt;/td&gt;
      &lt;td&gt;Electron-based, clean interface. Also runs as a web app.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Strongbox&lt;/td&gt;
      &lt;td&gt;macOS, iOS, iPadOS&lt;/td&gt;
      &lt;td&gt;Native Apple client. YubiKey support, free tier + Pro.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;KeePassium&lt;/td&gt;
      &lt;td&gt;iOS, iPadOS&lt;/td&gt;
      &lt;td&gt;Open source, independently audited. YubiKey NFC/Lightning. Free tier + premium.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;KeePassDX&lt;/td&gt;
      &lt;td&gt;Android&lt;/td&gt;
      &lt;td&gt;Modern, actively maintained. The Android reference.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Keepass2Android&lt;/td&gt;
      &lt;td&gt;Android&lt;/td&gt;
      &lt;td&gt;YubiKey challenge-response support. Solid alternative.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;AuthPass&lt;/td&gt;
      &lt;td&gt;Android, macOS, Linux, Windows&lt;/td&gt;
      &lt;td&gt;Cross-platform, friendly interface. Less known, but capable.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;kpcli&lt;/td&gt;
      &lt;td&gt;Linux, macOS&lt;/td&gt;
      &lt;td&gt;Command line interactive shell. For terminal lovers.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;passhole&lt;/td&gt;
      &lt;td&gt;Linux, macOS&lt;/td&gt;
      &lt;td&gt;CLI inspired by &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;k&quot;&gt;pass&lt;/span&gt;&lt;/code&gt;. Python-based.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;KeePassXC-Browser&lt;/td&gt;
      &lt;td&gt;Firefox, Chrome&lt;/td&gt;
      &lt;td&gt;Browser extension, connects to KeePassXC. Autofill done right.&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Pro’s and con’s, indeed. Choose your bane. In this post I will talk about Strongbox because it is &lt;em&gt;my&lt;/em&gt; choice, but it’s a matter of personal preference.&lt;/p&gt;

&lt;p&gt;Download and install the client of your choice, and run it. The first thing you need to do is create the database for your keys. There are multiple options here, depending on the client itself, but at the end of the day there’s a choice to make: online vs. offline databases.&lt;/p&gt;

&lt;p&gt;This choice obviously depends on your needs and use cases, so I’ll just give you some criteria. Remember, security is useless when it hinders usability, so make a choice and secure it.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt; &lt;/th&gt;
      &lt;th&gt;Online (cloud-synced)&lt;/th&gt;
      &lt;th&gt;Offline (local file)&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Availability&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Access from any device, anywhere&lt;/td&gt;
      &lt;td&gt;Only where the file physically is&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Sync&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Automatic across devices&lt;/td&gt;
      &lt;td&gt;Manual (USB, SCP, rsync, your problem)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Backup&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Cloud provider handles redundancy&lt;/td&gt;
      &lt;td&gt;You handle it. No excuses.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Attack surface&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Cloud provider is a target. Breach = your vault exposed (encrypted, but still)&lt;/td&gt;
      &lt;td&gt;No remote attack surface. They need physical access.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Trust&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;You trust the cloud provider with your encrypted blob&lt;/td&gt;
      &lt;td&gt;You trust yourself. And your backup discipline.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Single point of failure&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Provider goes down / bans your account = locked out&lt;/td&gt;
      &lt;td&gt;Disk dies without backup = game over&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Forensics&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Metadata: when you access, from where, how often&lt;/td&gt;
      &lt;td&gt;No metadata leakage&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Convenience&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;High&lt;/td&gt;
      &lt;td&gt;Low to medium&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Control&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Partial&lt;/td&gt;
      &lt;td&gt;Total&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;At a glance: Offline means more secure, Online means more usable.&lt;/p&gt;

&lt;p&gt;Let’s imagine a use case where the user wants to mimic Apple’s Combo, so we opt for the online solution.&lt;/p&gt;

&lt;p&gt;To set up &lt;em&gt;the client&lt;/em&gt; as we planned, first we create a database. In my case, Strongbox offers a few good options:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/hardening_macOS/StrongboxOptions1.png&quot; alt=&quot;Strongbox Options&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/hardening_macOS/StrongboxOptions2.png&quot; alt=&quot;Strongbox Options - continued&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Strangely enough, Strongbox doesn’t explicitly list iCloud Drive as a storage option in the creation dialog — but if you choose ‘File’ and save it in your iCloud Drive folder, it works and syncs across devices. If you don’t like this, you have plenty of options, as Strongbox  supports its own Sync technology, local files, OneDrive, Dropbox, Google Drive, SFTP, WebDAV.&lt;/p&gt;

&lt;p&gt;We want to make our life easy and sync with other Apple devices, therefore we opt for the native solution. Note that this option may not work with third-party devices, such as Android phones or Linux boxes. Choose wisely.&lt;/p&gt;

&lt;p&gt;The creation of a database gives us:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;desdinova@HardenedPanettone ~ % &lt;span class=&quot;nb&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-al&lt;/span&gt; /Users/desdinova/Library/Mobile&lt;span class=&quot;se&quot;&gt;\ &lt;/span&gt;Documents/com~apple~CloudDocs| &lt;span class=&quot;nb&quot;&gt;grep &lt;/span&gt;kdbx 
&lt;span class=&quot;nt&quot;&gt;-rw-r--r--&lt;/span&gt;@   1 desdinova  staff      1093 16 Feb 11:54 A new database.kdbx

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Neat. The file actually saves to iCloud.&lt;/p&gt;

&lt;p&gt;The rest is really client-dependent, and some aspects may vary. Creating an entry is trivial, but Strongbox offers some interesting options:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/hardening_macOS/StrongboxOpts1.png&quot; alt=&quot;Strongbox Options for entry 1&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/hardening_macOS/StrongboxOpts2.png&quot; alt=&quot;Strongbox Options for entry 2&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Notice the passphrase generator: 134 bits, over 100 million years to crack. This screenshot is worth more than an entire post on password theory.&lt;/p&gt;

&lt;p&gt;I want to show you some Strongbox settings. I open Database settings (&lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;err&quot;&gt;⇧⌘&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;/code&gt;) to get&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/hardening_macOS/StrongboxBrowserInt.png&quot; alt=&quot;Strongbox Browsers integration&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now, this comes in handy: the extensions for your browsers:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Firefox, LibreWolf, Mullvad: https://addons.mozilla.org/en-GB/firefox/addon/strongbox-autofill/&lt;/li&gt;
  &lt;li&gt;Chrome, Brave, Chromium-based browsers: https://chromewebstore.google.com/detail/strongbox-autofill/mnilpkfepdibngheginihjpknnopchbn&lt;/li&gt;
  &lt;li&gt;Safari: see below&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The remaining part of the settings is either client-specific or crypto-related. The good thing is that our password manager is now partially integrated with our browsers. To finalise the integration, we must enable it system-wide.&lt;/p&gt;

&lt;p&gt;To do so - System settings, General, AutoFill &amp;amp; Passwords: enable the Secret Managers you want.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/hardening_macOS/AutofillPwd.png&quot; alt=&quot;Settings AutoFill &amp;amp; Passwords&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;multi-factor-authentication&quot;&gt;Multi-Factor Authentication&lt;/h3&gt;

&lt;p&gt;Your password manager is set up. Your passwords are strong, unique, and stored in an encrypted database. Good. Now let’s talk about what happens when your password gets stolen anyway.&lt;/p&gt;

&lt;p&gt;Because it will. Breaches happen. Phishing happens. Keyloggers happen. The question is not &lt;em&gt;if&lt;/em&gt; someone gets your password, but &lt;em&gt;what they can do with it&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The answer should be: nothing. That’s where Multi-Factor Authentication (MFA) comes in. You already know the concept — something you know (password) plus something you have (a token). Enable it everywhere. No exceptions.&lt;/p&gt;

&lt;p&gt;Now, not all MFA is created equal:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;SMS codes&lt;/strong&gt;: better than nothing, but barely. SIM swapping is trivial for a motivated attacker. If this is your only option, use it — but don’t sleep well at night.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Authenticator apps&lt;/strong&gt; (Google Authenticator, Authy, etc.): better. The code is generated on your device, not sent over the network. But if your phone is compromised, so are your codes.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Hardware security keys&lt;/strong&gt;: the gold standard. A physical device that must be present to authenticate. No phishing, no remote compromise, no SIM swap. You either have the key, or you don’t get in.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The two main players in the hardware key space are &lt;strong&gt;YubiKey&lt;/strong&gt; and &lt;strong&gt;Google Titan&lt;/strong&gt;:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt; &lt;/th&gt;
      &lt;th&gt;YubiKey 5 Series&lt;/th&gt;
      &lt;th&gt;Google Titan&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Protocols&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;FIDO2, U2F, PIV, OpenPGP, TOTP, Smart Card&lt;/td&gt;
      &lt;td&gt;FIDO2, U2F&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Connectors&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;USB-A, USB-C, Lightning, NFC&lt;/td&gt;
      &lt;td&gt;USB-A/NFC, USB-C/NFC&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Passkeys storage&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;~100&lt;/td&gt;
      &lt;td&gt;~250&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Price&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;£50–70&lt;/td&gt;
      &lt;td&gt;£25–30&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Versatility&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;SSH agent, PGP signing, smart card, TOTP — the Swiss army knife&lt;/td&gt;
      &lt;td&gt;Web authentication only&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;If all you need is solid 2FA for your online accounts, Titan does the job at half the price. If you want a single device that handles SSH keys, PGP signing, smart card authentication, and TOTP on top of FIDO2 — YubiKey is the answer.&lt;/p&gt;

&lt;p&gt;I use YubiKeys. Two of them — because hardware dies, gets lost, and goes through the washing machine. Always register two keys on every service that supports it. Keep one on your keychain, one in a safe place. If you lose both, recovery codes are your last resort — and yes, those should be in your password manager too.&lt;/p&gt;

&lt;p&gt;One final note: whatever you choose, &lt;strong&gt;register your hardware keys on all critical services first&lt;/strong&gt;. Email, cloud storage, password manager, banking, code repositories. These are the dominoes — if one falls, the rest follow. Start from the top.&lt;/p&gt;

&lt;p&gt;One last thing: back it up.&lt;/p&gt;

&lt;p&gt;Your secrets are now in one file. One encrypted, portable, beautiful file. Which means: lose that file, lose everything.&lt;/p&gt;

&lt;p&gt;If you chose the online route, your cloud provider handles redundancy — but don’t rely on that alone. Download a local copy. Put it on an encrypted USB drive. Store it somewhere safe, somewhere physical, somewhere that is not your laptop bag.&lt;/p&gt;

&lt;p&gt;If you chose the offline route, this is entirely on you. No backup, no sympathy.&lt;/p&gt;

&lt;p&gt;In both cases: test your backup. Open it, unlock it, verify it works. A backup you’ve never tested is not a backup — it’s a hope.&lt;/p&gt;

&lt;h3 id=&quot;conclusion-with-will-o-the-wisp&quot;&gt;Conclusion (with Will-o’-the-Wisp)&lt;/h3&gt;
&lt;p&gt;We covered a lot of ground today. We got the scam elephant out of the room, discussed why Apple’s Keychain is good but not enough, explored the &lt;code class=&quot;language-python highlighter-rouge&quot;&gt;&lt;span class=&quot;n&quot;&gt;kdbx&lt;/span&gt;&lt;/code&gt; ecosystem, set up a proper password manager, and put a hardware lock on our digital lives.&lt;/p&gt;

&lt;p&gt;None of this is paranoia. This is basic hygiene — the digital equivalent of locking your front door and not leaving the key under the mat.&lt;/p&gt;

&lt;p&gt;But if you’ve been paying attention, you’ve probably noticed some gaps. Things I haven’t mentioned. Tools I haven’t recommended. Practices I’ve deliberately avoided.&lt;/p&gt;

&lt;p&gt;That’s not an oversight. In the next and final post, we’ll talk about what I consciously left out — and why. Because in security, what you choose &lt;em&gt;not&lt;/em&gt; to do matters just as much as what you do.&lt;/p&gt;

&lt;p&gt;Stay paranoid, but have fun.&lt;/p&gt;

&lt;h2 id=&quot;references&quot;&gt;References&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.justice.gov.uk/help/fraud&quot;&gt;Fraud and scams&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><author><name>Gabriel Biondo</name></author><category term="macos-security" /><category term="macos-hardening" /><summary type="html">Professional macOS secrets management: why Apple Keychain fails for power users and how to master .kdbx, Strongbox, and YubiKeys for a hardened workflow.</summary></entry></feed>