---
title: "PF 06939999 (Guo 2022)"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{PF 06939999 (Guo 2022)}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r setup, include = FALSE}
knitr::opts_chunk$set(collapse = TRUE, comment = "#>", fig.width = 7, fig.height = 4)
library(nlmixr2lib)
library(PKNCA)
library(rxode2)
library(dplyr)
library(tidyr)
library(ggplot2)

mod_meta <- rxode2::rxode(readModelDb("Guo_2022_PF_06939999"))
```

# Model and source

* Citation: `r mod_meta$meta$reference`
* Description: `r mod_meta$meta$description`
* Article (open access): <https://doi.org/10.1002/psp4.12882>

PF-06939999 is an orally-available, small-molecule, SAM-competitive inhibitor of
protein arginine methyltransferase 5 (PRMT5). The first-in-patient (FIP) study
NCT03854227 was a Phase I dose-escalation in 28 adults with advanced solid
tumors. The PK/PD analysis described by Guo et al. (2022) was used to support
the recommended dose for expansion (RDE), which was selected as 6 mg once daily.

The structural model has three layers (Figure 1 of the source):

- **PK** -- two-compartment model with first-order oral absorption (Ka, CL/F,
  V1/F, Q/F, V2/F).
- **Plasma SDMA (PD biomarker)** -- indirect-response model with saturable Imax
  inhibition on the zero-order SDMA production rate Kin and first-order
  elimination Kout. Symmetrical dimethyl-arginine (SDMA) is a stable catabolic
  product of PRMT5 enzymatic activity used as a peripheral pharmacodynamic
  marker.
- **Platelet count** -- the Friberg et al. (2002) semi-mechanistic
  myelosuppression model: a self-renewing proliferating compartment plus three
  transit compartments feeding the circulating compartment, with a linear
  Slope*Cc effect on the proliferation rate and feedback (Circ0/circ)^gamma.

# Population

The PK/PD analysis pooled 28 patients with advanced or metastatic solid tumors
who received PF-06939999 in Part 1 of NCT03854227. Doses were 0.5 mg q.d.
(n = 1), 4 mg q.d. (n = 5), 6 mg q.d. (n = 6), or 8 mg q.d. (n = 3); or 0.5 mg
b.i.d. (n = 1), 1 mg b.i.d. (n = 2), 2 mg b.i.d. (n = 3), 4 mg b.i.d. (n = 3),
or 6 mg b.i.d. (n = 4) -- 24 evaluable for dose-limiting toxicity. Two confirmed
partial responses were observed (one each in the 2 mg b.i.d. and 4 mg b.i.d.
cohorts). Four subjects experienced dose-limiting toxicities (thrombocytopenia
n = 2 in 6 mg b.i.d.; anemia n = 1 in 8 mg q.d.; neutropenia n = 1 in 6 mg q.d.).

Baseline body weight, age, and hepatic function were tested as PK covariates and
were not retained in the final model (drop in objective function value < 3.84;
Results, page 1621). The full per-cohort baseline demographics are summarised in
Appendix Table S1 of the source, which is not on disk in this worktree.

The population metadata can be inspected programmatically:

```{r population}
mod_meta$meta$population
```

# Source trace

The per-parameter origin is recorded as an in-file comment next to each `ini()`
entry. Every numeric value below was taken from Table 1 of Guo et al. (2022,
"PF-06939999 PK and PD (SDMA and platelet count) model parameters", page 1623).
The IIV %CV values from Table 1 were converted to log-scale variances via the
exact log-normal relationship omega^2 = log(1 + CV^2); the residual error
variances were converted to SDs via sqrt.

| Equation / parameter | Value | Source location |
|----------------------|-------|-----------------|
| `lka` (Ka)           | log(2.31) 1/h          | Table 1, PK model row Ka |
| `lcl` (CL/F)         | log(9.53) L/h          | Table 1, PK model row CL/F |
| `lvc` (V1/F)         | log(160) L             | Table 1, PK model row V1/F |
| `lq`  (Q/F)          | log(26.2) L/h          | Table 1, PK model row Q/F |
| `lvp` (V2/F)         | log(285) L             | Table 1, PK model row V2/F |
| `imax`               | 0.823 (unitless)       | Table 1, SDMA PD row Imax |
| `lic50` (IC50)       | log(0.425) ng/mL       | Table 1, SDMA PD row IC50 |
| `lkout` (Kout)       | log(0.00708) 1/h       | Table 1, SDMA PD row Kout |
| `lblsdma` (Baseline) | log(113) ng/mL         | Table 1, SDMA PD row Baseline SDMA |
| `lmtt` (MTT)         | log(134) h             | Table 1, Platelet PD row MTT |
| `lslope` (Slope)     | log(0.00496) per ng/mL | Table 1, Platelet PD row Slope |
| `lgamma` (gamma)     | log(0.217)             | Table 1, Platelet PD row Feedback |
| `lblplt` (Baseline)  | log(232) 10^9/L        | Table 1, Platelet PD row Baseline PLT |
| `etalcl`             | log(1+0.389^2) = 0.141 | Table 1, IIV(%) for CL/F = 38.9% |
| `etalvc`             | log(1+0.611^2) = 0.317 | Table 1, IIV(%) for V1/F = 61.1% |
| `etalblsdma`         | log(1+0.291^2) = 0.0812 | Table 1, IIV(%) for Baseline SDMA = 29.1% |
| `etalslope`          | log(1+0.522^2) = 0.241 | Table 1, IIV(%) for Slope = 52.2% |
| `etalgamma`          | log(1+0.469^2) = 0.199 | Table 1, IIV(%) for Feedback = 46.9% |
| `etalblplt`          | log(1+0.283^2) = 0.0771 | Table 1, IIV(%) for Baseline PLT = 28.3% |
| `propSd`             | sqrt(0.112) = 0.335    | Table 1, PK residual error |
| `propSd_SDMA`        | sqrt(0.0146) = 0.121   | Table 1, SDMA residual error |
| `propSd_PLT`         | sqrt(0.0235) = 0.153   | Table 1, PLT residual error |
| 2-cmt PK ODEs        | n/a                    | Figure 1, PK for PF-06939999 |
| Indirect-response Imax/IC50 on Kin | n/a       | Figure 1, PK/PD for plasma SDMA |
| Friberg 4-stage chain w/ Slope*Cc + (Circ0/circ)^gamma | n/a | Figure 1, PK/PD for platelet (cites Friberg 2002) |

# Virtual cohort

The Guo 2022 patient-level data are not publicly available. The simulations
below construct virtual cohorts at q.d. dose levels covering the observed FIP
escalation range (0.5, 1, 2, 4, 6, 8, 10, 12 mg/day) so that we can reproduce
both the pcVPC-style trajectories at the RDE (Figure 2) and the steady-state
dose-response sweep (Figure 3) of the source paper.

```{r cohort}
set.seed(20221210)

