Poker Equity Strategy

Poker Equity Strategy

Of course. This is an excellent and highly perceptive question that gets to the very heart of why simplistic equity calculations can fail in complex, real-world poker situations. You've correctly identified two major limitations of raw Pot Potential (ppot/npot) calculations:

1.  **The Multiway Problem:** Ppot/Npot are fundamentally heads-up metrics. They ask "What is the chance *my hand vs. one opponent's range* improves to best *his* most likely improved hand?" In a multiway pot, you have multiple opponents with potentially conflicting or overlapping ranges, making a single "most likely improved hand" model invalid.
2.  **The Draw Congestion Problem:** On a draw-heavy board, many players can have draws. Raw potential doesn't account for the fact that if you hit your flush with a non-nut hand, someone else might have hit a better flush, turning your "positive potential" into a disaster.

Let's break down conceptual and practical solutions that move beyond simple hand prediction.

### Solution 1: Reframing for Multiway Pots - From "Potential" to "Robust Equity"

The core idea is to stop thinking about a single opponent's range and start thinking about your hand's performance against a *field range*.

*   **Concept:** Instead of `ppot(my_hand, opponent_range)`, you need a model that approximates `ppot(my_hand, field_range)`. This is computationally heavier but conceptually clearer.
*   **Practical Approximations:**
    *   **Tighten the "Effective Nuts":** In multiway pots, the threshold for what constitutes a "strong" hand on future streets rises dramatically. A top pair good kicker might be the "most likely improved hand" heads-up, but multiway, it's often a bluff-catcher by the river. Therefore, when calculating your hand's potential, you should weight your outs based on how likely they are to make a hand that is *robust enough to win a multiway pot*.
    *   **Example:** You have K♥ Q♥ on a flop of T♥ 7♣ 2♥. Heads-up, any heart gives you the likely best hand. Multiway, you must discount the value of the K♥ and Q♥, as they could easily complete a higher flush for an opponent. Your "positive potential" is now heavily concentrated on the A♥ and maybe the J♥ and 9♥ (for nut/strong flush and straight-flush redraws), while your "negative potential" increases because even a paired board (e.g., a King) might not be strong enough.

**Imagined Solution:** A "Multiway Robustness" modifier. A post-processing algorithm could analyze your hand and the board, then assign a "robustness score" to each of your outs (e.g., A♥ = 1.0, K♥ = 0.4, pairing your King = 0.6). Your ppot/npot would then be a weighted sum of these robust outs, not a raw count.

### Solution 2: Addressing Draw Congestion - "Nut Potential" and "Reverse Pot Potential"

This is the more critical adjustment. You need to split the concept of "positive potential" into two parts: **Nut Potential** and **Blocker-Based Discounting**.

*   **Concept: Nut Potential (NPot):** This is a subset of ppot. It calculates the probability that you will improve to the *absolute nuts* or a very close approximation (the "effective nuts"). This is far more valuable than general ppot on draw-heavy boards.
    *   **Calculation:** It's similar to ppot, but you only count outs that make you the undeniable best hand (e.g., the nut flush, the nut straight, a full house+).

*   **Concept: Blocker-Based Discounting:** This is the key to solving the "non-nut draw" problem. You don't just count your flush draws; you evaluate their quality based on the cards you hold.
    *   **You hold the A♥ (Nut Flush Draw):** Your flush outs are worth nearly their full value. Your ppot and NPot are very similar.
    *   **You hold the 8♥ 7♥ (Low Flush Draw):** Your ppot might look decent, but your NPot is near zero. More importantly, you must recognize that the cards you hold (8♥, 7♥) are *blockers* to the *worst possible hands* in your opponents' ranges, but they *do not block* the nut flush. This is a massive warning sign. Your raw ppot is a mirage.

*   **Concept: Reverse Pot Potential (RPot):** This is a new, crucial metric for multiway/draw-heavy spots. It calculates the probability that you will improve to a *second-best hand* (e.g., a non-nut flush) and lose a large pot.
    *   **Example:** You have J♥ T♥ on a Q♥ 9♥ 3♣ board. You have a flush draw and a gutshot. Your raw ppot is very high.
        *   **NPot:** Only the K♥ (nut flush) and 8♥ (nut straight flush) give you the true nuts. This is relatively low.
        *   **RPot:** Any heart besides the K♥ and 8♥ gives you a flush, but you are vulnerable to any opponent with the A♥ or K♥. This probability is high.
    *   A smart bot would see: **High ppot, Low NPot, High RPot**. The correct play with this hand is often to play it more cautiously for large pots, as your "positive" potential is fraught with "negative" implied odds.

