Runway Takeoff-Hold Lights.
A Surveillance-Driven Safety Logic

XPGuard · technical white paper · THL / RWSL

Abstract. Takeoff-hold lights (THL) are red in-pavement lights at a runway's departure hold point that signal a flight crew, lined up or beginning its roll, that the runway ahead is not safe for takeoff. This paper specifies the THL safety logic used in XPGuard: a purely kinematic decision over surveillance tracks — latitude, longitude, ground speed v, true heading ψ, reported altitude. The formulation follows the runway-status-light safety logic of MIT Lincoln Laboratory [1].
1. Architecture and scope 2. Surveillance and state estimation 3. Runway-local frame, projection, and light placement 4. The armed condition 5. The activation (hazard) condition 6. Kinematic primitives 7. The intersection-window model 8. Anticipated separation 9. Per-fixture truncation 10. System realization in XPGuard 11. Parameters

1. Architecture and scope

A THL is red if and only if the runway is armed and activated:

\[\mathsf{THL}=\mathsf{RED}\ \ \Leftrightarrow\ \ \mathsf{armed}\ \wedge\ \mathsf{activated}\]

where,

SymbolMeaningDefault
\(\mathsf{armed}\)an aircraft is in takeoff position on the runway (§4)
\(\mathsf{activated}\)the runway ahead of it is unsafe (§5)

The logic consumes one observation per track per surveillance update — geodetic position, reported altitude, ground speed, and true heading. The two predicates separate cleanly. Armed is a property of a single aircraft (is anyone in takeoff position?); activated is a property of the traffic ahead of that aircraft (is the runway it would roll into unsafe?). Both are recomputed from the current track set on every update; the only state kept between updates is a short per-track speed history (for the acceleration estimate, §2) and a brief per-runway alarm hold (the dwell, §2.3). Each runway end is treated as an independent monitor.

The remainder is organized bottom-up: the surveillance and estimation layer (§2), the geometry (§3), the two predicates (§4–§7), and the system that carries the decision into the simulator (§10).

2. Surveillance and state estimation

An observation of a track is the tuple

observation

o = (λ, φ, z, v, ψ, t) — longitude, latitude, reported altitude (source-defined — MSL, AGL, or pressure), ground speed, true heading, and the observation time. The altitude is used only in a relative on-ground gate (§5), so its reference frame does not matter.

2.1 Acceleration estimate

The predictions of §5–§7 need an along-track acceleration a, but differentiating a single update is noisy. Each track instead keeps a short history of (t, v) over a trailing window W and estimates a as the secant slope across that window:

\[a\ \approx\ \frac{v(t_k)-v(t_j)}{\,t_k-t_j\,},\qquad t_j=\min\{\,t_i:\ t_i\geq t_k-W\,\}\]

where,

SymbolMeaningDefault
\(a\)along-track acceleration estimate
\(v\)ground speed
\(W\)estimation window6 s
\(t_k,\,t_j\)newest / oldest sample in the window

where tk is the latest sample and tj the oldest still inside [tkWtk]. The window (W = 6 s) is long enough to smooth surveillance jitter yet short enough to catch a rejected takeoff within a second or two of brake application. With fewer than two samples in the window — or all sharing one timestamp — the estimate is forced to zero rather than dividing by zero, so a long-stationary track reports a ≈ 0. This single estimator drives every prediction: the special-departure “not braking” test (§5.1), the crosser entry time (§5.2), and the crosser's latest window exit (§7).

Model output. The 6 s-secant acceleration estimate through a rejected takeoff: it turns below −aRTO a couple of seconds after braking begins, flagging the abort whatever the current speed.

2.2 Track lifetime

A track is created on first observation and dropped when no fresh data has arrived for Tstale (= 12 s); this bounds memory and prevents a vanished target from haunting a runway. The history is also pruned to the window W each update, so a track stationary for minutes still reports a ≈ 0 rather than a stale slope.

2.3 Temporal hysteresis (dwell)

Surveillance feeds are not uniform — a public datafeed may update only every several seconds — so a raw activation can flicker across a gap in the data. The alarm is therefore latched: once activation fires it is held on for a dwell Td (= 3 s) past the last active update. The hold carries the armed/hazard identities with it, so the displayed cause is stable; it only ever extends a red phase, never creates one, so it cannot mask a genuine all-clear beyond Td.