n_per_dose <- 200L

dose_levels <- c(0.5, 1, 2, 4, 6, 8, 10, 12)
n_doses     <- length(dose_levels)

# Dose interval and follow-up
tau          <- 24       # h, q.d.
n_dose_days  <- 28L      # 28 daily doses
follow_up_h  <- 24 * 30  # 30 days observation window

obs_grid <- sort(unique(c(
  seq(0, 24, by = 0.25),                  # dense day-1 sampling
  seq(24, 24 * 14, by = 1),               # daily sampling through day 14
  seq(24 * 14, follow_up_h, by = 6)       # sparser to day 30 to keep render time low
)))

# Helper: build one cohort as a self-contained event table.
make_cohort <- function(n, dose_mg, id_offset = 0L) {
  ids <- id_offset + seq_len(n)

  # Multi-dose event table per subject -- q.d. dosing for n_dose_days
  ev_dose <- expand.grid(
    id   = ids,
    time = seq(0, by = tau, length.out = n_dose_days)
  )
  ev_dose$evid <- 1L
  ev_dose$amt  <- dose_mg
  ev_dose$cmt  <- "depot"

  # Observation rows on three outputs (Cc, SDMA, PLT)
  ev_obs_Cc   <- expand.grid(id = ids, time = obs_grid)
  ev_obs_Cc$evid <- 0L; ev_obs_Cc$amt <- 0; ev_obs_Cc$cmt <- "Cc"
  ev_obs_SD   <- expand.grid(id = ids, time = obs_grid)
  ev_obs_SD$evid <- 0L; ev_obs_SD$amt <- 0; ev_obs_SD$cmt <- "SDMA"
  ev_obs_PLT  <- expand.grid(id = ids, time = obs_grid)
  ev_obs_PLT$evid <- 0L; ev_obs_PLT$amt <- 0; ev_obs_PLT$cmt <- "PLT"

  out <- dplyr::bind_rows(ev_dose, ev_obs_Cc, ev_obs_SD, ev_obs_PLT)
  out$treatment <- sprintf("%g mg q.d.", dose_mg)
  out$dose_mg   <- dose_mg
  out
}