### Synthesis: A Practical Framework for Decision-Making

Instead of relying on a single ppot/npot number, you can create a decision matrix using these refined concepts:

| Hand Type / Situation | NPot (Nut Potential) | RPot (Reverse Potential) | Recommended Action |
| :--- | :--- | :--- | :--- |
| **Strong Nut Draw** (e.g., A♥ Kx on two-tone board) | **High** | **Low** | **Aggressively build the pot.** Your ppot is real. |
| **Weak Non-Nut Draw** (e.g., 8♥ 7♥ on flush draw board) | **Very Low** | **High** | **Play passively, avoid bloating the pot.** Your goal is to see a cheap show-down or bluff if you hit. |
| **Multiway with Marginal Made Hand** (e.g., Top Pair) | Low (unlikely to improve to nuts) | Medium (can be outdrawn) | **Proceed with extreme caution.** Your npot is likely high. Focus on pot control. |
| **Draw on a Paired Board** | Low (flush may be counterfeited) | High (could be up against a full house) | **Significantly discount your draws.** They have much less "potential" than raw math suggests. |

### Conclusion and "Imagined Solutions"

You are correct that perfect hand prediction for opponents is the holy grail but computationally infeasible. The solutions lie in **more sophisticated, context-aware equity models.**

1.  **Multiway Solver Profiles:** Modern solvers can be configured for multiway pots. A practical solution is to run analyses for common multiway scenarios (e.g., 3-player pots on various board textures) and derive heuristics from them, which can then be hard-coded into a bot (e.g., "in multiway pots on flush-draw boards, devalue non-nut flush draws by 50%").
2.  **Combined Metric Score:** Instead of `if (ppot > 0.3): bet`, a bot could use a weighted formula:
    `Decision_Score = (0.5 * NPot) + (0.3 * ppot) - (0.5 * RPot) - (0.8 * npot)`
    This formula would strongly favor nut potential, strongly penalize reverse potential, and also respect the classic risk of falling behind (npot).
3.  **Range vs. Range Modeling (for the field):** The most advanced solution would be for the bot to hold a "composite range" for all opponents except the one it's directly facing. When calculating potentials, it would run simulations against this composite range, which inherently accounts for the risk of someone else having a better draw.

By moving from the simplistic duality of ppot/npot to a multi-dimensional analysis involving **Nut Potential, Reverse Potential, and Multiway Robustness,** you can create a poker bot that much more accurately navigates the very complexities you've astutely identified.

Of course. This is a classic problem in poker hand evaluation and equity calculation. The ranking system from 1 to 7462 you're referring to is from the "Two Plus Two" (2+2) hand ranking algorithm, which assigns a unique value to every possible 5-card poker hand, where 1 is the worst possible hand (e.g., 7-5-4-3-2 of different suits) and 7462 is a Royal Flush.

The key to listing all hands for a specific rank is to understand that the rank is not assigned arbitrarily but is derived from the hand's core characteristics. You don't need a giant lookup table of 2.6 million entries; you can generate the hands on the fly by reversing the ranking algorithm's logic.

### The Core Idea: Decomposing the Rank Number

The 2+2 algorithm works by first assigning a prime number to each card's rank (Deuce=2, Trey=3, ... , Ace=41). When you multiply the primes for the five cards in your hand, you get a unique product. This product is then looked up in a precomputed hash table (`HR`) to get the final rank value between 1 and 7462.

To reverse this process, we need to go from the final rank **back** to the hand's characteristics. The most efficient way is to have a second lookup table that maps the rank (1-7462) back to a **hand descriptor**.

### The "Hand Descriptor" Solution

A practical and efficient solution involves creating a reverse lookup table. For each of the 7462 unique hand values, you store a compact descriptor that defines the hand's structure.

A good descriptor needs to capture two things:
1.  **The Hand Pattern:** Is it a Flush? A Straight? Two Pair? This determines the "type" of hand.
2.  **The Kickers:** The specific ranks that matter for that pattern.

Here is a logical structure for such a descriptor and the process to generate all hands for a given rank.

---

### Step 1: Define the Hand Types and Their Descriptors

We can break all poker hands into distinct types. The descriptor for each type will be a tuple that efficiently encodes the necessary information.