3. Runway-local frame, projection, and light placement

Each runway end is treated independently. We place the origin O at the runway threshold and define a right-handed runway-local frame: ξ is the longitudinal coordinate (positive toward the far end), η the signed lateral coordinate. The runway unit vector u and bearing ψR come from the two threshold endpoints b (far minus near, in the local east/north metric):

\[u=\frac{b}{|b|},\qquad \psi_R=\mathrm{atan2}(u_x,\,u_y)\]

where,

SymbolMeaningDefault
\(u\)runway unit vector (along the runway)
\(\psi_R\)runway bearing (true)
\(b\)far-minus-near threshold vector

A track at (λφ) is carried to the local east/north offsets (xy) from the threshold by an equirectangular projection and then onto the runway axes; we write (st) for (lateral, longitudinal) in the implementation:

\[x=(\lambda-\lambda_0)\,\frac{\pi}{180}\,R\cos\phi_0,\quad y=(\phi-\phi_0)\,\frac{\pi}{180}\,R\qquad t=x\,u_x+y\,u_y,\quad s=-\,x\,u_y+y\,u_x\]

where,

SymbolMeaningDefault
\(x,\,y\)local east / north offset from the threshold
\(R\)Earth radius6 371 km
\(\lambda_0,\,\phi_0\)threshold longitude / latitude
\(t\equiv\xi\)distance down the runway
\(s\equiv\eta\)signed offset from the centerline

so t ≡ ξ is distance down the runway and s ≡ η is signed offset from the centerline. The differentiated form gives the along/across velocity split used throughout,

\[\dot{\xi}=v\cos\Delta\psi,\qquad \dot{\eta}=v\sin\Delta\psi\qquad(\Delta\psi=\psi-\psi_R)\]

where,

SymbolMeaningDefault
\(\Delta\psi\)heading relative to the runway
\(\dot\xi,\,\dot\eta\)along / across-runway velocity

All bearings are true. The runway has half-width h (defaulting to 25 m when the field width is unknown) and length R; the corridor treated as “on the runway” — the band — is |η| ≤ h + e with a small side extension e. The equirectangular approximation is exact to better than a metre over a runway-sized neighborhood, far below the band tolerance. Two lateral tolerances follow: the tighter |η| ≤ h gates the in-position / arming test (§4), while the wider band |η| ≤ h + e decides whether a hazard counts as “on the runway” (§5).

The THLs are, physically, a double row of in-pavement fixtures along the runway centerline, beginning a short distance ahead of the runway threshold and extending downfield (the row/fixture layout is a rendering detail, §10; the safety logic here yields only the lit longitudinal extent). In the runway-local frame the array occupies

\[\ell_0\,\leq\,\xi\,\leq\,\ell_0+L\]

where,

SymbolMeaningDefault
\(h\)runway half-width (default if unknown)25 m
\(e\)band side extension beyond the half-width15 m
\(\ell_0\)array start ahead of the threshold114 m (375 ft)
\(L\)array length457.2 m (1500 ft)
\(\ell_R\)runway lengthper runway

with start 0 = 114 m (375 ft) and length L = 457.2 m (1500 ft), per ATC-206 [1]. A departing aircraft holds at ξ ≈ 0 and sees the lit array stretching ahead of it. The array is the visual cue; whether, and how far, it is lit is decided by §4–§9.

Figure 1. THL placement and the runway-local frame (ξη) with origin at the runway threshold.

4. The armed condition

An aircraft is in position (and the runway thereby armed) when it lies in the arming region 𝒜, is aligned with the runway, and is at or below the in-position speed:

\[-B\ \leq\ \xi\ \leq\ \min(\ell_0+L,\ \ell_R-\ell_{\mathrm{ahead}}),\qquad |\eta|\leq h\]
\[\xi\in\mathcal{A},\qquad |\Delta\psi|\leq\Theta,\qquad v\leq V_0\]

where,

SymbolMeaningDefault
\(B\)arming margin behind the threshold40 m
\(\ell_{\mathrm{ahead}}\)minimum runway ahead of an in-position aircraft300 m
\(\Theta\)alignment tolerance65°
\(V_0\)in-position speed gate35 kt
\(\mathcal{A}\)the arming region

The region runs from a small margin B (= 40 m, for aircraft length and position jitter) behind the threshold out to the far end of the array, capped so that at least ahead (= 300 m) of runway remains in front:

arming bounds (implementation)

ξlo = −B,  ξhi = min(0 + LR − ahead), |η| ≤ h,  |Δψ| ≤ Θ, v ≤ V0.

Alignment uses a generous tolerance Θ = 65° so an aircraft still swinging onto the centerline arms; the speed gate V0 = 35 kt admits a rolling line-up but excludes a committed departure. When several aircraft satisfy the predicate, the protected aircraft A is the trailing-most (smallest ξA) — the one most in need of protection; an aircraft lined up further down is then a hazard for A (§9).

Figure 2. The arming region 𝒜 and the in-position predicate; the origin is the runway threshold and the takeoff arms from the full-length start.

5. The activation (hazard) condition

Given an armed aircraft A at ξA, a candidate hazard B is considered only if it is ahead of A (by a small guard, ξB > ξA + 30 m), within the runway length, and on the ground:

\[\xi_A+30\,\mathrm{m}\,<\,\xi_B\,\leq\,\ell_R\]

where,

SymbolMeaningDefault
\(\xi_A,\,\xi_B\)along-runway position of the armed aircraft / candidate hazard
\(z_g\)altitude difference from the armed aircraft treated as on-ground50 ft

The ground test is a height gate: a target whose reported altitude differs from the armed aircraft's by more than zg = 50 ft is climbing out or overflying and is not a surface hazard. Using A's own altitude as the datum makes the test a relative one, robust to local pressure setting. Each qualifying B falls into exactly one regime; the runway is activated if any flags a hazard, and the lit array stops at the nearest one (§9).

Figure 3. Hazard taxonomy: (a) in-trail occupancy, (b) a predicted crosser, (c) a conflict on an intersecting runway.

5.1 In-trail occupancy and the special-departure rule

When B lies within the band (|ηB| ≤ h + e) it is physically on A's runway and is a hazard unless it is a prior departure clearly clearing. Decompose its velocity into along- and across-runway components and form the clear-time tc, the time to reach the clear distance ξc at the along-runway speed (the denominator carries a small floor vmin to avoid division by zero near rest):

\[v_\parallel=v\cos\Delta\psi,\quad v_\perp=v\sin\Delta\psi,\qquad t_c=\frac{\xi_c-\xi}{\max(v_\parallel,\,v_{\min})}\]

where,

SymbolMeaningDefault
\(v_\parallel,\,v_\perp\)along / across-runway speed components
\(t_c\)time to reach the clear distance
\(\xi_c\)clear distance762 m
\(v_{\min}\)speed floor (avoids division by zero)0.3 m/s

Following the special-departure rule of ATC-206 [1, §2.2.8], B clears only when it is moving predominantly down the runway, fast, committed, and far enough along:

occupancy clears (not a hazard) if
\[|v_\parallel|\geq|v_\perp|,\quad v_\parallel>V_d,\quad a_B>-a_{RTO},\quad t_c\leq\tau_{AS}\]

where,

SymbolMeaningDefault
\(V_d\)clearing speed75 kt
\(a_{RTO}\)braking threshold for a rejected takeoff0.5 m/s²
\(\tau_{AS}\)anticipated-separation lead3.5 s

i.e., moving along not across, faster than the clearing speed, not braking, and reaching the clear distance within the anticipation lead. The clearing speed Vd = 75 kt is deliberately high: a normal departure is well past it by the clear distance ξc = 762 m, so the gate never delays a real takeoff, but it excludes the line-up/early-roll band where an abort is still likely. The braking test is the key safety feature: a rejected takeoff, whose estimated acceleration turns below −aRTO (= −0.5 m·s⁻²), is flagged the instant it begins to brake — whatever its current speed — because commitment, not velocity, decides whether the runway ahead will clear. A stationary, slow, crossing, or rejecting aircraft fails the test and remains a hazard.

Model output. The clearing rule in the speed/position plane: a committed departure crosses the 75 kt gate within ~370 m, so the rule never delays a real takeoff — only the line-up / early-roll band, where an abort is still likely, is held.
Animation 1. In-trail departure and the special-departure rule. THY5PG holds at the threshold with the runway ahead clear (THL off); PGT25R enters ahead and lines up, so the array lights from ahead of THY5PG up to the front aircraft; as PGT25R rolls and meets the clearing rule (v > Vd, not braking, within τAS of ξc) the array extinguishes and THY5PG may depart.