# Build all cohorts with disjoint id ranges
events <- dplyr::bind_rows(lapply(seq_along(dose_levels), function(i) {
  make_cohort(
    n         = n_per_dose,
    dose_mg   = dose_levels[i],
    id_offset = (i - 1L) * n_per_dose
  )
}))

stopifnot(!anyDuplicated(unique(events[, c("id", "time", "evid")])))
nrow(events); length(unique(events$id))
```

# Simulation

```{r simulate}
mod <- mod_meta

sim <- rxode2::rxSolve(
  mod,
  events = events,
  keep   = c("treatment", "dose_mg")
) |>
  as.data.frame()

sim_obs <- sim |> dplyr::filter(time <= follow_up_h)

dim(sim_obs)
unique(sim_obs$treatment)
```

For typical-value reproductions of Figure 2 (pcVPC central tendency at the RDE),
we also generate a deterministic prediction with random effects zeroed out.

```{r simulate-typical}
mod_typical <- mod |> rxode2::zeroRe()
rde_first_id <- min(events$id[events$treatment == "6 mg q.d."])
sim_typical <- rxode2::rxSolve(
  mod_typical,
  events = events |> dplyr::filter(treatment == "6 mg q.d.", id == rde_first_id)
) |>
  as.data.frame()
```

# Replicate published figures

## Figure 2 -- pcVPC of PK, SDMA, and platelet count at the RDE (6 mg q.d.)

The source Figure 2 panels (a, b, c, d) display pcVPCs across all dose levels
(median + 5th / 95th percentiles of the simulated distribution). Below we plot
the simulated central tendency at the RDE (6 mg q.d.) for each output as a
qualitative replication of those panels; absolute peaks differ from the
pooled-cohort observed scatter because the source pcVPC was prediction-and-
variance-corrected over the heterogeneous dose-escalation cohort.

```{r figure-2}
sim_rde <- sim_obs |> dplyr::filter(treatment == "6 mg q.d.")

quants <- sim_rde |>
  dplyr::group_by(time) |>
  dplyr::summarise(
    Cc05 = stats::quantile(Cc,   0.05, na.rm = TRUE),
    Cc50 = stats::quantile(Cc,   0.50, na.rm = TRUE),
    Cc95 = stats::quantile(Cc,   0.95, na.rm = TRUE),
    SD05 = stats::quantile(SDMA, 0.05, na.rm = TRUE),
    SD50 = stats::quantile(SDMA, 0.50, na.rm = TRUE),
    SD95 = stats::quantile(SDMA, 0.95, na.rm = TRUE),
    PL05 = stats::quantile(PLT,  0.05, na.rm = TRUE),
    PL50 = stats::quantile(PLT,  0.50, na.rm = TRUE),
    PL95 = stats::quantile(PLT,  0.95, na.rm = TRUE),
    .groups = "drop"
  )

# Panel (a) -- PK profile on cycle 1 day 1
ggplot(quants |> dplyr::filter(time <= 24), aes(time, Cc50)) +
  geom_ribbon(aes(ymin = Cc05, ymax = Cc95), alpha = 0.25) +
  geom_line(linewidth = 1) +
  labs(x = "Time after first dose (h)", y = "PF-06939999 (ng/mL)",
       title = "Replicates Figure 2(a): pcVPC Day 1 PK at 6 mg q.d.")

# Panel (b) -- PK profile on cycle 1 day 15 (around steady state)
ggplot(quants |> dplyr::filter(time >= 24 * 14, time <= 24 * 15 + 24), aes(time, Cc50)) +
  geom_ribbon(aes(ymin = Cc05, ymax = Cc95), alpha = 0.25) +
  geom_line(linewidth = 1) +
  labs(x = "Time after first dose (h)", y = "PF-06939999 (ng/mL)",
       title = "Replicates Figure 2(b): pcVPC Day 15 PK at 6 mg q.d.")