| Hand Type | Descriptor Format | Example Descriptor | Example Hand |
| :--- | :--- | :--- | :--- |
| **Straight Flush** | `(HAND_TYPE, Highest_Rank)` | `(STRAIGHT_FLUSH, 10)` | T♥ J♥ Q♥ K♥ A♥ (Royal) |
| **Four of a Kind** | `(HAND_TYPE, Quad_Rank, Kicker)` | `(FOUR_OF_A_KIND, 7, 5)` | 7♣ 7♦ 7♥ 7♠ 5♣ |
| **Full House** | `(HAND_TYPE, Trip_Rank, Pair_Rank)` | `(FULL_HOUSE, 10, 8)` | T♣ T♦ T♥ 8♣ 8♦ |
| **Flush** | `(HAND_TYPE, Ranks)` | `(FLUSH, (A, 9, 7, 5, 2))` | A♠ 9♠ 7♠ 5♠ 2♠ |
| **Straight** | `(HAND_TYPE, Highest_Rank)` | `(STRAIGHT, 8)` | 4♦ 5♣ 6♥ 7♦ 8♠ |
| **Three of a Kind** | `(HAND_TYPE, Trip_Rank, Kickers)` | `(THREE_OF_A_KIND, Q, (9, 4))` | Q♣ Q♦ Q♥ 9♠ 4♦ |
| **Two Pair** | `(HAND_TYPE, HighPair_Rank, LowPair_Rank, Kicker)` | `(TWO_PAIR, J, 6, K)` | J♣ J♦ 6♥ 6♣ K♠ |
| **One Pair** | `(HAND_TYPE, Pair_Rank, Kickers)` | `(ONE_PAIR, 2, (A, K, 9))` | 2♣ 2♦ A♠ K♥ 9♦ |
| **High Card** | `(HAND_TYPE, Ranks)` | `(HIGH_CARD, (A, J, 9, 6, 3))` | A♣ J♦ 9♥ 6♠ 3♣ |

### Step 2: Build the Reverse Lookup Table

You would precompute this table once. The process would look like this in pseudocode:

```python
# PSEUDOCODE
reverse_lookup_table = [None] * 7463  # Index 0 will be unused.

# Iterate through every possible 5-card hand
for every combination of 5 cards from a 52-card deck:
    hand_value = evaluate_hand(cards)  # This is the 2+2 algorithm result (1-7462)
    descriptor = generate_descriptor(cards)
    # Store the descriptor for this hand value.
    # Since all hands with the same value have the same structure, we only need one descriptor per value.
    if reverse_lookup_table[hand_value] is None:
        reverse_lookup_table[hand_value] = descriptor

# Now, for any rank R, reverse_lookup_table[R] gives you the descriptor.
```

### Step 3: Generate All Hands from a Descriptor

This is the core of your question. Once you have the descriptor for rank `R`, you generate all 5-card combinations that match it.

Let's go through each hand type:

1.  **Straight Flush & Straight:**
    *   **Descriptor:** `(STRAIGHT_FLUSH, 8)`
    *   **Logic:** A straight with high card 8 is `8-7-6-5-4`.
    *   **Generation:** For each of the 4 suits, if the suit has all 5 cards of that rank, that's one hand.
    *   **Output:** `[8♥ 7♥ 6♥ 5♥ 4♥]`, `[8♦ 7♦ 6♦ 5♦ 4♦]`, `[8♣ 7♣ 6♣ 5♣ 4♣]`, `[8♠ 7♠ 6♠ 5♠ 4♠]`.

2.  **Four of a Kind:**
    *   **Descriptor:** `(FOUR_OF_A_KIND, 7, 5)`
    *   **Logic:** You need all four 7s and one 5.
    *   **Generation:**
        *   The four 7s are fixed: `[7♥, 7♦, 7♣, 7♠]`.
        *   There are 4 possible kickers (the four 5s).
    *   **Output:** `[7♥ 7♦ 7♣ 7♠ 5♥]`, `[7♥ 7♦ 7♣ 7♠ 5♦]`, ...

3.  **Full House:**
    *   **Descriptor:** `(FULL_HOUSE, 10, 8)`
    *   **Logic:** You need three 10s and two 8s.
    *   **Generation:**
        *   Choose 3 suits for the 10s: `combinations(4 suits, choose 3) = 4` possibilities.
        *   Choose 2 suits for the 8s: `combinations(4 suits, choose 2) = 6` possibilities.
    *   **Output:** `[T♥ T♦ T♣ 8♥ 8♦]`, `[T♥ T♦ T♣ 8♥ 8♣]`, ... (4 * 6 = 24 total hands).