5.2 Predicted crosser

When B is outside the band but within a lateral sanity bound (|ηB| < ηmax = 1000 m), the logic does not wait for it to arrive. Its closure — the component of velocity toward the centerline, with n the runway normal — is

\[c=-\,\mathrm{sgn}(s)\,(v_E\,n_x+v_N\,n_y),\qquad n=(-u_y,\ u_x)\]

where,

SymbolMeaningDefault
\(c\)closure rate toward the centerline
\(n\)runway normal (unit)
\(v_E,\,v_N\)east / north velocity

and only a positive, significant closure (c > 0.5 m·s⁻¹) is treated as approaching. The closure and the lateral acceleration then give a time-to-enter τin, the smallest non-negative root of

\[|\eta_B|-(h+e)\ =\ \dot{\eta}\,\tau+\frac{1}{2}\,\ddot{\eta}\,\tau^{2}\]

where,

SymbolMeaningDefault
\(\tau_{\mathrm{in}}\)time-to-enter the band
\(\eta_{\max}\)lateral sanity bound on a crosser1000 m
\(\tau_H\)predicted-crosser horizon12 s

solved by the primitive of §6 (the lateral acceleration η̈ is the along-track acceleration projected onto the runway normal, taking the heading as fixed over the short horizon). B is a hazard if τin < τH (= 12 s): the light leads the entry, so a taxiing aircraft crossing the runway triggers the hazard warning before it reaches the surface, not after. The horizon τH is the principal sensitivity control: a controller can set it anywhere from 3 to 30 s from the EuroScope or vatSys plugin, trading earlier warning against fewer marginal activations.

(a) PGT25R brakes and holds short of the runway edge — τin stays above τH, so the THL stays off and THY5PG is clear to depart.
(b) PGT25R approaches fast — τin < τH = 12 s before it enters, so the THL lights and holds THY5PG.
Animation 2. Predictive crosser, deceleration-dependent. THY5PG is the lined-up departure being protected; PGT25R is the crosser. The light leads the entry, so the same geometry holds the runway (b) or not (a) according to whether τin reaches the horizon.
Model output. Time-to-enter τin against lateral offset for three closure rates. The array lights wherever τin < τH = 12 s — the faster the closure, the further out the hold begins.

5.3 Intersecting-runway conflict

A target traveling along a runway that crosses A's is excluded from the band rules above (at a shallow crossing angle they would misread it as an in-trail departure) and routed to the dedicated intersection-window model of §7. A track is classified as cross-runway traffic for A when it lies on some other runway rB (within that runway's band and length) and is aligned with it to within Δψdep = 20°, and rB geometrically crosses rA. The whole array lights for such a conflict.

6. Kinematic primitives

Two constant-acceleration solvers underlie every prediction. The first returns the smallest non-negative time to cover a distance d from speed v0 at acceleration a:

\[\tau\ =\ \frac{-v_0+\sqrt{v_0^{2}+2ad}}{a}\]

where,

SymbolMeaningDefault
\(\tau\)time to cover the distance
\(v_0\)initial speed
\(a\)acceleration
\(d\)distance to cover

It is used with the net closing distance and rate; if the discriminant is negative — the body decelerates to a stop short of d — the time is taken as +∞, which in the crosser and window tests means “never enters” or “stops inside and occupies” as appropriate. The second is a piecewise model that accelerates from v0 at a up to a cap vm and then travels with constant velocity:

\[\mathcal{T}(d,a)=\frac{v_m-v_0}{a}+\frac{d-d_a}{v_m}\ \ (d>d_a),\qquad d_a=\frac{v_m^{2}-v_0^{2}}{2a}\]

where,

SymbolMeaningDefault
\(\mathcal{T}\)capped accelerate-then-cruise time
\(v_m\)speed cap90 m/s (~175 kt)
\(d_a\)distance to reach the cap

for the constant-velocity branch (d > da, the distance to reach the cap); below da it reduces to the accelerating form of the first solver.

7. The intersection-window model

Where runway rB crosses rA, conflict is decided not by position but by timing: would the protected aircraft A and the crosser B occupy the shared crossing region at the same time?

7.1 Crossing geometry