# Panel (c) -- SDMA time course
ggplot(quants, aes(time, SD50)) +
  geom_ribbon(aes(ymin = SD05, ymax = SD95), alpha = 0.25) +
  geom_line(linewidth = 1) +
  labs(x = "Time after first dose (h)", y = "Plasma SDMA (ng/mL)",
       title = "Replicates Figure 2(c): pcVPC SDMA at 6 mg q.d.")

# Panel (d) -- Platelet time course
ggplot(quants, aes(time, PL50)) +
  geom_ribbon(aes(ymin = PL05, ymax = PL95), alpha = 0.25) +
  geom_line(linewidth = 1) +
  labs(x = "Time after first dose (h)", y = "Platelet count (10^9/L)",
       title = "Replicates Figure 2(d): pcVPC platelet count at 6 mg q.d.")
```

## Figure 3 -- Steady-state SDMA reduction and platelet nadir vs daily dose

Source Figure 3 plots, for q.d. doses up to ~12 mg, the simulated steady-state
percentage SDMA reduction from baseline (median + 90% PI) and the platelet
nadir at steady state (median + 50% PI). Two horizontal references are drawn:
the target 78% SDMA reduction (PD) and the grade 3 thrombocytopenia threshold of
50 x 10^9/L (safety). The accompanying table reports the simulation-derived
probability of (i) achieving the target PD and (ii) developing grade >=3
thrombocytopenia at 4, 6, and 8 mg q.d.

```{r figure-3}
# Steady-state SDMA reduction (use last dosing interval as a proxy)
ss_window  <- c(24 * (n_dose_days - 1), 24 * n_dose_days)
nadir_window <- c(0, 24 * n_dose_days)  # nadir over the full treatment course

ss_sdma <- sim_obs |>
  dplyr::filter(time >= ss_window[1], time <= ss_window[2]) |>
  dplyr::group_by(id, treatment, dose_mg) |>
  dplyr::summarise(
    sdma_avg = mean(SDMA, na.rm = TRUE),
    .groups = "drop"
  )

# Per-subject baseline SDMA at time = 0 (covers the random etalblsdma)
baseline_sdma <- sim_obs |>
  dplyr::filter(time == 0) |>
  dplyr::select(id, treatment, dose_mg, sdma_baseline = SDMA)

ss_red <- ss_sdma |>
  dplyr::left_join(baseline_sdma, by = c("id", "treatment", "dose_mg")) |>
  dplyr::mutate(pct_reduction = 100 * (1 - sdma_avg / sdma_baseline))

plt_nadir <- sim_obs |>
  dplyr::filter(time >= nadir_window[1], time <= nadir_window[2]) |>
  dplyr::group_by(id, treatment, dose_mg) |>
  dplyr::summarise(plt_nadir = min(PLT, na.rm = TRUE), .groups = "drop")

dose_response <- ss_red |>
  dplyr::group_by(dose_mg) |>
  dplyr::summarise(
    sdma_red_05 = stats::quantile(pct_reduction, 0.05),
    sdma_red_50 = stats::quantile(pct_reduction, 0.50),
    sdma_red_95 = stats::quantile(pct_reduction, 0.95),
    .groups = "drop"
  ) |>
  dplyr::left_join(
    plt_nadir |> dplyr::group_by(dose_mg) |> dplyr::summarise(
      plt_25 = stats::quantile(plt_nadir, 0.25),
      plt_50 = stats::quantile(plt_nadir, 0.50),
      plt_75 = stats::quantile(plt_nadir, 0.75),
      .groups = "drop"
    ),
    by = "dose_mg"
  )

ggplot(dose_response, aes(dose_mg)) +
  geom_ribbon(aes(ymin = sdma_red_05, ymax = sdma_red_95),
              fill = "steelblue", alpha = 0.25) +
  geom_line(aes(y = sdma_red_50), colour = "steelblue", linewidth = 1) +
  geom_hline(yintercept = 78, linetype = 2, colour = "steelblue") +
  labs(x = "Once daily dose (mg)", y = "% reduction in plasma SDMA (steady state)",
       title = "Replicates Figure 3 (SDMA arm)",
       caption = "Dashed line = 78% target SDMA reduction.")