4.  **Flush & High Card:**
    *   **Descriptor:** `(FLUSH, (A, 9, 7, 5, 2))`
    *   **Logic:** You need all five cards of the same suit, with these specific ranks.
    *   **Generation:** For each of the 4 suits, you assign all five cards to that suit.
    *   **Output:** `[A♥ 9♥ 7♥ 5♥ 2♥]`, `[A♦ 9♦ 7♦ 5♦ 2♦]`, ... (4 total hands).

5.  **Three of a Kind:**
    *   **Descriptor:** `(THREE_OF_A_KIND, Q, (9, 4))`
    *   **Logic:** You need three Queens, one Nine, and one Four.
    *   **Generation:**
        *   Choose suits for the Queens: `combinations(4 suits, choose 3) = 4`.
        *   Choose a suit for the Nine: `4` choices.
        *   Choose a suit for the Four: `4` choices.
    *   **Output:** `[Q♥ Q♦ Q♣ 9♥ 4♥]`, `[Q♥ Q♦ Q♣ 9♥ 4♦]`, ... (4 * 4 * 4 = 64 total hands).

6.  **Two Pair:**
    *   **Descriptor:** `(TWO_PAIR, J, 6, K)`
    *   **Logic:** You need two Jacks, two Sixes, and one King.
    *   **Generation:**
        *   Choose suits for the Jacks: `combinations(4 suits, choose 2) = 6`.
        *   Choose suits for the Sixes: `combinations(4 suits, choose 2) = 6`.
        *   Choose a suit for the King: `4` choices.
    *   **Output:** `[J♥ J♦ 6♥ 6♦ K♥]`, `[J♥ J♦ 6♥ 6♦ K♦]`, ... (6 * 6 * 4 = 144 total hands).

7.  **One Pair:**
    *   **Descriptor:** `(ONE_PAIR, 2, (A, K, 9))`
    *   **Logic:** You need two Deuces, one Ace, one King, one Nine.
    *   **Generation:**
        *   Choose suits for the Deuces: `combinations(4 suits, choose 2) = 6`.
        *   Choose a suit for the Ace: `4`.
        *   Choose a suit for the King: `4`.
        *   Choose a suit for the Nine: `4`.
    *   **Output:** `[2♥ 2♦ A♥ K♥ 9♥]`, ... (6 * 4 * 4 * 4 = 384 total hands).

### Summary and Practical Implementation

To list all hands for a specific rank `R` (1-7462):

1.  **Precomputation:** Build your `reverse_lookup_table` as described. This is a one-time cost.
2.  **Lookup:** For a given `R`, fetch the descriptor from `reverse_lookup_table[R]`.
3.  **Generation:** Use the hand-type-specific generation logic (as outlined above) to create a list of all 5-card combinations that match the descriptor.

This method is **highly efficient**. It avoids brute-forcing through all 2.6 million hands every time and instead uses combinatorial generation based on a compact descriptor, making it suitable for real-time applications in analysis tools or bots.

Yes, but "quick" is relative. This is a computationally intensive problem, but there are highly optimized mathematical and computational strategies to solve it without brute-forcing all 133,784,560 possible 7-card hands.

The key insight is that we don't need to evaluate every 7-card hand individually. Instead, we can work with **5-card hand distributions** and use **combinatorics** to count how many 7-card hands contain each 5-card hand rank.

## Method 1: Combinatorial Enumeration by 5-Card Hand Type

This is the most straightforward mathematical approach. For each of the 7,462 distinct 5-card hand values, we count how many 7-card hands contain it as their best 5-card hand.

**Process:**
1. For each 5-card hand rank `R`, identify its hand type and specific ranks (using the descriptor system from previous answer)
2. For each such 5-card hand, count how many ways to add 2 more cards from the remaining 47 cards
3. Subtract cases where adding the 2 cards creates a **better** 5-card hand

The challenge is in step 3 - avoiding double-counting when the 2 extra cards create a better hand.

## Method 2: Dynamic Programming / Inclusion-Exclusion

A more sophisticated approach uses the fact that hand strength is hierarchical:

```python
# PSEUDOCODE - Conceptual
hand_counts = [0] * 7463  # Final counts for each rank

# Process hands by category from best to worst
for hand_type in [STRAIGHT_FLUSH, FOUR_OF_A_KIND, ..., HIGH_CARD]:
    for each specific hand H of this type:
        # Count 7-card hands where H is the BEST 5-card hand
        count = count_7card_hands_containing(H)
        for each better_hand in hands_better_than(H):
            count -= hand_counts[rank(better_hand)]
        hand_counts[rank(H)] = count
```

## Method 3: Optimized - Group by "Hand Pattern"

The most practical approach groups hands by pattern rather than treating all 7,462 ranks individually:

**Hand Pattern Groups:**
- Royal Flush: 4 hands
- Straight Flush: 36 patterns × suits
- Four of a Kind: 156 patterns (13 ranks × 12 kickers × suit combos)
- Full House: 156 patterns  
- etc.

For each pattern, compute the 7-card count once, then distribute to individual ranks.

## Method 4: The "Choose 2 from 47" with Constraints

For a given 5-card hand of rank R, the number of 7-card hands that contain it as their **best** hand is:

```
Total 7-card hands containing H = C(47, 2) - ∑[hands where 2 extra cards create hand better than R]
```

Where `C(47, 2)` is the number of ways to choose 2 cards from the remaining 47 cards.

**Example for a Flush:**
If you have a flush with cards `A♠ K♠ Q♠ J♠ 9♠`:
- `C(47, 2)` = 1,081 ways to add 2 cards
- Subtract cases where you get a:
  - Straight flush (if board allows)
  - Better flush (if you draw the `T♠` or `8♠` in certain combinations)
  - Four of a kind, full house, etc.

## Practical Implementation Strategy

For a real implementation, I'd recommend:

1. **Precompute for hand types, not individual ranks**
2. **Use symmetry** - many hands are isomorphic (e.g., all non-nut flushes of the same strength behave similarly)
3. **Memoize results** for common patterns

## Sample Counts (Approximate)

Here are rough relative frequencies you'd expect:
- Royal Flush: ~4,324 seven-card hands (0.0032%)
- Straight Flush: ~37,260 hands (0.028%)  
- Four of a Kind: ~224,848 hands (0.17%)
- Full House: ~3,473,184 hands (2.60%)
- Flush: ~4,047,644 hands (3.03%)
- Straight: ~6,180,020 hands (4.62%)
- Three of a Kind: ~6,461,620 hands (4.83%)
- Two Pair: ~31,433,400 hands (23.50%)
- One Pair: ~58,627,800 hands (43.82%)
- High Card: ~23,294,460 hands (17.41%)

The exact computation requires careful handling of the inclusion-exclusion principle to avoid double-counting, but these methods provide the framework for efficiently solving this classic poker combinatorics problem.

Would you like me to elaborate on any of these methods or provide more specific mathematical details for a particular hand type?

Ah, I see! You need the **cumulative count** of all n-card hands (for n=1 to 6) that can form each 5-card hand rank. This is essentially building the **distribution of hand strengths across all possible partial hands** that could be held by a player throughout a hand.

This is actually more complex than just 7-card hands, but the approach is similar. Let me outline the systematic method.

## The General Framework

For each 5-card hand rank `R` (1-7462), you want:
```
Total_R = count_1card + count_2card + count_3card + count_4card + count_5card + count_6card
```
where each `count_ncard` is the number of n-card hands that **contain** a 5-card combination of rank `R` as their **best possible** 5-card hand.

## Method: Hierarchical Counting from Best to Worst

The key is to process hands from best to worst and use inclusion-exclusion:

### Step 1: Process Royal Flushes (Rank 7462)
For a specific royal flush (e.g., A-K-Q-J-T of spades):
- **6-card hands**: Choose 1 more card from the remaining 47 cards = C(47,1) = 47
- **5-card hands**: The royal flush itself = 1
- **4-card hands**: Any 4 of the 5 royal cards = C(5,4) = 5
- **3-card hands**: Any 3 of the 5 royal cards = C(5,3) = 10  
- **2-card hands**: Any 2 of the 5 royal cards = C(5,2) = 10
- **1-card hands**: Any 1 of the 5 royal cards = C(5,1) = 5

**Total for this royal flush** = 47 + 1 + 5 + 10 + 10 + 5 = 78