The runways cross only if they are not near-collinear — |sin θ| ≥ 0.17 (θ ≳ 10°) — and if rB's two ends fall on opposite sides of rA's centerline (s0·s1 < 0). The crossing point along rA follows by linear interpolation of the lateral offset:

\[f=\frac{s_0}{\,s_0-s_1\,},\qquad \xi_\times=t_0+f\,(t_1-t_0)\]

where,

SymbolMeaningDefault
\(f\)interpolation fraction of the crossing along the runway
\(\xi_\times\)crossing point along the runway
\(s_0,\,s_1\)lateral offset of the other runway's two ends
\(\theta\)angle between the runways

The shared region is a parallelogram; its half-extent along each runway includes the other runway's width projected through the crossing angle, half the host runway's width, and a spatial pad:

\[\Delta_A=\frac{h_B}{\sin\theta}+\frac{1}{2}\,h_A+W_{\mathrm{pad}}\]

where,

SymbolMeaningDefault
\(\Delta_A\)half-extent of the shared crossing window
\(h_A,\,h_B\)runway half-widths
\(W_{\mathrm{pad}}\)spatial safety pad at each edge40 m

The 1/sin θ factor widens the window at shallow crossings, and the pad Wpad = 40 m adds a fixed margin at each edge.

7.2 Window-occupancy intervals and overlap

A's occupancy of the window is uncertain because its takeoff acceleration is unknown; its interval is taken over the whole airliner range (§8), earliest entry with the fastest acceleration and latest exit with the slowest:

\[\tau_A^-=\mathcal{T}(\max(0,\,\xi_\times-\Delta_A-\xi_A),\,a_{\max}),\qquad \tau_A^+=\mathcal{T}(\max(0,\,\xi_\times+\Delta_A-\xi_A),\,a_{\min})\]

where,

SymbolMeaningDefault
\(\tau_A^-,\,\tau_A^+\)A's earliest entry / latest exit of the window
\(a_{\min},\,a_{\max}\)airliner ground-roll acceleration bracket1.3 / 2.8 m/s²
\(a_{B,\mathrm{acc}},\,a_{B,\mathrm{dec}}\)crosser assumed accel / max braking2.5 / 2.5 m/s²

B's interval uses its measured approach: its earliest entry is propagated from its current closing speed at an assumed crossing-departure acceleration via the capped solver of §6; its latest exit uses B's own acceleration through the uncapped quadratic — which diverges to +∞ if B would stop inside the window, so a stalled crosser is treated as a standing occupant. The runway is unsafe when the two intervals overlap within a margin μ:

intersection conflict if
\[\tau_B^-\leq\tau_A^++\mu,\qquad \tau_A^-\leq\tau_B^++\mu\]

where,

SymbolMeaningDefault
\(\mu\)window time margin2 s
\(\tau_B^-,\,\tau_B^+\)crosser's earliest entry / latest exit

A fast crosser that will clear the window before A could arrive produces no overlap and the lights stay off; a slow or stalling one keeps them red.

Animation 3. Intersecting runways. THY5PG is lined up on R1; PGT25R starts its takeoff roll on R2 across the intersection. The occupancy windows (lower panel) update live: while they overlap the THL holds THY5PG red, but once PGT25R will clear the intersection before THY5PG could reach it, anticipated separation releases the light.

8. Anticipated separation and the acceleration window

In every regime the lights extinguish before the hazard is fully clear, the moment a safe gap is assured — the property the FAA calls anticipated separation [2]. In the occupancy rule this is the clear distance ξc reached with the lead τAS = 3.5 s; in the crosser rule it is the horizon τH; in the intersection rule it is the interval-overlap test itself.

acceleration window

The protected aircraft's type is unknown, so its window-occupancy interval is taken over the whole airliner range. The mean ground-roll acceleration

\[\bar a\ =\ \frac{v_{LOF}^{2}}{2\,s_g}\]

clusters tightly: heavy widebodies near 1.3 m·s⁻², light narrowbodies near 2.8 m·s⁻². We bracket a ∈ [1.3, 2.8] and take A's earliest entry with the upper bound and its latest exit with the lower — the union over all plausible aircraft — so the runway holds if any share the window with the crosser.

where,