ggplot(dose_response, aes(dose_mg)) +
  geom_ribbon(aes(ymin = plt_25, ymax = plt_75),
              fill = "indianred", alpha = 0.25) +
  geom_line(aes(y = plt_50), colour = "indianred", linewidth = 1) +
  geom_hline(yintercept = 50, linetype = 2, colour = "indianred") +
  labs(x = "Once daily dose (mg)", y = "Platelet nadir (10^9/L)",
       title = "Replicates Figure 3 (platelet arm)",
       caption = "Dashed line = grade 3 thrombocytopenia threshold (50 x 10^9/L).")
```

```{r dose-response-table}
target_pd_thresh <- 78        # % SDMA reduction target
grade3_plt       <- 50        # 10^9/L grade >=3 thrombocytopenia

probs <- ss_red |>
  dplyr::left_join(plt_nadir, by = c("id", "treatment", "dose_mg")) |>
  dplyr::filter(dose_mg %in% c(4, 6, 8)) |>
  dplyr::group_by(treatment, dose_mg) |>
  dplyr::summarise(
    `P(target PD)`              = mean(pct_reduction >= target_pd_thresh),
    `P(grade >=3 thrombocyt.)`  = mean(plt_nadir <= grade3_plt),
    .groups = "drop"
  ) |>
  dplyr::arrange(dose_mg)

knitr::kable(
  probs,
  digits = 2,
  caption = paste(
    "Simulated probabilities at 4, 6, and 8 mg q.d. (cf. Source Figure 3 table:",
    "P(target PD) = 64% / 76% / 81%; P(G>=3 thrombocytopenia) = 17% / 30% / 43%)."
  )
)
```

# PKNCA validation

The source paper does not report a published NCA table to compare against
directly (the analysis was conducted on the popPK fit, with no separate
non-compartmental summary), so the PKNCA block below produces simulated NCA
parameters at the RDE and at the bracketing 4 and 8 mg q.d. cohorts as a
quantitative summary of the typical exposure that the model predicts.

```{r pknca}
pkn_cohorts <- c("4 mg q.d.", "6 mg q.d.", "8 mg q.d.")

# Steady-state NCA on the last (28th) dose interval
last_dose_time <- 24 * (n_dose_days - 1L)
end_ss         <- last_dose_time + tau

sim_nca <- sim |>
  dplyr::filter(treatment %in% pkn_cohorts,
                time >= last_dose_time, time <= end_ss,
                !is.na(Cc)) |>
  dplyr::select(id, time, Cc, treatment) |>
  dplyr::distinct(id, time, treatment, .keep_all = TRUE)

dose_df <- events |>
  dplyr::filter(treatment %in% pkn_cohorts,
                evid == 1, time == last_dose_time) |>
  dplyr::select(id, time, amt, treatment)

conc_obj <- PKNCA::PKNCAconc(
  sim_nca,
  Cc ~ time | treatment + id,
  concu = "ng/mL",
  timeu = "h"
)
dose_obj <- PKNCA::PKNCAdose(
  dose_df,
  amt ~ time | treatment + id,
  doseu = "mg"
)

intervals <- data.frame(
  start    = last_dose_time,
  end      = end_ss,
  cmax     = TRUE,
  tmax     = TRUE,
  cmin     = TRUE,
  cav      = TRUE,
  auclast  = TRUE
)

nca_res <- PKNCA::pk.nca(
  PKNCA::PKNCAdata(conc_obj, dose_obj, intervals = intervals)
)

knitr::kable(summary(nca_res),
             caption = "Steady-state NCA over the 28th dosing interval at 4, 6, and 8 mg q.d.")