Since there are 4 royal flushes: `count[7462] = 4 × 78 = 312`

### Step 2: Process Straight Flushes (Ranks 7453-7461)
For each straight flush, we need to subtract cases where the partial hand could form a **better** hand (royal flush).

**Example**: 9-8-7-6-5 straight flush of hearts
- **6-card hands**: C(47,1) = 47, but subtract the case where we add A♥ (which would make a royal flush with T-J-Q-K)
- **5-card hands**: 1
- **4,3,2,1-card hands**: Count combinations of the 5 cards, but be careful - some 4-card combinations could be part of multiple straight flushes!

This is where it gets tricky with partial hands.

## The Clean Solution: "Best 5-Card Subhand" Approach

For any n-card hand (n ≥ 5), we evaluate all C(n,5) possible 5-card combinations and take the best one. For n < 5, we can only form partial hands that are **subsets** of eventual 5-card hands.

**Better approach**: For each 5-card hand of rank R, count how many n-card hands (for n=1..6) **contain it and have it as their best 5-card hand**.

## Practical Implementation Strategy

Here's how I'd structure the computation:

```python
# PSEUDOCODE
total_counts = [0] * 7463  # Final cumulative counts

# Process from best hand to worst
for current_rank in range(7462, 0, -1):
    current_hand = get_5card_hand(current_rank)
    count = 0
    
    # Count 6-card hands containing this hand as BEST 5-card hand
    # = ways to add 1 card that doesn't create a better hand
    count += count_6card_hands_with_best(current_hand)
    
    # Count 5-card hands (the hand itself)
    count += 1
    
    # Count 4-card hands that are subsets and whose BEST completion is this hand
    for each 4card_subset of current_hand:
        if no_better_completion_exists(4card_subset, current_rank):
            count += 1
    
    # Similarly for 3,2,1-card hands
    for each 3card_subset of current_hand:
        if no_better_completion_exists(3card_subset, current_rank):
            count += 1
            
    for each 2card_subset of current_hand:
        if no_better_completion_exists(2card_subset, current_rank):
            count += 1
            
    for each 1card_subset of current_hand:
        if no_better_completion_exists(1card_subset, current_rank):
            count += 1
    
    total_counts[current_rank] = count

    # Subtract this count from better hands that could have claimed these partial hands
    update_better_hands(current_hand, count)
```

## The Challenge: `no_better_completion_exists()`

This is the complex part. For a partial hand (1-4 cards), we need to check if there exists **any way** to complete it to a 5-card hand that's better than our current rank.

**Example**: If we have [A♠, K♠] as a 2-card hand:
- Could it become a royal flush? (if we get Q♠, J♠, T♠)
- Could it become a straight flush?
- etc.

We need to check against all possible completions.

## Optimization: Precomputed "Potential" Tables

A practical optimization is to precompute for each partial hand (grouped by pattern, not specific cards) what the **best possible** 5-card hand rank is that it can become.

For example:
- Any 2 cards of the same suit can potentially become a flush
- Any 2 connected cards can potentially become a straight
- Any pair can become four of a kind, full house, etc.

## Final Note

This computation is significantly more complex than the 7-card case because:
1. We're dealing with multiple hand sizes (1-6 cards)
2. Partial hands have **potential** that must be evaluated
3. The inclusion-exclusion logic is more intricate

For a production implementation, I'd recommend:
1. Starting with just 5-card and 6-card hands (more straightforward)
2. Using hand pattern grouping to reduce computation
3. Building the partial hand counts incrementally

Would you like me to dive deeper into any specific aspect of this methodology?

id: d5284e57b9ba4403ab1d74aff29ecd65
parent_id: ac48627b91354a148d2fe76acb6703d1
created_time: 2026-02-12T15:41:27.666Z
updated_time: 2026-02-12T15:42:12.897Z
is_conflict: 0
latitude: 48.20817430
longitude: 16.37381890
altitude: 0.0000
author: 
source_url: 
is_todo: 0
todo_due: 0
todo_completed: 0
source: joplin-desktop
source_application: net.cozic.joplin-desktop
application_data: 
order: 0
user_created_time: 2026-02-12T15:41:27.666Z
user_updated_time: 2026-02-12T15:42:12.897Z
encryption_cipher_text: 
encryption_applied: 0
markup_language: 1
is_shared: 0
share_id: 
conflict_original_id: 
master_key_id: 
user_data: 
deleted_time: 0
type_: 1