SymbolMeaningDefault
\(\bar a\)mean ground-roll acceleration
\(v_{LOF}\)lift-off speed
\(s_g\)ground-roll distance
Model output. Representative airliner ground-roll acceleration against the model's [1.3, 2.8] m·s⁻² bracket, which conservatively spans the realistic range.
Figure 4. Anticipated separation as an interval-overlap test on the intersection window.
Model output. The interval-overlap test: A's window-occupancy bracket against the crosser's, with the ±μ = 2 s margin — overlap holds the array (left), a clear gap releases it (right).

9. Per-fixture truncation under multiple line-up

When the nearest hazard B is itself lined up within the array — on the centreline (|ηB| ≤ h), aligned (|Δψ| ≤ Θ), and slow (v ≤ V0) — the runway between A and B is unsafe but the runway beyond B is B's own to depart into. The lit set is truncated at the front aircraft:

\[\ell_0\,\leq\,\xi\,\leq\,\min(\ell_0+L,\ \xi_B)\]

where,

SymbolMeaningDefault
\(\xi_B\)along-runway position of the lined-up front aircraft

A crossing or rolling hazard does not truncate — the whole array lights — so only a stationary, aligned occupant shortens the array. The leading aircraft therefore always sees the clear pavement ahead and can depart while the trailing aircraft is held. This per-fixture lit extent is carried end-to-end (controller plugin → server → simulator) so the truncation is reflected fixture-by-fixture in the sim.

Figure 5. Multiple line-up: the array is lit from the threshold up to the front aircraft B and dark beyond.

10. System realization in XPGuard

The logic above is a self-contained, dependency-free monitor: pure math on the observation tuple, with no network, simulator, or sector-file coupling. XPGuard realises it as a distributed pipeline so that controllers drive the surveillance and pilots see the result.

StageRole
SurveillanceThe controller-side plugin (EuroScope) feeds the monitor from in-session radar targets — geodetic position, ground speed, reported heading, and altitude — at the radar update cadence.
DecisionFor each armed runway the monitor returns on/off, the armed and hazard track identities, the predicted-vs.-occupied flag, and the truncation distance ξB of §9. A rising edge is computed once and pushed; the lit extent is re-pushed when the truncation point moves more than a fixed tolerance.
DistributionThe decision and lit extent are posted to the XPGuard server, which holds the authoritative state and serves it to connected simulators. State is reconciled against runway ownership, so an unarmed runway never strands a red light.
RenderingThe X-Plane client builds the physical fixture array from the runway threshold and true heading and lights the corona instances up to the served extent, via the simulator's instancing API. The renderer is a thin reflector — it holds no safety logic of its own.

11. Parameters

SymbolMeaningValue
0, LTHL array start, length114 m, 457.2 m (375, 1500 ft)
eband side extension beyond half-width15 m
hrunway half-width (default if unknown)per runway (25 m)
aheadmin runway ahead of an in-position a/c300 m
Barming margin behind the threshold40 m
Θ, V0alignment tolerance, in-position speed65°, 35 kt
Vd, ξcclearing speed, clear distance75 kt, 762 m
aRTObraking threshold for a rejected takeoff0.5 m·s⁻²
τASanticipated-separation lead3.5 s
τHpredicted-crosser horizon (controller-adjustable, EuroScope / vatSys)12 s (3–30 s)
ηmaxlateral sanity bound on a crosser1000 m
zgaltitude difference from the armed aircraft treated as on-ground50 ft
Td, Tstalealarm dwell, track-stale timeout3 s, 12 s
Wgs-acceleration window6 s
Δψdep“along a runway” heading tolerance20°
amin, amaxairliner ground-roll acceleration window1.3–2.8 m·s⁻²
vmacceleration-model speed cap90 m·s⁻¹ (~175 kt)
aB,acc, aB,deccrosser assumed accel / max braking2.5, 2.5 m·s⁻²
μ, Wpadwindow time margin, spatial pad2 s, 40 m
collinear rejectmin |sin θ| to treat runways as crossing0.17 (~10°)
References
[1] J. R. Eggert, R. J. Sasiela, M. P. Kastner, et al., “Runway Status Light System Demonstration at Logan Airport,” MIT Lincoln Laboratory, Lexington, MA, USA, Project Report ATC-206, 1995.
[2] Federal Aviation Administration, “Runway Status Lights (RWSL) Pilot Reference Guide,” FAA, Washington, DC, USA.

XPGuard · THL Safety Logic