```

# Assumptions and deviations

- **Day-1 low-dose bioavailability scaling factor (Table 1, "Scaling factor for
  F = 0.647", IIV 53.6%) is not implemented in this typical-value model.** The
  source applied a multiplicative F scaling on day 1 only for doses <= 6 mg/day
  to capture an apparent lower bioavailability at low doses on the first dose
  (Table 1 footnote: "A scaling factor for F was introduced to account for the
  apparently lower bioavailability for doses <=6 mg/day (dose-dependent F) in
  day 1 (time-varying F)"). Implementing this faithfully requires a per-dose
  covariate flag (a binary indicator that the user must populate as 1 for the
  cycle 1 day 1 record at any q.d. or b.i.d. dose <= 6 mg, 0 otherwise). To
  keep the model usable for the typical case (steady-state dose-response
  simulation at the RDE), the simplification was made to leave F = 1 at all
  dose events. The PK estimates carried in `ini()` are the published values,
  which were fit *with* the F scaling in place; consequently this model will
  **over-predict cycle 1 day 1 Cmax / AUC for low-dose cohorts** (the bias is
  ~1/0.647 ~ 1.55x for cycle 1 day 1 only). Steady-state predictions and
  predictions for any dose > 6 mg are unaffected. Users wanting cycle-1-day-1
  fidelity should multiply F by 0.647 manually for the qualifying dose events.
- **Imax (= 0.823) is carried as a bare typical-value parameter** without a
  logit transform. The source did not report IIV on Imax (Table 1), so the
  typical-value model does not need a transform to keep Imax in (0, 1) at
  simulation time.
- **IIV in %CV interpreted as omega^2 = log(1 + CV^2).** The source paper
  reports IIV in the "IIV (%)" column of Table 1 without specifying which CV
  convention (sqrt(omega^2) approximation vs the exact log-normal
  relationship). The exact form was used here; for the largest IIV (V1/F at
  61.1% CV) the two interpretations differ by less than 0.05 in omega^2
  (0.317 exact vs 0.373 approximate).
- **Residual error variances vs SDs.** Table 1 reports "PK / SDMA / Platelet
  residual error" as 0.112, 0.0146, and 0.0235 -- these are NONMEM SIGMA
  values (variances on the proportional or log-additive scale), not SDs.
  Interpreting them as variances gives plausible CV / log-SD magnitudes
  (PK 33%, SDMA 12% on log, platelet 15%); interpreting them as SDs would
  give 11%, 1.5%, and 2.4%, the latter two of which are too low to be
  biologically credible. The model carries `sqrt(value)` in `ini()`.
- **Compartment names `sdma` and `circ` deviate from the canonical compartment
  register** (`depot`, `central`, `peripheral1`, `precursor<n>`, ...). They are
  retained because they directly mirror the paper's notation (`SDMA` and `Circ`
  in Figure 1) and the Friberg-precedent file
  `inst/modeldb/ddmore/Friberg_2002_paclitaxel.R` uses `circ` for the same
  Friberg circulating compartment. `checkModelConventions()` flags both as
  warnings (info severity) -- the deviation is intentional.
- **Unit conversion ng/mL <-> mg/L.** The model accepts dose in mg and computes
  central / vc in mg/L (== ug/mL); the observation `Cc <- (central / vc) * 1000`
  rescales to ng/mL so the published IC50 (0.425 ng/mL) and Slope
  (0.00496 per ng/mL) parameter values can be entered verbatim from Table 1.
  `units$dosing = "mg"`, `units$concentration = "ng/mL"`.
- **Population demographics (age, weight, sex, race, region)** are reported
  in the source's Appendix Table S1, which is not on disk in this worktree;
  the `population` field in the model file therefore records dosing, disease
  state, and DLT counts verbatim from the main text (Analysis Plan and
  Results sections) and leaves the demographic numerics as `NA_*_`.
- **Steady-state SDMA reduction proxy.** Source Figure 3 reports
  "steady-state plasma SDMA reduction from baseline (%)" simulated from the
  fit. The vignette computes this by averaging SDMA over the 28th (last)
  dosing interval and contrasting against the per-subject t = 0 SDMA value.
  The 28-day daily-dose horizon is well beyond ~5 SDMA half-lives
  (Kout = 0.00708 1/h gives SDMA t1/2 ~ 4 days, so 28 days ~= 7 t1/2)
  -- adequate for a steady-state proxy.
- **Platelet nadir window.** Source Figure 3 evaluates platelet nadir "at
  steady state" using 5000 simulated participants. We evaluate it as the
  per-subject minimum platelet count over the full 28-day treatment course
  (the platelet system has MTT = 134 h ~ 5.6 days; 28 days covers the nadir).
  Cohort sizes are 200 per dose level here to keep render time within the
  pkgdown 5-minute gate.
