diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..6463651
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,9 @@
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# OS generated files
+.DS_Store
+Thumbs.db
+desktop.ini
diff --git a/algorithmic-art/LICENSE.txt b/algorithmic-art/LICENSE.txt
new file mode 100644
index 0000000..4f881c5
--- /dev/null
+++ b/algorithmic-art/LICENSE.txt
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright 2026 Anthropic, PBC.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
\ No newline at end of file
diff --git a/algorithmic-art/SKILL.md b/algorithmic-art/SKILL.md
new file mode 100644
index 0000000..634f6fa
--- /dev/null
+++ b/algorithmic-art/SKILL.md
@@ -0,0 +1,405 @@
+---
+name: algorithmic-art
+description: Creating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems. Create original algorithmic art rather than copying existing artists' work to avoid copyright violations.
+license: Complete terms in LICENSE.txt
+---
+
+Algorithmic philosophies are computational aesthetic movements that are then expressed through code. Output .md files (philosophy), .html files (interactive viewer), and .js files (generative algorithms).
+
+This happens in two steps:
+1. Algorithmic Philosophy Creation (.md file)
+2. Express by creating p5.js generative art (.html + .js files)
+
+First, undertake this task:
+
+## ALGORITHMIC PHILOSOPHY CREATION
+
+To begin, create an ALGORITHMIC PHILOSOPHY (not static images or templates) that will be interpreted through:
+- Computational processes, emergent behavior, mathematical beauty
+- Seeded randomness, noise fields, organic systems
+- Particles, flows, fields, forces
+- Parametric variation and controlled chaos
+
+### THE CRITICAL UNDERSTANDING
+- What is received: Some subtle input or instructions by the user to take into account, but use as a foundation; it should not constrain creative freedom.
+- What is created: An algorithmic philosophy/generative aesthetic movement.
+- What happens next: The same version receives the philosophy and EXPRESSES IT IN CODE - creating p5.js sketches that are 90% algorithmic generation, 10% essential parameters.
+
+Consider this approach:
+- Write a manifesto for a generative art movement
+- The next phase involves writing the algorithm that brings it to life
+
+The philosophy must emphasize: Algorithmic expression. Emergent behavior. Computational beauty. Seeded variation.
+
+### HOW TO GENERATE AN ALGORITHMIC PHILOSOPHY
+
+**Name the movement** (1-2 words): "Organic Turbulence" / "Quantum Harmonics" / "Emergent Stillness"
+
+**Articulate the philosophy** (4-6 paragraphs - concise but complete):
+
+To capture the ALGORITHMIC essence, express how this philosophy manifests through:
+- Computational processes and mathematical relationships?
+- Noise functions and randomness patterns?
+- Particle behaviors and field dynamics?
+- Temporal evolution and system states?
+- Parametric variation and emergent complexity?
+
+**CRITICAL GUIDELINES:**
+- **Avoid redundancy**: Each algorithmic aspect should be mentioned once. Avoid repeating concepts about noise theory, particle dynamics, or mathematical principles unless adding new depth.
+- **Emphasize craftsmanship REPEATEDLY**: The philosophy MUST stress multiple times that the final algorithm should appear as though it took countless hours to develop, was refined with care, and comes from someone at the absolute top of their field. This framing is essential - repeat phrases like "meticulously crafted algorithm," "the product of deep computational expertise," "painstaking optimization," "master-level implementation."
+- **Leave creative space**: Be specific about the algorithmic direction, but concise enough that the next Claude has room to make interpretive implementation choices at an extremely high level of craftsmanship.
+
+The philosophy must guide the next version to express ideas ALGORITHMICALLY, not through static images. Beauty lives in the process, not the final frame.
+
+### PHILOSOPHY EXAMPLES
+
+**"Organic Turbulence"**
+Philosophy: Chaos constrained by natural law, order emerging from disorder.
+Algorithmic expression: Flow fields driven by layered Perlin noise. Thousands of particles following vector forces, their trails accumulating into organic density maps. Multiple noise octaves create turbulent regions and calm zones. Color emerges from velocity and density - fast particles burn bright, slow ones fade to shadow. The algorithm runs until equilibrium - a meticulously tuned balance where every parameter was refined through countless iterations by a master of computational aesthetics.
+
+**"Quantum Harmonics"**
+Philosophy: Discrete entities exhibiting wave-like interference patterns.
+Algorithmic expression: Particles initialized on a grid, each carrying a phase value that evolves through sine waves. When particles are near, their phases interfere - constructive interference creates bright nodes, destructive creates voids. Simple harmonic motion generates complex emergent mandalas. The result of painstaking frequency calibration where every ratio was carefully chosen to produce resonant beauty.
+
+**"Recursive Whispers"**
+Philosophy: Self-similarity across scales, infinite depth in finite space.
+Algorithmic expression: Branching structures that subdivide recursively. Each branch slightly randomized but constrained by golden ratios. L-systems or recursive subdivision generate tree-like forms that feel both mathematical and organic. Subtle noise perturbations break perfect symmetry. Line weights diminish with each recursion level. Every branching angle the product of deep mathematical exploration.
+
+**"Field Dynamics"**
+Philosophy: Invisible forces made visible through their effects on matter.
+Algorithmic expression: Vector fields constructed from mathematical functions or noise. Particles born at edges, flowing along field lines, dying when they reach equilibrium or boundaries. Multiple fields can attract, repel, or rotate particles. The visualization shows only the traces - ghost-like evidence of invisible forces. A computational dance meticulously choreographed through force balance.
+
+**"Stochastic Crystallization"**
+Philosophy: Random processes crystallizing into ordered structures.
+Algorithmic expression: Randomized circle packing or Voronoi tessellation. Start with random points, let them evolve through relaxation algorithms. Cells push apart until equilibrium. Color based on cell size, neighbor count, or distance from center. The organic tiling that emerges feels both random and inevitable. Every seed produces unique crystalline beauty - the mark of a master-level generative algorithm.
+
+*These are condensed examples. The actual algorithmic philosophy should be 4-6 substantial paragraphs.*
+
+### ESSENTIAL PRINCIPLES
+- **ALGORITHMIC PHILOSOPHY**: Creating a computational worldview to be expressed through code
+- **PROCESS OVER PRODUCT**: Always emphasize that beauty emerges from the algorithm's execution - each run is unique
+- **PARAMETRIC EXPRESSION**: Ideas communicate through mathematical relationships, forces, behaviors - not static composition
+- **ARTISTIC FREEDOM**: The next Claude interprets the philosophy algorithmically - provide creative implementation room
+- **PURE GENERATIVE ART**: This is about making LIVING ALGORITHMS, not static images with randomness
+- **EXPERT CRAFTSMANSHIP**: Repeatedly emphasize the final algorithm must feel meticulously crafted, refined through countless iterations, the product of deep expertise by someone at the absolute top of their field in computational aesthetics
+
+**The algorithmic philosophy should be 4-6 paragraphs long.** Fill it with poetic computational philosophy that brings together the intended vision. Avoid repeating the same points. Output this algorithmic philosophy as a .md file.
+
+---
+
+## DEDUCING THE CONCEPTUAL SEED
+
+**CRITICAL STEP**: Before implementing the algorithm, identify the subtle conceptual thread from the original request.
+
+**THE ESSENTIAL PRINCIPLE**:
+The concept is a **subtle, niche reference embedded within the algorithm itself** - not always literal, always sophisticated. Someone familiar with the subject should feel it intuitively, while others simply experience a masterful generative composition. The algorithmic philosophy provides the computational language. The deduced concept provides the soul - the quiet conceptual DNA woven invisibly into parameters, behaviors, and emergence patterns.
+
+This is **VERY IMPORTANT**: The reference must be so refined that it enhances the work's depth without announcing itself. Think like a jazz musician quoting another song through algorithmic harmony - only those who know will catch it, but everyone appreciates the generative beauty.
+
+---
+
+## P5.JS IMPLEMENTATION
+
+With the philosophy AND conceptual framework established, express it through code. Pause to gather thoughts before proceeding. Use only the algorithmic philosophy created and the instructions below.
+
+### ⚠️ STEP 0: READ THE TEMPLATE FIRST ⚠️
+
+**CRITICAL: BEFORE writing any HTML:**
+
+1. **Read** `templates/viewer.html` using the Read tool
+2. **Study** the exact structure, styling, and Anthropic branding
+3. **Use that file as the LITERAL STARTING POINT** - not just inspiration
+4. **Keep all FIXED sections exactly as shown** (header, sidebar structure, Anthropic colors/fonts, seed controls, action buttons)
+5. **Replace only the VARIABLE sections** marked in the file's comments (algorithm, parameters, UI controls for parameters)
+
+**Avoid:**
+- ❌ Creating HTML from scratch
+- ❌ Inventing custom styling or color schemes
+- ❌ Using system fonts or dark themes
+- ❌ Changing the sidebar structure
+
+**Follow these practices:**
+- ✅ Copy the template's exact HTML structure
+- ✅ Keep Anthropic branding (Poppins/Lora fonts, light colors, gradient backdrop)
+- ✅ Maintain the sidebar layout (Seed → Parameters → Colors? → Actions)
+- ✅ Replace only the p5.js algorithm and parameter controls
+
+The template is the foundation. Build on it, don't rebuild it.
+
+---
+
+To create gallery-quality computational art that lives and breathes, use the algorithmic philosophy as the foundation.
+
+### TECHNICAL REQUIREMENTS
+
+**Seeded Randomness (Art Blocks Pattern)**:
+```javascript
+// ALWAYS use a seed for reproducibility
+let seed = 12345; // or hash from user input
+randomSeed(seed);
+noiseSeed(seed);
+```
+
+**Parameter Structure - FOLLOW THE PHILOSOPHY**:
+
+To establish parameters that emerge naturally from the algorithmic philosophy, consider: "What qualities of this system can be adjusted?"
+
+```javascript
+let params = {
+ seed: 12345, // Always include seed for reproducibility
+ // colors
+ // Add parameters that control YOUR algorithm:
+ // - Quantities (how many?)
+ // - Scales (how big? how fast?)
+ // - Probabilities (how likely?)
+ // - Ratios (what proportions?)
+ // - Angles (what direction?)
+ // - Thresholds (when does behavior change?)
+};
+```
+
+**To design effective parameters, focus on the properties the system needs to be tunable rather than thinking in terms of "pattern types".**
+
+**Core Algorithm - EXPRESS THE PHILOSOPHY**:
+
+**CRITICAL**: The algorithmic philosophy should dictate what to build.
+
+To express the philosophy through code, avoid thinking "which pattern should I use?" and instead think "how to express this philosophy through code?"
+
+If the philosophy is about **organic emergence**, consider using:
+- Elements that accumulate or grow over time
+- Random processes constrained by natural rules
+- Feedback loops and interactions
+
+If the philosophy is about **mathematical beauty**, consider using:
+- Geometric relationships and ratios
+- Trigonometric functions and harmonics
+- Precise calculations creating unexpected patterns
+
+If the philosophy is about **controlled chaos**, consider using:
+- Random variation within strict boundaries
+- Bifurcation and phase transitions
+- Order emerging from disorder
+
+**The algorithm flows from the philosophy, not from a menu of options.**
+
+To guide the implementation, let the conceptual essence inform creative and original choices. Build something that expresses the vision for this particular request.
+
+**Canvas Setup**: Standard p5.js structure:
+```javascript
+function setup() {
+ createCanvas(1200, 1200);
+ // Initialize your system
+}
+
+function draw() {
+ // Your generative algorithm
+ // Can be static (noLoop) or animated
+}
+```
+
+### CRAFTSMANSHIP REQUIREMENTS
+
+**CRITICAL**: To achieve mastery, create algorithms that feel like they emerged through countless iterations by a master generative artist. Tune every parameter carefully. Ensure every pattern emerges with purpose. This is NOT random noise - this is CONTROLLED CHAOS refined through deep expertise.
+
+- **Balance**: Complexity without visual noise, order without rigidity
+- **Color Harmony**: Thoughtful palettes, not random RGB values
+- **Composition**: Even in randomness, maintain visual hierarchy and flow
+- **Performance**: Smooth execution, optimized for real-time if animated
+- **Reproducibility**: Same seed ALWAYS produces identical output
+
+### OUTPUT FORMAT
+
+Output:
+1. **Algorithmic Philosophy** - As markdown or text explaining the generative aesthetic
+2. **Single HTML Artifact** - Self-contained interactive generative art built from `templates/viewer.html` (see STEP 0 and next section)
+
+The HTML artifact contains everything: p5.js (from CDN), the algorithm, parameter controls, and UI - all in one file that works immediately in claude.ai artifacts or any browser. Start from the template file, not from scratch.
+
+---
+
+## INTERACTIVE ARTIFACT CREATION
+
+**REMINDER: `templates/viewer.html` should have already been read (see STEP 0). Use that file as the starting point.**
+
+To allow exploration of the generative art, create a single, self-contained HTML artifact. Ensure this artifact works immediately in claude.ai or any browser - no setup required. Embed everything inline.
+
+### CRITICAL: WHAT'S FIXED VS VARIABLE
+
+The `templates/viewer.html` file is the foundation. It contains the exact structure and styling needed.
+
+**FIXED (always include exactly as shown):**
+- Layout structure (header, sidebar, main canvas area)
+- Anthropic branding (UI colors, fonts, gradients)
+- Seed section in sidebar:
+ - Seed display
+ - Previous/Next buttons
+ - Random button
+ - Jump to seed input + Go button
+- Actions section in sidebar:
+ - Regenerate button
+ - Reset button
+
+**VARIABLE (customize for each artwork):**
+- The entire p5.js algorithm (setup/draw/classes)
+- The parameters object (define what the art needs)
+- The Parameters section in sidebar:
+ - Number of parameter controls
+ - Parameter names
+ - Min/max/step values for sliders
+ - Control types (sliders, inputs, etc.)
+- Colors section (optional):
+ - Some art needs color pickers
+ - Some art might use fixed colors
+ - Some art might be monochrome (no color controls needed)
+ - Decide based on the art's needs
+
+**Every artwork should have unique parameters and algorithm!** The fixed parts provide consistent UX - everything else expresses the unique vision.
+
+### REQUIRED FEATURES
+
+**1. Parameter Controls**
+- Sliders for numeric parameters (particle count, noise scale, speed, etc.)
+- Color pickers for palette colors
+- Real-time updates when parameters change
+- Reset button to restore defaults
+
+**2. Seed Navigation**
+- Display current seed number
+- "Previous" and "Next" buttons to cycle through seeds
+- "Random" button for random seed
+- Input field to jump to specific seed
+- Generate 100 variations when requested (seeds 1-100)
+
+**3. Single Artifact Structure**
+```html
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+**CRITICAL**: This is a single artifact. No external files, no imports (except p5.js CDN). Everything inline.
+
+**4. Implementation Details - BUILD THE SIDEBAR**
+
+The sidebar structure:
+
+**1. Seed (FIXED)** - Always include exactly as shown:
+- Seed display
+- Prev/Next/Random/Jump buttons
+
+**2. Parameters (VARIABLE)** - Create controls for the art:
+```html
+
+ Parameter Name
+
+ ...
+
+```
+Add as many control-group divs as there are parameters.
+
+**3. Colors (OPTIONAL/VARIABLE)** - Include if the art needs adjustable colors:
+- Add color pickers if users should control palette
+- Skip this section if the art uses fixed colors
+- Skip if the art is monochrome
+
+**4. Actions (FIXED)** - Always include exactly as shown:
+- Regenerate button
+- Reset button
+- Download PNG button
+
+**Requirements**:
+- Seed controls must work (prev/next/random/jump/display)
+- All parameters must have UI controls
+- Regenerate, Reset, Download buttons must work
+- Keep Anthropic branding (UI styling, not art colors)
+
+### USING THE ARTIFACT
+
+The HTML artifact works immediately:
+1. **In claude.ai**: Displayed as an interactive artifact - runs instantly
+2. **As a file**: Save and open in any browser - no server needed
+3. **Sharing**: Send the HTML file - it's completely self-contained
+
+---
+
+## VARIATIONS & EXPLORATION
+
+The artifact includes seed navigation by default (prev/next/random buttons), allowing users to explore variations without creating multiple files. If the user wants specific variations highlighted:
+
+- Include seed presets (buttons for "Variation 1: Seed 42", "Variation 2: Seed 127", etc.)
+- Add a "Gallery Mode" that shows thumbnails of multiple seeds side-by-side
+- All within the same single artifact
+
+This is like creating a series of prints from the same plate - the algorithm is consistent, but each seed reveals different facets of its potential. The interactive nature means users discover their own favorites by exploring the seed space.
+
+---
+
+## THE CREATIVE PROCESS
+
+**User request** → **Algorithmic philosophy** → **Implementation**
+
+Each request is unique. The process involves:
+
+1. **Interpret the user's intent** - What aesthetic is being sought?
+2. **Create an algorithmic philosophy** (4-6 paragraphs) describing the computational approach
+3. **Implement it in code** - Build the algorithm that expresses this philosophy
+4. **Design appropriate parameters** - What should be tunable?
+5. **Build matching UI controls** - Sliders/inputs for those parameters
+
+**The constants**:
+- Anthropic branding (colors, fonts, layout)
+- Seed navigation (always present)
+- Self-contained HTML artifact
+
+**Everything else is variable**:
+- The algorithm itself
+- The parameters
+- The UI controls
+- The visual outcome
+
+To achieve the best results, trust creativity and let the philosophy guide the implementation.
+
+---
+
+## RESOURCES
+
+This skill includes helpful templates and documentation:
+
+- **templates/viewer.html**: REQUIRED STARTING POINT for all HTML artifacts.
+ - This is the foundation - contains the exact structure and Anthropic branding
+ - **Keep unchanged**: Layout structure, sidebar organization, Anthropic colors/fonts, seed controls, action buttons
+ - **Replace**: The p5.js algorithm, parameter definitions, and UI controls in Parameters section
+ - The extensive comments in the file mark exactly what to keep vs replace
+
+- **templates/generator_template.js**: Reference for p5.js best practices and code structure principles.
+ - Shows how to organize parameters, use seeded randomness, structure classes
+ - NOT a pattern menu - use these principles to build unique algorithms
+ - Embed algorithms inline in the HTML artifact (don't create separate .js files)
+
+**Critical reminder**:
+- The **template is the STARTING POINT**, not inspiration
+- The **algorithm is where to create** something unique
+- Don't copy the flow field example - build what the philosophy demands
+- But DO keep the exact UI structure and Anthropic branding from the template
\ No newline at end of file
diff --git a/algorithmic-art/templates/generator_template.js b/algorithmic-art/templates/generator_template.js
new file mode 100644
index 0000000..e263fbd
--- /dev/null
+++ b/algorithmic-art/templates/generator_template.js
@@ -0,0 +1,223 @@
+/**
+ * ═══════════════════════════════════════════════════════════════════════════
+ * P5.JS GENERATIVE ART - BEST PRACTICES
+ * ═══════════════════════════════════════════════════════════════════════════
+ *
+ * This file shows STRUCTURE and PRINCIPLES for p5.js generative art.
+ * It does NOT prescribe what art you should create.
+ *
+ * Your algorithmic philosophy should guide what you build.
+ * These are just best practices for how to structure your code.
+ *
+ * ═══════════════════════════════════════════════════════════════════════════
+ */
+
+// ============================================================================
+// 1. PARAMETER ORGANIZATION
+// ============================================================================
+// Keep all tunable parameters in one object
+// This makes it easy to:
+// - Connect to UI controls
+// - Reset to defaults
+// - Serialize/save configurations
+
+let params = {
+ // Define parameters that match YOUR algorithm
+ // Examples (customize for your art):
+ // - Counts: how many elements (particles, circles, branches, etc.)
+ // - Scales: size, speed, spacing
+ // - Probabilities: likelihood of events
+ // - Angles: rotation, direction
+ // - Colors: palette arrays
+
+ seed: 12345,
+ // define colorPalette as an array -- choose whatever colors you'd like ['#d97757', '#6a9bcc', '#788c5d', '#b0aea5']
+ // Add YOUR parameters here based on your algorithm
+};
+
+// ============================================================================
+// 2. SEEDED RANDOMNESS (Critical for reproducibility)
+// ============================================================================
+// ALWAYS use seeded random for Art Blocks-style reproducible output
+
+function initializeSeed(seed) {
+ randomSeed(seed);
+ noiseSeed(seed);
+ // Now all random() and noise() calls will be deterministic
+}
+
+// ============================================================================
+// 3. P5.JS LIFECYCLE
+// ============================================================================
+
+function setup() {
+ createCanvas(800, 800);
+
+ // Initialize seed first
+ initializeSeed(params.seed);
+
+ // Set up your generative system
+ // This is where you initialize:
+ // - Arrays of objects
+ // - Grid structures
+ // - Initial positions
+ // - Starting states
+
+ // For static art: call noLoop() at the end of setup
+ // For animated art: let draw() keep running
+}
+
+function draw() {
+ // Option 1: Static generation (runs once, then stops)
+ // - Generate everything in setup()
+ // - Call noLoop() in setup()
+ // - draw() doesn't do much or can be empty
+
+ // Option 2: Animated generation (continuous)
+ // - Update your system each frame
+ // - Common patterns: particle movement, growth, evolution
+ // - Can optionally call noLoop() after N frames
+
+ // Option 3: User-triggered regeneration
+ // - Use noLoop() by default
+ // - Call redraw() when parameters change
+}
+
+// ============================================================================
+// 4. CLASS STRUCTURE (When you need objects)
+// ============================================================================
+// Use classes when your algorithm involves multiple entities
+// Examples: particles, agents, cells, nodes, etc.
+
+class Entity {
+ constructor() {
+ // Initialize entity properties
+ // Use random() here - it will be seeded
+ }
+
+ update() {
+ // Update entity state
+ // This might involve:
+ // - Physics calculations
+ // - Behavioral rules
+ // - Interactions with neighbors
+ }
+
+ display() {
+ // Render the entity
+ // Keep rendering logic separate from update logic
+ }
+}
+
+// ============================================================================
+// 5. PERFORMANCE CONSIDERATIONS
+// ============================================================================
+
+// For large numbers of elements:
+// - Pre-calculate what you can
+// - Use simple collision detection (spatial hashing if needed)
+// - Limit expensive operations (sqrt, trig) when possible
+// - Consider using p5 vectors efficiently
+
+// For smooth animation:
+// - Aim for 60fps
+// - Profile if things are slow
+// - Consider reducing particle counts or simplifying calculations
+
+// ============================================================================
+// 6. UTILITY FUNCTIONS
+// ============================================================================
+
+// Color utilities
+function hexToRgb(hex) {
+ const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
+ return result ? {
+ r: parseInt(result[1], 16),
+ g: parseInt(result[2], 16),
+ b: parseInt(result[3], 16)
+ } : null;
+}
+
+function colorFromPalette(index) {
+ return params.colorPalette[index % params.colorPalette.length];
+}
+
+// Mapping and easing
+function mapRange(value, inMin, inMax, outMin, outMax) {
+ return outMin + (outMax - outMin) * ((value - inMin) / (inMax - inMin));
+}
+
+function easeInOutCubic(t) {
+ return t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2;
+}
+
+// Constrain to bounds
+function wrapAround(value, max) {
+ if (value < 0) return max;
+ if (value > max) return 0;
+ return value;
+}
+
+// ============================================================================
+// 7. PARAMETER UPDATES (Connect to UI)
+// ============================================================================
+
+function updateParameter(paramName, value) {
+ params[paramName] = value;
+ // Decide if you need to regenerate or just update
+ // Some params can update in real-time, others need full regeneration
+}
+
+function regenerate() {
+ // Reinitialize your generative system
+ // Useful when parameters change significantly
+ initializeSeed(params.seed);
+ // Then regenerate your system
+}
+
+// ============================================================================
+// 8. COMMON P5.JS PATTERNS
+// ============================================================================
+
+// Drawing with transparency for trails/fading
+function fadeBackground(opacity) {
+ fill(250, 249, 245, opacity); // Anthropic light with alpha
+ noStroke();
+ rect(0, 0, width, height);
+}
+
+// Using noise for organic variation
+function getNoiseValue(x, y, scale = 0.01) {
+ return noise(x * scale, y * scale);
+}
+
+// Creating vectors from angles
+function vectorFromAngle(angle, magnitude = 1) {
+ return createVector(cos(angle), sin(angle)).mult(magnitude);
+}
+
+// ============================================================================
+// 9. EXPORT FUNCTIONS
+// ============================================================================
+
+function exportImage() {
+ saveCanvas('generative-art-' + params.seed, 'png');
+}
+
+// ============================================================================
+// REMEMBER
+// ============================================================================
+//
+// These are TOOLS and PRINCIPLES, not a recipe.
+// Your algorithmic philosophy should guide WHAT you create.
+// This structure helps you create it WELL.
+//
+// Focus on:
+// - Clean, readable code
+// - Parameterized for exploration
+// - Seeded for reproducibility
+// - Performant execution
+//
+// The art itself is entirely up to you!
+//
+// ============================================================================
\ No newline at end of file
diff --git a/algorithmic-art/templates/viewer.html b/algorithmic-art/templates/viewer.html
new file mode 100644
index 0000000..630cc1f
--- /dev/null
+++ b/algorithmic-art/templates/viewer.html
@@ -0,0 +1,599 @@
+
+
+
+
+
+
+ Generative Art Viewer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Initializing generative art...
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/canvas-design/LICENSE.txt b/canvas-design/LICENSE.txt
new file mode 100644
index 0000000..4f881c5
--- /dev/null
+++ b/canvas-design/LICENSE.txt
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright 2026 Anthropic, PBC.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
\ No newline at end of file
diff --git a/canvas-design/SKILL.md b/canvas-design/SKILL.md
new file mode 100644
index 0000000..9f63fee
--- /dev/null
+++ b/canvas-design/SKILL.md
@@ -0,0 +1,130 @@
+---
+name: canvas-design
+description: Create beautiful visual art in .png and .pdf documents using design philosophy. You should use this skill when the user asks to create a poster, piece of art, design, or other static piece. Create original visual designs, never copying existing artists' work to avoid copyright violations.
+license: Complete terms in LICENSE.txt
+---
+
+These are instructions for creating design philosophies - aesthetic movements that are then EXPRESSED VISUALLY. Output only .md files, .pdf files, and .png files.
+
+Complete this in two steps:
+1. Design Philosophy Creation (.md file)
+2. Express by creating it on a canvas (.pdf file or .png file)
+
+First, undertake this task:
+
+## DESIGN PHILOSOPHY CREATION
+
+To begin, create a VISUAL PHILOSOPHY (not layouts or templates) that will be interpreted through:
+- Form, space, color, composition
+- Images, graphics, shapes, patterns
+- Minimal text as visual accent
+
+### THE CRITICAL UNDERSTANDING
+- What is received: Some subtle input or instructions by the user that should be taken into account, but used as a foundation; it should not constrain creative freedom.
+- What is created: A design philosophy/aesthetic movement.
+- What happens next: Then, the same version receives the philosophy and EXPRESSES IT VISUALLY - creating artifacts that are 90% visual design, 10% essential text.
+
+Consider this approach:
+- Write a manifesto for an art movement
+- The next phase involves making the artwork
+
+The philosophy must emphasize: Visual expression. Spatial communication. Artistic interpretation. Minimal words.
+
+### HOW TO GENERATE A VISUAL PHILOSOPHY
+
+**Name the movement** (1-2 words): "Brutalist Joy" / "Chromatic Silence" / "Metabolist Dreams"
+
+**Articulate the philosophy** (4-6 paragraphs - concise but complete):
+
+To capture the VISUAL essence, express how the philosophy manifests through:
+- Space and form
+- Color and material
+- Scale and rhythm
+- Composition and balance
+- Visual hierarchy
+
+**CRITICAL GUIDELINES:**
+- **Avoid redundancy**: Each design aspect should be mentioned once. Avoid repeating points about color theory, spatial relationships, or typographic principles unless adding new depth.
+- **Emphasize craftsmanship REPEATEDLY**: The philosophy MUST stress multiple times that the final work should appear as though it took countless hours to create, was labored over with care, and comes from someone at the absolute top of their field. This framing is essential - repeat phrases like "meticulously crafted," "the product of deep expertise," "painstaking attention," "master-level execution."
+- **Leave creative space**: Remain specific about the aesthetic direction, but concise enough that the next Claude has room to make interpretive choices also at a extremely high level of craftmanship.
+
+The philosophy must guide the next version to express ideas VISUALLY, not through text. Information lives in design, not paragraphs.
+
+### PHILOSOPHY EXAMPLES
+
+**"Concrete Poetry"**
+Philosophy: Communication through monumental form and bold geometry.
+Visual expression: Massive color blocks, sculptural typography (huge single words, tiny labels), Brutalist spatial divisions, Polish poster energy meets Le Corbusier. Ideas expressed through visual weight and spatial tension, not explanation. Text as rare, powerful gesture - never paragraphs, only essential words integrated into the visual architecture. Every element placed with the precision of a master craftsman.
+
+**"Chromatic Language"**
+Philosophy: Color as the primary information system.
+Visual expression: Geometric precision where color zones create meaning. Typography minimal - small sans-serif labels letting chromatic fields communicate. Think Josef Albers' interaction meets data visualization. Information encoded spatially and chromatically. Words only to anchor what color already shows. The result of painstaking chromatic calibration.
+
+**"Analog Meditation"**
+Philosophy: Quiet visual contemplation through texture and breathing room.
+Visual expression: Paper grain, ink bleeds, vast negative space. Photography and illustration dominate. Typography whispered (small, restrained, serving the visual). Japanese photobook aesthetic. Images breathe across pages. Text appears sparingly - short phrases, never explanatory blocks. Each composition balanced with the care of a meditation practice.
+
+**"Organic Systems"**
+Philosophy: Natural clustering and modular growth patterns.
+Visual expression: Rounded forms, organic arrangements, color from nature through architecture. Information shown through visual diagrams, spatial relationships, iconography. Text only for key labels floating in space. The composition tells the story through expert spatial orchestration.
+
+**"Geometric Silence"**
+Philosophy: Pure order and restraint.
+Visual expression: Grid-based precision, bold photography or stark graphics, dramatic negative space. Typography precise but minimal - small essential text, large quiet zones. Swiss formalism meets Brutalist material honesty. Structure communicates, not words. Every alignment the work of countless refinements.
+
+*These are condensed examples. The actual design philosophy should be 4-6 substantial paragraphs.*
+
+### ESSENTIAL PRINCIPLES
+- **VISUAL PHILOSOPHY**: Create an aesthetic worldview to be expressed through design
+- **MINIMAL TEXT**: Always emphasize that text is sparse, essential-only, integrated as visual element - never lengthy
+- **SPATIAL EXPRESSION**: Ideas communicate through space, form, color, composition - not paragraphs
+- **ARTISTIC FREEDOM**: The next Claude interprets the philosophy visually - provide creative room
+- **PURE DESIGN**: This is about making ART OBJECTS, not documents with decoration
+- **EXPERT CRAFTSMANSHIP**: Repeatedly emphasize the final work must look meticulously crafted, labored over with care, the product of countless hours by someone at the top of their field
+
+**The design philosophy should be 4-6 paragraphs long.** Fill it with poetic design philosophy that brings together the core vision. Avoid repeating the same points. Keep the design philosophy generic without mentioning the intention of the art, as if it can be used wherever. Output the design philosophy as a .md file.
+
+---
+
+## DEDUCING THE SUBTLE REFERENCE
+
+**CRITICAL STEP**: Before creating the canvas, identify the subtle conceptual thread from the original request.
+
+**THE ESSENTIAL PRINCIPLE**:
+The topic is a **subtle, niche reference embedded within the art itself** - not always literal, always sophisticated. Someone familiar with the subject should feel it intuitively, while others simply experience a masterful abstract composition. The design philosophy provides the aesthetic language. The deduced topic provides the soul - the quiet conceptual DNA woven invisibly into form, color, and composition.
+
+This is **VERY IMPORTANT**: The reference must be refined so it enhances the work's depth without announcing itself. Think like a jazz musician quoting another song - only those who know will catch it, but everyone appreciates the music.
+
+---
+
+## CANVAS CREATION
+
+With both the philosophy and the conceptual framework established, express it on a canvas. Take a moment to gather thoughts and clear the mind. Use the design philosophy created and the instructions below to craft a masterpiece, embodying all aspects of the philosophy with expert craftsmanship.
+
+**IMPORTANT**: For any type of content, even if the user requests something for a movie/game/book, the approach should still be sophisticated. Never lose sight of the idea that this should be art, not something that's cartoony or amateur.
+
+To create museum or magazine quality work, use the design philosophy as the foundation. Create one single page, highly visual, design-forward PDF or PNG output (unless asked for more pages). Generally use repeating patterns and perfect shapes. Treat the abstract philosophical design as if it were a scientific bible, borrowing the visual language of systematic observation—dense accumulation of marks, repeated elements, or layered patterns that build meaning through patient repetition and reward sustained viewing. Add sparse, clinical typography and systematic reference markers that suggest this could be a diagram from an imaginary discipline, treating the invisible subject with the same reverence typically reserved for documenting observable phenomena. Anchor the piece with simple phrase(s) or details positioned subtly, using a limited color palette that feels intentional and cohesive. Embrace the paradox of using analytical visual language to express ideas about human experience: the result should feel like an artifact that proves something ephemeral can be studied, mapped, and understood through careful attention. This is true art.
+
+**Text as a contextual element**: Text is always minimal and visual-first, but let context guide whether that means whisper-quiet labels or bold typographic gestures. A punk venue poster might have larger, more aggressive type than a minimalist ceramics studio identity. Most of the time, font should be thin. All use of fonts must be design-forward and prioritize visual communication. Regardless of text scale, nothing falls off the page and nothing overlaps. Every element must be contained within the canvas boundaries with proper margins. Check carefully that all text, graphics, and visual elements have breathing room and clear separation. This is non-negotiable for professional execution. **IMPORTANT: Use different fonts if writing text. Search the `./canvas-fonts` directory. Regardless of approach, sophistication is non-negotiable.**
+
+Download and use whatever fonts are needed to make this a reality. Get creative by making the typography actually part of the art itself -- if the art is abstract, bring the font onto the canvas, not typeset digitally.
+
+To push boundaries, follow design instinct/intuition while using the philosophy as a guiding principle. Embrace ultimate design freedom and choice. Push aesthetics and design to the frontier.
+
+**CRITICAL**: To achieve human-crafted quality (not AI-generated), create work that looks like it took countless hours. Make it appear as though someone at the absolute top of their field labored over every detail with painstaking care. Ensure the composition, spacing, color choices, typography - everything screams expert-level craftsmanship. Double-check that nothing overlaps, formatting is flawless, every detail perfect. Create something that could be shown to people to prove expertise and rank as undeniably impressive.
+
+Output the final result as a single, downloadable .pdf or .png file, alongside the design philosophy used as a .md file.
+
+---
+
+## FINAL STEP
+
+**IMPORTANT**: The user ALREADY said "It isn't perfect enough. It must be pristine, a masterpiece if craftsmanship, as if it were about to be displayed in a museum."
+
+**CRITICAL**: To refine the work, avoid adding more graphics; instead refine what has been created and make it extremely crisp, respecting the design philosophy and the principles of minimalism entirely. Rather than adding a fun filter or refactoring a font, consider how to make the existing composition more cohesive with the art. If the instinct is to call a new function or draw a new shape, STOP and instead ask: "How can I make what's already here more of a piece of art?"
+
+Take a second pass. Go back to the code and refine/polish further to make this a philosophically designed masterpiece.
+
+## MULTI-PAGE OPTION
+
+To create additional pages when requested, create more creative pages along the same lines as the design philosophy but distinctly different as well. Bundle those pages in the same .pdf or many .pngs. Treat the first page as just a single page in a whole coffee table book waiting to be filled. Make the next pages unique twists and memories of the original. Have them almost tell a story in a very tasteful way. Exercise full creative freedom.
\ No newline at end of file
diff --git a/canvas-design/canvas-fonts/ArsenalSC-OFL.txt b/canvas-design/canvas-fonts/ArsenalSC-OFL.txt
new file mode 100644
index 0000000..1dad6ca
--- /dev/null
+++ b/canvas-design/canvas-fonts/ArsenalSC-OFL.txt
@@ -0,0 +1,93 @@
+Copyright 2012 The Arsenal Project Authors (andrij.design@gmail.com)
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://openfontlicense.org
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf b/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf
new file mode 100644
index 0000000..fe5409b
Binary files /dev/null and b/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf differ
diff --git a/canvas-design/canvas-fonts/BigShoulders-Bold.ttf b/canvas-design/canvas-fonts/BigShoulders-Bold.ttf
new file mode 100644
index 0000000..fc5f8fd
Binary files /dev/null and b/canvas-design/canvas-fonts/BigShoulders-Bold.ttf differ
diff --git a/canvas-design/canvas-fonts/BigShoulders-OFL.txt b/canvas-design/canvas-fonts/BigShoulders-OFL.txt
new file mode 100644
index 0000000..b220280
--- /dev/null
+++ b/canvas-design/canvas-fonts/BigShoulders-OFL.txt
@@ -0,0 +1,93 @@
+Copyright 2019 The Big Shoulders Project Authors (https://github.com/xotypeco/big_shoulders)
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://openfontlicense.org
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/canvas-design/canvas-fonts/BigShoulders-Regular.ttf b/canvas-design/canvas-fonts/BigShoulders-Regular.ttf
new file mode 100644
index 0000000..de8308c
Binary files /dev/null and b/canvas-design/canvas-fonts/BigShoulders-Regular.ttf differ
diff --git a/canvas-design/canvas-fonts/Boldonse-OFL.txt b/canvas-design/canvas-fonts/Boldonse-OFL.txt
new file mode 100644
index 0000000..1890cb1
--- /dev/null
+++ b/canvas-design/canvas-fonts/Boldonse-OFL.txt
@@ -0,0 +1,93 @@
+Copyright 2024 The Boldonse Project Authors (https://github.com/googlefonts/boldonse)
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://openfontlicense.org
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/canvas-design/canvas-fonts/Boldonse-Regular.ttf b/canvas-design/canvas-fonts/Boldonse-Regular.ttf
new file mode 100644
index 0000000..43fa30a
Binary files /dev/null and b/canvas-design/canvas-fonts/Boldonse-Regular.ttf differ
diff --git a/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf b/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf
new file mode 100644
index 0000000..f3b1ded
Binary files /dev/null and b/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf differ
diff --git a/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt b/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt
new file mode 100644
index 0000000..fc2b216
--- /dev/null
+++ b/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt
@@ -0,0 +1,93 @@
+Copyright 2022 The Bricolage Grotesque Project Authors (https://github.com/ateliertriay/bricolage)
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://openfontlicense.org
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf b/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf
new file mode 100644
index 0000000..0674ae3
Binary files /dev/null and b/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf differ
diff --git a/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf b/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf
new file mode 100644
index 0000000..58730fb
Binary files /dev/null and b/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf differ
diff --git a/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf b/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf
new file mode 100644
index 0000000..786a1bd
Binary files /dev/null and b/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf differ
diff --git a/canvas-design/canvas-fonts/CrimsonPro-OFL.txt b/canvas-design/canvas-fonts/CrimsonPro-OFL.txt
new file mode 100644
index 0000000..f976fdc
--- /dev/null
+++ b/canvas-design/canvas-fonts/CrimsonPro-OFL.txt
@@ -0,0 +1,93 @@
+Copyright 2018 The Crimson Pro Project Authors (https://github.com/Fonthausen/CrimsonPro)
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://openfontlicense.org
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf b/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf
new file mode 100644
index 0000000..f5666b9
Binary files /dev/null and b/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf differ
diff --git a/canvas-design/canvas-fonts/DMMono-OFL.txt b/canvas-design/canvas-fonts/DMMono-OFL.txt
new file mode 100644
index 0000000..5b17f0c
--- /dev/null
+++ b/canvas-design/canvas-fonts/DMMono-OFL.txt
@@ -0,0 +1,93 @@
+Copyright 2020 The DM Mono Project Authors (https://www.github.com/googlefonts/dm-mono)
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://openfontlicense.org
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/canvas-design/canvas-fonts/DMMono-Regular.ttf b/canvas-design/canvas-fonts/DMMono-Regular.ttf
new file mode 100644
index 0000000..7efe813
Binary files /dev/null and b/canvas-design/canvas-fonts/DMMono-Regular.ttf differ
diff --git a/canvas-design/canvas-fonts/EricaOne-OFL.txt b/canvas-design/canvas-fonts/EricaOne-OFL.txt
new file mode 100644
index 0000000..490d012
--- /dev/null
+++ b/canvas-design/canvas-fonts/EricaOne-OFL.txt
@@ -0,0 +1,94 @@
+Copyright (c) 2011 by LatinoType Limitada (luciano@latinotype.com),
+with Reserved Font Names "Erica One"
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://openfontlicense.org
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/canvas-design/canvas-fonts/EricaOne-Regular.ttf b/canvas-design/canvas-fonts/EricaOne-Regular.ttf
new file mode 100644
index 0000000..8bd91d1
Binary files /dev/null and b/canvas-design/canvas-fonts/EricaOne-Regular.ttf differ
diff --git a/canvas-design/canvas-fonts/GeistMono-Bold.ttf b/canvas-design/canvas-fonts/GeistMono-Bold.ttf
new file mode 100644
index 0000000..736ff7c
Binary files /dev/null and b/canvas-design/canvas-fonts/GeistMono-Bold.ttf differ
diff --git a/canvas-design/canvas-fonts/GeistMono-OFL.txt b/canvas-design/canvas-fonts/GeistMono-OFL.txt
new file mode 100644
index 0000000..679a685
--- /dev/null
+++ b/canvas-design/canvas-fonts/GeistMono-OFL.txt
@@ -0,0 +1,93 @@
+Copyright 2024 The Geist Project Authors (https://github.com/vercel/geist-font.git)
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://openfontlicense.org
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/canvas-design/canvas-fonts/GeistMono-Regular.ttf b/canvas-design/canvas-fonts/GeistMono-Regular.ttf
new file mode 100644
index 0000000..1a30262
Binary files /dev/null and b/canvas-design/canvas-fonts/GeistMono-Regular.ttf differ
diff --git a/canvas-design/canvas-fonts/Gloock-OFL.txt b/canvas-design/canvas-fonts/Gloock-OFL.txt
new file mode 100644
index 0000000..363acd3
--- /dev/null
+++ b/canvas-design/canvas-fonts/Gloock-OFL.txt
@@ -0,0 +1,93 @@
+Copyright 2022 The Gloock Project Authors (https://github.com/duartp/gloock)
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://openfontlicense.org
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/canvas-design/canvas-fonts/Gloock-Regular.ttf b/canvas-design/canvas-fonts/Gloock-Regular.ttf
new file mode 100644
index 0000000..3e58c4e
Binary files /dev/null and b/canvas-design/canvas-fonts/Gloock-Regular.ttf differ
diff --git a/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf b/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf
new file mode 100644
index 0000000..247979c
Binary files /dev/null and b/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf differ
diff --git a/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt b/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt
new file mode 100644
index 0000000..e423b74
--- /dev/null
+++ b/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt
@@ -0,0 +1,93 @@
+Copyright © 2017 IBM Corp. with Reserved Font Name "Plex"
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://openfontlicense.org
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf b/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf
new file mode 100644
index 0000000..601ae94
Binary files /dev/null and b/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf differ
diff --git a/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf b/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf
new file mode 100644
index 0000000..78f6e50
Binary files /dev/null and b/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf differ
diff --git a/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf b/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf
new file mode 100644
index 0000000..369b89d
Binary files /dev/null and b/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf differ
diff --git a/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf b/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf
new file mode 100644
index 0000000..a4d859a
Binary files /dev/null and b/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf differ
diff --git a/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf b/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf
new file mode 100644
index 0000000..35f454c
Binary files /dev/null and b/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf differ
diff --git a/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf b/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf
new file mode 100644
index 0000000..f602dce
Binary files /dev/null and b/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf differ
diff --git a/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf b/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf
new file mode 100644
index 0000000..122b273
Binary files /dev/null and b/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf differ
diff --git a/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf b/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf
new file mode 100644
index 0000000..4b98fb8
Binary files /dev/null and b/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf differ
diff --git a/canvas-design/canvas-fonts/InstrumentSans-OFL.txt b/canvas-design/canvas-fonts/InstrumentSans-OFL.txt
new file mode 100644
index 0000000..4bb9914
--- /dev/null
+++ b/canvas-design/canvas-fonts/InstrumentSans-OFL.txt
@@ -0,0 +1,93 @@
+Copyright 2022 The Instrument Sans Project Authors (https://github.com/Instrument/instrument-sans)
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://openfontlicense.org
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf b/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf
new file mode 100644
index 0000000..14c6113
Binary files /dev/null and b/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf differ
diff --git a/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf b/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf
new file mode 100644
index 0000000..8fa958d
Binary files /dev/null and b/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf differ
diff --git a/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf b/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf
new file mode 100644
index 0000000..9763031
Binary files /dev/null and b/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf differ
diff --git a/canvas-design/canvas-fonts/Italiana-OFL.txt b/canvas-design/canvas-fonts/Italiana-OFL.txt
new file mode 100644
index 0000000..ba8af21
--- /dev/null
+++ b/canvas-design/canvas-fonts/Italiana-OFL.txt
@@ -0,0 +1,93 @@
+Copyright (c) 2011, Santiago Orozco (hi@typemade.mx), with Reserved Font Name "Italiana".
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://openfontlicense.org
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/canvas-design/canvas-fonts/Italiana-Regular.ttf b/canvas-design/canvas-fonts/Italiana-Regular.ttf
new file mode 100644
index 0000000..a9b828c
Binary files /dev/null and b/canvas-design/canvas-fonts/Italiana-Regular.ttf differ
diff --git a/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf b/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf
new file mode 100644
index 0000000..1926c80
Binary files /dev/null and b/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf differ
diff --git a/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt b/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt
new file mode 100644
index 0000000..5ceee00
--- /dev/null
+++ b/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt
@@ -0,0 +1,93 @@
+Copyright 2020 The JetBrains Mono Project Authors (https://github.com/JetBrains/JetBrainsMono)
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://openfontlicense.org
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf b/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf
new file mode 100644
index 0000000..436c982
Binary files /dev/null and b/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf differ
diff --git a/canvas-design/canvas-fonts/Jura-Light.ttf b/canvas-design/canvas-fonts/Jura-Light.ttf
new file mode 100644
index 0000000..dffbb33
Binary files /dev/null and b/canvas-design/canvas-fonts/Jura-Light.ttf differ
diff --git a/canvas-design/canvas-fonts/Jura-Medium.ttf b/canvas-design/canvas-fonts/Jura-Medium.ttf
new file mode 100644
index 0000000..4bf91a3
Binary files /dev/null and b/canvas-design/canvas-fonts/Jura-Medium.ttf differ
diff --git a/canvas-design/canvas-fonts/Jura-OFL.txt b/canvas-design/canvas-fonts/Jura-OFL.txt
new file mode 100644
index 0000000..64ad4c6
--- /dev/null
+++ b/canvas-design/canvas-fonts/Jura-OFL.txt
@@ -0,0 +1,93 @@
+Copyright 2019 The Jura Project Authors (https://github.com/ossobuffo/jura)
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://openfontlicense.org
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt b/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt
new file mode 100644
index 0000000..8c531fa
--- /dev/null
+++ b/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt
@@ -0,0 +1,93 @@
+Copyright 2012 The Libre Baskerville Project Authors (https://github.com/impallari/Libre-Baskerville) with Reserved Font Name Libre Baskerville.
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://openfontlicense.org
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf b/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf
new file mode 100644
index 0000000..c1abc26
Binary files /dev/null and b/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf differ
diff --git a/canvas-design/canvas-fonts/Lora-Bold.ttf b/canvas-design/canvas-fonts/Lora-Bold.ttf
new file mode 100644
index 0000000..edae21e
Binary files /dev/null and b/canvas-design/canvas-fonts/Lora-Bold.ttf differ
diff --git a/canvas-design/canvas-fonts/Lora-BoldItalic.ttf b/canvas-design/canvas-fonts/Lora-BoldItalic.ttf
new file mode 100644
index 0000000..12dea8c
Binary files /dev/null and b/canvas-design/canvas-fonts/Lora-BoldItalic.ttf differ
diff --git a/canvas-design/canvas-fonts/Lora-Italic.ttf b/canvas-design/canvas-fonts/Lora-Italic.ttf
new file mode 100644
index 0000000..e24b69b
Binary files /dev/null and b/canvas-design/canvas-fonts/Lora-Italic.ttf differ
diff --git a/canvas-design/canvas-fonts/Lora-OFL.txt b/canvas-design/canvas-fonts/Lora-OFL.txt
new file mode 100644
index 0000000..4cf1b95
--- /dev/null
+++ b/canvas-design/canvas-fonts/Lora-OFL.txt
@@ -0,0 +1,93 @@
+Copyright 2011 The Lora Project Authors (https://github.com/cyrealtype/Lora-Cyrillic), with Reserved Font Name "Lora".
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://openfontlicense.org
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/canvas-design/canvas-fonts/Lora-Regular.ttf b/canvas-design/canvas-fonts/Lora-Regular.ttf
new file mode 100644
index 0000000..dc751db
Binary files /dev/null and b/canvas-design/canvas-fonts/Lora-Regular.ttf differ
diff --git a/canvas-design/canvas-fonts/NationalPark-Bold.ttf b/canvas-design/canvas-fonts/NationalPark-Bold.ttf
new file mode 100644
index 0000000..f4d7c02
Binary files /dev/null and b/canvas-design/canvas-fonts/NationalPark-Bold.ttf differ
diff --git a/canvas-design/canvas-fonts/NationalPark-OFL.txt b/canvas-design/canvas-fonts/NationalPark-OFL.txt
new file mode 100644
index 0000000..f4ec3fb
--- /dev/null
+++ b/canvas-design/canvas-fonts/NationalPark-OFL.txt
@@ -0,0 +1,93 @@
+Copyright 2025 The National Park Project Authors (https://github.com/benhoepner/National-Park)
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://openfontlicense.org
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/canvas-design/canvas-fonts/NationalPark-Regular.ttf b/canvas-design/canvas-fonts/NationalPark-Regular.ttf
new file mode 100644
index 0000000..e4cbfbf
Binary files /dev/null and b/canvas-design/canvas-fonts/NationalPark-Regular.ttf differ
diff --git a/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt b/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt
new file mode 100644
index 0000000..c81eccd
--- /dev/null
+++ b/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt
@@ -0,0 +1,93 @@
+Copyright (c) 2010, Kimberly Geswein (kimberlygeswein.com)
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://openfontlicense.org
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf b/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf
new file mode 100644
index 0000000..b086bce
Binary files /dev/null and b/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf differ
diff --git a/canvas-design/canvas-fonts/Outfit-Bold.ttf b/canvas-design/canvas-fonts/Outfit-Bold.ttf
new file mode 100644
index 0000000..f9f2f72
Binary files /dev/null and b/canvas-design/canvas-fonts/Outfit-Bold.ttf differ
diff --git a/canvas-design/canvas-fonts/Outfit-OFL.txt b/canvas-design/canvas-fonts/Outfit-OFL.txt
new file mode 100644
index 0000000..fd0cb99
--- /dev/null
+++ b/canvas-design/canvas-fonts/Outfit-OFL.txt
@@ -0,0 +1,93 @@
+Copyright 2021 The Outfit Project Authors (https://github.com/Outfitio/Outfit-Fonts)
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://openfontlicense.org
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/canvas-design/canvas-fonts/Outfit-Regular.ttf b/canvas-design/canvas-fonts/Outfit-Regular.ttf
new file mode 100644
index 0000000..3939ab2
Binary files /dev/null and b/canvas-design/canvas-fonts/Outfit-Regular.ttf differ
diff --git a/canvas-design/canvas-fonts/PixelifySans-Medium.ttf b/canvas-design/canvas-fonts/PixelifySans-Medium.ttf
new file mode 100644
index 0000000..95cd372
Binary files /dev/null and b/canvas-design/canvas-fonts/PixelifySans-Medium.ttf differ
diff --git a/canvas-design/canvas-fonts/PixelifySans-OFL.txt b/canvas-design/canvas-fonts/PixelifySans-OFL.txt
new file mode 100644
index 0000000..b02d1b6
--- /dev/null
+++ b/canvas-design/canvas-fonts/PixelifySans-OFL.txt
@@ -0,0 +1,93 @@
+Copyright 2021 The Pixelify Sans Project Authors (https://github.com/eifetx/Pixelify-Sans)
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://openfontlicense.org
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/canvas-design/canvas-fonts/PoiretOne-OFL.txt b/canvas-design/canvas-fonts/PoiretOne-OFL.txt
new file mode 100644
index 0000000..607bdad
--- /dev/null
+++ b/canvas-design/canvas-fonts/PoiretOne-OFL.txt
@@ -0,0 +1,93 @@
+Copyright (c) 2011, Denis Masharov (denis.masharov@gmail.com)
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://openfontlicense.org
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/canvas-design/canvas-fonts/PoiretOne-Regular.ttf b/canvas-design/canvas-fonts/PoiretOne-Regular.ttf
new file mode 100644
index 0000000..b339511
Binary files /dev/null and b/canvas-design/canvas-fonts/PoiretOne-Regular.ttf differ
diff --git a/canvas-design/canvas-fonts/RedHatMono-Bold.ttf b/canvas-design/canvas-fonts/RedHatMono-Bold.ttf
new file mode 100644
index 0000000..a6e3cf1
Binary files /dev/null and b/canvas-design/canvas-fonts/RedHatMono-Bold.ttf differ
diff --git a/canvas-design/canvas-fonts/RedHatMono-OFL.txt b/canvas-design/canvas-fonts/RedHatMono-OFL.txt
new file mode 100644
index 0000000..16cf394
--- /dev/null
+++ b/canvas-design/canvas-fonts/RedHatMono-OFL.txt
@@ -0,0 +1,93 @@
+Copyright 2024 The Red Hat Project Authors (https://github.com/RedHatOfficial/RedHatFont)
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://openfontlicense.org
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/canvas-design/canvas-fonts/RedHatMono-Regular.ttf b/canvas-design/canvas-fonts/RedHatMono-Regular.ttf
new file mode 100644
index 0000000..3bf6a69
Binary files /dev/null and b/canvas-design/canvas-fonts/RedHatMono-Regular.ttf differ
diff --git a/canvas-design/canvas-fonts/Silkscreen-OFL.txt b/canvas-design/canvas-fonts/Silkscreen-OFL.txt
new file mode 100644
index 0000000..a1fe7d5
--- /dev/null
+++ b/canvas-design/canvas-fonts/Silkscreen-OFL.txt
@@ -0,0 +1,93 @@
+Copyright 2001 The Silkscreen Project Authors (https://github.com/googlefonts/silkscreen)
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://openfontlicense.org
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/canvas-design/canvas-fonts/Silkscreen-Regular.ttf b/canvas-design/canvas-fonts/Silkscreen-Regular.ttf
new file mode 100644
index 0000000..8abaa7c
Binary files /dev/null and b/canvas-design/canvas-fonts/Silkscreen-Regular.ttf differ
diff --git a/canvas-design/canvas-fonts/SmoochSans-Medium.ttf b/canvas-design/canvas-fonts/SmoochSans-Medium.ttf
new file mode 100644
index 0000000..0af9ead
Binary files /dev/null and b/canvas-design/canvas-fonts/SmoochSans-Medium.ttf differ
diff --git a/canvas-design/canvas-fonts/SmoochSans-OFL.txt b/canvas-design/canvas-fonts/SmoochSans-OFL.txt
new file mode 100644
index 0000000..4c2f033
--- /dev/null
+++ b/canvas-design/canvas-fonts/SmoochSans-OFL.txt
@@ -0,0 +1,93 @@
+Copyright 2016 The Smooch Sans Project Authors (https://github.com/googlefonts/smooch-sans)
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://openfontlicense.org
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/canvas-design/canvas-fonts/Tektur-Medium.ttf b/canvas-design/canvas-fonts/Tektur-Medium.ttf
new file mode 100644
index 0000000..34fc797
Binary files /dev/null and b/canvas-design/canvas-fonts/Tektur-Medium.ttf differ
diff --git a/canvas-design/canvas-fonts/Tektur-OFL.txt b/canvas-design/canvas-fonts/Tektur-OFL.txt
new file mode 100644
index 0000000..2cad55f
--- /dev/null
+++ b/canvas-design/canvas-fonts/Tektur-OFL.txt
@@ -0,0 +1,93 @@
+Copyright 2023 The Tektur Project Authors (https://www.github.com/hyvyys/Tektur)
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://openfontlicense.org
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/canvas-design/canvas-fonts/Tektur-Regular.ttf b/canvas-design/canvas-fonts/Tektur-Regular.ttf
new file mode 100644
index 0000000..f280fba
Binary files /dev/null and b/canvas-design/canvas-fonts/Tektur-Regular.ttf differ
diff --git a/canvas-design/canvas-fonts/WorkSans-Bold.ttf b/canvas-design/canvas-fonts/WorkSans-Bold.ttf
new file mode 100644
index 0000000..5c97989
Binary files /dev/null and b/canvas-design/canvas-fonts/WorkSans-Bold.ttf differ
diff --git a/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf b/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf
new file mode 100644
index 0000000..54418b8
Binary files /dev/null and b/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf differ
diff --git a/canvas-design/canvas-fonts/WorkSans-Italic.ttf b/canvas-design/canvas-fonts/WorkSans-Italic.ttf
new file mode 100644
index 0000000..40529b6
Binary files /dev/null and b/canvas-design/canvas-fonts/WorkSans-Italic.ttf differ
diff --git a/canvas-design/canvas-fonts/WorkSans-OFL.txt b/canvas-design/canvas-fonts/WorkSans-OFL.txt
new file mode 100644
index 0000000..070f341
--- /dev/null
+++ b/canvas-design/canvas-fonts/WorkSans-OFL.txt
@@ -0,0 +1,93 @@
+Copyright 2019 The Work Sans Project Authors (https://github.com/weiweihuanghuang/Work-Sans)
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://openfontlicense.org
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/canvas-design/canvas-fonts/WorkSans-Regular.ttf b/canvas-design/canvas-fonts/WorkSans-Regular.ttf
new file mode 100644
index 0000000..d24586c
Binary files /dev/null and b/canvas-design/canvas-fonts/WorkSans-Regular.ttf differ
diff --git a/canvas-design/canvas-fonts/YoungSerif-OFL.txt b/canvas-design/canvas-fonts/YoungSerif-OFL.txt
new file mode 100644
index 0000000..f09443c
--- /dev/null
+++ b/canvas-design/canvas-fonts/YoungSerif-OFL.txt
@@ -0,0 +1,93 @@
+Copyright 2023 The Young Serif Project Authors (https://github.com/noirblancrouge/YoungSerif)
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://openfontlicense.org
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/canvas-design/canvas-fonts/YoungSerif-Regular.ttf b/canvas-design/canvas-fonts/YoungSerif-Regular.ttf
new file mode 100644
index 0000000..f454fbe
Binary files /dev/null and b/canvas-design/canvas-fonts/YoungSerif-Regular.ttf differ
diff --git a/component-skeleton-contract/SKILL.md b/component-skeleton-contract/SKILL.md
new file mode 100644
index 0000000..91dfb7a
--- /dev/null
+++ b/component-skeleton-contract/SKILL.md
@@ -0,0 +1,183 @@
+---
+name: component-skeleton-contract
+description: >-
+ Enforce a strict synchronization contract between React components and their skeleton loading states.
+ Requires co-located compound exports, shared structural layouts,
+ zero Cumulative Layout Shift (CLS = 0), OKLCH directional shimmer, and React 19 Suspense / loading.tsx composition.
+---
+
+# Component Skeleton Synchronization Contract (Zero-CLS Architecture)
+
+Ce skill impose un contrat architectural strict : **chaque composant asynchrone ou dynamique doit posséder et exporter son propre Skeleton co-localisé (` `)**.
+
+Il garantit que le squelette de chargement partage la même structure dimensionnelle que le composant réel, éliminant à 100% le décalage de mise en page (*Cumulative Layout Shift - CLS*), même lors des futures mises à jour du composant.
+
+---
+
+## 🎯 Déclencheurs d'Activation
+
+Activez ce skill dès que :
+1. Vous concevez un composant qui charge des données distantes (cartes de profil, widgets de métriques, listes d'articles, tableaux).
+2. Vous créez un fichier de route de chargement (`loading.tsx` dans Next.js / Remix).
+3. Vous définissez une frontière asynchrone avec ``.
+4. Vous mettez à jour la géométrie ou les espacements d'un composant existant (le Skeleton doit être synchronisé immédiatement).
+5. Vous auditez le critère Core Web Vitals **CLS ≤ 0.1**.
+
+---
+
+## 📐 1. Le Contrat Architectural Co-localisé (Compound Pattern)
+
+### Les 4 Règles d'Or du Contrat :
+1. **Même fichier source** : Le Skeleton vit obligatoirement dans le même fichier que le composant réel.
+2. **Export Compound attaché** : Le composant principal expose son skeleton via la propriété statique ` ` ET un export nommé.
+3. **Conteneur Structurel Identique** : Le conteneur racine du Skeleton doit avoir exactement les **mêmes classes CSS de disposition** (`display`, `padding`, `gap`, `grid-template`, `min-height`, `border-radius`) que le composant réel.
+4. **Composition dans `loading.tsx` & ``** : Il est formellement interdit de réinventer un faux layout dans un `loading.tsx`. Une page en chargement doit être l'assemblage exact des `.Skeleton` de ses composants enfants.
+
+---
+
+## 💫 2. Texture Visuelle : Shimmer Directionnel en OKLCH
+
+Les skeletons ne doivent pas utiliser une simple alternance d'opacité grossière (`animate-pulse`). Ils adoptent un **balayage de lumière feutré en OKLCH** qui respecte l'accessibilité cognitive (`prefers-reduced-motion`).
+
+### Définition CSS du Shimmer (Tailwind v4 / CSS standard) :
+```css
+@keyframes shimmer {
+ 0% { transform: translateX(-100%); }
+ 100% { transform: translateX(100%); }
+}
+
+.skeleton-shimmer {
+ position: relative;
+ overflow: hidden;
+ background-color: oklch(0.2 0.01 260); /* Fond neutre sombre teinté */
+}
+
+.skeleton-shimmer::after {
+ content: "";
+ position: absolute;
+ inset: 0;
+ transform: translateX(-100%);
+ background-image: linear-gradient(
+ 90deg,
+ transparent 0%,
+ oklch(1 0 0 / 0.07) 50%,
+ transparent 100%
+ );
+ animation: shimmer 1.8s infinite ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .skeleton-shimmer::after {
+ animation: none;
+ background-image: none;
+ }
+}
+```
+
+---
+
+## 💻 3. Exemple d'Implémentation de Référence
+
+Voici un composant métier parfait respectant le contrat d'invariance dimensionnelle :
+
+```tsx
+// components/user-profile-card.tsx
+import React from 'react';
+
+// Classes de disposition partagées pour garantir CLS = 0
+const CONTAINER_LAYOUT = `
+ relative overflow-hidden rounded-2xl p-6
+ bg-[oklch(0.16_0.008_255)] border border-[oklch(1_0_0/0.08)]
+ flex flex-col gap-4 min-h-[200px]
+`;
+
+export interface UserProfileCardProps {
+ name: string;
+ role: string;
+ avatarUrl: string;
+ stats: { followers: number; projects: number };
+}
+
+// 1. Le Composant Réel
+export const UserProfileCard: React.FC & {
+ Skeleton: React.FC;
+} = ({ name, role, avatarUrl, stats }) => {
+ return (
+
+
+
+
+
+
+ {stats.projects} projets
+ {stats.followers} abonnés
+
+
+ );
+};
+
+// 2. Le Skeleton Co-localisé (Géométrie strictly identique)
+const UserProfileCardSkeleton: React.FC = () => {
+ return (
+
+
+ {/* Avatar Placeholder */}
+
+
+ {/* Textes Placeholders */}
+
+
+
+ {/* Footer Placeholder */}
+
+
+ );
+};
+
+// Liaison compound
+UserProfileCard.Skeleton = UserProfileCardSkeleton;
+```
+
+---
+
+## 🚀 4. Composition dans `loading.tsx` & React 19 Suspense
+
+Lors de la création d'une page avec streaming, assemblez les squelettes directement :
+
+```tsx
+// app/dashboard/loading.tsx
+import { UserProfileCard } from '@/components/user-profile-card';
+
+export default function DashboardLoading() {
+ return (
+
+
+
+
+
+ );
+}
+```
+
+---
+
+## 📋 Checklist de Conformité Skeleton (Zero-CLS Gate)
+
+- [ ] Tout composant asynchrone exporte son sous-composant `.Skeleton`.
+- [ ] Le conteneur du Skeleton et celui du composant réel partagent les mêmes classes de grille, flex, marges intérieures (`padding`) et hauteur minimale.
+- [ ] `aria-hidden="true"` est apposé sur le conteneur du squelette pour ne pas perturber les lecteurs d'écran.
+- [ ] Le shimmer visuel se désactive automatiquement sous `prefers-reduced-motion`.
+- [ ] Le fichier `loading.tsx` de la route réutilise exclusivement les composants `.Skeleton` des briques de la page.
diff --git a/e2e-a11y-testing/SKILL.md b/e2e-a11y-testing/SKILL.md
new file mode 100644
index 0000000..771b82d
--- /dev/null
+++ b/e2e-a11y-testing/SKILL.md
@@ -0,0 +1,129 @@
+---
+name: e2e-a11y-testing
+description: >-
+ Automate end-to-end accessibility (WCAG 2.2 AA) and visual regression testing using Playwright
+ and @axe-core/playwright. Enforces automated gates for keyboard focus trapping, ARIA roles,
+ and cross-viewport screenshot diffing.
+---
+
+# E2E Accessibility & Visual Regression Testing
+
+Ce skill standardise les tests de bout en bout (E2E) pour garantir qu'aucune régression visuelle ou d'accessibilité (WCAG 2.2 AA) ne soit livrée en production. Il couple **Playwright** et le moteur d'analyse **Axe-core**.
+
+---
+
+## 🎯 Déclencheurs d'Activation
+
+Activez ce skill dès que :
+1. Vous créez ou modifiez des composants interactifs critiques (modales, menus déroulants, formulaires d'inscription, flux d'achat).
+2. Vous devez vérifier qu'une modale capture bien le focus clavier (*focus trap*) et se ferme avec la touche `Échap`.
+3. Vous mettez en place des tests d'accessibilité automatisés dans un pipeline CI/CD (GitHub Actions).
+4. Vous validez le comportement responsive sur les 3 résolutions de référence (Mobile 375px, Tablette 768px, Desktop 1440px).
+
+---
+
+## 🧪 1. Test d'Accessibilité Automatisé avec `@axe-core/playwright`
+
+Ce test injecte Axe-core directement dans la page rendue par Playwright pour détecter 100% des violations automatisables (contrastes, attributs ARIA orphelins, étiquettes de formulaires manquantes) :
+
+```typescript
+// tests/a11y.spec.ts
+import { test, expect } from '@playwright/test';
+import AxeBuilder from '@axe-core/playwright';
+
+test.describe('Audit d\'accessibilité globale WCAG 2.2 AA', () => {
+ test('La page d\'accueil ne doit présenter aucune violation critique ou sérieuse', async ({ page }) => {
+ await page.goto('/');
+
+ // Attendre que la page et les polices soient stabilisées
+ await page.waitForLoadState('networkidle');
+
+ const accessibilityScanResults = await new AxeBuilder({ page })
+ .withTags(['wcag2a', 'wcag2aa', 'wcag21a', 'wcag21aa', 'wcag22aa'])
+ .analyze();
+
+ expect(accessibilityScanResults.violations).toEqual([]);
+ });
+});
+```
+
+---
+
+## ⌨️ 2. Test du Piège de Focus Clavier (*Focus Trap*) dans une Modale
+
+Ce test vérifie que le focus reste enfermé dans la boîte de dialogue et revient sur le bouton d'origine à la fermeture :
+
+```typescript
+// tests/modal-keyboard.spec.ts
+import { test, expect } from '@playwright/test';
+
+test('La modale respecte le flux clavier standard', async ({ page }) => {
+ await page.goto('/dashboard');
+
+ const triggerButton = page.getByRole('button', { name: 'Nouvelle tâche' });
+ await triggerButton.click();
+
+ const dialog = page.getByRole('dialog');
+ await expect(dialog).toBeVisible();
+
+ // Le premier champ interactif de la modale doit avoir le focus
+ const firstInput = dialog.getByRole('textbox', { name: 'Titre' });
+ await expect(firstInput).toBeFocused();
+
+ // Navigation avec la touche Tab
+ await page.keyboard.press('Tab');
+ const closeButton = dialog.getByRole('button', { name: 'Fermer' });
+ await expect(closeButton).toBeFocused();
+
+ // Boucle : Tab depuis le dernier élément doit revenir au premier
+ await page.keyboard.press('Tab');
+ await expect(firstInput).toBeFocused();
+
+ // Fermeture par la touche Échap (Escape)
+ await page.keyboard.press('Escape');
+ await expect(dialog).toBeHidden();
+
+ // Le focus doit être restitué au bouton déclencheur initial
+ await expect(triggerButton).toBeFocused();
+});
+```
+
+---
+
+## 📸 3. Test de Régression Visuelle Multi-Viewport
+
+Pour garantir que les ajustements CSS ne cassent pas le rendu visuel :
+
+```typescript
+// tests/visual-regression.spec.ts
+import { test, expect } from '@playwright/test';
+
+const viewports = [
+ { name: 'mobile', width: 375, height: 812 },
+ { name: 'tablet', width: 768, height: 1024 },
+ { name: 'desktop', width: 1440, height: 900 },
+];
+
+for (const vp of viewports) {
+ test(`Capture de référence responsive - ${vp.name}`, async ({ page }) => {
+ await page.setViewportSize({ width: vp.width, height: vp.height });
+ await page.goto('/');
+ await page.waitForLoadState('networkidle');
+
+ await expect(page).toHaveScreenshot(`homepage-${vp.name}.png`, {
+ maxDiffPixelRatio: 0.02, // Seuil de tolérance anti-bruit de 2%
+ animations: 'disabled', // Neutralise les animations pour éviter les faux positifs
+ });
+ });
+}
+```
+
+---
+
+## 📋 Checklist de Conformité Tests E2E & A11y
+
+- [ ] La suite de tests `@axe-core/playwright` s'exécute sans violation sur toutes les pages publiques.
+- [ ] Les flux au clavier (`Tab`, `Shift+Tab`, `Escape`, `Enter`) sont couverts par des assertions explicites.
+- [ ] Les éléments cliquables possèdent un nom accessible vérifiable via `page.getByRole()`.
+- [ ] Les captures de régression visuelle couvrent à la fois les thèmes clair et sombre.
+- [ ] Les tests échouent immédiatement en CI si un contraste de couleur passe sous le seuil 4.5:1.
diff --git a/eu-legal-compliance/SKILL.md b/eu-legal-compliance/SKILL.md
new file mode 100644
index 0000000..19b975a
--- /dev/null
+++ b/eu-legal-compliance/SKILL.md
@@ -0,0 +1,146 @@
+---
+name: eu-legal-compliance
+description: >-
+ Enforce European web regulations: GDPR/RGPD (data minimization, user rights, consent),
+ ePrivacy & CNIL/EDPB guidelines (cookie consent without dark patterns, equal accept/reject),
+ European Accessibility Act (EAA 2025 / EN 301 549), and mandatory legal notices (LCEN, hosting, consumer mediation).
+---
+
+# Conformité Web & Réglementation Européenne (RGPD, ePrivacy, EAA, LCEN)
+
+Ce skill régit la conformité juridique et technique stricte aux directives et règlements de l'Union Européenne (RGPD, Directive ePrivacy, European Accessibility Act EAA 2025, recommandations CNIL et CEPD/EDPB).
+
+---
+
+## 🎯 Déclencheurs d'Activation
+
+Activez ce skill dès que :
+1. Vous implémentez un bandeau ou un gestionnaire de consentement aux cookies (*Cookie Banner / CMP*).
+2. Vous créez des formulaires de contact, d'inscription, de paiement ou de collecte de données personnelles.
+3. Vous rédigez ou intégrez les pages légales obligatoires (Mentions Légales, Politique de Confidentialité, CGU/CGV).
+4. Vous auditez la conformité au **European Accessibility Act (EAA)** en vigueur depuis le 28 juin 2025 pour les services marchands et B2C.
+5. Vous mettez en place des flux de suppression ou d'export de données personnelles (Droit à l'oubli - RGPD Art. 17).
+
+---
+
+## 🍪 1. Directive ePrivacy & Règles CNIL / EDPB (Gestion des Cookies)
+
+### La Règle Fondamentale : Zéro Dark Pattern & Égalité Parfaite
+Selon les lignes directrices de la CNIL et du Comité Européen de la Protection des Données (EDPB) :
+- **Refuser doit être aussi simple qu'accepter** : Le bouton « Tout refuser » doit être situé au **même niveau**, avoir la **même taille**, la **même forme** et un **contraste visuel équivalent** au bouton « Tout accepter ».
+- **Interdiction formelle** de reléguer le refus derrière un lien discret « Continuer sans accepter » ou dans un sous-menu « Paramétrer mes choix » pendant que « Tout accepter » est mis en valeur en pleine couleur.
+- **Blocage préalable (*Opt-in*)** : Aucun script tiers non essentiel (Google Analytics, Pixel Meta, Hotjar, TikTok) ne doit être chargé ou exécuté **AVANT** le recueil actif du consentement.
+- **Durée de conservation** : Le choix (acceptation ou refus) doit être conservé pendant une durée raisonnable (6 mois selon la CNIL).
+
+### Exemple de Composant Cookie Banner 100% Conforme (React / Tailwind)
+
+```tsx
+import React, { useState, useEffect } from 'react';
+
+export const CompliantCookieBanner = () => {
+ const [consentGiven, setConsentGiven] = useState(null);
+
+ useEffect(() => {
+ const saved = localStorage.getItem('eu_cookie_consent');
+ if (saved) setConsentGiven(true);
+ }, []);
+
+ if (consentGiven !== null) return null;
+
+ const handleConsent = (accepted: boolean) => {
+ localStorage.setItem('eu_cookie_consent', accepted ? 'accepted' : 'rejected');
+ localStorage.setItem('eu_cookie_date', new Date().toISOString());
+ setConsentGiven(true);
+ if (accepted) {
+ // Activer les traceurs analytics ici
+ }
+ };
+
+ return (
+
+
Respect de votre vie privée
+
+ Nous utilisons des cookies strictement nécessaires au fonctionnement du site. Avec votre accord, nous utilisons également des cookies de mesure d'audience anonymes.
+
+
+ {/* Égalité stricte : Deux boutons identiques côte à côte */}
+
+ handleConsent(false)}
+ className="flex-1 px-3 py-2 rounded-lg text-xs font-medium text-white/90 bg-white/10 hover:bg-white/15
+ border border-white/10 transition-colors focus-visible:ring-2 focus-visible:ring-indigo-400"
+ >
+ Tout refuser
+
+ handleConsent(true)}
+ className="flex-1 px-3 py-2 rounded-lg text-xs font-medium text-white bg-indigo-600 hover:bg-indigo-500
+ transition-colors focus-visible:ring-2 focus-visible:ring-indigo-400"
+ >
+ Tout accepter
+
+
+
+
+ );
+};
+```
+
+---
+
+## 🔒 2. RGPD (Règlement UE 2016/679) : Formulaires & Données Personnelles
+
+1. **Minimisation des données (Art. 5.1.c)** : Ne collectez que les données strictement indispensables (ex: ne pas demander le numéro de téléphone ou la date de naissance pour une simple newsletter).
+2. **Case à cocher d'information explicite** :
+ - Case non pré-cochée obligatoire sous tout formulaire collectant des données.
+ - Mention claire de la finalité et lien vers la politique de confidentialité.
+3. **Droit à l'effacement et portabilité (Art. 17 & 20)** :
+ - Toute application SaaS doit fournir un mécanisme clair permettant à l'utilisateur de supprimer définitivement son compte et ses données (*Hard delete* ou anonymisation irréversible sous 30 jours).
+
+---
+
+## ♿ 3. European Accessibility Act (EAA - Directive UE 2019/882)
+
+Depuis le **28 juin 2025**, l'accessibilité numérique est une **obligation légale** pour le secteur privé en Europe (e-commerce, banques, billetteries, SaaS B2C) :
+- **Référentiel Technique** : Norme européenne **EN 301 549** (alignée sur **WCAG 2.1 / 2.2 Niveau AA**).
+- **Déclaration d'Accessibilité Obligatoire** : Chaque site doit publier une page accessible déclarant son niveau de conformité, listant les non-conformités éventuelles et fournissant un moyen de contact direct pour signaler une difficulté.
+- **Accessibilité du bandeau cookie** : Le bandeau de consentement doit impérativement être navigable au clavier et vocalisable par les lecteurs d'écran.
+
+---
+
+## 📜 4. Mentions Légales Obligatoires (Droit Français / LCEN & Directive E-commerce)
+
+Tout site accessible au public en France / UE doit comporter une page `/mentions-legales` facilement accessible contenant :
+1. **Éditeur du site** :
+ - Nom / Raison sociale, forme juridique, capital social.
+ - Adresse du siège social, numéro d'inscription au RCS (SIREN/SIRET).
+ - Numéro de TVA intracommunautaire.
+ - Contact : adresse email et numéro de téléphone non surtaxé.
+ - Directeur de la publication (nom et prénom).
+2. **Hébergeur** :
+ - Nom de l'hébergeur (ex: Vercel Inc, OVHcloud, AWS).
+ - Raison sociale, adresse postale complète et numéro de téléphone de l'hébergeur.
+3. **Médiation de la consommation (Sites marchands B2C)** :
+ - Coordonnées du médiateur de la consommation agréé auquel le consommateur peut faire appel gratuitement.
+
+---
+
+## 📋 Checklist de Conformité Réglementaire Européenne
+
+- [ ] Le bandeau cookies présente un bouton « Tout refuser » aussi accessible et visible que « Tout accepter ».
+- [ ] Aucun cookie tiers ou traceur n'est déposé avant un clic positif de l'utilisateur.
+- [ ] La page `/mentions-legales` renseigne l'éditeur complet, le n° RCS/TVA et l'hébergeur avec son adresse et téléphone.
+- [ ] La page `/politique-confidentialite` précise les finalités, la base légale, la durée de conservation et les droits d'accès/suppression.
+- [ ] Les formulaires disposent d'une mention d'information sans case pré-cochée.
+- [ ] Le site respecte les exigences de l'EAA (WCAG 2.1/2.2 AA) et publie sa déclaration d'accessibilité.
diff --git a/expo-native-ui/SKILL.md b/expo-native-ui/SKILL.md
new file mode 100644
index 0000000..8c80580
--- /dev/null
+++ b/expo-native-ui/SKILL.md
@@ -0,0 +1,201 @@
+---
+name: expo-native-ui
+description: Framework (OSS). Build beautiful, native-feeling Expo screens. Covers Apple HIG styling, semantic colors, native controls, SF Symbols, media, visual effects, gradients, storage, and responsive layout. For routing and navigation, use the expo-router skill; for motion and animation, use the expo-animation skill.
+version: 1.1.1
+license: MIT
+---
+
+# Expo Native UI Guidelines
+
+For routes, links, stacks, tabs, modals, sheets, and headers, use the `expo-router` skill. For any motion — entering/exiting, gestures, springs, keyboard-driven UI — use the `expo-animation` skill.
+
+> **Before picking any UI component, check `expo-ui` first.** `@expo/ui` provides native equivalents — BottomSheet, Button, Picker, Slider, Menu, Section, Switch, SegmentedControl, and more — rendered as real SwiftUI on iOS and Jetpack Compose on Android, available in Expo Go on SDK 56+ with no custom build. Load the **`expo-ui`** skill to find the right component before falling back to React Native built-ins or community libraries. This skill (`expo-native-ui`) covers the surrounding structure: Expo Router navigation, layout, styling, and visual effects.
+
+## References
+
+Consult these resources as needed:
+
+```
+references/
+ controls.md Native iOS: Switch, Slider, SegmentedControl, DateTimePicker, Picker
+ gradients.md CSS gradients via experimental_backgroundImage (New Arch only)
+ icons.md SF Symbols via expo-symbols SymbolView: names, weights, animations; Material icons on Android
+ media.md Camera, audio, video, and file saving
+ storage.md SQLite, AsyncStorage, SecureStore
+ visual-effects.md Blur (expo-blur) and liquid glass (expo-glass-effect)
+ webgpu-three.md 3D graphics, games, GPU visualizations with WebGPU and Three.js
+```
+
+## Running the App
+
+**CRITICAL: Always try Expo Go first before creating custom builds.**
+
+Most Expo apps work in Expo Go without any custom native code. Before running `npx expo run:ios` or `npx expo run:android`:
+
+1. **Start with Expo Go**: Run `npx expo start` and scan the QR code with Expo Go
+2. **Check if features work**: Test your app thoroughly in Expo Go
+3. **Only create custom builds when required** - see below
+
+### When Custom Builds Are Required
+
+You need `npx expo run:ios/android` or `eas build` ONLY when using:
+
+- **Local Expo modules** (custom native code in `modules/`)
+- **Apple targets** (widgets, app clips, extensions via `@bacons/apple-targets`)
+- **Third-party native modules** not included in Expo Go
+- **Custom native configuration** that can't be expressed in `app.json`
+
+### When Expo Go Works
+
+Expo Go supports a wide range of features out of the box:
+
+- Most `expo-*` packages (camera, location, sensors, sqlite, etc.) — but not all: remote push notifications don't work in Expo Go on Android since SDK 53, and some packages need native capabilities Expo Go doesn't bundle (e.g. WebGPU — see `references/webgpu-three.md`)
+- Expo Router navigation and deep links
+- Most UI libraries (reanimated, gesture handler, etc.)
+
+**If you're unsure, try Expo Go first.** Creating custom builds adds complexity, slower iteration, and requires Xcode/Android Studio setup.
+
+## Code Style
+
+- Be cautious of unterminated strings. Ensure nested backticks are escaped; never forget to escape quotes correctly.
+- Always use import statements at the top of the file.
+- Always use kebab-case for file names, e.g. `comment-card.tsx`
+- Never use special characters in file names
+- Configure tsconfig.json with path aliases, and prefer aliases over relative imports for refactors.
+
+## Library Preferences
+
+- **For any sheet, picker, slider, toggle, menu, or grouped-form section: use `@expo/ui` (see `expo-ui` skill) before reaching for a React Native built-in or community library** — it renders native SwiftUI/Compose and works in Expo Go on SDK 56+. For grouped/settings-style rows (short, fixed-length), use `@expo/ui`'s `List` + `ListItem`. For large or unknown-length scrolling lists (feeds, search results, catalogs), use `FlatList` or `FlashList` — `@expo/ui`'s `List` is not virtualized.
+- Never use modules removed from React Native such as Picker, WebView, SafeAreaView, or AsyncStorage
+- Never use legacy expo-permissions
+- `expo-audio` not `expo-av`
+- `expo-video` not `expo-av`
+- `expo-symbols` (`SymbolView`) for SF Symbols on iOS, not `@expo/vector-icons` — see `references/icons.md`. SF Symbols are Apple-only: on Android every icon needs a Material source (`md` prop on NativeTabs triggers; in-screen options under "Android: Material Icons" in icons.md), never SF-only iconography
+- `react-native-safe-area-context` not react-native SafeAreaView
+- `process.env.EXPO_OS` not `Platform.OS`
+- `React.use` not `React.useContext`
+- `expo-image` Image component instead of intrinsic element `img`
+- `expo-glass-effect` for liquid glass backdrops
+- `Color` from `expo-router` for native semantic colors, not raw `PlatformColor` (type-safe, auto-adapts to light/dark)
+- In SDK 56+, never import from `@react-navigation/*` directly — use `expo-router/react-navigation` instead (covers `@react-navigation/native`, `/core`, `/elements`, `/routers`)
+
+## Responsiveness
+
+- Wrap screens with scrollable content in a ScrollView. Screens whose root is a FlatList/FlashList must not add an outer ScrollView (the list is the scroll container), and full-bleed screens (camera, map, canvas) need neither
+- Use ` ` instead of `` for smarter safe area insets
+- `contentInsetAdjustmentBehavior="automatic"` should be applied to FlatList and SectionList as well
+- Use flexbox instead of Dimensions API
+- ALWAYS prefer `useWindowDimensions` over `Dimensions.get()` to measure screen size
+
+## Behavior
+
+- Use expo-haptics conditionally on iOS to make more delightful experiences
+- Use views with built-in haptics like ` ` from React Native and `@react-native-community/datetimepicker`
+- When a Stack route has scrollable content, make the ScrollView (or FlatList) the first component inside the route, with `contentInsetAdjustmentBehavior="automatic"` set
+- Use the ` ` prop on text containing data that could be copied
+- Consider formatting large numbers like 1.4M or 38k
+- Never use intrinsic elements like 'img' or 'div' unless in a webview or Expo DOM component
+- Every screen that loads data has four states (loading, error, empty, content) - never show the empty state while the first load is still resolving; the rules live in the `expo-data-fetching` skill
+- On scrollable forms and search results, use `keyboardShouldPersistTaps="handled"` so controls receive the first tap and unhandled taps can dismiss the keyboard. Use `"always"` only when unhandled taps should also keep it open
+- A form's primary action must never sit under the keyboard. For UI that tracks the keyboard's real frame, load the `expo-animation` skill's keyboard recipe (`react-native-keyboard-controller`) - never `Keyboard.addListener` plus a timing animation
+- Every enabled control must perform its advertised action: search filters results, Save commits edits, and settings affect behavior. Empty handlers and success alerts are not implementations; local state is enough when the user requested a prototype
+- For async saves, preserve drafts and handle pending/failure states per `expo-data-fetching`; do not dismiss a form before its save succeeds
+
+Before calling a screen complete, walk through its primary task, including one failure and recovery when it loads or saves data. Check keyboard access and back/dismiss behavior. Try long titles, missing images, no search results, and large system text; required actions must remain reachable. Report what you exercised and what you could not run.
+
+# Styling
+
+Follow each platform's own design language: Apple Human Interface Guidelines on iOS, Material Design 3 on Android. Never dress one platform in the other's uniform - no FAB or ripple in iOS layouts; no hand-built iOS chrome (back-chevrons, large-title text, iOS-styled switches) on Android.
+
+## General Styling Rules
+
+- Prefer flex gap over margin and padding styles
+- Prefer padding over margin where possible
+- Always account for safe area, either with stack headers, tabs, or ScrollView/FlatList `contentInsetAdjustmentBehavior="automatic"`
+- Ensure both top and bottom safe area insets are accounted for
+- Inline styles not StyleSheet.create unless reusing styles is faster
+- For any motion or animation work, load the `expo-animation` skill — it owns the animate-or-not decision, timing values, and interruption rules
+- Use `{ borderCurve: 'continuous' }` for rounded corners unless creating a capsule shape
+- ALWAYS use a navigation stack title instead of a custom text element on the page
+- When padding a ScrollView, use `contentContainerStyle` padding and gap instead of padding on the ScrollView itself (reduces clipping)
+- CSS and Tailwind are not supported - use inline styles
+
+## Colors
+
+Use the `Color` API from `expo-router` for native semantic colors. It is a type-safe wrapper over `PlatformColor` that exposes iOS UIKit colors through `Color.ios.*` and Android Material 3 colors through `Color.android.material.*` (static) or `Color.android.dynamic.*` (adapts to the user's wallpaper on Android 12+). These resolve on-device and automatically adapt to light/dark mode and accessibility settings, so you no longer maintain separate light/dark hex tables or a `colors.web.ts` file.
+
+`Color` is platform-specific, so wrap each value in `Platform.select` with a `default` hex fallback for web. Centralize the palette in `theme/colors.ts` and import `colors` everywhere:
+
+```tsx
+// theme/colors.ts
+import { Platform } from "react-native";
+import { Color } from "expo-router";
+
+export const colors = {
+ label: Platform.select({
+ ios: Color.ios.label,
+ android: Color.android.dynamic.onSurface,
+ default: "#000000",
+ })!,
+ secondaryLabel: Platform.select({
+ ios: Color.ios.secondaryLabel,
+ android: Color.android.dynamic.onSurfaceVariant,
+ default: "#3c3c43",
+ })!,
+ separator: Platform.select({
+ ios: Color.ios.separator,
+ android: Color.android.dynamic.outlineVariant,
+ default: "#c6c6c8",
+ })!,
+ systemBackground: Platform.select({
+ ios: Color.ios.systemBackground,
+ android: Color.android.dynamic.surface,
+ default: "#ffffff",
+ })!,
+ secondarySystemBackground: Platform.select({
+ ios: Color.ios.secondarySystemBackground,
+ android: Color.android.dynamic.surfaceVariant,
+ default: "#f2f2f7",
+ })!,
+ systemBlue: Platform.select({
+ ios: Color.ios.systemBlue,
+ android: Color.android.dynamic.primary,
+ default: "#007aff",
+ })!,
+};
+```
+
+```tsx
+import { colors } from "@/theme/colors";
+
+
+ Title
+ ;
+```
+
+- iOS re-resolves these colors automatically when the system theme changes. On Android, call `useColorScheme()` inside any component that renders them so it re-renders when the theme flips (required when React Compiler memoizes the component).
+- Don't pass `Color` / `PlatformColor` values into Reanimated styles — they are opaque native color objects, not strings; use static colors there.
+- `Platform.select({...})!` returns `string | OpaqueColorValue`. Most React Native style props accept `ColorValue` (`string | OpaqueColorValue`) so this works fine. But some third-party props only accept `string` (e.g. `tintColor` on `expo-image`). Cast when needed: `colors.label as string`.
+
+## Text Styling
+
+- Add the `selectable` prop to every ` ` element displaying important data or error messages
+- Counters should use `{ fontVariant: 'tabular-nums' }` for alignment
+
+## Shadows
+
+Use CSS `boxShadow` style prop. NEVER use legacy React Native shadow or elevation styles.
+
+```tsx
+
+```
+
+'inset' shadows are supported.
+
+## Submitting Feedback
+If you encounter errors, misleading or outdated information in this skill, report it so Expo can improve:
+```bash
+npx --yes submit-expo-feedback@latest --category skills --subject "expo-native-ui" ""
+```
+Only submit when you have something specific and actionable to report. Include as much relevant context as possible.
+If an AI agent repeatedly failed or the user had to take over an Expo task, load the expo-skill-feedback skill and follow its eval-candidate flow instead of reusing the command above.
diff --git a/expo-native-ui/agents/openai.yaml b/expo-native-ui/agents/openai.yaml
new file mode 100644
index 0000000..b41117e
--- /dev/null
+++ b/expo-native-ui/agents/openai.yaml
@@ -0,0 +1,4 @@
+interface:
+ display_name: "Expo Native UI"
+ short_description: "Build beautiful, native-feeling Expo screens: HIG styling, semantic colors, controls, SF Symbols, media, and visual effects"
+ default_prompt: "Use $expo-native-ui to style native-feeling Expo screens, choose semantic colors and native controls, add media and visual effects, and decide when Expo Go is enough before creating native builds."
diff --git a/expo-native-ui/references/controls.md b/expo-native-ui/references/controls.md
new file mode 100644
index 0000000..05865bd
--- /dev/null
+++ b/expo-native-ui/references/controls.md
@@ -0,0 +1,231 @@
+# Native Controls
+
+Native iOS controls provide built-in haptics, accessibility, and platform-appropriate styling.
+
+> **Prefer `@expo/ui` for these controls.** Its `Slider`, `Switch`, `DateTimePicker`, `Menu`, and segmented pickers render as real SwiftUI / Jetpack Compose and follow platform design conventions automatically — recommended over the React Native controls below. See the **`expo-ui`** skill; use the React Native controls below as a fallback when you're not using `@expo/ui`.
+
+## Switch
+
+Use for binary on/off settings. Has built-in haptics.
+
+```tsx
+import { Switch } from "react-native";
+import { useState } from "react";
+
+const [enabled, setEnabled] = useState(false);
+
+ ;
+```
+
+Don't recolor the Switch — native styling adapts to dark mode automatically.
+
+## Segmented Control
+
+Use for non-navigational tabs or mode selection. Avoid changing default colors.
+
+```tsx
+import SegmentedControl from "@react-native-segmented-control/segmented-control";
+import { useState } from "react";
+
+const [index, setIndex] = useState(0);
+
+ setIndex(nativeEvent.selectedSegmentIndex)}
+/>;
+```
+
+### Rules
+
+- Maximum 4 options — use a picker for more
+- Keep labels short (1-2 words)
+- Avoid custom colors — native styling adapts to dark mode
+
+### With Icons (iOS 14+)
+
+```tsx
+ setIndex(nativeEvent.selectedSegmentIndex)}
+/>
+```
+
+## Slider
+
+Continuous value selection.
+
+```tsx
+import Slider from "@react-native-community/slider";
+import { useState } from "react";
+
+const [value, setValue] = useState(0.5);
+
+ ;
+```
+
+### Discrete Steps
+
+```tsx
+
+```
+
+## Date/Time Picker
+
+Compact pickers with popovers. Has built-in haptics.
+
+```tsx
+import DateTimePicker from "@react-native-community/datetimepicker";
+import { useState } from "react";
+
+const [date, setDate] = useState(new Date());
+
+ {
+ if (selectedDate) setDate(selectedDate);
+ }}
+ mode="datetime"
+/>;
+```
+
+### Modes
+
+- `date` — Date only
+- `time` — Time only
+- `datetime` — Date and time
+
+### Display Styles
+
+```tsx
+// Compact inline (default)
+
+
+// Spinner wheel
+
+
+// Full calendar
+
+```
+
+### Time Intervals
+
+```tsx
+
+```
+
+### Min/Max Dates
+
+```tsx
+
+```
+
+## TextInput
+
+Native text input with various keyboard types.
+
+```tsx
+import { TextInput } from "react-native";
+import { colors } from "@/theme/colors";
+
+
+```
+
+### Keyboard Types
+
+```tsx
+// Email
+
+
+// Phone
+
+
+// Number
+
+
+// Password
+
+
+// Search
+
+```
+
+### Multiline
+
+```tsx
+
+```
+
+## Picker (Wheel)
+
+For selection from many options (5+ items).
+
+```tsx
+import { Picker } from "@react-native-picker/picker";
+import { useState } from "react";
+
+const [selected, setSelected] = useState("js");
+
+
+
+
+
+
+ ;
+```
+
+## Best Practices
+
+- **Haptics**: Switch and DateTimePicker have built-in haptics — don't add extra
+- **No native Stepper**: React Native has no `Stepper` component — compose increment/decrement from two Buttons or a numeric TextInput
+- **Accessibility**: Native controls have proper accessibility labels by default
+- **Dark Mode**: Avoid custom colors — native styling adapts automatically
+- **Spacing**: Use consistent padding around controls (12-16pt)
+- **Labels**: Place labels above or to the left of controls
+- **Grouping**: Group related controls in sections with headers
diff --git a/expo-native-ui/references/gradients.md b/expo-native-ui/references/gradients.md
new file mode 100644
index 0000000..329600d
--- /dev/null
+++ b/expo-native-ui/references/gradients.md
@@ -0,0 +1,106 @@
+# CSS Gradients
+
+> **New Architecture Only**: CSS gradients require React Native's New Architecture (Fabric). They are not available in the old architecture or Expo Go.
+
+Use CSS gradients with the `experimental_backgroundImage` style property.
+
+## Linear Gradients
+
+```tsx
+// Top to bottom
+
+
+// Left to right
+
+
+// Diagonal
+
+
+// Using degrees
+
+```
+
+## Radial Gradients
+
+```tsx
+// Circle at center
+
+
+// Ellipse
+
+
+// Positioned
+
+```
+
+## Multiple Gradients
+
+Stack multiple gradients by comma-separating them:
+
+```tsx
+
+```
+
+## Common Patterns
+
+### Overlay on Image
+
+```tsx
+
+
+
+
+```
+
+### Frosted Glass Effect
+
+```tsx
+
+```
+
+### Button Gradient
+
+```tsx
+
+ Submit
+
+```
+
+## Important Notes
+
+- Do NOT use `expo-linear-gradient` — use CSS gradients instead
+- Gradients are strings, not objects
+- Use `rgba()` for transparency, or `transparent` keyword
+- Color stops use percentages (0%, 50%, 100%)
+- Direction keywords: `to top`, `to bottom`, `to left`, `to right`, `to top left`, etc.
+- Degree values: `45deg`, `90deg`, `135deg`, etc.
diff --git a/expo-native-ui/references/icons.md b/expo-native-ui/references/icons.md
new file mode 100644
index 0000000..d23ac8f
--- /dev/null
+++ b/expo-native-ui/references/icons.md
@@ -0,0 +1,232 @@
+# Icons (SF Symbols)
+
+Use SF Symbols on iOS for native feel. SF Symbols are an Apple asset and never render on Android - every icon needs a Material counterpart (see "Android: Material Icons" below). Never use FontAwesome or Ionicons on either platform, and never emoji as icons.
+
+## Basic Usage
+
+```tsx
+import { SymbolView } from "expo-symbols";
+import { colors } from "@/theme/colors";
+
+ ;
+```
+
+## Props
+
+```tsx
+
+```
+
+## Common Icons
+
+### Navigation & Actions
+- `house.fill` - home
+- `gear` - settings
+- `magnifyingglass` - search
+- `plus` - add
+- `xmark` - close
+- `chevron.left` - back
+- `chevron.right` - forward
+- `arrow.left` - back arrow
+- `arrow.right` - forward arrow
+
+### Media
+- `play.fill` - play
+- `pause.fill` - pause
+- `stop.fill` - stop
+- `backward.fill` - rewind
+- `forward.fill` - fast forward
+- `speaker.wave.2.fill` - volume
+- `speaker.slash.fill` - mute
+
+### Camera
+- `camera` - camera
+- `camera.fill` - camera filled
+- `arrow.triangle.2.circlepath` - flip camera
+- `photo` - gallery/photos
+- `bolt` - flash
+- `bolt.slash` - flash off
+
+### Communication
+- `message` - message
+- `message.fill` - message filled
+- `envelope` - email
+- `envelope.fill` - email filled
+- `phone` - phone
+- `phone.fill` - phone filled
+- `video` - video call
+- `video.fill` - video call filled
+
+### Social
+- `heart` - like
+- `heart.fill` - liked
+- `star` - favorite
+- `star.fill` - favorited
+- `hand.thumbsup` - thumbs up
+- `hand.thumbsdown` - thumbs down
+- `person` - profile
+- `person.fill` - profile filled
+- `person.2` - people
+- `person.2.fill` - people filled
+
+### Content Actions
+- `square.and.arrow.up` - share
+- `square.and.arrow.down` - download
+- `doc.on.doc` - copy
+- `trash` - delete
+- `pencil` - edit
+- `folder` - folder
+- `folder.fill` - folder filled
+- `bookmark` - bookmark
+- `bookmark.fill` - bookmarked
+
+### Status & Feedback
+- `checkmark` - success/done
+- `checkmark.circle.fill` - completed
+- `xmark.circle.fill` - error/failed
+- `exclamationmark.triangle` - warning
+- `info.circle` - info
+- `questionmark.circle` - help
+- `bell` - notification
+- `bell.fill` - notification filled
+
+### Misc
+- `ellipsis` - more options
+- `ellipsis.circle` - more in circle
+- `line.3.horizontal` - menu/hamburger
+- `slider.horizontal.3` - filters
+- `arrow.clockwise` - refresh
+- `location` - location
+- `location.fill` - location filled
+- `map` - map
+- `mappin` - pin
+- `clock` - time
+- `calendar` - calendar
+- `link` - link
+- `nosign` - block/prohibited
+
+## Animated Symbols
+
+```tsx
+
+```
+
+### Animation Effects
+
+- `bounce` - Bouncy animation
+- `pulse` - Pulsing effect
+- `variableColor` - Color cycling
+- `scale` - Scale animation
+
+```tsx
+// Bounce with direction
+animationSpec={{
+ effect: { type: "bounce", direction: "up" } // up | down
+}}
+
+// Pulse
+animationSpec={{
+ effect: { type: "pulse" }
+}}
+
+// Variable color (multicolor symbols)
+animationSpec={{
+ effect: {
+ type: "variableColor",
+ cumulative: true,
+ reversing: true
+ }
+}}
+```
+
+## Symbol Weights
+
+```tsx
+// Lighter weights
+
+
+
+
+// Default
+
+
+// Heavier weights
+
+
+
+
+
+```
+
+## Symbol Scales
+
+```tsx
+
+ // default
+
+```
+
+## Multicolor Symbols
+
+Some symbols support multiple colors:
+
+```tsx
+
+```
+
+## Android: Material Icons
+
+On Android an SF Symbol source renders nothing - an app that ships SF-only iconography ships blank icons. Give every icon a Material source:
+
+- **Tab bars**: pass `md` (Material Symbol name) beside `sf` on NativeTabs triggers - ` ` (SDK 55+, see the `expo-router` skill).
+- **In screens**: `@expo/vector-icons` Material families, gated by platform:
+
+```tsx
+import MaterialIcons from "@expo/vector-icons/MaterialIcons";
+
+process.env.EXPO_OS === "ios" ? (
+
+) : (
+
+);
+```
+
+One icon family per platform - never a mixed set, never SF names on Android or Material glyphs on iOS.
+
+## Finding Symbol Names
+
+1. Use the SF Symbols app on macOS (free from Apple)
+2. Search at https://developer.apple.com/sf-symbols/
+3. Symbol names use dot notation: `square.and.arrow.up`
+
+## Best Practices
+
+- On iOS, always use SF Symbols over vector icon libraries; on Android, use Material icons (see above)
+- Match symbol weight to nearby text weight
+- Use `.fill` variants for selected/active states
+- Use the cross-platform `colors` helper (see SKILL.md "Colors") for tint to support dark mode
+- Keep icons at consistent sizes (16, 20, 24, 32)
diff --git a/expo-native-ui/references/media.md b/expo-native-ui/references/media.md
new file mode 100644
index 0000000..65813b4
--- /dev/null
+++ b/expo-native-ui/references/media.md
@@ -0,0 +1,193 @@
+# Media
+
+## Camera
+
+- Hide navigation headers when there's a full screen camera
+- Ensure to flip the camera with `mirror` to emulate social apps
+- Use liquid glass buttons on cameras
+- Icons: `arrow.triangle.2.circlepath` (flip), `photo` (gallery), `bolt` (flash)
+- Gate the camera behind an explanation screen with a Grant button (as below) — never fire the permission prompt on mount
+- Lazily request media library permission (at first save/pick)
+
+The example uses the `GlassButton` helper defined in `visual-effects.md` (Glass Buttons section).
+
+```tsx
+import React, { useRef, useState } from "react";
+import { View, Pressable, Text } from "react-native";
+import { CameraView, CameraType, useCameraPermissions } from "expo-camera";
+import * as ImagePicker from "expo-image-picker";
+import * as Haptics from "expo-haptics";
+import { colors } from "@/theme/colors";
+import { GlassView } from "expo-glass-effect";
+import { useSafeAreaInsets } from "react-native-safe-area-context";
+
+function Camera({ onPicture }: { onPicture: (uri: string) => Promise }) {
+ const [permission, requestPermission] = useCameraPermissions();
+ const cameraRef = useRef(null);
+ const [type, setType] = useState("back");
+ const { bottom } = useSafeAreaInsets();
+
+ if (!permission?.granted) {
+ return (
+
+ Camera access is required
+
+
+ Grant Permission
+
+
+
+ );
+ }
+
+ const takePhoto = async () => {
+ await Haptics.selectionAsync();
+ if (!cameraRef.current) return;
+ const photo = await cameraRef.current.takePictureAsync({ quality: 0.8 });
+ await onPicture(photo.uri);
+ };
+
+ const selectPhoto = async () => {
+ await Haptics.selectionAsync();
+ const result = await ImagePicker.launchImageLibraryAsync({
+ mediaTypes: "images",
+ allowsEditing: false,
+ quality: 0.8,
+ });
+ if (!result.canceled && result.assets?.[0]) {
+ await onPicture(result.assets[0].uri);
+ }
+ };
+
+ return (
+
+
+
+
+
+
+
+
+ setType(t => t === "back" ? "front" : "back")} icon="arrow.triangle.2.circlepath" />
+
+
+
+ );
+}
+```
+
+## Audio Playback
+
+Use `expo-audio` not `expo-av`:
+
+```tsx
+import { useAudioPlayer } from 'expo-audio';
+
+const player = useAudioPlayer({ uri: 'https://stream.nightride.fm/rektory.mp3' });
+
+ player.play()} />
+```
+
+## Audio Recording (Microphone)
+
+```tsx
+import {
+ useAudioRecorder,
+ AudioModule,
+ RecordingPresets,
+ setAudioModeAsync,
+ useAudioRecorderState,
+} from 'expo-audio';
+import { Alert, Button } from 'react-native';
+
+function App() {
+ const audioRecorder = useAudioRecorder(RecordingPresets.HIGH_QUALITY);
+ const recorderState = useAudioRecorderState(audioRecorder);
+
+ // Request the microphone on first record, not on mount — no prompt before user intent
+ const record = async () => {
+ const status = await AudioModule.requestRecordingPermissionsAsync();
+ if (!status.granted) {
+ Alert.alert('Permission to access microphone was denied');
+ return;
+ }
+ await setAudioModeAsync({ playsInSilentMode: true, allowsRecording: true });
+ await audioRecorder.prepareToRecordAsync();
+ audioRecorder.record();
+ };
+
+ const stop = () => audioRecorder.stop();
+
+ return (
+
+ );
+}
+```
+
+## Video Playback
+
+Use `expo-video` not `expo-av`:
+
+```tsx
+import { useVideoPlayer, VideoView } from 'expo-video';
+import { useEvent } from 'expo';
+
+const videoSource = 'https://example.com/video.mp4';
+
+const player = useVideoPlayer(videoSource, player => {
+ player.loop = true;
+ player.play();
+});
+
+const { isPlaying } = useEvent(player, 'playingChange', { isPlaying: player.playing });
+
+
+```
+
+VideoView options:
+- `allowsPictureInPicture`: boolean
+- `contentFit`: 'contain' | 'cover' | 'fill'
+- `nativeControls`: boolean
+- `playsInline`: boolean
+- `startsPictureInPictureAutomatically`: boolean
+
+## Saving Media
+
+```tsx
+import * as MediaLibrary from "expo-media-library";
+
+const { granted } = await MediaLibrary.requestPermissionsAsync();
+if (granted) {
+ await MediaLibrary.saveToLibraryAsync(uri);
+}
+```
+
+### Saving Base64 Images
+
+`MediaLibrary.saveToLibraryAsync` only accepts local file paths. Save base64 strings to disk first:
+
+```tsx
+import { File, Paths } from "expo-file-system/next";
+
+function base64ToLocalUri(base64: string, filename?: string) {
+ if (!filename) {
+ const match = base64.match(/^data:(image\/[a-zA-Z]+);base64,/);
+ const ext = match ? match[1].split("/")[1] : "jpg";
+ filename = `generated-${Date.now()}.${ext}`;
+ }
+
+ if (base64.startsWith("data:")) base64 = base64.split(",")[1];
+ const binaryString = atob(base64);
+ const len = binaryString.length;
+ const bytes = new Uint8Array(new ArrayBuffer(len));
+ for (let i = 0; i < len; i++) bytes[i] = binaryString.charCodeAt(i);
+
+ const f = new File(Paths.cache, filename);
+ f.create({ overwrite: true });
+ f.write(bytes);
+ return f.uri;
+}
+```
diff --git a/expo-native-ui/references/storage.md b/expo-native-ui/references/storage.md
new file mode 100644
index 0000000..c084f12
--- /dev/null
+++ b/expo-native-ui/references/storage.md
@@ -0,0 +1,121 @@
+# Storage
+
+## Key-Value Storage
+
+Use the localStorage polyfill for key-value storage. **Never use AsyncStorage**
+
+```tsx
+import "expo-sqlite/localStorage/install";
+
+// Simple get/set
+localStorage.setItem("key", "value");
+localStorage.getItem("key");
+
+// Store objects as JSON
+localStorage.setItem("user", JSON.stringify({ name: "John", id: 1 }));
+const user = JSON.parse(localStorage.getItem("user") ?? "{}");
+```
+
+## When to Use What
+
+| Use Case | Solution |
+| ---------------------------------------------------- | ----------------------- |
+| Simple key-value (settings, preferences, small data) | `localStorage` polyfill |
+| Large datasets, complex queries, relational data | Full `expo-sqlite` |
+| Sensitive data (tokens, passwords) | `expo-secure-store` |
+
+## Storage with React State
+
+Create a storage utility with subscriptions for reactive updates:
+
+```tsx
+// utils/storage.ts
+import "expo-sqlite/localStorage/install";
+
+type Listener = () => void;
+const listeners = new Map>();
+
+export const storage = {
+ get(key: string, defaultValue: T): T {
+ const value = localStorage.getItem(key);
+ return value ? JSON.parse(value) : defaultValue;
+ },
+
+ set(key: string, value: T): void {
+ localStorage.setItem(key, JSON.stringify(value));
+ listeners.get(key)?.forEach((fn) => fn());
+ },
+
+ subscribe(key: string, listener: Listener): () => void {
+ if (!listeners.has(key)) listeners.set(key, new Set());
+ listeners.get(key)!.add(listener);
+ return () => listeners.get(key)?.delete(listener);
+ },
+};
+```
+
+## React Hook for Storage
+
+```tsx
+// hooks/use-storage.ts
+import { useSyncExternalStore } from "react";
+import { storage } from "@/utils/storage";
+
+export function useStorage(
+ key: string,
+ defaultValue: T
+): [T, (value: T) => void] {
+ const value = useSyncExternalStore(
+ (cb) => storage.subscribe(key, cb),
+ () => storage.get(key, defaultValue)
+ );
+
+ return [value, (newValue: T) => storage.set(key, newValue)];
+}
+```
+
+Usage:
+
+```tsx
+function Settings() {
+ const [theme, setTheme] = useStorage("theme", "light");
+
+ return (
+ setTheme(dark ? "dark" : "light")}
+ />
+ );
+}
+```
+
+## Full SQLite for Complex Data
+
+For larger datasets or complex queries, use expo-sqlite directly:
+
+```tsx
+import * as SQLite from "expo-sqlite";
+
+const db = await SQLite.openDatabaseAsync("app.db");
+
+// Create table
+await db.execAsync(`
+ CREATE TABLE IF NOT EXISTS events (
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
+ title TEXT NOT NULL,
+ date TEXT NOT NULL,
+ location TEXT
+ )
+`);
+
+// Insert
+await db.runAsync("INSERT INTO events (title, date) VALUES (?, ?)", [
+ "Meeting",
+ "2024-01-15",
+]);
+
+// Query
+const events = await db.getAllAsync("SELECT * FROM events WHERE date > ?", [
+ "2024-01-01",
+]);
+```
diff --git a/expo-native-ui/references/visual-effects.md b/expo-native-ui/references/visual-effects.md
new file mode 100644
index 0000000..fdf312a
--- /dev/null
+++ b/expo-native-ui/references/visual-effects.md
@@ -0,0 +1,198 @@
+# Visual Effects
+
+## Backdrop Blur
+
+Use `expo-blur` for blur effects. Prefer systemMaterial tints as they adapt to dark mode.
+
+```tsx
+import { BlurView } from "expo-blur";
+
+ ;
+```
+
+### Tint Options
+
+```tsx
+// System materials (adapt to dark mode)
+
+
+
+
+
+
+// Basic tints
+
+
+
+
+// Prominent (more visible)
+
+
+// Extra light/dark
+
+```
+
+### Intensity
+
+Control blur strength with `intensity` (0-100):
+
+```tsx
+ // Subtle
+ // Full
+```
+
+### Rounded Corners
+
+BlurView requires `overflow: 'hidden'` to clip rounded corners:
+
+```tsx
+
+```
+
+### Overlay Pattern
+
+Common pattern for overlaying blur on content:
+
+```tsx
+
+
+
+ Caption
+
+
+```
+
+## Glass Effects (iOS 26+)
+
+Use `expo-glass-effect` for liquid glass backdrops on iOS 26+.
+
+```tsx
+import { GlassView } from "expo-glass-effect";
+
+
+ Content inside glass
+
+```
+
+### Interactive Glass
+
+Add `isInteractive` for buttons and pressable glass:
+
+```tsx
+import { GlassView } from "expo-glass-effect";
+import { SymbolView } from "expo-symbols";
+import { colors } from "@/theme/colors";
+
+
+
+
+
+
+```
+
+### Glass Buttons
+
+Create liquid glass buttons:
+
+```tsx
+function GlassButton({ icon, onPress }) {
+ return (
+
+
+
+
+
+ );
+}
+
+// Usage
+
+
+```
+
+### Glass Card
+
+```tsx
+
+
+ Card Title
+
+
+ Card content goes here
+
+
+```
+
+### Checking Availability
+
+Check both guards: `isLiquidGlassAvailable()` (OS support) and `isGlassEffectAPIAvailable()` — some iOS 26 beta versions lack the API and crash without the second check.
+
+```tsx
+import { isLiquidGlassAvailable, isGlassEffectAPIAvailable } from "expo-glass-effect";
+
+const canUseGlass = isLiquidGlassAvailable() && isGlassEffectAPIAvailable();
+```
+
+### Fallback Pattern
+
+```tsx
+import { GlassView, isLiquidGlassAvailable, isGlassEffectAPIAvailable } from "expo-glass-effect";
+import { BlurView } from "expo-blur";
+
+function AdaptiveGlass({ children, style }) {
+ if (isLiquidGlassAvailable() && isGlassEffectAPIAvailable()) {
+ return {children} ;
+ }
+
+ return (
+
+ {children}
+
+ );
+}
+```
+
+When the user has Reduce Transparency enabled (`AccessibilityInfo.isReduceTransparencyEnabled()`), skip glass *and* blur — render a solid `colors.systemBackground` surface instead.
+
+## Sheet with Glass Background
+
+Make sheet backgrounds liquid glass on iOS 26+:
+
+```tsx
+
+```
+
+## Best Practices
+
+- Use `systemMaterial` tints for automatic dark mode support
+- Always set `overflow: 'hidden'` on BlurView for rounded corners — but never on a `GlassView` or its ancestors: glass clips itself via `borderRadius` (+ `borderCurve`), and outside clipping cuts off the rim highlight and press bulge
+- Use `isInteractive` on GlassView only for actual controls (buttons, pressables) — leave background surfaces non-interactive
+- Check `isLiquidGlassAvailable()` **and** `isGlassEffectAPIAvailable()`, provide fallbacks, and respect Reduce Transparency with a solid surface
+- Never animate opacity on a `GlassView` or an ancestor — animate content around a stable glass surface, or switch `glassEffectStyle` on the mounted view to change its look
+- Avoid nesting blur views (performance impact)
+- Keep blur intensity reasonable (50-100) for readability
diff --git a/expo-native-ui/references/webgpu-three.md b/expo-native-ui/references/webgpu-three.md
new file mode 100644
index 0000000..58b5ce8
--- /dev/null
+++ b/expo-native-ui/references/webgpu-three.md
@@ -0,0 +1,605 @@
+# WebGPU & Three.js for Expo
+
+**Use this skill for ANY 3D graphics, games, GPU compute, or Three.js features in React Native.**
+
+## Locked Versions (Tested & Working)
+
+```json
+{
+ "react-native-wgpu": "^0.4.1",
+ "three": "0.172.0",
+ "@react-three/fiber": "^9.4.0",
+ "wgpu-matrix": "^3.0.2",
+ "@types/three": "0.172.0"
+}
+```
+
+**Critical:** These versions are tested together. Mismatched versions cause type errors and runtime issues.
+
+## Installation
+
+```bash
+npm install react-native-wgpu@^0.4.1 three@0.172.0 @react-three/fiber@^9.4.0 wgpu-matrix@^3.0.2 @types/three@0.172.0 --legacy-peer-deps
+```
+
+**Note:** `--legacy-peer-deps` may be required due to peer dependency conflicts with canary Expo versions.
+
+## Metro Configuration
+
+Create `metro.config.js` in project root:
+
+```js
+const { getDefaultConfig } = require("expo/metro-config");
+
+const config = getDefaultConfig(__dirname);
+
+config.resolver.resolveRequest = (context, moduleName, platform) => {
+ // Force 'three' to webgpu build
+ if (moduleName.startsWith("three")) {
+ moduleName = "three/webgpu";
+ }
+
+ // Use standard react-three/fiber instead of React Native version
+ if (platform !== "web" && moduleName.startsWith("@react-three/fiber")) {
+ return context.resolveRequest(
+ {
+ ...context,
+ unstable_conditionNames: ["module"],
+ mainFields: ["module"],
+ },
+ moduleName,
+ platform
+ );
+ }
+ return context.resolveRequest(context, moduleName, platform);
+};
+
+module.exports = config;
+```
+
+## Required Lib Files
+
+Create these files in `src/lib/`:
+
+### 1. make-webgpu-renderer.ts
+
+```ts
+import type { NativeCanvas } from "react-native-wgpu";
+import * as THREE from "three/webgpu";
+
+export class ReactNativeCanvas {
+ constructor(private canvas: NativeCanvas) {}
+
+ get width() {
+ return this.canvas.width;
+ }
+ get height() {
+ return this.canvas.height;
+ }
+ set width(width: number) {
+ this.canvas.width = width;
+ }
+ set height(height: number) {
+ this.canvas.height = height;
+ }
+ get clientWidth() {
+ return this.canvas.width;
+ }
+ get clientHeight() {
+ return this.canvas.height;
+ }
+ set clientWidth(width: number) {
+ this.canvas.width = width;
+ }
+ set clientHeight(height: number) {
+ this.canvas.height = height;
+ }
+
+ addEventListener(_type: string, _listener: EventListener) {}
+ removeEventListener(_type: string, _listener: EventListener) {}
+ dispatchEvent(_event: Event) {}
+ setPointerCapture() {}
+ releasePointerCapture() {}
+}
+
+export const makeWebGPURenderer = (
+ context: GPUCanvasContext,
+ { antialias = true }: { antialias?: boolean } = {}
+) =>
+ new THREE.WebGPURenderer({
+ antialias,
+ // @ts-expect-error
+ canvas: new ReactNativeCanvas(context.canvas),
+ context,
+ });
+```
+
+### 2. fiber-canvas.tsx
+
+```tsx
+import * as THREE from "three/webgpu";
+import React, { useEffect, useRef } from "react";
+import type { ReconcilerRoot, RootState } from "@react-three/fiber";
+import {
+ extend,
+ createRoot,
+ unmountComponentAtNode,
+ events,
+} from "@react-three/fiber";
+import type { ViewProps } from "react-native";
+import { PixelRatio } from "react-native";
+import { Canvas, type CanvasRef } from "react-native-wgpu";
+
+import {
+ makeWebGPURenderer,
+ ReactNativeCanvas,
+} from "@/lib/make-webgpu-renderer";
+
+// Extend THREE namespace for R3F - add all components you use
+extend({
+ AmbientLight: THREE.AmbientLight,
+ DirectionalLight: THREE.DirectionalLight,
+ PointLight: THREE.PointLight,
+ SpotLight: THREE.SpotLight,
+ Mesh: THREE.Mesh,
+ Group: THREE.Group,
+ Points: THREE.Points,
+ BoxGeometry: THREE.BoxGeometry,
+ SphereGeometry: THREE.SphereGeometry,
+ CylinderGeometry: THREE.CylinderGeometry,
+ ConeGeometry: THREE.ConeGeometry,
+ DodecahedronGeometry: THREE.DodecahedronGeometry,
+ BufferGeometry: THREE.BufferGeometry,
+ BufferAttribute: THREE.BufferAttribute,
+ MeshStandardMaterial: THREE.MeshStandardMaterial,
+ MeshBasicMaterial: THREE.MeshBasicMaterial,
+ PointsMaterial: THREE.PointsMaterial,
+ PerspectiveCamera: THREE.PerspectiveCamera,
+ Scene: THREE.Scene,
+});
+
+interface FiberCanvasProps {
+ children: React.ReactNode;
+ style?: ViewProps["style"];
+ camera?: THREE.PerspectiveCamera;
+ scene?: THREE.Scene;
+}
+
+export const FiberCanvas = ({
+ children,
+ style,
+ scene,
+ camera,
+}: FiberCanvasProps) => {
+ const root = useRef>(null!);
+ const canvasRef = useRef(null);
+
+ useEffect(() => {
+ const context = canvasRef.current!.getContext("webgpu")!;
+ const renderer = makeWebGPURenderer(context);
+
+ // @ts-expect-error - ReactNativeCanvas wraps native canvas
+ const canvas = new ReactNativeCanvas(context.canvas) as HTMLCanvasElement;
+ canvas.width = canvas.clientWidth * PixelRatio.get();
+ canvas.height = canvas.clientHeight * PixelRatio.get();
+ const size = {
+ top: 0,
+ left: 0,
+ width: canvas.clientWidth,
+ height: canvas.clientHeight,
+ };
+
+ if (!root.current) {
+ root.current = createRoot(canvas);
+ }
+ root.current.configure({
+ size,
+ events,
+ scene,
+ camera,
+ gl: renderer,
+ frameloop: "always",
+ dpr: 1,
+ onCreated: async (state: RootState) => {
+ // @ts-expect-error - WebGPU renderer has init method
+ await state.gl.init();
+ const renderFrame = state.gl.render.bind(state.gl);
+ state.gl.render = (s: THREE.Scene, c: THREE.Camera) => {
+ renderFrame(s, c);
+ context?.present();
+ };
+ },
+ });
+ root.current.render(children);
+ return () => {
+ if (canvas != null) {
+ unmountComponentAtNode(canvas!);
+ }
+ };
+ });
+
+ return ;
+};
+```
+
+## Basic 3D Scene
+
+```tsx
+import * as THREE from "three/webgpu";
+import { View } from "react-native";
+import { useRef } from "react";
+import { useFrame, useThree } from "@react-three/fiber";
+import { FiberCanvas } from "@/lib/fiber-canvas";
+
+function RotatingBox() {
+ const ref = useRef(null!);
+
+ useFrame((_, delta) => {
+ ref.current.rotation.x += delta;
+ ref.current.rotation.y += delta * 0.5;
+ });
+
+ return (
+
+
+
+
+ );
+}
+
+function Scene() {
+ const { camera } = useThree();
+
+ useEffect(() => {
+ camera.position.set(0, 2, 5);
+ camera.lookAt(0, 0, 0);
+ }, [camera]);
+
+ return (
+ <>
+
+
+
+ >
+ );
+}
+
+export default function App() {
+ return (
+
+
+
+
+
+ );
+}
+```
+
+## Lazy Loading (Recommended)
+
+Use React.lazy to code-split Three.js for better loading:
+
+```tsx
+import React, { Suspense } from "react";
+import { ActivityIndicator, View } from "react-native";
+
+const Scene = React.lazy(() => import("@/components/scene"));
+
+export default function Page() {
+ return (
+
+ }>
+
+
+
+ );
+}
+```
+
+## Common Geometries
+
+```tsx
+// Box
+
+
+
+
+
+// Sphere
+
+
+
+
+
+// Cylinder
+
+
+
+
+
+// Cone
+
+
+
+
+```
+
+## Lighting
+
+```tsx
+// Ambient (uniform light everywhere)
+
+
+// Directional (sun-like)
+
+
+// Point (light bulb)
+
+
+// Spot (flashlight)
+
+```
+
+## Animation with useFrame
+
+```tsx
+import { useFrame } from "@react-three/fiber";
+import { useRef } from "react";
+import * as THREE from "three/webgpu";
+
+function AnimatedMesh() {
+ const ref = useRef(null!);
+
+ // Runs every frame - delta is time since last frame
+ useFrame((state, delta) => {
+ // Rotate
+ ref.current.rotation.y += delta;
+
+ // Oscillate position
+ ref.current.position.y = Math.sin(state.clock.elapsedTime) * 2;
+ });
+
+ return (
+
+
+
+
+ );
+}
+```
+
+## Particle Systems
+
+```tsx
+import * as THREE from "three/webgpu";
+import { useRef, useEffect } from "react";
+import { useFrame } from "@react-three/fiber";
+
+function Particles({ count = 500 }) {
+ const ref = useRef(null!);
+ const positions = useRef(new Float32Array(count * 3));
+
+ useEffect(() => {
+ for (let i = 0; i < count; i++) {
+ positions.current[i * 3] = (Math.random() - 0.5) * 50;
+ positions.current[i * 3 + 1] = (Math.random() - 0.5) * 50;
+ positions.current[i * 3 + 2] = (Math.random() - 0.5) * 50;
+ }
+ }, [count]);
+
+ useFrame((_, delta) => {
+ // Animate particles
+ for (let i = 0; i < count; i++) {
+ positions.current[i * 3 + 1] -= delta * 2;
+ if (positions.current[i * 3 + 1] < -25) {
+ positions.current[i * 3 + 1] = 25;
+ }
+ }
+ ref.current.geometry.attributes.position.needsUpdate = true;
+ });
+
+ return (
+
+
+
+
+
+
+ );
+}
+```
+
+## Touch Controls (Orbit)
+
+See the full `orbit-controls.tsx` implementation in the lib files. Usage:
+
+```tsx
+import { View } from "react-native";
+import { FiberCanvas } from "@/lib/fiber-canvas";
+import useControls from "@/lib/orbit-controls";
+
+function Scene() {
+ const [OrbitControls, events] = useControls();
+
+ return (
+
+
+
+ {/* Your 3D content */}
+
+
+ );
+}
+```
+
+## Common Issues & Solutions
+
+### 1. "X is not part of the THREE namespace"
+
+**Problem:** Error like `AmbientLight is not part of the THREE namespace`
+
+**Solution:** Add the missing component to the `extend()` call in fiber-canvas.tsx:
+
+```tsx
+extend({
+ AmbientLight: THREE.AmbientLight,
+ // Add other missing components...
+});
+```
+
+### 2. TypeScript Errors with Three.js
+
+**Problem:** Type mismatches between three.js and R3F
+
+**Solution:** Use `@ts-expect-error` comments where needed:
+
+```tsx
+// @ts-expect-error - WebGPU renderer types don't match
+await state.gl.init();
+```
+
+### 3. Blank Screen
+
+**Problem:** Canvas renders but nothing visible
+
+**Solution:**
+
+1. Ensure camera is positioned correctly and looking at scene
+2. Add lighting (objects are black without light)
+3. Check that `extend()` includes all components used
+
+### 4. Performance Issues
+
+**Problem:** Low frame rate or stuttering
+
+**Solution:**
+
+- Reduce polygon count in geometries
+- Use `useMemo` for static data
+- Limit particle count
+- Use `instancedMesh` for many identical objects
+
+### 5. Peer Dependency Errors
+
+**Problem:** npm install fails with ERESOLVE
+
+**Solution:** Use `--legacy-peer-deps`:
+
+```bash
+npm install --legacy-peer-deps
+```
+
+## Building
+
+WebGPU requires a custom build:
+
+```bash
+npx expo prebuild
+npx expo run:ios
+```
+
+**Note:** WebGPU does NOT work in Expo Go.
+
+## File Structure
+
+```
+src/
+├── app/
+│ └── index.tsx # Entry point with lazy loading
+├── components/
+│ ├── scene.tsx # Main 3D scene
+│ └── game.tsx # Game logic
+└── lib/
+ ├── fiber-canvas.tsx # R3F canvas wrapper
+ ├── make-webgpu-renderer.ts # WebGPU renderer
+ └── orbit-controls.tsx # Touch controls
+```
+
+## Decision Tree
+
+```
+Need 3D graphics?
+├── Simple shapes → mesh + geometry + material
+├── Animated objects → useFrame + refs
+├── Many objects → instancedMesh
+├── Particles → Points + BufferGeometry
+│
+Need interaction?
+├── Orbit camera → useControls hook
+├── Touch objects → onClick on mesh
+├── Gestures → react-native-gesture-handler
+│
+Performance critical?
+├── Static geometry → useMemo
+├── Many instances → InstancedMesh
+└── Complex scenes → LOD (Level of Detail)
+```
+
+## Example: Complete Game Scene
+
+```tsx
+import * as THREE from "three/webgpu";
+import { View, Text, Pressable } from "react-native";
+import { useRef, useState, useCallback } from "react";
+import { useFrame, useThree } from "@react-three/fiber";
+import { FiberCanvas } from "@/lib/fiber-canvas";
+
+function Player({ position }: { position: THREE.Vector3 }) {
+ const ref = useRef(null!);
+
+ useFrame(() => {
+ ref.current.position.copy(position);
+ });
+
+ return (
+
+
+
+
+ );
+}
+
+function GameScene({ playerX }: { playerX: number }) {
+ const { camera } = useThree();
+ const playerPos = useRef(new THREE.Vector3(0, 0, 0));
+
+ playerPos.current.x = playerX;
+
+ useEffect(() => {
+ camera.position.set(0, 10, 15);
+ camera.lookAt(0, 0, 0);
+ }, [camera]);
+
+ return (
+ <>
+
+
+
+ >
+ );
+}
+
+export default function Game() {
+ const [playerX, setPlayerX] = useState(0);
+
+ return (
+
+
+
+
+
+
+ setPlayerX((x) => x - 1)}>
+ ◀
+
+ setPlayerX((x) => x + 1)}>
+ ▶
+
+
+
+ );
+}
+```
diff --git a/frontend-design/LICENSE.txt b/frontend-design/LICENSE.txt
new file mode 100644
index 0000000..f433b1a
--- /dev/null
+++ b/frontend-design/LICENSE.txt
@@ -0,0 +1,177 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
diff --git a/frontend-design/SKILL.md b/frontend-design/SKILL.md
new file mode 100644
index 0000000..a533345
--- /dev/null
+++ b/frontend-design/SKILL.md
@@ -0,0 +1,71 @@
+---
+name: frontend-design
+description: Guidance for distinctive, intentional visual design when building new UI or reshaping an existing one. Helps with aesthetic direction, typography, and making choices that don't read as templated defaults.
+license: Complete terms in LICENSE.txt
+---
+
+# Frontend Design
+
+Approach this as the design lead at a design studio known for giving every client a distinct visual identity that is not mistaken for anyone else's. This client has already rejected proposals that felt cliché or templated, and is paying for a distinctive point of view: make deliberate, opinionated choices about palette, typography, and layout that are specific to this brief, and take aesthetic risk if justified.
+
+## Ground your designs in the subject matter
+
+If the brief does not identify what the product or subject matter is, identify it yourself before designing, and confirm with the client. You can come up with one concrete subject, the design's audience, and the design's primary job, as a proposal. If there's any information in your memory about the client's preferences or context about what they're building, use that as a hint. The subject's industry, subject matter, materials, and vernacular are where distinctive visual choices come from — a design for a toy for girls aged 8–11 will be very aesthetically different from a dashboard for financial analysts. Build with the brief's real content and subject matter throughout.
+
+## Design principles
+
+For web designs, the hero is the first thing viewers will see. Open with the most characteristic thing in the subject's world, in the form that is most appropriate: a headline, an image, an animation, a live demo, an interactive moment, or other treatments. Be deliberate with your choice: a big number with a small label, supporting stats, and a gradient accent is the default treatment, so only use it if that's truly the best option.
+
+Typography carries the personality of the page. You don't need a different typeface for display or headline text and body content: use one family or two, and if two, make them clearly distinct.
+
+Choose your typefaces deliberately, not the default families you would reach for on any other project, and set a clear type scale following the default guidance of The Elements of Typographic Style with intentional weights, widths, and spacing. When type is used as a headline or visual element, use the type treatment itself as an active part of the design, not a neutral delivery vehicle for the content.
+
+Default to line lengths of less than 80 characters. Serif typefaces can have slightly longer line lengths; give serif body text slightly more line-height than a sans-serif.
+
+Avoid these default typographic treatments; they are the commonest tells of a generated page:
+- Accenting just a single word or phrase in a headline, like putting one word in italic/bold or a different color.
+- Using all caps for labels.
+- Adding unnecessary typographic labels above content.
+
+Visual structure is information. Structural devices like outlines, borders, numbering, eyebrows, dividers, labels, etc., encode useful information about the content rather than decorate it. Many generic designs use numbered markers (01 / 02 / 03), but that's only appropriate if the content actually is a sequence — like a stepped process or a timeline. Before adding numbered markers, check the content really is a sequence.
+
+Use non-user-triggered motion sparingly and deliberately, only to draw attention. A single orchestrated moment — one page-load sequence or one reveal — lands better than scattered effects; fade-and-slide-up entrances on each section and hover transitions on every card are the generic default and read as AI-generated. Motion that answers a person's action (opening, expanding, confirming) is welcome when it shows what changed.
+
+Consider written content carefully. Often a design brief may not contain real content, and it's up to you to come up with copy and placeholder content. Copy can make a design feel as templated as the design itself. See the below section on writing for more guidance.
+
+## Process: plan, review against the brief, build, critique
+
+For calibration, AI-generated design right now clusters around some traits:
+1. a warm cream background (near #F4F1EA) with a high-contrast serif display and a terracotta or warm-clay accent (often near #D97757 — Anthropic's own Claude-interaction accent, so on a user's brief it reads as a tell);
+2. a near-black background with a single bright acid-green or vermilion accent;
+3. a broadsheet-style layout with hairline rules, zero border-radius, and dense newspaper-like columns;
+4. the SaaS-card kit: content chopped into identical rounded cards, one border-radius on everything regardless of hierarchy, the same soft grey shadow (rgba(0,0,0,.1)) under each, and gradient washes as decoration;
+5. template chrome that appears whatever the subject: a tracked-out ALL-CAPS eyebrow label above every heading; meta strings joined with middle dots ('A · B · C'); labels built as 'WORD — fragment' with a spaced em dash; tinted near-black (#0B0B0B, #111) standing in for black; a monospace face for small data labels; a '→' appended to link and button text.
+
+All traits are legitimate for some briefs, but they are defaults rather than choices, and they appear regardless of subject. Where the brief pins down a visual direction, follow it exactly — the brief's own words always win, including when it asks for one of these looks. Where it leaves an axis free, don't spend that freedom on one of these defaults. As with a hired human designer, there's often a careful balance between doing what you're good at and taking each project as a chance to experiment and learn.
+
+Work in two passes. First, brainstorm a short design plan based on the client's design brief: create a compact token system with color, type, layout, and principles.
+- Color: describe the core base palette as 4–6 named hex values.
+- Type: the typefaces and their roles.
+- Layout: a layout concept, using one-sentence prose descriptions and ASCII wireframes to ideate and compare. Include alignment guidance; should the content be left aligned, center aligned, justified?
+- Principles: the high-level guidance for what makes this page unique.
+
+Then review that plan against the brief before building: if any part of it reads like the generic default you would produce for any similar page (work through a similar prompt to see if you arrive somewhere similar) rather than a choice made for this specific brief — revise that part, say what you changed and why. Only after you've confirmed the relative uniqueness of your design plan should you start to write the code, following the revised plan.
+
+When writing the code, be careful of structuring your CSS selector specificities. It's easy to generate CSS classes that cancel each other out (especially with a type-based selector like .section and an element-based selector like .cta). This can happen often with padding/margin between sections.
+
+## Restraint and self-critique
+
+Spend your boldness in one place. Let one element be the memorable thing, keep everything around it quiet and disciplined, and cut any decoration that does not serve the brief. Build to a quality floor without announcing it: responsive down to mobile, visible keyboard focus, reduced motion respected, visually accessible, harmonious color palettes. Critique your own work as you build, taking screenshots to review if your environment supports it — a picture is worth 1000 tokens. Consider Chanel's advice: before leaving the house, take a look in the mirror and remove one accessory. Human creatives have memory and always try to do something new, so if you have a space to quickly jot down notes about what you've tried, it can help you in future passes.
+
+## More on writing in design
+
+Words appear in a design for one reason: to make it easier to understand and use. They are design content, not decoration. Bring the same intentionality and minimalism to copywriting that you would bring to spacing and color. Before writing anything, ask what the design needs to say, and how it can best be said to help the person navigate the experience.
+
+Write from the end user's perspective. Name things by what users will understand in simple language, not by how the system is built. A user manages notifications, not webhook config. Describe what something is or does in plain terms rather than selling it. Being specific and legible to new users is always better than being clever.
+
+Use active voice as default. A CTA says exactly what happens when it is used: "Save changes," not "Submit." An action keeps the same name through the whole flow, so the button that says "Publish" produces a toast that says "Published." The vocabulary of an interface is the signposting for someone navigating the product. Cohesion and consistency are how people learn their way around.
+
+Treat failure and emptiness as moments for direction, not mood. Explain what went wrong and how to fix it, in the interface's voice rather than a person's. Errors don't apologize, and they are never vague about what happened. An empty screen is an invitation to act.
+
+Keep the tone conversational: plain verbs, sentence case, no filler, with tone matched to the brand and the audience. Let each written element do exactly one job.
diff --git a/i18n-l10n-standards/SKILL.md b/i18n-l10n-standards/SKILL.md
new file mode 100644
index 0000000..2738e56
--- /dev/null
+++ b/i18n-l10n-standards/SKILL.md
@@ -0,0 +1,96 @@
+---
+name: i18n-l10n-standards
+description: >-
+ Enforce internationalization (i18n), localization (l10n), and bidirectional layout standards (LTR/RTL).
+ Eliminates hardcoded strings, requires CSS logical properties (padding-inline, margin-inline),
+ type-safe translation schemas, and native browser Intl formatting.
+---
+
+# Internationalization (i18n), Localization (l10n) & Bidirectional Layouts
+
+Ce skill impose les règles nécessaires pour concevoir des applications web multilingues et universellement adaptables. Il élimine le texte en dur dans les composants, impose les **propriétés logiques CSS** pour supporter nativement les écritures de droite à gauche (RTL comme l'arabe et l'hébreu) et standardise le formatage des données via l'API native `Intl`.
+
+---
+
+## 🎯 Déclencheurs d'Activation
+
+Activez ce skill dès que :
+1. Vous structurez une application multilingue (ex: français, anglais, espagnol, arabe).
+2. Vous écrivez du balisage contenant du texte visible par l'utilisateur (interdiction de coder en dur).
+3. Vous appliquez des marges, espacements ou alignements directionnels (`padding`, `margin`, `text-align`, `float`).
+4. Vous formatez des prix, devises, pourcentages, dates ou durées relatives.
+5. Vous configurez le routage multilingue (`/fr/`, `/en/`) et les balises SEO `hreflang`.
+
+---
+
+## 📐 1. Propriétés CSS Logiques (Inversion Automatique RTL)
+
+Les classes physiques (`left`, `right`) cassent le design dès qu'une langue s'écrit de droite à gauche. Utilisez systématiquement les **propriétés logiques** :
+
+| Classe Physique (Interdite) | Classe Logique Standard | Propriété CSS Sous-jacente |
+| :--- | :--- | :--- |
+| `pl-4` / `pr-4` | `ps-4` / `pe-4` | `padding-inline-start` / `padding-inline-end` |
+| `ml-auto` | `ms-auto` | `margin-inline-start: auto` |
+| `text-left` / `text-right` | `text-start` / `text-end` | `text-align: start` / `text-align: end` |
+| `left-0` / `right-0` | `start-0` / `end-0` | `inset-inline-start: 0` / `inset-inline-end: 0` |
+| `border-l` / `border-r` | `border-s` / `border-e` | `border-inline-start` / `border-inline-end` |
+
+---
+
+## 🌐 2. Dictionnaires de Traduction Typés (Zéro Chaîne en Dur)
+
+Toutes les chaînes de texte doivent provenir d'un dictionnaire typé (ex: `next-intl`, `paraglide` ou format ICU) :
+
+```tsx
+import { useTranslations } from 'next-intl';
+
+export const PricingHeader = () => {
+ const t = useTranslations('pricing');
+
+ return (
+
+ {/* Traduction avec interpolation sécurisée */}
+
+ {t('title')}
+
+
+ {t('subtitle', { count: 3 })}
+
+
+ );
+};
+```
+
+---
+
+## 💶 3. Formatage Natif via l'API Navigateur `Intl`
+
+Ne formatez jamais manuellement des nombres ou des dates avec des expressions régulières ou des calculs maison. L'API native JavaScript standard `Intl` est calibrée par l'IETF :
+
+```typescript
+// Monnaies & Devises
+export const formatCurrency = (amount: number, locale = 'fr-FR', currency = 'EUR') => {
+ return new Intl.NumberFormat(locale, {
+ style: 'currency',
+ currency,
+ }).format(amount);
+};
+// formatCurrency(1249.5, 'fr-FR', 'EUR') => "1 249,50 €"
+// formatCurrency(1249.5, 'en-US', 'USD') => "$1,249.50"
+
+// Dates Relatives ("il y a 2 heures", "hier")
+export const formatRelativeTime = (value: number, unit: Intl.RelativeTimeFormatUnit, locale = 'fr-FR') => {
+ return new Intl.RelativeTimeFormat(locale, { numeric: 'auto' }).format(value, unit);
+};
+// formatRelativeTime(-1, 'day', 'fr-FR') => "hier"
+```
+
+---
+
+## 📋 Checklist de Conformité i18n & RTL
+
+- [ ] Aucune chaîne de texte visible n'est codée en dur dans les composants JSX.
+- [ ] Les classes Tailwind directionnelles utilisent exclusivement les variantes logiques (`ps-*`, `pe-*`, `ms-*`, `me-*`, `start-*`, `end-*`).
+- [ ] L'attribut `dir="rtl"` ou `dir="ltr"` est appliqué dynamiquement sur la balise ``.
+- [ ] Les prix, dates et pourcentages sont formatés via `Intl.NumberFormat` ou `Intl.DateTimeFormat`.
+- [ ] Les balises ` ` sont présentes pour chaque variante linguistique.
diff --git a/motion-spring-physics/SKILL.md b/motion-spring-physics/SKILL.md
new file mode 100644
index 0000000..91f9be3
--- /dev/null
+++ b/motion-spring-physics/SKILL.md
@@ -0,0 +1,144 @@
+---
+name: motion-spring-physics
+description: >-
+ Implement physical, tactile micro-interactions and layout transitions using Spring Physics
+ (Motion / Framer Motion, FLIP technique via layoutId, CSS @starting-style, View Transitions API)
+ with strict compliance with prefers-reduced-motion.
+---
+
+# Motion & Spring Physics Architecture
+
+Ce skill régit l'animation interactive haute fidélité. Il remplace les animations rigides basées sur des durées fixes (`transition: all 0.3s ease`) par des **ressorts physiques réels** (*Spring Physics*), conférant aux interfaces un toucher organique, réactif et interruptible caractéristique des applications comme Linear, Raycast ou macOS.
+
+---
+
+## 🎯 Déclencheurs d'Activation
+
+Activez ce skill dès que :
+1. Vous animez des éléments interactifs (boutons, modales, tiroirs, onglets, menus accordéons).
+2. Vous concevez des transitions d'état de liste ou de réorganisation (glisser-déposer, suppression, filtrage).
+3. Vous implémentez un indicateur de sélection flottant ou un curseur d'onglets partagé (`layoutId`).
+4. Vous créez des micro-interactions au survol ou à la pression tactile (`whileHover`, `whileTap`).
+5. Vous devez garantir l'accessibilité des animations face au critère WCAG 2.3.3 (`prefers-reduced-motion`).
+
+---
+
+## 🏎️ 1. Les Principes de la Physique de Ressort (*Springs*)
+
+Contrairement aux courbes de Bézier cubiques (`ease-in-out`) qui forcent un temps fixe indépendamment de la distance parcourue, un ressort physique calcule la trajectoire en temps réel :
+- **Stiffness (Raideur)** : Vitesse de rappel du ressort. Une raideur élevée (300–500) rend le contrôle vif et immédiat.
+- **Damping (Amortissement)** : Friction qui freine le mouvement. Un amortissement bien réglé (20–30) évite les oscillations oscillatoires excessives (« effet cartoon »).
+- **Mass (Masse)** : Inertie de l'élément (0.5 à 1.0 par défaut).
+
+### Les 3 Profils de Ressort Standards
+
+| Profil | Cas d'Usage | Paramètres Recommandés |
+| :--- | :--- | :--- |
+| **Snappy / Micro-tactile** | Boutons, toggles, badges, chips, icones | `{ type: 'spring', stiffness: 500, damping: 30, mass: 0.5 }` |
+| **Smooth / Layout** | Modales, volets latéraux, accordéons, cartes | `{ type: 'spring', stiffness: 350, damping: 28, mass: 0.8 }` |
+| **Gentle / Page Transition** | Entrées de page, vues séquentielles | `{ type: 'spring', stiffness: 200, damping: 24, mass: 1.0 }` |
+
+---
+
+## 💫 2. Transitions Partagées avec `layoutId` (Technique FLIP)
+
+Pour un indicateur d'onglet ou un sous-lignage qui glisse d'un bouton à l'autre sans saut visuel :
+
+```tsx
+import { motion } from 'framer-motion';
+import { useState } from 'react';
+
+const tabs = ['Vue d\'ensemble', 'Analytique', 'Paramètres'];
+
+export const TabNavigation = () => {
+ const [activeTab, setActiveTab] = useState(tabs[0]);
+
+ return (
+
+ {tabs.map((tab) => {
+ const isActive = activeTab === tab;
+ return (
+ setActiveTab(tab)}
+ className="relative px-4 py-1.5 text-sm font-medium rounded-lg text-white/80 hover:text-white transition-colors"
+ >
+ {/* Pilule d'arrière-plan animée en FLIP automatique */}
+ {isActive && (
+
+ )}
+ {tab}
+
+ );
+ })}
+
+ );
+};
+```
+
+---
+
+## ♿ 3. Respect Impératif de `prefers-reduced-motion`
+
+Chaque animation doit se désactiver instantanément pour les utilisateurs sensibles au mal des transports ou ayant activé la réduction de mouvement dans leur OS :
+
+```tsx
+import { motion, useReducedMotion } from 'framer-motion';
+
+export const AccessibleCard = ({ children }: { children: React.ReactNode }) => {
+ const shouldReduceMotion = useReducedMotion();
+
+ return (
+
+ {children}
+
+ );
+};
+```
+
+---
+
+## 🎨 4. Alternatives CSS Modernes (Sans Dépendance JS)
+
+Pour les transitions simples au chargement d'éléments, privilégiez `@starting-style` et la View Transitions API :
+
+```css
+/* Entrée fluide pure CSS d'un dialog ou popover */
+dialog[open] {
+ opacity: 1;
+ transform: scale(1);
+ transition: opacity 0.2s ease-out, transform 0.25s cubic-bezier(0.16, 1, 0.3, 1), display 0.2s allow-discrete;
+}
+
+@starting-style {
+ dialog[open] {
+ opacity: 0;
+ transform: scale(0.96);
+ }
+}
+```
+
+---
+
+## 📋 Checklist de Conformité Motion
+
+- [ ] Aucun mouvement décoratif continu en boucle (pas de floating infini qui distrait).
+- [ ] Les micro-interactions au clic utilisent `active:scale-[0.98]` ou un ressort réactif.
+- [ ] `useReducedMotion()` (ou la media query `@media (prefers-reduced-motion: reduce)`) ramène la durée à 0.
+- [ ] Les animations de changement de layout (`layoutId`) ne causent aucun reflow de texte brutal.
+- [ ] La performance d'animation cible 60fps/120fps en animant exclusivement `transform` et `opacity`.
diff --git a/production-resilience-observability/SKILL.md b/production-resilience-observability/SKILL.md
new file mode 100644
index 0000000..e3ca1ef
--- /dev/null
+++ b/production-resilience-observability/SKILL.md
@@ -0,0 +1,119 @@
+---
+name: production-resilience-observability
+description: >-
+ Implement production resilience and observability: nested React Error Boundaries,
+ graceful UI degradation, PII-safe telemetry, structured error logging, and retry mechanisms.
+---
+
+# Production Resilience & Observability Architecture
+
+Ce skill empêche l'écran blanc fatal (*White Screen of Death*). Il impose l'encapsulation modulaire des composants dans des **Error Boundaries** imbriquées, fournit des interfaces de dégradation gracieuse avec réessai sans rechargement de page, et configure la télémétrie conforme au RGPD (anonymisation stricte des données personnelles dans les logs).
+
+---
+
+## 🎯 Déclencheurs d'Activation
+
+Activez ce skill dès que :
+1. Vous intégrez des composants tiers ou dépendants d'un service distant instable (graphiques, flux en direct, météo, intégrations bancaires).
+2. Vous structurez l'architecture racine d'une application ou les gabarits de mise en page (*Layouts*).
+3. Vous mettez en place la capture d'erreurs en production (Sentry, OpenTelemetry, Datadog).
+4. Vous configurez des flux de réessai utilisateur en cas d'échec de rendu.
+5. Vous auditez la protection contre les fuites de données personnelles dans les journaux système (PII Masking).
+
+---
+
+## 🛡️ 1. Error Boundaries Imbriquées (Isolation des Pannes)
+
+Une erreur dans une bannière ou un graphique secondaire ne doit **jamais** casser la barre de navigation ou le tableau de bord principal.
+
+```tsx
+'use client';
+
+import React from 'react';
+import { ErrorBoundary, FallbackProps } from 'react-error-boundary';
+
+// Interface de repli modulaire avec bouton de réessai ciblé
+export const ComponentErrorFallback: React.FC = ({ error, resetErrorBoundary }) => {
+ return (
+
+
+
+ Une erreur temporaire est survenue
+
+
+ Ce widget n'a pas pu être chargé. Les autres services restent pleinement opérationnels.
+
+
+ Réessayer le chargement
+
+
+ );
+};
+
+// Encapsulation déclarative
+export const SafeWidgetWrapper = ({ children }: { children: React.ReactNode }) => {
+ return (
+ {
+ // Nettoyage ou réinitialisation d'état local si besoin
+ }}
+ onError={(error, info) => {
+ // Journalisation sécurisée
+ logSafeError(error, info);
+ }}
+ >
+ {children}
+
+ );
+};
+```
+
+---
+
+## 🔒 2. Journalisation PII-Safe (Conformité RGPD)
+
+Il est illégal et dangereux d'envoyer des mots de passe, tokens JWT ou adresses email privées dans des outils de tracking de bugs comme Sentry ou Datadog :
+
+```typescript
+// Filtrage et assainissement des données avant expédition
+export function logSafeError(error: Error, errorInfo?: any) {
+ const sanitizedContext = {
+ message: error.message,
+ stack: error.stack,
+ componentStack: errorInfo?.componentStack,
+ url: window.location.pathname, // Pas de paramètres de requête sensibles (?token=...)
+ timestamp: new Date().toISOString(),
+ };
+
+ // Masquage des motifs sensibles (regex token/mot de passe/email)
+ const payloadString = JSON.stringify(sanitizedContext)
+ .replace(/"(password|token|secret|apiKey)":\s*"[^"]+"/gi, '"$1": "[REDACTED]"')
+ .replace(/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g, '[EMAIL_REDACTED]');
+
+ // Expédition sécurisée vers l'outil d'observabilité
+ if (process.env.NODE_ENV === 'production') {
+ // Sentry.captureException(...) ou fetch('/api/telemetry', { body: payloadString })
+ } else {
+ console.error('Safe Dev Error Log:', JSON.parse(payloadString));
+ }
+}
+```
+
+---
+
+## 📋 Checklist de Conformité Résilience & Observabilité
+
+- [ ] Les widgets à risque ou asynchrones sont isolés par leur propre `ErrorBoundary`.
+- [ ] Le composant de repli (*Fallback*) offre un bouton d'action clair pour retenter sans recharger la page entière.
+- [ ] Aucune donnée personnelle (email, mot de passe, token en URL) n'est envoyée aux outils de télémétrie.
+- [ ] Le Layout racine possède une frontière d'erreur globale (`global-error.tsx` dans Next.js).
+- [ ] Les promesses non interceptées (*unhandled rejections*) sont écoutées et journalisées proprement.
diff --git a/remotion-best-practices/SKILL.md b/remotion-best-practices/SKILL.md
new file mode 100644
index 0000000..eb1bd57
--- /dev/null
+++ b/remotion-best-practices/SKILL.md
@@ -0,0 +1,59 @@
+---
+name: remotion-best-practices
+description: Router for all Remotion skills
+version: 4.0.526
+---
+
+## Preserve user changes
+
+Users may make edits in the code outside of the conversation.
+
+If you detect a surprising change made in the meanwhile, don't overwrite it, assume it was intentional or ask for confirmation.
+
+## Creating a video
+
+If the user asks to make, create, or build a new video or composition, load [Create a new Remotion video](./remotion-create/REFERENCE.md), whether or not a Remotion project already exists.
+
+## New project setup
+
+If no Remotion project currently exists, load [Create a new Remotion project](./remotion-create/REFERENCE.md)
+
+## React Markup Best Practices
+
+If you are writing Remotion React Markup, load [Remotion Markup Best Practices](./remotion-markup/REFERENCE.md)
+
+## Maps
+
+For static maps, animated routes and markers, geographic explainers, Mapbox, MapLibre, MapTiler, GeoJSON, or 3D geographic flyovers, load [Remotion Maps](./remotion-maps/REFERENCE.md).
+
+## Multimedia
+
+For achieving multimedia tasks in the browser, such as trimming, cropping videos, or getting metadata from them, load [Remotion Multimedia](./remotion-multimedia/REFERENCE.md)
+
+## Improving Interactivity
+
+By structuring the Remotion markup well, we can allow users to interactively change things in the Studio and write back to code. If relevant: [Interactivity Best Practices](./remotion-interactivity/REFERENCE.md)
+
+## Rendering
+
+For advanced rendering beyond simple `npx remotion render`, see: [Rendering Best Practices](./remotion-render/REFERENCE.md)
+
+## Opening Remotion Studio
+
+To launch a project in Remotion Studio, open its exact local URL, or configure Studio CLI flags, load [Remotion Studio](./remotion-studio/REFERENCE.md).
+
+## Captions
+
+When working with Captions, load [Remotion Captions](./remotion-captions/REFERENCE.md).
+
+## Creating a SaaS, automation or application
+
+Use the [Remotion SaaS skill](./remotion-saas/REFERENCE.md) for knowledge about Remotion-powered SaaS apps, such as ``, rendering on Lambda, Vercel, Cloudflare, via Express.js, client-side rendering, or for finding the right SaaS template.
+
+## Looking up Remotion APIs and documentation
+
+To find and read current Remotion documentation, load [Remotion Docs](./remotion-docs/REFERENCE.md).
+
+## Upgrading
+
+To upgrade Remotion, related packages, compatible Mediabunny packages, and installed Remotion Agent Skills, load [Remotion Upgrade](./remotion-upgrade/REFERENCE.md).
diff --git a/remotion-best-practices/agents/openai.yaml b/remotion-best-practices/agents/openai.yaml
new file mode 100644
index 0000000..5ce4e93
--- /dev/null
+++ b/remotion-best-practices/agents/openai.yaml
@@ -0,0 +1,7 @@
+interface:
+ display_name: '/remotion-best-practices'
+ short_description: 'Route Remotion tasks to the right workflow'
+ icon_small: './assets/remotion-icon.svg'
+ icon_large: './assets/remotion-icon.svg'
+ brand_color: '#0B84F3'
+ default_prompt: '$remotion-best-practices: Make a promo video for my product'
diff --git a/remotion-best-practices/assets/remotion-icon.svg b/remotion-best-practices/assets/remotion-icon.svg
new file mode 100644
index 0000000..420dbc7
--- /dev/null
+++ b/remotion-best-practices/assets/remotion-icon.svg
@@ -0,0 +1,4 @@
+
+Remotion
+
+
diff --git a/remotion-best-practices/remotion-captions/REFERENCE.md b/remotion-best-practices/remotion-captions/REFERENCE.md
new file mode 100644
index 0000000..e97cd98
--- /dev/null
+++ b/remotion-best-practices/remotion-captions/REFERENCE.md
@@ -0,0 +1,36 @@
+---
+name: remotion-captions
+description: Transcribing, displaying and animating captions
+version: 4.0.526
+---
+
+All captions must be processed in JSON. The captions must use the [`Caption`](https://www.remotion.dev/docs/captions/caption.md) type which is the following:
+
+```ts
+import type { Caption } from "@remotion/captions";
+```
+
+This is the definition:
+
+```ts
+type Caption = {
+ text: string;
+ startMs: number;
+ endMs: number;
+ timestampMs: number | null;
+ confidence: number | null;
+ pageBreakAfter?: boolean;
+};
+```
+
+## Generating captions
+
+To transcribe video and audio files to generate captions, load the [transcribe-captions.md](transcribe-captions.md) file for more instructions.
+
+## Displaying captions
+
+To display captions in your video, load the [display-captions.md](display-captions.md) file for more instructions.
+
+## Importing captions
+
+To import captions from a .srt file, load the [import-srt-captions.md](import-srt-captions.md) file for more instructions.
diff --git a/remotion-best-practices/remotion-captions/agents/openai.yaml b/remotion-best-practices/remotion-captions/agents/openai.yaml
new file mode 100644
index 0000000..f385130
--- /dev/null
+++ b/remotion-best-practices/remotion-captions/agents/openai.yaml
@@ -0,0 +1,7 @@
+interface:
+ display_name: '/remotion-captions'
+ short_description: 'Transcribe, display, and animate captions'
+ icon_small: './assets/remotion-icon.svg'
+ icon_large: './assets/remotion-icon.svg'
+ brand_color: '#0B84F3'
+ default_prompt: '$remotion-captions: Transcribe my video and display captions'
diff --git a/remotion-best-practices/remotion-captions/assets/remotion-icon.svg b/remotion-best-practices/remotion-captions/assets/remotion-icon.svg
new file mode 100644
index 0000000..420dbc7
--- /dev/null
+++ b/remotion-best-practices/remotion-captions/assets/remotion-icon.svg
@@ -0,0 +1,4 @@
+
+Remotion
+
+
diff --git a/remotion-best-practices/remotion-captions/display-captions.md b/remotion-best-practices/remotion-captions/display-captions.md
new file mode 100644
index 0000000..c720d0c
--- /dev/null
+++ b/remotion-best-practices/remotion-captions/display-captions.md
@@ -0,0 +1,190 @@
+---
+name: display-captions
+description: Displaying captions in Remotion with TikTok-style pages and word highlighting
+metadata:
+ tags: captions, subtitles, display, tiktok, highlight
+---
+
+# Displaying captions in Remotion
+
+This guide explains how to display captions in Remotion, assuming you already have captions in the [`Caption`](https://www.remotion.dev/docs/captions/caption) format.
+
+## Prerequisites
+
+Read [Transcribing audio](transcribe-captions.md) for how to generate captions.
+
+First, the [`@remotion/captions`](https://www.remotion.dev/docs/captions) package needs to be installed.
+If it is not installed, use the following command:
+
+```bash
+npx remotion add @remotion/captions
+```
+
+## Fetching captions
+
+First, fetch your captions JSON file. Use [`useDelayRender()`](https://www.remotion.dev/docs/use-delay-render) to hold the render until the captions are loaded:
+
+```tsx
+import { useState, useEffect, useCallback } from "react";
+import { AbsoluteFill, staticFile, useDelayRender } from "remotion";
+import type { Caption } from "@remotion/captions";
+
+export const MyComponent: React.FC = () => {
+ const [captions, setCaptions] = useState(null);
+ const { delayRender, continueRender, cancelRender } = useDelayRender();
+ const [handle] = useState(() => delayRender());
+
+ const fetchCaptions = useCallback(async () => {
+ try {
+ // Assuming captions.json is in the public/ folder.
+ const response = await fetch(staticFile("captions123.json"));
+ const data = await response.json();
+ setCaptions(data);
+ continueRender(handle);
+ } catch (e) {
+ cancelRender(e);
+ }
+ }, [continueRender, cancelRender, handle]);
+
+ useEffect(() => {
+ fetchCaptions();
+ }, [fetchCaptions]);
+
+ if (!captions) {
+ return null;
+ }
+
+ return (
+
+ {/* Render captions here */}
+
+ );
+};
+```
+
+## Creating pages
+
+Use `createTikTokStyleCaptions()` to group captions into pages. The `combineTokensWithinMilliseconds` option controls how many words appear at once:
+
+```tsx
+import { useMemo } from "react";
+import { createTikTokStyleCaptions } from "@remotion/captions";
+import type { Caption } from "@remotion/captions";
+
+// How often captions should switch (in milliseconds)
+// Higher values = more words per page
+// Lower values = fewer words (more word-by-word)
+const SWITCH_CAPTIONS_EVERY_MS = 1200;
+
+const { pages } = useMemo(() => {
+ return createTikTokStyleCaptions({
+ captions,
+ combineTokensWithinMilliseconds: SWITCH_CAPTIONS_EVERY_MS,
+ });
+}, [captions]);
+```
+
+If a caption has `pageBreakAfter: true`, the current page ends after that caption and the next caption starts a new page.
+
+## Rendering with Sequences
+
+Map over the pages and render each one in a ``. Calculate the start frame and duration from the page timing:
+
+```tsx
+import { Sequence, useVideoConfig, AbsoluteFill } from "remotion";
+import type { TikTokPage } from "@remotion/captions";
+
+const CaptionedContent: React.FC = () => {
+ const { fps } = useVideoConfig();
+
+ return (
+
+ {pages.map((page, index) => {
+ const nextPage = pages[index + 1] ?? null;
+ const startFrame = (page.startMs / 1000) * fps;
+ const endFrame = Math.min(
+ nextPage ? (nextPage.startMs / 1000) * fps : Infinity,
+ startFrame + (SWITCH_CAPTIONS_EVERY_MS / 1000) * fps,
+ );
+ const durationInFrames = endFrame - startFrame;
+
+ if (durationInFrames <= 0) {
+ return null;
+ }
+
+ return (
+
+
+
+ );
+ })}
+
+ );
+};
+```
+
+## White-space preservation
+
+The captions are whitespace sensitive. You should include spaces in the `text` field before each word. Use `whiteSpace: "pre"` to preserve the whitespace in the captions.
+
+## Separate component for captions
+
+Put captioning logic in a separate component.
+Make a new file for it.
+
+## Word highlighting
+
+A caption page contains `tokens` which you can use to highlight the currently spoken word:
+
+```tsx
+import { AbsoluteFill, useCurrentFrame, useVideoConfig } from "remotion";
+import type { TikTokPage } from "@remotion/captions";
+
+const HIGHLIGHT_COLOR = "#39E508";
+
+const CaptionPage: React.FC<{ page: TikTokPage }> = ({ page }) => {
+ const frame = useCurrentFrame();
+ const { fps } = useVideoConfig();
+
+ // Current time relative to the start of the sequence
+ const currentTimeMs = (frame / fps) * 1000;
+ // Convert to absolute time by adding the page start
+ const absoluteTimeMs = page.startMs + currentTimeMs;
+
+ return (
+
+
+ {page.tokens.map((token, tokenIndex) => {
+ const isActive =
+ token.fromMs <= absoluteTimeMs && token.toMs > absoluteTimeMs;
+
+ return (
+
+ {token.text}
+
+ );
+ })}
+
+
+ );
+};
+```
+
+## Display captions alongside video content
+
+By default, put the captions alongside the video content, so the captions are in sync.
+For each video, make a new captions JSON file.
+
+```tsx
+
+
+
+
+```
diff --git a/remotion-best-practices/remotion-captions/import-srt-captions.md b/remotion-best-practices/remotion-captions/import-srt-captions.md
new file mode 100644
index 0000000..5fdf83a
--- /dev/null
+++ b/remotion-best-practices/remotion-captions/import-srt-captions.md
@@ -0,0 +1,73 @@
+---
+name: import-srt-captions
+description: Importing .srt subtitle files into Remotion using @remotion/captions
+metadata:
+ tags: captions, subtitles, srt, import, parse
+---
+
+# Importing .srt subtitles into Remotion
+
+If you have an existing `.srt` subtitle file, you can import it into Remotion using `parseSrt()` from `@remotion/captions`.
+
+If you don't have a .srt file, read [Transcribing audio](transcribe-captions.md) for how to generate captions instead.
+
+## Prerequisites
+
+First, the @remotion/captions package needs to be installed.
+If it is not installed, use the following command:
+
+```bash
+npx remotion add @remotion/captions # If project uses npm
+bunx remotion add @remotion/captions # If project uses bun
+yarn remotion add @remotion/captions # If project uses yarn
+pnpm exec remotion add @remotion/captions # If project uses pnpm
+```
+
+## Reading an .srt file
+
+Use `staticFile()` to reference an `.srt` file in your `public` folder, then fetch and parse it:
+
+```tsx
+import { useState, useEffect, useCallback } from "react";
+import { AbsoluteFill, staticFile, useDelayRender } from "remotion";
+import { parseSrt } from "@remotion/captions";
+import type { Caption } from "@remotion/captions";
+
+export const MyComponent: React.FC = () => {
+ const [captions, setCaptions] = useState(null);
+ const { delayRender, continueRender, cancelRender } = useDelayRender();
+ const [handle] = useState(() => delayRender());
+
+ const fetchCaptions = useCallback(async () => {
+ try {
+ const response = await fetch(staticFile("subtitles.srt"));
+ const text = await response.text();
+ const { captions: parsed } = parseSrt({ input: text });
+ setCaptions(parsed);
+ continueRender(handle);
+ } catch (e) {
+ cancelRender(e);
+ }
+ }, [continueRender, cancelRender, handle]);
+
+ useEffect(() => {
+ fetchCaptions();
+ }, [fetchCaptions]);
+
+ if (!captions) {
+ return null;
+ }
+
+ return (
+
+ {/* Use captions here */}
+
+ );
+};
+```
+
+Remote URLs are also supported - you can `fetch()` a remote file via URL instead of using `staticFile()`.
+
+## Using imported captions
+
+Once parsed, the captions are in the `Caption` format and can be used with all `@remotion/captions` utilities.
diff --git a/remotion-best-practices/remotion-captions/transcribe-captions.md b/remotion-best-practices/remotion-captions/transcribe-captions.md
new file mode 100644
index 0000000..ba649d5
--- /dev/null
+++ b/remotion-best-practices/remotion-captions/transcribe-captions.md
@@ -0,0 +1,70 @@
+---
+name: transcribe-captions
+description: Transcribing audio to generate captions in Remotion
+metadata:
+ tags: captions, transcribe, whisper, audio, speech-to-text
+---
+
+# Transcribing audio
+
+To transcribe audio to generate captions in Remotion, you can use the [`transcribe()`](https://www.remotion.dev/docs/install-whisper-cpp/transcribe) function from the [`@remotion/install-whisper-cpp`](https://www.remotion.dev/docs/install-whisper-cpp) package.
+
+## Prerequisites
+
+First, the @remotion/install-whisper-cpp package needs to be installed.
+If it is not installed, use the following command:
+
+```bash
+npx remotion add @remotion/install-whisper-cpp
+```
+
+## Transcribing
+
+Make a Node.js script to download Whisper.cpp and a model, and transcribe the audio.
+
+```ts
+import path from "path";
+import {
+ downloadWhisperModel,
+ installWhisperCpp,
+ transcribe,
+ toCaptions,
+} from "@remotion/install-whisper-cpp";
+import fs from "fs";
+
+const to = path.join(process.cwd(), "whisper.cpp");
+
+await installWhisperCpp({
+ to,
+ version: "1.5.5",
+});
+
+await downloadWhisperModel({
+ model: "medium.en",
+ folder: to,
+});
+
+// Convert the audio to a 16KHz wav file first if needed:
+// import {execSync} from 'child_process';
+// execSync('ffmpeg -i /path/to/audio.mp4 -ar 16000 /path/to/audio.wav -y');
+
+const whisperCppOutput = await transcribe({
+ model: "medium.en",
+ whisperPath: to,
+ whisperCppVersion: "1.5.5",
+ inputPath: "/path/to/audio123.wav",
+ tokenLevelTimestamps: true,
+});
+
+// Optional: Apply our recommended postprocessing
+const { captions } = toCaptions({
+ whisperCppOutput,
+});
+
+// Write it to the public/ folder so it can be fetched from Remotion
+fs.writeFileSync("captions123.json", JSON.stringify(captions, null, 2));
+```
+
+Transcribe each clip individually and create multiple JSON files.
+
+See [Displaying captions](display-captions.md) for how to display the captions in Remotion.
diff --git a/remotion-best-practices/remotion-create/REFERENCE.md b/remotion-best-practices/remotion-create/REFERENCE.md
new file mode 100644
index 0000000..7e56bb3
--- /dev/null
+++ b/remotion-best-practices/remotion-create/REFERENCE.md
@@ -0,0 +1,85 @@
+---
+name: remotion-create
+description: Create a new Remotion video
+version: 4.0.526
+---
+
+These are instructions for making a new Remotion project and composition.
+If this is not the next task, see [Remotion Best Practices](../SKILL.md)
+
+## Scaffold a project
+
+If a project already exists, skip this.
+Ensure Node.js and Git is installed, and the current folder is appropriate for starting a new project.
+
+Inspect the current folder, including hidden files, before choosing where to scaffold.
+
+### Empty folder
+
+If it is empty, or contains only disposable operating-system metadata such as `.DS_Store`, create the project directly in the current folder.
+Remove only those disposable metadata files first, since `create-video` rejects non-empty folders.
+Do not treat all hidden files as disposable: files such as `.env` and directories such as `.git` are meaningful contents.
+
+Scaffold in existing folder:
+
+```bash
+npx create-video@latest --yes --blank --no-tailwind .
+npm i
+```
+
+### Non-empty folder
+
+If the current folder contains meaningful contents and no project already exists, scaffold into a new subfolder.
+Replace `my-video` with a suitable project name.
+
+
+```bash
+npx create-video@latest --yes --blank --no-tailwind my-video
+cd my-video
+npm i
+```
+
+## Designing a video
+
+Keep the scaffold and add React Markup.
+Follow [Remotion React Markup Best Practices](../remotion-markup/REFERENCE.md) and [Video Layout Rules](video-layout.md) for video-first layout and text sizing guidance.
+
+## Is this a multi-scene video?
+
+If this is a video with multiple subsequence videos, follow guidance at [Multi-scene videos](../remotion-markup/multi-scene-video.md).
+
+## Interactivity Best Practices
+
+By structuring the React Markup following [Remotion Interactivity Best Practices](../remotion-interactivity/REFERENCE.md), you allow the user to make edits in the Studio which write back to code.
+
+## TailwindCSS
+
+If Tailwind is requested, see [tailwind.md](tailwind.md) for using TailwindCSS in Remotion.
+
+## Open the preview
+
+Start the preview server after building the composition:
+
+```bash
+npx remotion studio --no-open
+```
+
+This will start a long-running process and print the server URL for the preview.
+If the server is already started, it will print the URL.
+If an in-harness browser is available, open it there.
+You can visit a specific composition by navigating to `/[composition-id]`, for example `http://localhost:3000/MapAnimation`.
+
+## Render the video
+
+Only render if the user explicitly asks for it.
+
+```
+npx remotion render
+```
+
+For more options, see [Rendering](../remotion-render/REFERENCE.md).
+
+## Follow-up
+
+The video creation process has finished.
+For follow-up prompts, use [Remotion Best Practices](../SKILL.md)
diff --git a/remotion-best-practices/remotion-create/agents/openai.yaml b/remotion-best-practices/remotion-create/agents/openai.yaml
new file mode 100644
index 0000000..20b2d88
--- /dev/null
+++ b/remotion-best-practices/remotion-create/agents/openai.yaml
@@ -0,0 +1,7 @@
+interface:
+ display_name: '/remotion-create'
+ short_description: 'Create a new Remotion video project'
+ icon_small: './assets/remotion-icon.svg'
+ icon_large: './assets/remotion-icon.svg'
+ brand_color: '#0B84F3'
+ default_prompt: '$remotion-create: Create a Remotion video and make a promo for my product'
diff --git a/remotion-best-practices/remotion-create/assets/remotion-icon.svg b/remotion-best-practices/remotion-create/assets/remotion-icon.svg
new file mode 100644
index 0000000..420dbc7
--- /dev/null
+++ b/remotion-best-practices/remotion-create/assets/remotion-icon.svg
@@ -0,0 +1,4 @@
+
+Remotion
+
+
diff --git a/remotion-best-practices/remotion-create/tailwind.md b/remotion-best-practices/remotion-create/tailwind.md
new file mode 100644
index 0000000..b902131
--- /dev/null
+++ b/remotion-best-practices/remotion-create/tailwind.md
@@ -0,0 +1,11 @@
+---
+name: tailwind
+description: Using TailwindCSS in Remotion.
+metadata:
+---
+
+You can and should use TailwindCSS in Remotion, if TailwindCSS is installed in the project.
+
+Don't use `transition-*` or `animate-*` classes - always animate using the `useCurrentFrame()` hook.
+
+Tailwind must be installed and enabled first in a Remotion project - see https://www.remotion.dev/docs/tailwind.
diff --git a/remotion-best-practices/remotion-create/video-layout.md b/remotion-best-practices/remotion-create/video-layout.md
new file mode 100644
index 0000000..3e6bc43
--- /dev/null
+++ b/remotion-best-practices/remotion-create/video-layout.md
@@ -0,0 +1,9 @@
+You are designing a video, not a webpage.
+
+- Decide what the viewer should notice first in each scene. Build the frame around that one thing.
+- Keep important content inside a generous safe area. For 1080px-wide videos, keep key text at least 80px from the sides and 100px from the top and bottom.
+- Do not add redundant elements.
+- For 1080px-wide compositions, use these rough minimums:
+ - Main headline: 84px
+ - Important supporting text: 44px
+- Scale those values with the composition width.
diff --git a/remotion-best-practices/remotion-docs/REFERENCE.md b/remotion-best-practices/remotion-docs/REFERENCE.md
new file mode 100644
index 0000000..75ca247
--- /dev/null
+++ b/remotion-best-practices/remotion-docs/REFERENCE.md
@@ -0,0 +1,46 @@
+---
+name: remotion-docs
+description: Search Remotion documentation
+version: 4.0.526
+---
+
+This skill teaches you how to discover and read current Remotion documentation.
+If this is not relevant, load [Remotion Best Practices](../SKILL.md) instead.
+
+## Searching the docs
+
+Use the Algolia search API to find relevant documentation pages:
+
+```
+POST https://plsduol1ca-dsn.algolia.net/1/indexes/*/queries?x-algolia-api-key=3e42dbd4f895fe93ff5cf40d860c4a85&x-algolia-application-id=PLSDUOL1CA
+Content-Type: application/x-www-form-urlencoded
+
+{
+ "requests": [
+ {
+ "query": "",
+ "indexName": "remotion",
+ "params": "attributesToRetrieve=[\"hierarchy.lvl0\",\"hierarchy.lvl1\",\"hierarchy.lvl2\",\"url\"]&hitsPerPage=10"
+ }
+ ]
+}
+```
+
+Each hit contains a `url` field pointing to the documentation page.
+
+## Fetching a page as Markdown
+
+Append `.md` to any Remotion docs URL to retrieve its Markdown source (saves tokens):
+
+```
+https://www.remotion.dev/docs/use-video-config.md
+https://www.remotion.dev/docs/sequence.md
+https://www.remotion.dev/docs/lambda/rendermediaonlambda.md
+```
+
+## Workflow
+
+1. Search Algolia for the concept or API you need.
+2. Pick the most relevant URL(s) from the results.
+3. Fetch each URL with the `.md` suffix.
+4. Implement using the current documentation rather than memorized API knowledge.
diff --git a/remotion-best-practices/remotion-docs/agents/openai.yaml b/remotion-best-practices/remotion-docs/agents/openai.yaml
new file mode 100644
index 0000000..64be533
--- /dev/null
+++ b/remotion-best-practices/remotion-docs/agents/openai.yaml
@@ -0,0 +1,7 @@
+interface:
+ display_name: '/remotion-docs'
+ short_description: 'Search current Remotion documentation'
+ icon_small: './assets/remotion-icon.svg'
+ icon_large: './assets/remotion-icon.svg'
+ brand_color: '#0B84F3'
+ default_prompt: '$remotion-docs: What server-side rendering options does Remotion have?'
diff --git a/remotion-best-practices/remotion-docs/assets/remotion-icon.svg b/remotion-best-practices/remotion-docs/assets/remotion-icon.svg
new file mode 100644
index 0000000..420dbc7
--- /dev/null
+++ b/remotion-best-practices/remotion-docs/assets/remotion-icon.svg
@@ -0,0 +1,4 @@
+
+Remotion
+
+
diff --git a/remotion-best-practices/remotion-interactivity/REFERENCE.md b/remotion-best-practices/remotion-interactivity/REFERENCE.md
new file mode 100644
index 0000000..9901aba
--- /dev/null
+++ b/remotion-best-practices/remotion-interactivity/REFERENCE.md
@@ -0,0 +1,249 @@
+---
+name: remotion-interactivity
+description: Structure Remotion markup for interactivity
+version: 4.0.526
+---
+
+By writing Remotion markup in a specific way, the Remotion Studio is able to recognize the structure of the code and makes it interactive:
+
+- Allowing items to be selected by clicking on them
+- Allowing drag+drop, resizing and rotation
+- Editing the CSS styles
+- Making keyframes and easing values editable
+
+If the markup is too complex for the Studio to make it interactive, then the values become grayed out.
+
+## Make an HTML element interactive using `Interactive`
+
+Every HTML and SVG element (except ` `, it already is interactive) such as `` can be turned interactive using `Interactive`:
+
+```tsx title="Interactive elements"
+
+ Hello
+
+```
+
+This allows styles and keyframes to be set in the Studio. Be sensible, if a component has many elements, the timeline might get messy.
+
+## Prefer inline text
+
+If text is fixed and only used once, write it directly inside the interactive element instead of extracting it into a constant.
+
+```tsx title="Inline text"
+// 👍 Fixed copy stays editable
+
+ Remotion Best Practices
+
+```
+
+Use a prop or variable only when the text is dynamic or reused.
+
+## Give interactive elements a descriptive name
+
+Add a `name` prop to elements to make them easily identifyable.
+Avoid computed names, hardcode them.
+
+```tsx title="Interactive names"
+<>
+
+ Launch day
+
+
+
+
+ Launch day
+
+>
+```
+
+## Keep all CSS styles inline
+
+The best way is to just pass a plain object to `style` - no referring to constants, no object spreading, no math.
+
+```tsx title="Interactive example"
+
+ Hello World!
+
+```
+
+```tsx title="❌ Bad for interactivity"
+const baseStyle = useMemo(() => {
+ return {
+ fontSize: 12 // ❌ Non-inline styles are not supported
+ }
+}, []);
+
+
+ Hello World!
+
+```
+
+## Animate using `interpolate()`
+
+Write animations as inline `interpolate()` calls on the property that changes.
+The output range, easing, extrapolation and `output` property should use hardcoded values.
+
+The input range may additionally use `durationInFrames`, `fps`, `width` and `height` destructured directly from `useVideoConfig()`. Bare identifiers such as `durationInFrames`, multiplication with a number such as `2 * fps` or `fps * 2`, and subtraction of a number such as `durationInFrames - 1` are supported.
+
+```tsx title="Inline values"
+const {fps, durationInFrames} = useVideoConfig();
+
+// 👍 Inline values can be standardized and keyframed
+
+```
+
+```tsx title="❌ Bad interactivity"
+const translateY = interpolate(frame, [0, 30], [0, 120]); // ❌ Math should be directly in the markup
+
+
+```
+
+## Use `scale`, `translate`, `rotate` CSS properties
+
+Avoid the `transform` CSS property.
+If possible, use `scale`, `rotate` and `translate` instead because only they are interactively editable.
+
+## Keep composition metadata inline
+
+When scaffolding a composition, keep `width`, `height`, `fps`, `durationInFrames` and `defaultProps` inline and make no type assertions.
+
+The Props editor can save visual edits back to your code when `defaultProps` is an inline object literal on `
` or ``.
+
+```tsx
+// 👍 Static values are in , dynamic values are in calculateMetadata()
+const calculateMetadata = useMemo(async () => {
+ const dimensions = await getDimensions(); // just an example
+ return {width: dimensions.width, height: dimensions.height};
+});
+
+
+```
+
+```tsx title="Negative examples"
+const defaultProps = {title: 'Hello', color: '#0b84ff'}; // ❌ Don't extract defaultProps, must be inline
+const calculateMetadata = useMemo(() => {
+ // ❌ Unnecessary because no calculation is being done,
+ return {durationInFrames: 150, fps: 30, width: 1920, height: 1080};
+});
+
+
+```
+
+Use only `calculateMetadata()` for the part of the metadata that is dynamic.
+
+## Effects should be inline too
+
+The effects array should not be computed.
+The same rules for setting keyframes as `interpolate()` apply too here: All values should also be hardcoded: Input range, output range, easing, extrapolation, `output` property.
+
+```tsx title="Effects"
+// 👍 Parameters are inline and the array shape is stable
+
+
+const center = [0.5, 0.5] as const;
+const rotation = frame * 1.5;
+
+
+```
+
+Render separate elements if one version should have effects and another should not.
+
+## Making your own component interactive
+
+When using `Interactive.withSchema()`, include `Interactive.baseSchema` in the schema so standard timeline controls such as trimming and visibility remain available.
+
+To make a custom userland component interactive, use:
+[Make a component interactive](https://www.remotion.dev/docs/studio/make-component-interactive.md)
+
+## Video editing
+
+If a Remotion component mainly consists of video and audio clips, see [Video editing](../remotion-markup/video-editing.md) for best practices on how to structure Remotion markup so the clips are interactively editable in the timeline.
diff --git a/remotion-best-practices/remotion-interactivity/agents/openai.yaml b/remotion-best-practices/remotion-interactivity/agents/openai.yaml
new file mode 100644
index 0000000..e4152ad
--- /dev/null
+++ b/remotion-best-practices/remotion-interactivity/agents/openai.yaml
@@ -0,0 +1,7 @@
+interface:
+ display_name: '/remotion-interactivity'
+ short_description: 'Make compositions editable in Remotion Studio'
+ icon_small: './assets/remotion-icon.svg'
+ icon_large: './assets/remotion-icon.svg'
+ brand_color: '#0B84F3'
+ default_prompt: '$remotion-interactivity: Make the markup in MyComp.tsx interactive'
diff --git a/remotion-best-practices/remotion-interactivity/assets/remotion-icon.svg b/remotion-best-practices/remotion-interactivity/assets/remotion-icon.svg
new file mode 100644
index 0000000..420dbc7
--- /dev/null
+++ b/remotion-best-practices/remotion-interactivity/assets/remotion-icon.svg
@@ -0,0 +1,4 @@
+
+Remotion
+
+
diff --git a/remotion-best-practices/remotion-maps/REFERENCE.md b/remotion-best-practices/remotion-maps/REFERENCE.md
new file mode 100644
index 0000000..6ce8b2c
--- /dev/null
+++ b/remotion-best-practices/remotion-maps/REFERENCE.md
@@ -0,0 +1,36 @@
+---
+name: remotion-maps
+description: Remotion Map animation knowledge
+version: 4.0.526
+---
+
+# Remotion Maps
+
+Choose exactly one technique from the intended shot, then load only that technique's `TECHNIQUE.md`.
+Every technique directory is self-contained and may be removed without breaking the others.
+
+## [Static map](techniques/static-map/TECHNIQUE.md)
+
+- Requires you grab a satellite image and mount it in a ` ` tag, and animate on top
+
+## [Mapbox](techniques/mapbox/TECHNIQUE.md)
+
+- Requires a Mapbox key
+- Nicer styles by default
+- Map can display a round globe when zoomed out
+- Includes nice 3D buildings such as the Eiffel tower
+
+## [MapLibre](techniques/maplibre/TECHNIQUE.md)
+
+- Requires no API key, fully free
+- Does not include 3D building
+
+## [MapTiler](techniques/maptiler/TECHNIQUE.md)
+
+- Uses MapTiler
+- Annotations can be drawn on top of geographic features: borders, rivers, labels
+
+## [CesiumJS](techniques/cesium/TECHNIQUE.md)
+
+- Flythroughs through terrain and mountains
+- "Flight simulator" perspective
diff --git a/remotion-best-practices/remotion-maps/agents/openai.yaml b/remotion-best-practices/remotion-maps/agents/openai.yaml
new file mode 100644
index 0000000..c60b3a1
--- /dev/null
+++ b/remotion-best-practices/remotion-maps/agents/openai.yaml
@@ -0,0 +1,7 @@
+interface:
+ display_name: '/remotion-maps'
+ short_description: 'Create animated maps in Remotion videos'
+ icon_small: './assets/remotion-icon.svg'
+ icon_large: './assets/remotion-icon.svg'
+ brand_color: '#0B84F3'
+ default_prompt: '$remotion-maps: Animate a dot from Zurich to New York.'
diff --git a/remotion-best-practices/remotion-maps/assets/remotion-icon.svg b/remotion-best-practices/remotion-maps/assets/remotion-icon.svg
new file mode 100644
index 0000000..420dbc7
--- /dev/null
+++ b/remotion-best-practices/remotion-maps/assets/remotion-icon.svg
@@ -0,0 +1,4 @@
+
+Remotion
+
+
diff --git a/remotion-best-practices/remotion-maps/techniques/cesium/TECHNIQUE.md b/remotion-best-practices/remotion-maps/techniques/cesium/TECHNIQUE.md
new file mode 100644
index 0000000..b58e4a4
--- /dev/null
+++ b/remotion-best-practices/remotion-maps/techniques/cesium/TECHNIQUE.md
@@ -0,0 +1,89 @@
+# CesiumJS — 3D flyovers in Remotion
+
+Instructions for achieving map animations with "flight-simulator" perspective in Remotion.
+
+## Modes
+
+| Mode | Data | Use for |
+| ----------- | ----------------------------------------------------- | ------------------------------------------------------ |
+| `landscape` | MapTiler `terrain-quantized-mesh-v2` + `satellite-v2` | Mountains, gorges, rivers, coastlines and rural routes |
+| `city` | Google Photorealistic 3D Tiles | Cities, architecture and recognizable landmarks |
+
+Do not use footprint extrusions for city flyovers. They produce crude building blocks rather than
+textured architecture.
+
+## Credentials
+
+For `landscape`, set:
+
+```text
+REMOTION_MAPTILER_KEY=...
+```
+
+Create a MapTiler key at https://cloud.maptiler.com/account/keys/.
+
+For `city`, set:
+
+```text
+REMOTION_GOOGLE_MAPS_API_KEY=...
+```
+
+Create a billing-enabled Google Map Tiles API key by following
+https://developers.google.com/maps/documentation/tile/get-api-key. Enable the **Map Tiles API** and
+restrict the key to that API. Ensure its application restriction permits local headless Remotion
+requests.
+
+## Build the flight
+
+1. Copy `assets/CesiumFlythrough.tsx`, a path JSON and `assets/example-Root.tsx` into the Remotion
+ project, or import the component directly.
+2. Supply the camera route as `[longitude, latitude][]`. Use only meaningful control points; do not hand-author dozens of tiny corrections.
+3. Leave `pathSmoothingPasses={3}` initially. The component applies repeated Chaikin corner cutting, turning straight-then-corner input into a continuous swerve. Increase to `4` for a softer route or reduce to `2` when the camera must follow a tight corridor.
+4. Set absolute camera altitudes for the location. City cameras normally fly lower than landscape
+ cameras.
+5. Render a middle-frame still before rendering the full video.
+
+```tsx
+
+```
+
+## Camera behavior
+
+Walk the smoothed curve by arc length for constant ground speed. Aim at a real point farther along
+the curve rather than its next vertex. Derive roll from the change in look-ahead bearing so the
+camera banks into a turn instead of twitching left and right.
+
+For landscape routes, `scripts/prep-cesium-path.mjs` also clips, resamples, smooths and dampens a
+GeoJSON centerline before the component applies its final curve smoothing.
+
+
+## Mechanics
+
+- Set `viewer.useDefaultRenderLoop = false`.
+- Call `viewer.render()`, never `scene.render()`, while settling.
+- Use `preserveDrawingBuffer: true`.
+- Gate initialization and every frame with `delayRender`.
+- Drive camera animation from `useCurrentFrame()`; do not use CSS transitions or browser-timed animation.
+- Settle landscapes on `globe.tilesLoaded` and cities on `tileset.tilesLoaded`.
+- Keep all provider attribution visible.
+- Record the source and effective date of custom or disputed geography.
+- Inspect rendered pixels, not only Studio playback, at every required aspect ratio.
+- Read `references/3d-flyover-architecture.md` for camera math, `references/3d-data-sources.md` for provider details, and `references/3d-troubleshooting.md` for blank, coarse, unauthorized or timed-out renders.
+
+## Files
+
+- `assets/CesiumFlythrough.tsx` — reusable two-mode component.
+- `assets/flight-path.ts` — dependency-free Chaikin route smoothing.
+- `assets/example-Root.tsx` — landscape and city compositions.
+- `assets/cesium-path.json` — sample landscape route.
+- `assets/city-path.json` — sample city route.
+- `assets/sample-river.geojson` — sample path-preparation input.
+- `scripts/prep-cesium-path.mjs` — dependency-free landscape route preparation.
diff --git a/remotion-best-practices/remotion-maps/techniques/cesium/assets/CesiumFlythrough.tsx b/remotion-best-practices/remotion-maps/techniques/cesium/assets/CesiumFlythrough.tsx
new file mode 100644
index 0000000..02465d0
--- /dev/null
+++ b/remotion-best-practices/remotion-maps/techniques/cesium/assets/CesiumFlythrough.tsx
@@ -0,0 +1,284 @@
+import React, {useEffect, useMemo, useRef, useState} from 'react';
+import {
+ AbsoluteFill,
+ cancelRender,
+ continueRender,
+ delayRender,
+ useCurrentFrame,
+ useVideoConfig,
+} from 'remotion';
+import terrainPath from './cesium-path.json';
+import {smoothFlightPath, type LngLat} from './flight-path';
+
+export type FlyoverMode = 'landscape' | 'city';
+export type {LngLat} from './flight-path';
+
+export type CesiumFlythroughProps = {
+ mode?: FlyoverMode;
+ path?: LngLat[];
+ pathSmoothingPasses?: number;
+ altitudeStart?: number;
+ altitudeEnd?: number;
+ lookAheadKm?: number;
+ travelKm?: number;
+ pitchFromNadir?: number;
+ verticalExaggeration?: number;
+ maximumScreenSpaceError?: number;
+};
+
+const MAPTILER_KEY = process.env.REMOTION_MAPTILER_KEY;
+const GOOGLE_MAPS_API_KEY = process.env.REMOTION_GOOGLE_MAPS_API_KEY;
+const CESIUM_VER = '1.143';
+const CDN = `https://cesium.com/downloads/cesiumjs/releases/${CESIUM_VER}/Build/Cesium/`;
+const R = 6371;
+const MAX_BANK = 0.13;
+const BANK_GAIN = 0.6;
+
+const havKm = (a: number[], b: number[]) => {
+ const r = Math.PI / 180;
+ const dLat = (b[1] - a[1]) * r;
+ const dLng = (b[0] - a[0]) * r;
+ const h =
+ Math.sin(dLat / 2) ** 2 +
+ Math.cos(a[1] * r) * Math.cos(b[1] * r) * Math.sin(dLng / 2) ** 2;
+ return 2 * R * Math.asin(Math.sqrt(h));
+};
+
+const makePathWalker = (path: LngLat[]) => {
+ if (path.length < 2)
+ throw new Error('Flyover path needs at least two points');
+ const cumulative = [0];
+ for (let i = 1; i < path.length; i++) {
+ cumulative.push(cumulative[i - 1] + havKm(path[i - 1], path[i]));
+ }
+ const lengthKm = cumulative[cumulative.length - 1];
+ const along = (km: number): LngLat => {
+ const d = Math.max(0, Math.min(lengthKm, km));
+ let i = 1;
+ while (i < cumulative.length && cumulative[i] < d) i++;
+ if (i >= cumulative.length) return path[path.length - 1];
+ const segmentLength = cumulative[i] - cumulative[i - 1] || 1;
+ const t = (d - cumulative[i - 1]) / segmentLength;
+ return [
+ path[i - 1][0] + (path[i][0] - path[i - 1][0]) * t,
+ path[i - 1][1] + (path[i][1] - path[i - 1][1]) * t,
+ ];
+ };
+ return {along, lengthKm};
+};
+
+const bearing = (a: number[], b: number[]) => {
+ const r = Math.PI / 180;
+ const y = Math.sin((b[0] - a[0]) * r) * Math.cos(b[1] * r);
+ const x =
+ Math.cos(a[1] * r) * Math.sin(b[1] * r) -
+ Math.sin(a[1] * r) * Math.cos(b[1] * r) * Math.cos((b[0] - a[0]) * r);
+ return Math.atan2(y, x);
+};
+
+const lerp = (a: number, b: number, t: number) => a + (b - a) * t;
+const clamp = (v: number, lo: number, hi: number) =>
+ Math.max(lo, Math.min(hi, v));
+
+const loadCesium = () =>
+ new Promise((resolve, reject) => {
+ if ((window as any).Cesium) return resolve((window as any).Cesium);
+ (window as any).CESIUM_BASE_URL = CDN;
+ const css = document.createElement('link');
+ css.rel = 'stylesheet';
+ css.href = `${CDN}Widgets/widgets.css`;
+ document.head.appendChild(css);
+ const script = document.createElement('script');
+ script.src = `${CDN}Cesium.js`;
+ script.onload = () => resolve((window as any).Cesium);
+ script.onerror = () =>
+ reject(new Error(`Failed to load CesiumJS ${CESIUM_VER}`));
+ document.head.appendChild(script);
+ });
+
+export const CesiumFlythrough: React.FC = ({
+ mode = 'landscape',
+ path = terrainPath as LngLat[],
+ pathSmoothingPasses = 3,
+ altitudeStart = 4600,
+ altitudeEnd = 4300,
+ lookAheadKm = 1.5,
+ travelKm = 13,
+ pitchFromNadir = 76,
+ verticalExaggeration = 1.1,
+ maximumScreenSpaceError = 8,
+}) => {
+ const containerRef = useRef(null);
+ const started = useRef(false);
+ const viewerRef = useRef(null);
+ const tilesetRef = useRef(null);
+ const frame = useCurrentFrame();
+ const {durationInFrames, fps, width, height} = useVideoConfig();
+ const [ready, setReady] = useState(false);
+ const [handle] = useState(() =>
+ delayRender(`cesium init: ${mode}`, {timeoutInMilliseconds: 120000}),
+ );
+ const walker = useMemo(
+ () => makePathWalker(smoothFlightPath(path, pathSmoothingPasses)),
+ [path, pathSmoothingPasses],
+ );
+
+ const setCamera = (C: any, viewer: any, progress: number) => {
+ const maxTravel = Math.max(0, walker.lengthKm - lookAheadKm * 2);
+ const cameraDistance = Math.min(travelKm, maxTravel) * progress;
+ const camera = walker.along(cameraDistance);
+ const aim = walker.along(cameraDistance + lookAheadKm);
+ const aim2 = walker.along(cameraDistance + lookAheadKm * 2);
+ const heading = bearing(camera, aim);
+ let headingDelta = bearing(aim, aim2) - heading;
+ while (headingDelta > Math.PI) headingDelta -= 2 * Math.PI;
+ while (headingDelta < -Math.PI) headingDelta += 2 * Math.PI;
+ viewer.camera.setView({
+ destination: C.Cartesian3.fromDegrees(
+ camera[0],
+ camera[1],
+ lerp(altitudeStart, altitudeEnd, progress),
+ ),
+ orientation: {
+ heading,
+ pitch: C.Math.toRadians(-(90 - pitchFromNadir)),
+ roll: clamp(headingDelta * BANK_GAIN, -MAX_BANK, MAX_BANK),
+ },
+ });
+ };
+
+ const tilesAreLoaded = (viewer: any) => {
+ if (mode === 'landscape') return viewer.scene.globe.tilesLoaded;
+ return Boolean(tilesetRef.current?.tilesLoaded);
+ };
+
+ const settle = (viewer: any) =>
+ new Promise((resolve) => {
+ let stable = 0;
+ let ticks = 0;
+ const tick = () => {
+ viewer.render();
+ ticks++;
+ stable = tilesAreLoaded(viewer) ? stable + 1 : 0;
+ if (stable > 8 || ticks > 600) {
+ viewer.render();
+ resolve();
+ } else {
+ setTimeout(tick, 8);
+ }
+ };
+ tick();
+ });
+
+ useEffect(() => {
+ if (started.current) return;
+ started.current = true;
+ (async () => {
+ if (mode === 'landscape' && !MAPTILER_KEY) {
+ throw new Error(
+ 'Set REMOTION_MAPTILER_KEY. Create a key at https://cloud.maptiler.com/account/keys/',
+ );
+ }
+ if (mode === 'city' && !GOOGLE_MAPS_API_KEY) {
+ throw new Error(
+ 'Set REMOTION_GOOGLE_MAPS_API_KEY. Create a Map Tiles API key at https://developers.google.com/maps/documentation/tile/get-api-key',
+ );
+ }
+ if (mode === 'city' && durationInFrames / fps > 30) {
+ throw new Error(
+ 'Google Photorealistic 3D Tiles compositions must not exceed 30 seconds',
+ );
+ }
+
+ const C = await loadCesium();
+ const viewer = new C.Viewer(containerRef.current, {
+ baseLayer: false,
+ baseLayerPicker: false,
+ geocoder: false,
+ homeButton: false,
+ sceneModePicker: false,
+ navigationHelpButton: false,
+ animation: false,
+ timeline: false,
+ fullscreenButton: false,
+ infoBox: false,
+ selectionIndicator: false,
+ contextOptions: {webgl: {preserveDrawingBuffer: true}},
+ });
+ if (mode === 'landscape') {
+ viewer.imageryLayers.addImageryProvider(
+ new C.UrlTemplateImageryProvider({
+ url: `https://api.maptiler.com/tiles/satellite-v2/{z}/{x}/{y}.jpg?key=${MAPTILER_KEY}`,
+ maximumLevel: 20,
+ }),
+ );
+ viewer.terrainProvider = await C.CesiumTerrainProvider.fromUrl(
+ `https://api.maptiler.com/tiles/terrain-quantized-mesh-v2/?key=${MAPTILER_KEY}`,
+ {requestVertexNormals: true},
+ );
+ viewer.creditDisplay.addStaticCredit(
+ new C.Credit(
+ '© MapTiler ',
+ true,
+ ),
+ );
+ }
+ if (mode === 'city') {
+ viewer.scene.globe.show = false;
+ const tileset = await C.Cesium3DTileset.fromUrl(
+ `https://tile.googleapis.com/v1/3dtiles/root.json?key=${GOOGLE_MAPS_API_KEY}`,
+ {
+ showCreditsOnScreen: true,
+ maximumScreenSpaceError,
+ },
+ );
+ viewer.scene.primitives.add(tileset);
+ tilesetRef.current = tileset;
+ }
+
+ viewer.useDefaultRenderLoop = false;
+ viewer.scene.skyAtmosphere.show = true;
+ viewer.scene.fog.enabled = true;
+ viewer.scene.globe.enableLighting = false;
+ viewer.scene.verticalExaggeration = verticalExaggeration;
+ (window as any).__CESIUM_FLYOVER__ = {C, mode};
+ viewerRef.current = viewer;
+ setCamera(C, viewer, 0);
+ await settle(viewer);
+ setReady(true);
+ continueRender(handle);
+ })().catch((error) => cancelRender(error));
+ }, [durationInFrames, fps, handle, mode]);
+
+ useEffect(() => {
+ if (!ready) return;
+ const frameHandle = delayRender(`cesium ${mode} frame ${frame}`, {
+ timeoutInMilliseconds: 60000,
+ });
+ const C = (window as any).__CESIUM_FLYOVER__.C;
+ const viewer = viewerRef.current;
+ const progress = durationInFrames <= 1 ? 0 : frame / (durationInFrames - 1);
+ setCamera(C, viewer, progress);
+ settle(viewer).then(() => continueRender(frameHandle));
+ }, [ready, frame, durationInFrames, mode]);
+
+ return (
+
+
+ {mode === 'city' ? (
+
+ For promotional purposes only
+
+ ) : null}
+
+ );
+};
diff --git a/remotion-best-practices/remotion-maps/techniques/cesium/assets/cesium-path.json b/remotion-best-practices/remotion-maps/techniques/cesium/assets/cesium-path.json
new file mode 100644
index 0000000..32b60ba
--- /dev/null
+++ b/remotion-best-practices/remotion-maps/techniques/cesium/assets/cesium-path.json
@@ -0,0 +1,299 @@
+[
+ [94.986139893537, 29.76417312959953],
+ [94.98637054463002, 29.764163024004816],
+ [94.98661427422437, 29.764153025681516],
+ [94.9868698103708, 29.764142908388347],
+ [94.98713600736019, 29.764132461562934],
+ [94.98741179569139, 29.76412145291623],
+ [94.9876962466277, 29.764109663422126],
+ [94.98798853462426, 29.764096898390772],
+ [94.98828790834106, 29.764082995679242],
+ [94.98859364523021, 29.764067827511347],
+ [94.98890509685035, 29.764051279216236],
+ [94.98922167960325, 29.76403324759024],
+ [94.98954294512464, 29.76401367774424],
+ [94.9898685550894, 29.76399255290906],
+ [94.99019820264337, 29.76396985787546],
+ [94.9905316178847, 29.763945606334815],
+ [94.9908685732739, 29.763919866576575],
+ [94.99120886105722, 29.763892700951896],
+ [94.99155229116181, 29.7638641665054],
+ [94.99189872300363, 29.76383429811986],
+ [94.99224811692223, 29.763803085651237],
+ [94.99260053337049, 29.763770509641105],
+ [94.99295601118384, 29.76373658086857],
+ [94.99331456742908, 29.763701322339223],
+ [94.99367598745215, 29.763664830647013],
+ [94.99404000156176, 29.763627219082974],
+ [94.99440635968021, 29.763588592698778],
+ [94.99477481502787, 29.76354905236459],
+ [94.9951451006731, 29.763508748648892],
+ [94.99578766204738, 29.763462125646818],
+ [94.99643710580968, 29.763412119743368],
+ [94.99709296623192, 29.763358988682928],
+ [94.99775479298779, 29.763302979031952],
+ [94.99842214521965, 29.763244327404465],
+ [94.99909470569231, 29.763183258547627],
+ [94.9997722961385, 29.76312010454948],
+ [95.00045474013422, 29.763055184243758],
+ [95.00114189582168, 29.762988795623112],
+ [95.00183368970049, 29.762921207778405],
+ [95.0025300799095, 29.76285270023514],
+ [95.00323103443773, 29.762783549665084],
+ [95.00393658318124, 29.76271400155497],
+ [95.00464681949704, 29.76264432424487],
+ [95.00536183331896, 29.76257477740286],
+ [95.00608171146906, 29.762505612813378],
+ [95.00680653793428, 29.762437075077955],
+ [95.00753639864557, 29.762369398844733],
+ [95.00827137837749, 29.762302811854063],
+ [95.00901153006761, 29.762237519590354],
+ [95.00975680776318, 29.76217368790719],
+ [95.01050716875933, 29.762111478518566],
+ [95.0112626067996, 29.76205102042169],
+ [95.01202312290016, 29.761992432502932],
+ [95.01278871942189, 29.76193583156792],
+ [95.01355940108247, 29.761881333165324],
+ [95.01433525277555, 29.761829093407865],
+ [95.01511636205572, 29.761779224166457],
+ [95.01590278872715, 29.76173180995877],
+ [95.0166868810408, 29.76168612055982],
+ [95.01746871725406, 29.761642332250204],
+ [95.0182483756254, 29.76160062131038],
+ [95.01902596675926, 29.761561177619345],
+ [95.019801682618, 29.761524238306453],
+ [95.02057570378254, 29.76149004865798],
+ [95.02134818878243, 29.761458838563573],
+ [95.02211921065114, 29.761430763930672],
+ [95.02288888930805, 29.761405973069504],
+ [95.02365734467304, 29.761384614290225],
+ [95.02442469666667, 29.761366835902948],
+ [95.02519095257038, 29.761352731197437],
+ [95.02595602043016, 29.761342344990513],
+ [95.02671980829304, 29.761335722099044],
+ [95.02748221022355, 29.76133286485609],
+ [95.02824308111781, 29.761333684556867],
+ [95.02900227020879, 29.761338090875398],
+ [95.02975960629327, 29.76134599002589],
+ [95.03051480114966, 29.76135728786741],
+ [95.03126749207338, 29.761371921751238],
+ [95.03201723576402, 29.761389829130785],
+ [95.03276363398774, 29.761410893146387],
+ [95.03350632277824, 29.761434973117545],
+ [95.03424521675927, 29.76146183394706],
+ [95.03498037607913, 29.761491215377145],
+ [95.035711917426, 29.761522866578012],
+ [95.03643998610582, 29.761556530192124],
+ [95.03716475930274, 29.761591886465347],
+ [95.03788653744915, 29.761628566185358],
+ [95.03860571883365, 29.76166618469001],
+ [95.03932258585421, 29.76170436456548],
+ [95.04003738892985, 29.76174273062808],
+ [95.04075025083816, 29.76178094997509],
+ [95.0414610559133, 29.76181870813213],
+ [95.04216961904287, 29.761855638407084],
+ [95.04287591713418, 29.761891331889718],
+ [95.04357986124926, 29.761925397709096],
+ [95.04428137757625, 29.761957488479126],
+ [95.04498041854592, 29.76198725048925],
+ [95.04567682817188, 29.762014317811357],
+ [95.04637032968634, 29.762038376323694],
+ [95.04706059416637, 29.762059099770216],
+ [95.04774726432963, 29.762076162373777],
+ [95.0484300050609, 29.762089241174117],
+ [95.04910871445378, 29.762098042845082],
+ [95.04978328153793, 29.762102280852183],
+ [95.05045359964508, 29.76210167552205],
+ [95.05111966253706, 29.76209602004179],
+ [95.05178153406797, 29.762085106891018],
+ [95.05243927503516, 29.762068731547185],
+ [95.05309287649075, 29.762046750046103],
+ [95.0537422946664, 29.762019099359485],
+ [95.05438748396233, 29.761985721609257],
+ [95.05502839823626, 29.76194655859307],
+ [95.05566488201883, 29.761901557942874],
+ [95.05629656919591, 29.761850805510885],
+ [95.05692313234233, 29.761794428680094],
+ [95.0575442743842, 29.761732580860688],
+ [95.0581596433054, 29.761665348138973],
+ [95.05876888708963, 29.761592816601354],
+ [95.05937164047754, 29.761515065256333],
+ [95.05996759228947, 29.761432144038746],
+ [95.06055643134583, 29.761344102883623],
+ [95.06113793491645, 29.761251010034922],
+ [95.06171214230999, 29.761153046649387],
+ [95.06227907948092, 29.761050389948267],
+ [95.06283877238438, 29.760943217152814],
+ [95.06339127381165, 29.760831691663462],
+ [95.06393669678933, 29.760716002374487],
+ [95.06447520396281, 29.76059636241658],
+ [95.06500695797821, 29.760472984920362],
+ [95.06553212847378, 29.760346104258282],
+ [95.0660508986937, 29.760216015040477],
+ [95.06656344194985, 29.760083025494016],
+ [95.06707002648291, 29.75994741412334],
+ [95.06757112978441, 29.759809440866206],
+ [95.06806722979658, 29.759669344181514],
+ [95.06855878142073, 29.759527354008487],
+ [95.06904617625263, 29.759383697903765],
+ [95.06952978875404, 29.75923861533451],
+ [95.07000993080214, 29.759092371156385],
+ [95.07048679175114, 29.758945227682446],
+ [95.07096044787545, 29.75879742836973],
+ [95.07143096114058, 29.758649219939148],
+ [95.0718984144853, 29.758500858117706],
+ [95.07236278188816, 29.7583525823887],
+ [95.07282412506945, 29.758204644682806],
+ [95.07328275575983, 29.75805728963777],
+ [95.07373905641253, 29.757910760813612],
+ [95.07419366476313, 29.757765217208473],
+ [95.07464735762416, 29.757620800921966],
+ [95.07510085345471, 29.757477677507868],
+ [95.07555467766437, 29.757336168750566],
+ [95.07600940811365, 29.757196598118206],
+ [95.07646537399586, 29.75705931280275],
+ [95.0769228207089, 29.756924677394206],
+ [95.07738220221682, 29.756793075496777],
+ [95.07784401968648, 29.75666487927172],
+ [95.07830874492939, 29.756540496044202],
+ [95.07877690647402, 29.756420332181715],
+ [95.07924898851259, 29.75630478841808],
+ [95.07972503722137, 29.756194196891926],
+ [95.08020511490892, 29.756088882533362],
+ [95.0806891403115, 29.75598918720403],
+ [95.08117690920173, 29.75589531641115],
+ [95.08166835685006, 29.755807414283098],
+ [95.08216335868525, 29.75572566824862],
+ [95.08266177736347, 29.755650250535062],
+ [95.08316349491537, 29.75558120546187],
+ [95.08366839703267, 29.755518567048284],
+ [95.08417639041532, 29.75546236367944],
+ [95.08468755179344, 29.755412571989652],
+ [95.08520236790308, 29.755369015997044],
+ [95.08572134650697, 29.75533148313236],
+ [95.0862450098908, 29.755299740305322],
+ [95.08677390781156, 29.75527358808779],
+ [95.08730861289804, 29.755252808551163],
+ [95.08784970300886, 29.755237175354623],
+ [95.08839755885471, 29.755226476280296],
+ [95.08895256438073, 29.755220494902016],
+ [95.089514993805, 29.755219019351184],
+ [95.09008489086116, 29.7552217729881],
+ [95.09066229928165, 29.75522847917293],
+ [95.09124726342738, 29.755238870403907],
+ [95.09183976966378, 29.755252726598844],
+ [95.09243978867215, 29.75526985018834],
+ [95.09304723439128, 29.755290065097345],
+ [95.09366184648091, 29.75531326126932],
+ [95.09428337414857, 29.755339326723966],
+ [95.09491171647382, 29.755368102171502],
+ [95.09554680939114, 29.75539940595205],
+ [95.09618846028675, 29.755433126230766],
+ [95.09683632409143, 29.75546923335011],
+ [95.09749004228215, 29.75550775219342],
+ [95.09814924669702, 29.755548754655436],
+ [95.0988136358514, 29.755592374644042],
+ [95.09948290826172, 29.755638746066982],
+ [95.1001568080277, 29.75568798494813],
+ [95.10083517891061, 29.75574017449467],
+ [95.10151797539464, 29.75579531974171],
+ [95.1022051519645, 29.755853425724286],
+ [95.10289664375364, 29.755914488290983],
+ [95.10359258928374, 29.755978570204803],
+ [95.10429306658138, 29.756045742645284],
+ [95.10499798654989, 29.756116067070348],
+ [95.10570717321444, 29.75618958016383],
+ [95.10642032295875, 29.75626636089044],
+ [95.10713711848761, 29.756346492746122],
+ [95.10785729025027, 29.75643004436662],
+ [95.10858043622838, 29.75651688160893],
+ [95.10930611534633, 29.75660684892344],
+ [95.11003407093642, 29.756699686157475],
+ [95.11076414467685, 29.756795123665622],
+ [95.1114960914754, 29.756892893838618],
+ [95.11222971288655, 29.756992700238396],
+ [95.1129649452222, 29.75709420093414],
+ [95.11370170201873, 29.75719709582746],
+ [95.11443986012442, 29.757301125099488],
+ [95.11517935555177, 29.7574061249826],
+ [95.11592009761476, 29.757511940391662],
+ [95.11666232015585, 29.75761835330566],
+ [95.11740624233691, 29.757725222810585],
+ [95.11815181076378, 29.75783253698326],
+ [95.11889913308254, 29.757940178669305],
+ [95.11964841222917, 29.758048000558695],
+ [95.12039993276164, 29.758155854652614],
+ [95.12115399312397, 29.75826357999786],
+ [95.1219108497459, 29.75837102690515],
+ [95.1226706293697, 29.758478081829693],
+ [95.12343325561484, 29.758584686897258],
+ [95.12419857627997, 29.758690818430438],
+ [95.12496638982559, 29.75879646083105],
+ [95.12573649209446, 29.7589015818837],
+ [95.12650863318528, 29.75900618637391],
+ [95.12728253192327, 29.759110282431784],
+ [95.12805798566751, 29.75921386162033],
+ [95.12883477913662, 29.759316919371038],
+ [95.12961273528985, 29.759419445656786],
+ [95.13039166301432, 29.759521458216526],
+ [95.13117134363408, 29.759622963323043],
+ [95.13195155721434, 29.759723948972997],
+ [95.13273211930314, 29.759824349786275],
+ [95.13351286507051, 29.759924061406032],
+ [95.13428648274362, 29.76002351015658],
+ [95.1350533298064, 29.760122544307915],
+ [95.1358137532818, 29.760221010686855],
+ [95.13656784419986, 29.760318809952974],
+ [95.13731567503761, 29.76041584848236],
+ [95.1380573752464, 29.760511990985425],
+ [95.13879310931623, 29.76060704815151],
+ [95.13952306473344, 29.760700794123938],
+ [95.14024751710419, 29.7607929520901],
+ [95.14096671686433, 29.760883206230545],
+ [95.14168092332761, 29.76097123202995],
+ [95.14239029599311, 29.761056732470486],
+ [95.14309486625548, 29.761139484506582],
+ [95.14379454089128, 29.761219462160696],
+ [95.14448922306659, 29.76129664046317],
+ [95.14517882147311, 29.76137100941381],
+ [95.14586312132259, 29.761442532574584],
+ [95.14654188135431, 29.761511168945386],
+ [95.14721489938523, 29.761576901934955],
+ [95.14788204807155, 29.761639772673718],
+ [95.14854319868547, 29.76169982923195],
+ [95.14919822095698, 29.761757127412878],
+ [95.14984699116548, 29.76181173598209],
+ [95.15048960377052, 29.761863851723042],
+ [95.15112617637942, 29.761913696049017],
+ [95.15175681293137, 29.761961561816054],
+ [95.15238148064795, 29.762007691856205],
+ [95.15300009096235, 29.762052309028526],
+ [95.1533539374323, 29.762086082676035],
+ [95.15370650809008, 29.762118928860186],
+ [95.15405759583123, 29.762150875711065],
+ [95.15440704121897, 29.76218191319173],
+ [95.1547548321985, 29.762211967913583],
+ [95.15510097264206, 29.762240955288657],
+ [95.15544525415498, 29.762268829619945],
+ [95.15578751039571, 29.76229553455492],
+ [95.15612769998111, 29.762320941845203],
+ [95.15646565712565, 29.762344985615734],
+ [95.156801142589, 29.76236761294652],
+ [95.1571338046714, 29.76238883654028],
+ [95.15746323934037, 29.76240869370805],
+ [95.15778903282519, 29.762427217766984],
+ [95.15811077257146, 29.762444433666733],
+ [95.15842800577592, 29.762460368791256],
+ [95.15874028837707, 29.76247502889767],
+ [95.15904716834646, 29.76248842410003],
+ [95.1593481499996, 29.762500590502704],
+ [95.15964271930007, 29.76251153961251],
+ [95.1599303416933, 29.76252129267978],
+ [95.16021045104225, 29.762529892932115],
+ [95.16048243037355, 29.762537389252305],
+ [95.16074559672008, 29.762543832974302],
+ [95.1609993202866, 29.762549265122786],
+ [95.16124294069552, 29.762553753099137],
+ [95.16147571071544, 29.762557390653928],
+ [95.16169677155058, 29.762560323342807]
+]
diff --git a/remotion-best-practices/remotion-maps/techniques/cesium/assets/city-path.json b/remotion-best-practices/remotion-maps/techniques/cesium/assets/city-path.json
new file mode 100644
index 0000000..821973f
--- /dev/null
+++ b/remotion-best-practices/remotion-maps/techniques/cesium/assets/city-path.json
@@ -0,0 +1,12 @@
+[
+ [-74.0135, 40.7047],
+ [-74.0102, 40.7104],
+ [-74.0074, 40.7167],
+ [-74.0047, 40.7232],
+ [-74.0017, 40.7297],
+ [-73.9988, 40.7362],
+ [-73.9954, 40.7429],
+ [-73.9917, 40.7496],
+ [-73.9882, 40.7563],
+ [-73.9848, 40.7631]
+]
diff --git a/remotion-best-practices/remotion-maps/techniques/cesium/assets/example-Root.tsx b/remotion-best-practices/remotion-maps/techniques/cesium/assets/example-Root.tsx
new file mode 100644
index 0000000..9a27a0b
--- /dev/null
+++ b/remotion-best-practices/remotion-maps/techniques/cesium/assets/example-Root.tsx
@@ -0,0 +1,39 @@
+import React from 'react';
+import {Composition} from 'remotion';
+import {CesiumFlythrough, type CesiumFlythroughProps} from './CesiumFlythrough';
+import cityPath from './city-path.json';
+
+export const RemotionRoot: React.FC = () => (
+ <>
+
+
+ >
+);
diff --git a/remotion-best-practices/remotion-maps/techniques/cesium/assets/flight-path.ts b/remotion-best-practices/remotion-maps/techniques/cesium/assets/flight-path.ts
new file mode 100644
index 0000000..de7f7bd
--- /dev/null
+++ b/remotion-best-practices/remotion-maps/techniques/cesium/assets/flight-path.ts
@@ -0,0 +1,35 @@
+export type LngLat = [number, number];
+
+// Chaikin corner cutting turns a sparse route into a continuous curve. Repeated passes round
+// direction changes into deliberate swerves instead of left-right heading bumps.
+export const smoothFlightPath = (source: LngLat[], passes = 3): LngLat[] => {
+ if (source.length < 2)
+ throw new Error('Flyover path needs at least two points');
+
+ // Keep adjacent longitudes continuous for routes that cross the antimeridian.
+ const unwrapped: LngLat[] = [source[0]];
+ for (let index = 1; index < source.length; index++) {
+ const [lng, lat] = source[index];
+ const previous = unwrapped[index - 1][0];
+ let adjusted = lng;
+ while (adjusted - previous > 180) adjusted -= 360;
+ while (adjusted - previous < -180) adjusted += 360;
+ unwrapped.push([adjusted, lat]);
+ }
+
+ let curve = unwrapped;
+ for (let pass = 0; pass < Math.max(0, passes); pass++) {
+ const next: LngLat[] = [curve[0]];
+ for (let i = 0; i < curve.length - 1; i++) {
+ const a = curve[i];
+ const b = curve[i + 1];
+ next.push(
+ [a[0] * 0.75 + b[0] * 0.25, a[1] * 0.75 + b[1] * 0.25],
+ [a[0] * 0.25 + b[0] * 0.75, a[1] * 0.25 + b[1] * 0.75],
+ );
+ }
+ next.push(curve[curve.length - 1]);
+ curve = next;
+ }
+ return curve;
+};
diff --git a/remotion-best-practices/remotion-maps/techniques/cesium/assets/sample-river.geojson b/remotion-best-practices/remotion-maps/techniques/cesium/assets/sample-river.geojson
new file mode 100644
index 0000000..5574b30
--- /dev/null
+++ b/remotion-best-practices/remotion-maps/techniques/cesium/assets/sample-river.geojson
@@ -0,0 +1,215 @@
+{
+ "type": "FeatureCollection",
+ "features": [
+ {
+ "type": "Feature",
+ "properties": {"name": "Yarlung Tsangpo (OSM, gorge way)"},
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [94.8794306, 29.5453548],
+ [94.880058, 29.5500259],
+ [94.8804545, 29.5529773],
+ [94.8872806, 29.559007],
+ [94.8902386, 29.5645817],
+ [94.8945618, 29.5651505],
+ [94.8985437, 29.5703839],
+ [94.8978611, 29.5758448],
+ [94.9077237, 29.5843086],
+ [94.9107706, 29.5872382],
+ [94.9136749, 29.5879042],
+ [94.9208424, 29.5864253],
+ [94.9243692, 29.5890419],
+ [94.9243692, 29.5945028],
+ [94.9268508, 29.597544],
+ [94.9331942, 29.6000111],
+ [94.9350913, 29.6024165],
+ [94.9359736, 29.6042869],
+ [94.9354367, 29.6064452],
+ [94.9350634, 29.608155],
+ [94.9343462, 29.6094434],
+ [94.9295695, 29.6113703],
+ [94.9288061, 29.6124782],
+ [94.9268721, 29.6194181],
+ [94.9273809, 29.6276608],
+ [94.9274409, 29.6286334],
+ [94.9263783, 29.6303683],
+ [94.9250518, 29.6304537],
+ [94.922744, 29.6299103],
+ [94.9170292, 29.6256472],
+ [94.9144757, 29.6243553],
+ [94.9115439, 29.6243318],
+ [94.9008302, 29.6273853],
+ [94.8972905, 29.6276085],
+ [94.8897112, 29.6252949],
+ [94.8827398, 29.6253184],
+ [94.8806998, 29.6268686],
+ [94.8777241, 29.6317051],
+ [94.8768493, 29.6342436],
+ [94.8768641, 29.6346894],
+ [94.8769277, 29.6365972],
+ [94.8775677, 29.6391137],
+ [94.8804943, 29.6418187],
+ [94.8821969, 29.6438716],
+ [94.8877263, 29.6456718],
+ [94.8903366, 29.6468971],
+ [94.8959561, 29.6481151],
+ [94.9032857, 29.6528729],
+ [94.9113869, 29.6568592],
+ [94.9162734, 29.6587881],
+ [94.9182022, 29.6625172],
+ [94.9203882, 29.670104],
+ [94.9197453, 29.6744761],
+ [94.9192644, 29.6754058],
+ [94.9178164, 29.6782052],
+ [94.915116, 29.6816771],
+ [94.9094581, 29.6810342],
+ [94.9043145, 29.6796197],
+ [94.9018712, 29.6806484],
+ [94.8976278, 29.6812914],
+ [94.8909411, 29.6856634],
+ [94.8896552, 29.6890068],
+ [94.892227, 29.6990368],
+ [94.8978849, 29.704952],
+ [94.9017426, 29.7100956],
+ [94.9061206, 29.7112788],
+ [94.9065005, 29.7113815],
+ [94.9225743, 29.7192255],
+ [94.9264023, 29.7212652],
+ [94.9267629, 29.7213678],
+ [94.9341474, 29.723469],
+ [94.9360823, 29.7245705],
+ [94.9357152, 29.7273333],
+ [94.9344915, 29.7289804],
+ [94.9323502, 29.7303263],
+ [94.9298621, 29.73339],
+ [94.9294542, 29.734665],
+ [94.9298213, 29.7382244],
+ [94.9306755, 29.739157],
+ [94.9340021, 29.7439794],
+ [94.9355331, 29.7464083],
+ [94.9364901, 29.7488664],
+ [94.9372115, 29.749423],
+ [94.937775, 29.7498579],
+ [94.939019, 29.7500527],
+ [94.9407117, 29.7501944],
+ [94.9429346, 29.7513629],
+ [94.947778, 29.7543307],
+ [94.9541921, 29.755984],
+ [94.9574551, 29.7555414],
+ [94.9603715, 29.7553644],
+ [94.9629516, 29.755488],
+ [94.9676317, 29.757489],
+ [94.9709355, 29.7587814],
+ [94.9737019, 29.7603278],
+ [94.9738572, 29.7603796],
+ [94.9844009, 29.7638941],
+ [94.9852725, 29.7649069],
+ [94.9861359, 29.7675568],
+ [94.9898232, 29.7694497],
+ [94.9917263, 29.7691954],
+ [94.9966421, 29.7688099],
+ [95.0005707, 29.7670075],
+ [95.0007566, 29.7668999],
+ [95.0028203, 29.7657056],
+ [95.0080406, 29.7614995],
+ [95.0092963, 29.7609572],
+ [95.0138378, 29.7589957],
+ [95.0160159, 29.7574362],
+ [95.0194618, 29.7553902],
+ [95.0222306, 29.7524106],
+ [95.024336, 29.7498815],
+ [95.0273932, 29.7487547],
+ [95.0324981, 29.7493557],
+ [95.0339552, 29.7496724],
+ [95.0346257, 29.7499916],
+ [95.035882, 29.7507411],
+ [95.0375964, 29.7530966],
+ [95.0386203, 29.754818],
+ [95.0383895, 29.7567272],
+ [95.038166, 29.7590432],
+ [95.0395792, 29.7618349],
+ [95.0411334, 29.7631575],
+ [95.0420532, 29.7639402],
+ [95.0467825, 29.7661735],
+ [95.0495101, 29.7673453],
+ [95.0510063, 29.7681933],
+ [95.0516577, 29.7683919],
+ [95.0560621, 29.7692331],
+ [95.0577259, 29.7690047],
+ [95.0588453, 29.7684695],
+ [95.0650773, 29.767807],
+ [95.0705737, 29.761782],
+ [95.0720258, 29.7599696],
+ [95.0736121, 29.7540856],
+ [95.0754147, 29.751782],
+ [95.0758224, 29.751042],
+ [95.0760619, 29.750314],
+ [95.0759483, 29.7495284],
+ [95.0751984, 29.7480135],
+ [95.0728911, 29.7466988],
+ [95.0724585, 29.7445327],
+ [95.0732804, 29.7429802],
+ [95.0734102, 29.740789],
+ [95.0731362, 29.7386729],
+ [95.0744382, 29.7374902],
+ [95.075294, 29.7367129],
+ [95.079535, 29.7361346],
+ [95.081745, 29.736994],
+ [95.083005, 29.737484],
+ [95.0833905, 29.7430745],
+ [95.0844421, 29.7452715],
+ [95.0871532, 29.7473749],
+ [95.0918361, 29.7499864],
+ [95.0931923, 29.7511573],
+ [95.0943202, 29.7514189],
+ [95.0965266, 29.7510558],
+ [95.0991656, 29.7494408],
+ [95.1029871, 29.7472998],
+ [95.1038668, 29.7453591],
+ [95.1063039, 29.7417406],
+ [95.1084814, 29.741365],
+ [95.111726, 29.7426671],
+ [95.1138489, 29.7452914],
+ [95.1152135, 29.7465013],
+ [95.1154175, 29.7473556],
+ [95.1158661, 29.7480506],
+ [95.1167533, 29.7482586],
+ [95.1179004, 29.7491572],
+ [95.119434, 29.7515181],
+ [95.1195997, 29.7517319],
+ [95.1214023, 29.7535598],
+ [95.1239692, 29.754987],
+ [95.1260602, 29.7556005],
+ [95.1284973, 29.7561388],
+ [95.1311663, 29.7559002],
+ [95.1323477, 29.7559385],
+ [95.1344757, 29.7564723],
+ [95.1350155, 29.7583672],
+ [95.1382746, 29.7617848],
+ [95.1400377, 29.7646815],
+ [95.1410982, 29.7654339],
+ [95.1437689, 29.7649144],
+ [95.1469991, 29.7640131],
+ [95.1503617, 29.7622343],
+ [95.1506908, 29.7620602],
+ [95.1532721, 29.7600322],
+ [95.1565312, 29.7590432],
+ [95.1584059, 29.7594063],
+ [95.1589059, 29.7599317],
+ [95.1595043, 29.7612399],
+ [95.1611602, 29.7632119],
+ [95.1635565, 29.7646136],
+ [95.1700434, 29.7649144],
+ [95.1730828, 29.7644136],
+ [95.1748094, 29.7636814],
+ [95.1765005, 29.7628339],
+ [95.1794885, 29.7589784],
+ [95.1830673, 29.7576787],
+ [95.1848212, 29.7580682],
+ [95.1869103, 29.7594603]
+ ]
+ }
+ }
+ ]
+}
diff --git a/remotion-best-practices/remotion-maps/techniques/cesium/references/3d-data-sources.md b/remotion-best-practices/remotion-maps/techniques/cesium/references/3d-data-sources.md
new file mode 100644
index 0000000..c5cfcbd
--- /dev/null
+++ b/remotion-best-practices/remotion-maps/techniques/cesium/references/3d-data-sources.md
@@ -0,0 +1,43 @@
+# Flyover data sources
+
+## Landscape
+
+Use MapTiler for both layers:
+
+- `terrain-quantized-mesh-v2`: elevation encoded as Cesium quantized-mesh terrain.
+- `satellite-v2`: raster satellite imagery draped on that mesh.
+
+CesiumJS renders the layers; it does not supply the data. Set `REMOTION_MAPTILER_KEY`.
+
+Create a key:
+
+- https://cloud.maptiler.com/account/keys/
+
+Official documentation:
+
+- https://docs.maptiler.com/cesium/
+- https://docs.maptiler.com/schema-raster/terrain-3d/
+
+## City
+
+Use Google Photorealistic 3D Tiles. Google supplies one high-resolution 3D mesh already textured
+with imagery. Disable the Cesium globe and do not add MapTiler terrain or satellite beneath it. Set
+`REMOTION_GOOGLE_MAPS_API_KEY`.
+
+Create and configure a key:
+
+- https://developers.google.com/maps/documentation/tile/get-api-key
+
+Enable the Map Tiles API in a billing-enabled Google Cloud project and restrict the key to that API.
+The application restriction must permit the local headless Remotion request.
+
+Official documentation:
+
+- https://developers.google.com/maps/documentation/tile/3d-tiles
+- https://developers.google.com/maps/documentation/tile/policies
+
+## Why not extruded buildings
+
+OSM-, Overture- and vector-tile building products primarily provide footprints, approximate heights
+and optional roof attributes. They are useful for analytical or stylized maps, but they do not
+provide the textured architecture required for a cinematic city flyover.
diff --git a/remotion-best-practices/remotion-maps/techniques/cesium/references/3d-flyover-architecture.md b/remotion-best-practices/remotion-maps/techniques/cesium/references/3d-flyover-architecture.md
new file mode 100644
index 0000000..a2222d7
--- /dev/null
+++ b/remotion-best-practices/remotion-maps/techniques/cesium/references/3d-flyover-architecture.md
@@ -0,0 +1,128 @@
+# 3D Flyover — architecture reference
+
+Deep detail behind `TECHNIQUE.md`: provider loading, the camera-path pipeline, per-frame camera math, and
+the proven terrain values. Both landscape and city modes have been forward-tested through Remotion.
+
+## 1. Provider initialization
+
+Create the Viewer with `baseLayer: false`, UI widgets disabled, and
+`contextOptions.webgl.preserveDrawingBuffer: true`. Never hide the credit display.
+
+### Landscape
+
+Add MapTiler `satellite-v2` with `UrlTemplateImageryProvider`, then load
+`terrain-quantized-mesh-v2` with `CesiumTerrainProvider.fromUrl({requestVertexNormals: true})`.
+MapTiler supplies both datasets; no Cesium ion token is required.
+
+### City
+
+Do not add MapTiler. Hide the globe, then add:
+
+```ts
+viewer.scene.globe.show = false;
+const tileset = await Cesium.Cesium3DTileset.fromUrl(
+ `https://tile.googleapis.com/v1/3dtiles/root.json?key=${GOOGLE_KEY}`,
+ {showCreditsOnScreen: true, maximumScreenSpaceError: 4},
+);
+viewer.scene.primitives.add(tileset);
+```
+
+Lower `maximumScreenSpaceError` improves refinement at substantial download/render cost. Start at
+`4` for a hero landmark and `6–8` for wider urban shots. Enforce the Google 30-second promotional
+video ceiling in the component.
+
+Load Cesium from the CDN after setting `window.CESIUM_BASE_URL`; the tested version is `1.143`.
+
+## 2. The camera path — structure & generation
+
+Four properties matter, in order:
+
+1. **Continuous curvature** — the camera must flow through curves, never "fly straight, snap to a new
+ heading, fly straight." The component applies three passes of **Chaikin corner cutting** to every
+ supplied path. Each pass replaces a segment with quarter and three-quarter points, rounding a
+ corner into a curve. Three passes are the default; four is softer, two is tighter.
+2. **Constant ground speed** — precompute cumulative distance along the rounded curve and interpolate
+ by arc length. Do not animate by source-point index; unequal source spacing creates speed bumps.
+3. **Minimized amplitude** — for detailed landscape centerlines, dampen the prepared path toward its
+ straight start→end chord by a fixed fraction `DAMP` (0 = dead straight, 1 = full river). This is
+ the single swerve-amplitude knob.
+4. **Enough length** — `PATHKM ≥ TRAVEL_KM + 2·LOOK_AHEAD_KM` so the look-ahead aim never clamps.
+
+`../scripts/prep-cesium-path.mjs` does: clip a window of the source centerline → resample to even
+arc-length spacing (0.1 km) → moving-average smooth (±2.8 km window, 2 passes) → dampen toward the chord
+(`DAMP=0.45`). Validate with the heading-delta probe it prints — deltas should be small and change
+_gradually_ (water-wars: `3,0,-1,-3,-4,1,7,9,5,-5,-12,-7,…`). Big jumps = corners = bad.
+
+The component then applies Chaikin smoothing to this prepared route, or directly to a short
+hand-authored city route. Keep city control points sparse and intentional; smoothing cannot rescue a
+zig-zagging route that crosses the subject repeatedly.
+
+**Source data:** OSM via Overpass (~0.3 km vertex spacing) — Natural Earth is too coarse for inner
+gorges. overpass-api.de is often busy → mirror `overpass.kumi.systems`.
+
+## 3. Camera animation per frame (position, heading, pitch, bank)
+
+Walk the path by **arc length** (precompute cumulative distances once). Every frame:
+
+- **Position** = the point at `dCam` km along the path, altitude `lerp(ALT_START, ALT_END, prog)`.
+- **Heading** = bearing from the camera point to a **real point `LOOK_AHEAD_KM` further along the same
+ path**. A far aim averages wiggle → smooth heading; on a curved path it leads into the bend, so the
+ heading turns gently with the path. (A local-tangent aim spins the camera at every kink — don't.)
+- **Pitch** = constant. We keep a MapLibre-style param `PITCH_FROM_NADIR` (90 = horizon), then convert:
+ **Cesium pitch = `-(90 - PITCH_FROM_NADIR)`** (Cesium: 0 = horizon, -90 = straight down). 76° → -14°.
+- **Bank (roll)** = lean _into_ the turn — the helicopter tell. Measure turn rate as the bearing change
+ between `aim` and a point `2·LOOK_AHEAD_KM` ahead; `roll = clamp(dH · BANK_GAIN, ±MAX_BANK)`. Because
+ the path is smooth, `dH` changes gradually → the bank eases in and out, never jerks.
+
+```ts
+const setCamera = (C, viewer, prog) => {
+ const dCam = Math.min(TRAVEL_KM, PATHKM - LOOK_AHEAD_KM * 2) * prog;
+ const cam = alongPath(dCam); // arc-length point
+ const aim = alongPath(dCam + LOOK_AHEAD_KM); // heading target (real point on the path)
+ const aim2 = alongPath(dCam + LOOK_AHEAD_KM * 2); // turn-rate probe → bank
+ const heading = bearing(cam, aim);
+ let dH = bearing(aim, aim2) - heading; while (dH > Math.PI) dH -= 2*Math.PI; while (dH < -Math.PI) dH += 2*Math.PI;
+ viewer.camera.setView({
+ destination: C.Cartesian3.fromDegrees(cam[0], cam[1], lerp(ALT_START, ALT_END, prog)),
+ orientation: { heading, pitch: C.Math.toRadians(-(90 - PITCH_FROM_NADIR)), roll: clamp(dH * BANK_GAIN, -MAX_BANK, MAX_BANK) },
+ });
+};
+```
+
+> **Cesium vs MapLibre conventions (gotcha):** Cesium heading is radians, 0 = north, clockwise. Pitch
+> 0 = horizon, negative = down (MapLibre is the inverse). Roll positive = bank right; tune the sign by eye.
+
+## 4. The feel — proven water-wars values
+
+| Param | Value | Meaning |
+| ------------------------ | ---------------------- | ------------------------------------------------------------------------------------ |
+| `TRAVEL_KM` | 13 | How far the camera travels. **Speed = `TRAVEL_KM / durationSeconds`.** |
+| duration | 24 s (720 f @30) | 13 km / 24 s ≈ **0.54 km/s** — a slow, peaceful glide. 8 s felt "extremely rushed". |
+| `ALT_START → ALT_END` | 4600 → 4300 m ASL | Absolute (terrain-independent). Inside the corridor walls → fly _through_, not over. |
+| `LOOK_AHEAD_KM` | 1.5 | Heading smoothness vs responsiveness. |
+| `PITCH_FROM_NADIR` | 76° | Stare-ahead down the corridor (90 = level). → Cesium -14°. |
+| `MAX_BANK` / `BANK_GAIN` | 0.13 rad (~7.5°) / 0.6 | Helicopter lean into turns. |
+| `verticalExaggeration` | 1.1 | Subtle terrain drama. |
+| `DAMP` (prep) | 0.45 | Swerve amount: higher = weavier, lower = straighter. |
+
+**A slow camera renders fast.** At 0.54 km/s the camera moves ~18 m/frame, so tiles stay cached and each
+`settle()` returns almost immediately; the 720-frame render completed in one pass (no chunk-rendering).
+
+## 5. The complete component
+
+The full, runnable component is `../assets/CesiumFlythrough.tsx` — read it directly. Its shape:
+
+- `loadCesium()` — inject `CESIUM_BASE_URL` + the CDN `Cesium.js`, resolve when loaded.
+- init effect — build the Viewer (§1), `setCamera(…, 0)`, `await settle(viewer)`, `continueRender`.
+- `settle(viewer)` — loop `viewer.render()` until `globe.tilesLoaded` for landscapes or
+ `tileset.tilesLoaded` for cities is stable for ~8 ticks (cap ~600).
+- per-frame effect — `delayRender({timeoutInMilliseconds: 60000})` → `setCamera(prog)` → `settle()` → `continueRender`.
+
+## 6. Render
+
+```bash
+bunx remotion still src/index.ts out.png --frame=N --gl=angle --timeout=180000 # validate framing/bank first
+bunx remotion render src/index.ts out.mp4 --gl=angle --concurrency=1 --timeout=180000
+```
+
+`--gl=angle` is mandatory. Use `--concurrency=1`; `settle()` already serializes tile loading.
diff --git a/remotion-best-practices/remotion-maps/techniques/cesium/references/3d-troubleshooting.md b/remotion-best-practices/remotion-maps/techniques/cesium/references/3d-troubleshooting.md
new file mode 100644
index 0000000..488eb9d
--- /dev/null
+++ b/remotion-best-practices/remotion-maps/techniques/cesium/references/3d-troubleshooting.md
@@ -0,0 +1,57 @@
+# 3D Flyover — troubleshooting
+
+## The headless dead-end (why we render through Remotion)
+
+Cesium's globe **will not draw in a standalone headless Playwright/Chromium** harness. Verified on
+Apple M4 (ANGLE Metal active, WebGL working): the skybox/stars render, but the globe surface produces
+**zero draw commands** (`scene.frameState.commandList.length === 0`), `globe.tilesLoaded` never goes
+true, and frames come back as the black starfield. No network failures; `sampleTerrainMostDetailed`
+succeeds (terrain data is reachable). Dead-ends tried, all failed:
+
+- default render loop, manual `scene.render()`, manual `viewer.render()`, headed mode (context-destroyed).
+
+**What works:** render Cesium **through Remotion** — same headless Chrome, but driven by Remotion's frame
+loop with these four non-negotiables:
+
+1. `useDefaultRenderLoop = false` — drive frames by hand.
+2. Per frame call **`viewer.render()`**, NOT `scene.render()`. `viewer.render()` does the full frame
+ (`initializeFrame` → tile streaming → render); `scene.render()` skips frame-init, so tiles never
+ advance and the globe never appears. **This is the single most important line.**
+3. `contextOptions: { webgl: { preserveDrawingBuffer: true } }` so Remotion's screenshot captures pixels.
+4. Gate init + every frame with `delayRender(…, {timeoutInMilliseconds})` — tile loading can exceed Remotion's
+ default; use 60–120 s.
+
+The standalone `flythrough.html` / `render.mjs` / `probe.mjs` from the original spike are kept only as the
+record of this dead-end. The canonical render path is the Remotion component
+(`../assets/CesiumFlythrough.tsx`).
+
+## Symptom → fix
+
+| Symptom | Cause | Fix |
+| --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- |
+| Frames are black with stars | Globe not drawing (headless Playwright, or `scene.render()` used) | Render through Remotion; use `viewer.render()`; `useDefaultRenderLoop=false`. |
+| Screenshots blank/transparent | No `preserveDrawingBuffer` | `contextOptions:{ webgl:{ preserveDrawingBuffer:true } }`. |
+| "delayRender timed out" | Cold tiles exceed the default | `delayRender(…, {timeoutInMilliseconds: 120000})` + `--timeout=180000`. |
+| Globe is a dark/navy sphere | Imagery layer didn't attach | `baseLayer:false` then `viewer.imageryLayers.addImageryProvider(...)`. |
+| High-pitch frame shows a void/starfield above the horizon | No atmosphere | `viewer.scene.skyAtmosphere.show = true`. |
+| 403 on tiles in headless | Domain-locked MapTiler key | Use an **unrestricted** key. |
+| Google root tileset returns 403 | Map Tiles API disabled, billing absent, wrong key, or application restriction blocks local headless rendering | Enable Map Tiles API and billing; restrict the key to that API while allowing the Remotion request. |
+| Google scene shows a duplicate/competing surface | MapTiler or the Cesium globe is still enabled | Do not add MapTiler; set `viewer.scene.globe.show=false`. |
+| Google mesh remains coarse | Screen-space error is too high or the capture starts before refinement | Lower `maximumScreenSpaceError`; settle on `tileset.tilesLoaded`. |
+| WebGL unavailable / software renderer | Missing GL flag | Render with `--gl=angle`. |
+| Camera looks at sky / ground, not terrain | Pitch sign / convention | Cesium pitch 0 = horizon, negative = down (inverse of MapLibre); `-(90 - PITCH_FROM_NADIR)`. |
+| Aim/turn-probe clamps near the end | Path too short | `PATHKM ≥ TRAVEL_KM + 2·LOOK_AHEAD_KM`; raise `WINDOW_KM` in prep. |
+| Path feels like straight-then-corner | Douglas-Peucker simplification | Use resample → moving-average smooth (see architecture §2), not `turf.simplify`. |
+| Camera bumps left and right instead of swerving | Sparse route vertices are still being followed as straight segments | Keep `pathSmoothingPasses={3}`; use sparse intentional control points and arc-length movement. |
+
+## Gotchas checklist
+
+- **`viewer.render()`, never `scene.render()`** per frame. The single biggest trap.
+- Cesium loads from **CDN**; set `window.CESIUM_BASE_URL` _before_ injecting the script.
+- `preserveDrawingBuffer: true` or screenshots are blank.
+- `delayRender` uses `timeoutInMilliseconds`; set it to at least 60,000.
+- Terrain: `baseLayer:false`, then add MapTiler imagery.
+- Google: no MapTiler, hide the globe, retain `showCreditsOnScreen:true`.
+- Always `skyAtmosphere.show = true`.
+- Validate the path's heading-delta probe and render one **still** (framing + bank) before the full mp4.
+- Cesium pitch/roll conventions are inverted vs MapLibre.
diff --git a/remotion-best-practices/remotion-maps/techniques/cesium/scripts/prep-cesium-path.mjs b/remotion-best-practices/remotion-maps/techniques/cesium/scripts/prep-cesium-path.mjs
new file mode 100644
index 0000000..dbb3f0f
--- /dev/null
+++ b/remotion-best-practices/remotion-maps/techniques/cesium/scripts/prep-cesium-path.mjs
@@ -0,0 +1,161 @@
+// Camera-path generator for the Cesium flythrough. Turns a river/route centerline GeoJSON into a LONG,
+// CONTINUOUSLY-curving camera path so the camera banks through smooth flowing curves (no
+// straight-then-corner). Method: clip → resample to even spacing → moving-average smooth (inherently
+// continuous curvature) → dampen lateral deviation toward the straight chord (dials swerve amplitude).
+// No Douglas-Peucker (that concentrates curvature at sparse control points → corners).
+//
+// RUN (out of the box, against the shipped sample):
+// node prep-cesium-path.mjs
+// → reads assets/sample-river.geojson (override: node prep-cesium-path.mjs )
+// → writes assets/cesium-path.json (then import that JSON in CesiumFlythrough.tsx, or copy it
+// into your Remotion project's src/geo/ and adjust the import)
+//
+// ADAPT for a new location: change START (a point ON your centerline where the corridor opens),
+// WINDOW_KM, and DAMP/SMOOTH below. Input must be a single LineString feature (features[0].geometry).
+
+import {readFileSync, writeFileSync, mkdirSync} from 'fs';
+import {dirname, resolve} from 'path';
+import {fileURLToPath} from 'url';
+
+const __dir = dirname(fileURLToPath(import.meta.url));
+const IN = process.argv[2] || resolve(__dir, '../assets/sample-river.geojson');
+const OUT = process.argv[3] || resolve(__dir, '../assets/cesium-path.json');
+const havKm = (a, b) => {
+ const R = 6371,
+ r = Math.PI / 180,
+ dLat = (b[1] - a[1]) * r,
+ dLng = (b[0] - a[0]) * r;
+ const h =
+ Math.sin(dLat / 2) ** 2 +
+ Math.cos(a[1] * r) * Math.cos(b[1] * r) * Math.sin(dLng / 2) ** 2;
+ return 2 * R * Math.asin(Math.sqrt(h));
+};
+
+const gorge = JSON.parse(readFileSync(IN, 'utf8')).features[0].geometry
+ .coordinates;
+
+// ADAPT: clip ~24 km of river from the reach where the flythrough opens. START must be a point ON the
+// centerline (the script snaps to the nearest vertex). The sample's opening is the Yarlung gorge:
+const START = [94.968, 29.757];
+let s0 = 0,
+ best = Infinity;
+gorge.forEach((p, i) => {
+ const d = havKm(p, START);
+ if (d < best) {
+ best = d;
+ s0 = i;
+ }
+});
+const WINDOW_KM = 30; // clip to ~end of gorge data; smoothing+dampening shrink it to the usable corridor
+const clip = [];
+for (let i = s0, acc = 0; i < gorge.length; i++) {
+ if (i > s0) acc += havKm(gorge[i - 1], gorge[i]);
+ if (acc > WINDOW_KM) break;
+ clip.push(gorge[i]);
+}
+
+// Resample to even arc-length spacing so curvature is distributed evenly along the path.
+const STEP_KM = 0.1;
+const resample = (coords) => {
+ const out = [coords[0].slice()];
+ let carry = 0,
+ from = coords[0];
+ for (let i = 1; i < coords.length; i++) {
+ let segLen = havKm(from, coords[i]);
+ while (carry + segLen >= STEP_KM) {
+ const t = (STEP_KM - carry) / segLen;
+ const np = [
+ from[0] + (coords[i][0] - from[0]) * t,
+ from[1] + (coords[i][1] - from[1]) * t,
+ ];
+ out.push(np);
+ from = np;
+ segLen = havKm(from, coords[i]);
+ carry = 0;
+ }
+ carry += segLen;
+ from = coords[i];
+ }
+ return out;
+};
+
+// Moving-average smoothing — inherently continuous (no kinks). Window in points; repeat for extra glass.
+const smoothMA = (coords, w, passes) => {
+ let c = coords;
+ for (let p = 0; p < passes; p++) {
+ c = c.map((_, i) => {
+ let sx = 0,
+ sy = 0,
+ n = 0;
+ for (
+ let j = Math.max(0, i - w);
+ j <= Math.min(c.length - 1, i + w);
+ j++
+ ) {
+ sx += c[j][0];
+ sy += c[j][1];
+ n++;
+ }
+ return [sx / n, sy / n];
+ });
+ }
+ return c;
+};
+
+const SMOOTH_W = 28; // ±2.8 km window — turns meanders into smooth flowing curves
+const SMOOTH_PASSES = 2;
+const DAMP = 0.45; // keep 45% of the (already-smooth) deviation → gentle, continuous swerve
+
+const even = resample(clip);
+const sm = smoothMA(even, SMOOTH_W, SMOOTH_PASSES);
+
+const lat0 = (sm[0][1] * Math.PI) / 180;
+const kx = 111.32 * Math.cos(lat0),
+ ky = 110.57;
+const toXY = (p) => [(p[0] - sm[0][0]) * kx, (p[1] - sm[0][1]) * ky];
+const toLL = (xy) => [sm[0][0] + xy[0] / kx, sm[0][1] + xy[1] / ky];
+const A = toXY(sm[0]),
+ B = toXY(sm[sm.length - 1]);
+const AB = [B[0] - A[0], B[1] - A[1]],
+ len2 = AB[0] ** 2 + AB[1] ** 2;
+const path = sm.map((p) => {
+ const P = toXY(p);
+ const t = ((P[0] - A[0]) * AB[0] + (P[1] - A[1]) * AB[1]) / len2;
+ const proj = [A[0] + t * AB[0], A[1] + t * AB[1]];
+ return toLL([
+ proj[0] + (P[0] - proj[0]) * DAMP,
+ proj[1] + (P[1] - proj[1]) * DAMP,
+ ]);
+});
+
+mkdirSync(dirname(OUT), {recursive: true});
+writeFileSync(OUT, JSON.stringify(path));
+
+let len = 0;
+for (let i = 1; i < path.length; i++) len += havKm(path[i - 1], path[i]);
+console.log(
+ `cesium-path: clip ${clip.length} → resample ${even.length} → smooth → ${path.length} pts · ${len.toFixed(1)} km`,
+);
+const bear = (a, b) => {
+ const r = Math.PI / 180;
+ const y = Math.sin((b[0] - a[0]) * r) * Math.cos(b[1] * r);
+ const x =
+ Math.cos(a[1] * r) * Math.sin(b[1] * r) -
+ Math.sin(a[1] * r) * Math.cos(b[1] * r) * Math.cos((b[0] - a[0]) * r);
+ return (Math.atan2(y, x) * 180) / Math.PI;
+};
+// heading sampled every ~1.5 km — should change gradually & continuously (no big jumps = no corners)
+const stepPts = Math.round(1.5 / STEP_KM);
+let prev = null,
+ hs = [];
+for (let i = 0; i + stepPts < path.length; i += stepPts) {
+ const h = bear(path[i], path[i + stepPts]);
+ if (prev !== null) {
+ let d = h - prev;
+ while (d > 180) d -= 360;
+ while (d < -180) d += 360;
+ hs.push(d.toFixed(0));
+ }
+ prev = h;
+}
+console.log(` heading deltas every 1.5km (deg): ${hs.join(', ')}`);
diff --git a/remotion-best-practices/remotion-maps/techniques/mapbox/TECHNIQUE.md b/remotion-best-practices/remotion-maps/techniques/mapbox/TECHNIQUE.md
new file mode 100644
index 0000000..5af3fe1
--- /dev/null
+++ b/remotion-best-practices/remotion-maps/techniques/mapbox/TECHNIQUE.md
@@ -0,0 +1,449 @@
+---
+name: maps-mapbox
+description: Make deterministic Remotion 2D map animations with Mapbox GL JS and Turf. Use when the user chooses Mapbox for animated routes, map markers, labels, camera movement, or Mapbox styles.
+metadata:
+ tags: map, map animation, mapbox, turf, geojson, route animation
+---
+
+Use Mapbox GL JS for rendering maps in Remotion when the user wants Mapbox styles or higher-fidelity map visuals and has a Mapbox access token. Use Turf for geospatial operations such as great-circle routes, distances, slicing lines, and positions along routes.
+
+Use this technique only when the user has a Mapbox access token and wants Mapbox styles or data.
+
+## Core rules
+
+- Prefer `@turf/turf` for geospatial work. Do not hand-roll distance, great-circle, route slicing, or coordinate interpolation unless the user explicitly needs a custom non-geodesic effect.
+- Use GeoJSON sources and Mapbox layers for lines, markers, and labels. Avoid DOM `Marker` elements unless the user specifically asks for HTML markers.
+- Keep the live map camera static by default. Before moving it on every frame, read [moving-map stability](references/render-stability.md). Prefer a fixed map plate for satellite imagery, hillshade, or a modest 2D reframe.
+- Use a live per-frame camera only after rendering a short MP4 and checking for shimmer. This 2D technique does not provide genuine terrain, pitch, bearing, or banking.
+- Disable non-deterministic map behavior: `interactive: false`, `fadeDuration: 0`.
+- Drive animation from `useCurrentFrame()`; do not use CSS transitions or browser-timed animation.
+- Use `delayRender()` / `continueRender()` around map loading and per-frame map updates.
+- Set `preserveDrawingBuffer: true` and render WebGL with `bunx remotion ... --gl=angle`.
+- Before continuing the initial render, add sources/layers, apply the frame-0 camera with `jumpTo()` or `setFreeCameraOptions()`, then wait for `idle`.
+- Do not add a `mapInstance.remove()` cleanup function; it can interfere with Remotion's render lifecycle.
+- Use Mapbox style URLs such as `mapbox://styles/mapbox/standard` or a user-provided custom style.
+- Do not install `@types/mapbox-gl`; Mapbox GL JS ships its own types.
+- Keep required provider attribution visible and verify current provider terms before rendering.
+- Record the source and effective date of custom or disputed geography.
+- Inspect rendered pixels, not only Studio playback, at every required aspect ratio.
+
+Coordinates in Mapbox, Turf, and GeoJSON are `[longitude, latitude]`.
+
+```ts
+const zurich: [number, number] = [8.5417, 47.3769];
+const newYork: [number, number] = [-74.006, 40.7128];
+```
+
+## Prerequisites
+
+Install Mapbox GL JS and Turf with the project's package manager.
+
+```bash
+npm i mapbox-gl @turf/turf
+```
+
+```bash
+bun i mapbox-gl @turf/turf
+```
+
+```bash
+yarn add mapbox-gl @turf/turf
+```
+
+```bash
+pnpm i mapbox-gl @turf/turf
+```
+
+Import the Mapbox CSS once in the component or an app-level stylesheet:
+
+```ts
+import 'mapbox-gl/dist/mapbox-gl.css';
+```
+
+Mapbox requires a public access token. Prefer passing it as an input prop or reading it from an environment variable that is available to the bundled Remotion code.
+
+```ts
+const mapboxAccessToken = process.env.REMOTION_MAPBOX_TOKEN;
+
+if (!mapboxAccessToken) {
+ throw new Error('Set REMOTION_MAPBOX_TOKEN to render Mapbox maps.');
+}
+```
+
+## Basic map example
+
+```tsx
+import {useEffect, useRef, useState} from 'react';
+import {AbsoluteFill, useDelayRender, useVideoConfig} from 'remotion';
+import mapboxgl from 'mapbox-gl';
+import 'mapbox-gl/dist/mapbox-gl.css';
+
+const zurich: [number, number] = [8.5417, 47.3769];
+
+const mapboxAccessToken = process.env.REMOTION_MAPBOX_TOKEN;
+
+if (!mapboxAccessToken) {
+ throw new Error('Set REMOTION_MAPBOX_TOKEN to render Mapbox maps.');
+}
+
+export const MyComposition = () => {
+ const containerRef = useRef(null);
+ const {delayRender, continueRender} = useDelayRender();
+ const {width, height} = useVideoConfig();
+ const [loadingHandle] = useState(() => delayRender('Loading Mapbox map'));
+
+ useEffect(() => {
+ if (!containerRef.current) {
+ return;
+ }
+
+ const mapInstance = new mapboxgl.Map({
+ accessToken: mapboxAccessToken,
+ container: containerRef.current,
+ style: 'mapbox://styles/mapbox/standard',
+ center: zurich,
+ zoom: 7,
+ interactive: false,
+ attributionControl: false,
+ fadeDuration: 0,
+ canvasContextAttributes: {
+ preserveDrawingBuffer: true,
+ },
+ });
+
+ mapInstance.on('load', () => {
+ mapInstance.jumpTo({center: zurich, zoom: 7});
+ mapInstance.once('idle', () => {
+ continueRender(loadingHandle);
+ });
+ });
+ }, [continueRender, loadingHandle]);
+
+ return (
+
+
+
+ );
+};
+```
+
+Animated examples should keep the loaded map in React state and skip per-frame updates until that state is set.
+
+## Animated flight route example
+
+This example shows the recommended pattern for route animations:
+
+- Turf creates the route and markers.
+- Turf slices the route for line reveal animation.
+- Mapbox renders the route with GeoJSON sources and layers.
+- The camera uses `jumpTo()` with animated center, zoom, bearing, and pitch.
+- Frame 0 is prepared before `continueRender()`.
+
+```tsx
+import * as turf from '@turf/turf';
+import {useEffect, useRef, useState} from 'react';
+import {
+ AbsoluteFill,
+ Easing,
+ interpolate,
+ useCurrentFrame,
+ useDelayRender,
+ useVideoConfig,
+} from 'remotion';
+import mapboxgl, {type GeoJSONSource, type Map} from 'mapbox-gl';
+import 'mapbox-gl/dist/mapbox-gl.css';
+
+const zurich: [number, number] = [8.5417, 47.3769];
+const newYork: [number, number] = [-74.006, 40.7128];
+
+const mapboxAccessToken = process.env.REMOTION_MAPBOX_TOKEN;
+
+if (!mapboxAccessToken) {
+ throw new Error('Set REMOTION_MAPBOX_TOKEN to render Mapbox maps.');
+}
+
+const greatCircleLine = (from: [number, number], to: [number, number]) => {
+ const route = turf.greatCircle(from, to, {npoints: 100});
+
+ if (route.geometry.type === 'LineString') {
+ return turf.lineString(route.geometry.coordinates);
+ }
+
+ // Great-circle routes crossing the antimeridian can become MultiLineString.
+ // Keep the example valid by choosing the longest segment.
+ const longestSegment = route.geometry.coordinates.reduce((longest, segment) => {
+ return segment.length > longest.length ? segment : longest;
+ });
+
+ return turf.lineString(longestSegment);
+};
+
+const targetRoute = greatCircleLine(zurich, newYork);
+const targetRouteDistance = turf.length(targetRoute);
+
+const cityMarkers = turf.featureCollection([
+ turf.point(zurich, {name: 'Zurich'}),
+ turf.point(newYork, {name: 'New York'}),
+]);
+
+const clampProgress = (progress: number) => Math.min(1, Math.max(0, progress));
+
+const distanceAlong = (totalDistance: number, progress: number) => {
+ // Keep the route non-empty at progress 0; Turf can error on zero-length slices.
+ return Math.max(0.001, totalDistance * clampProgress(progress));
+};
+
+const getPartialTargetRoute = (progress: number) => {
+ return turf.lineSliceAlong(
+ targetRoute,
+ 0,
+ distanceAlong(targetRouteDistance, progress),
+ );
+};
+
+const getCameraOptions = (progress: number) => {
+ const target = turf.along(
+ targetRoute,
+ distanceAlong(targetRouteDistance, progress),
+ ).geometry.coordinates as [number, number];
+
+ return {
+ center: target,
+ zoom: interpolate(progress, [0, 0.5, 1], [7, 2.4, 8], {
+ extrapolateLeft: 'clamp',
+ extrapolateRight: 'clamp',
+ easing: Easing.bezier(0.645, 0.045, 0.355, 1),
+ }),
+ bearing: interpolate(progress, [0, 1], [-20, 35], {
+ extrapolateLeft: 'clamp',
+ extrapolateRight: 'clamp',
+ }),
+ pitch: interpolate(progress, [0, 0.25, 0.75, 1], [25, 55, 55, 30], {
+ extrapolateLeft: 'clamp',
+ extrapolateRight: 'clamp',
+ easing: Easing.bezier(0.645, 0.045, 0.355, 1),
+ }),
+ };
+};
+
+export const MyComposition = () => {
+ const containerRef = useRef(null);
+ const frame = useCurrentFrame();
+ const {delayRender, continueRender} = useDelayRender();
+ const {durationInFrames, height, width} = useVideoConfig();
+ const [map, setMap] = useState(null);
+ const [loadingHandle] = useState(() => delayRender('Loading Mapbox map'));
+
+ useEffect(() => {
+ if (!containerRef.current) {
+ return;
+ }
+
+ const mapInstance = new mapboxgl.Map({
+ accessToken: mapboxAccessToken,
+ container: containerRef.current,
+ style: 'mapbox://styles/mapbox/standard',
+ center: zurich,
+ zoom: 7,
+ interactive: false,
+ attributionControl: false,
+ fadeDuration: 0,
+ canvasContextAttributes: {
+ preserveDrawingBuffer: true,
+ },
+ });
+
+ mapInstance.on('load', () => {
+ mapInstance.addSource('trace', {
+ type: 'geojson',
+ data: getPartialTargetRoute(0),
+ });
+
+ mapInstance.addLayer({
+ id: 'trace-line',
+ type: 'line',
+ source: 'trace',
+ layout: {
+ 'line-cap': 'round',
+ 'line-join': 'round',
+ },
+ paint: {
+ 'line-color': '#111111',
+ 'line-width': 7,
+ },
+ });
+
+ mapInstance.addSource('city-markers', {
+ type: 'geojson',
+ data: cityMarkers,
+ });
+
+ mapInstance.addLayer({
+ id: 'city-marker-dots',
+ type: 'circle',
+ source: 'city-markers',
+ paint: {
+ 'circle-color': '#f03b20',
+ 'circle-radius': 12,
+ 'circle-stroke-color': '#ffffff',
+ 'circle-stroke-width': 4,
+ },
+ });
+
+ mapInstance.addLayer({
+ id: 'city-marker-labels',
+ type: 'symbol',
+ source: 'city-markers',
+ layout: {
+ 'text-allow-overlap': true,
+ 'text-anchor': 'top',
+ 'text-field': ['get', 'name'],
+ 'text-offset': [0, 0.9],
+ 'text-size': 28,
+ },
+ paint: {
+ 'text-color': '#111111',
+ 'text-halo-color': '#ffffff',
+ 'text-halo-width': 3,
+ },
+ });
+
+ mapInstance.jumpTo(getCameraOptions(0));
+ mapInstance.once('idle', () => {
+ setMap(mapInstance);
+ continueRender(loadingHandle);
+ });
+ });
+ }, [continueRender, loadingHandle]);
+
+ useEffect(() => {
+ if (!map) {
+ return;
+ }
+
+ const handle = delayRender('Rendering Mapbox frame');
+ const timelineProgress = interpolate(frame, [0, durationInFrames - 1], [0, 1], {
+ extrapolateLeft: 'clamp',
+ extrapolateRight: 'clamp',
+ });
+ const travelProgress = interpolate(timelineProgress, [0.2, 0.82], [0, 1], {
+ extrapolateLeft: 'clamp',
+ extrapolateRight: 'clamp',
+ easing: Easing.bezier(0.645, 0.045, 0.355, 1),
+ });
+ const trace = map.getSource('trace') as GeoJSONSource | undefined;
+
+ trace?.setData(getPartialTargetRoute(travelProgress));
+ map.jumpTo(getCameraOptions(travelProgress));
+
+ map.once('idle', () => continueRender(handle));
+ // Force an idle event even if the camera parameters are unchanged from the previous frame.
+ map.triggerRepaint();
+ }, [continueRender, delayRender, durationInFrames, frame, map]);
+
+ return (
+
+
+
+ );
+};
+```
+
+## Camera guidance
+
+For a validated live-camera route animation, animate `center`, `zoom`, `bearing`, and `pitch` with `jumpTo()`:
+
+```ts
+map.jumpTo({
+ center,
+ zoom,
+ bearing,
+ pitch,
+});
+```
+
+Keep route progress and camera progress separate if the camera needs to lead, lag, zoom out, or zoom back in. For cinematic 3D camera moves, load the 3D flyover branch from the parent skill.
+
+## Lines
+
+Use GeoJSON sources for lines. Unless the user asks, do not add glow effects or extra decorative points.
+
+For geodesic flight routes, use Turf:
+
+```ts
+const line = greatCircleLine(start, end);
+const distance = turf.length(line);
+const partialLine = turf.lineSliceAlong(
+ line,
+ 0,
+ // Keep the route non-empty at progress 0.
+ Math.max(0.001, distance * progress),
+);
+```
+
+For a visually straight line on the map, use a simple GeoJSON `LineString` between the two points instead of `greatCircle()`.
+
+## Markers and labels
+
+Use map-native GeoJSON layers for markers and labels:
+
+```tsx
+mapInstance.addSource('markers', {
+ type: 'geojson',
+ data: turf.featureCollection([
+ turf.point([-118.2437, 34.0522], {name: 'Los Angeles'}),
+ ]),
+});
+
+mapInstance.addLayer({
+ id: 'marker-dots',
+ type: 'circle',
+ source: 'markers',
+ paint: {
+ 'circle-color': '#f03b20',
+ 'circle-radius': 12,
+ 'circle-stroke-color': '#ffffff',
+ 'circle-stroke-width': 4,
+ },
+});
+
+mapInstance.addLayer({
+ id: 'marker-labels',
+ type: 'symbol',
+ source: 'markers',
+ layout: {
+ 'text-allow-overlap': true,
+ 'text-anchor': 'top',
+ 'text-field': ['get', 'name'],
+ 'text-offset': [0, 0.9],
+ 'text-size': 28,
+ },
+ paint: {
+ 'text-color': '#111111',
+ 'text-halo-color': '#ffffff',
+ 'text-halo-width': 3,
+ },
+});
+```
+
+Make marker sizes and label font sizes large enough for the composition resolution.
+
+## Styles
+
+Default to Mapbox Standard:
+
+```ts
+style: 'mapbox://styles/mapbox/standard'
+```
+
+If the user requests another style, use any valid Mapbox style URL.
+
+## Rendering
+
+For WebGL map renders, prefer single concurrency and ANGLE:
+
+```bash
+bunx remotion render [composition-id] out/video.mp4 --gl=angle --concurrency=1
+```
+
+Use the equivalent package runner for the project. In npm projects, use `npx`; in Bun projects, use `bunx`.
diff --git a/remotion-best-practices/remotion-maps/techniques/mapbox/references/render-stability.md b/remotion-best-practices/remotion-maps/techniques/mapbox/references/render-stability.md
new file mode 100644
index 0000000..fc40033
--- /dev/null
+++ b/remotion-best-practices/remotion-maps/techniques/mapbox/references/render-stability.md
@@ -0,0 +1,64 @@
+# Moving Map Render Stability
+
+Read this reference before building a moving 2D MapTiler scene or diagnosing a wavering Remotion render.
+
+## Symptom and cause
+
+If basemap detail shimmers or jitters during a pan/zoom, the likely cause is per-frame `map.jumpTo()`.
+Headless MapTiler capture can resample both vector hillshade and satellite imagery differently frame to
+frame. Tile retries, easing changes, and label changes do not solve that renderer effect.
+
+## Required pattern: fixed map plate
+
+For any 2D pan/zoom:
+
+1. Render the MapTiler canvas once at the largest required zoom in an oversized container. Size it from the camera route and keep each dimension below the browser's reliable WebGL render-buffer limit (commonly 4096 px). Do **not** blindly use 3×: a 1920×1080 composition becomes 5760 px wide and Chromium may silently downsample it, causing visible pixelation during the CSS zoom.
+2. Keep the map's camera static.
+3. For each frame, calculate the approved target centre/zoom, then move the canvas with CSS `translate` + `scale`.
+4. Apply the same transform to every projected HTML overlay.
+5. Continue to animate GeoJSON data and paint properties imperatively; only the renderer camera is frozen.
+
+Keep pitch and bearing constant. Use a 3D engine such as Cesium for genuine changing pitch/bearing or a terrain flythrough.
+
+```ts
+const baseZoom = Math.max(start.zoom, end.zoom);
+const map = new maptilersdk.Map({
+ container,
+ style,
+ center: end.center,
+ zoom: baseZoom,
+ pitch: end.pitch ?? 0,
+ bearing: end.bearing ?? 0,
+ interactive: false,
+ fadeDuration: 0,
+ canvasContextAttributes: {preserveDrawingBuffer: true},
+});
+
+// Per Remotion frame. `camera` is the approved centre/zoom interpolation.
+const projected = map.project(camera.center);
+const scale = 2 ** (camera.zoom - baseZoom);
+const plate = {
+ transform: `translate(${width / 2 - projected.x * scale}px, ${height / 2 - projected.y * scale}px) scale(${scale})`,
+ transformOrigin: "0 0",
+};
+
+// Convert label projection with exactly the same plate transform.
+const labelX = labelPoint.x * scale + width / 2 - projected.x * scale;
+const labelY = labelPoint.y * scale + height / 2 - projected.y * scale;
+```
+
+### Plate sizing and sharpness
+
+- Render at the maximum zoom reached by **any** camera waypoint, including intermediate or hold cameras. The CSS scale should never exceed `1`; otherwise the plate is being enlarged.
+- Centre the frozen map on the midpoint of the camera route's geographic extent, not automatically on the final camera. This minimizes required overscan.
+- Keep the largest canvas dimension at or below 4096 px unless the actual render environment has been tested with a larger `MAX_RENDERBUFFER_SIZE`.
+- For 1920×1080, a 3840×2160 plate is a safe default. For 1080×1920, use approximately 2700×3840 when the route needs extra horizontal pan room.
+- If the route cannot fit within that plate at the required zoom, split the shot into two fixed plates with a deliberate editorial transition. Do not trade sharpness for one enormous canvas.
+- Distinguish failure modes: repeating shimmer means the live renderer is moving; steadily soft tiles during a CSS push means the fixed plate is underspecified, internally downsampled, or being scaled above `1`.
+
+## Verification
+
+- Render a short MP4, not only a Studio preview.
+- Inspect static terrain texture and satellite detail while the camera moves.
+- If any underlying map detail wavers, use the fixed map plate. Do not approve it as a minor preview artefact.
+- Render WebGL with `--gl=angle`, `preserveDrawingBuffer:true`, and conservative concurrency (`1`) while validating.
diff --git a/remotion-best-practices/remotion-maps/techniques/maplibre/TECHNIQUE.md b/remotion-best-practices/remotion-maps/techniques/maplibre/TECHNIQUE.md
new file mode 100644
index 0000000..94ef160
--- /dev/null
+++ b/remotion-best-practices/remotion-maps/techniques/maplibre/TECHNIQUE.md
@@ -0,0 +1,484 @@
+---
+name: maps-maplibre
+description: Make deterministic Remotion 2D map animations with MapLibre GL JS and Turf. Use when the user chooses MapLibre for animated routes, map markers, labels, and camera movement.
+metadata:
+ tags: map, map animation, maplibre, turf, geojson, route animation
+---
+
+Use MapLibre GL JS for rendering maps in Remotion. Use Turf for geospatial operations such as great-circle routes, distances, slicing lines, and positions along routes.
+
+## Core rules
+
+- Prefer `@turf/turf` for geospatial work. Do not hand-roll distance, great-circle, route slicing, or coordinate interpolation unless the user explicitly needs a custom non-geodesic effect.
+- Use GeoJSON sources and MapLibre layers for lines, markers, and labels. Avoid DOM `Marker` elements unless the user specifically asks for HTML markers.
+- Keep the live map camera static by default. Before moving it on every frame, read [moving-map stability](references/render-stability.md). Prefer a fixed map plate for satellite imagery, hillshade, or a modest 2D reframe.
+- Use a live per-frame camera only after rendering a short MP4 and checking for shimmer. This 2D technique does not provide genuine terrain, pitch, bearing, or banking.
+- Disable non-deterministic map behavior: `interactive: false`, `fadeDuration: 0`.
+- Drive animation from `useCurrentFrame()`; do not use CSS transitions or browser-timed animation.
+- Use `delayRender()` / `continueRender()` around map loading and per-frame map updates.
+- Set `preserveDrawingBuffer: true` and render WebGL with `bunx remotion ... --gl=angle`.
+- Before continuing the initial render, add sources/layers, apply the frame-0 camera with `jumpTo()`, then wait for `idle`.
+- Do not add a `mapInstance.remove()` cleanup function; it can interfere with Remotion's render lifecycle.
+- Use standard MapLibre style JSON URLs and layer/source APIs.
+- Do not install `@types/maplibre-gl`; MapLibre ships its own types.
+- Keep required provider attribution visible and verify the current terms of the chosen style and tile providers before rendering.
+- Record the source and effective date of custom or disputed geography.
+- Inspect rendered pixels, not only Studio playback, at every required aspect ratio.
+
+Coordinates in MapLibre, Turf, and GeoJSON are `[longitude, latitude]`.
+
+```ts
+const zurich: [number, number] = [8.5417, 47.3769];
+const newYork: [number, number] = [-74.006, 40.7128];
+```
+
+## Prerequisites
+
+Install MapLibre and Turf with the project's package manager.
+
+```bash
+npm i maplibre-gl @turf/turf
+```
+
+```bash
+bun i maplibre-gl @turf/turf
+```
+
+```bash
+yarn add maplibre-gl @turf/turf
+```
+
+```bash
+pnpm i maplibre-gl @turf/turf
+```
+
+Import the MapLibre CSS once in the component or an app-level stylesheet:
+
+```ts
+import 'maplibre-gl/dist/maplibre-gl.css';
+```
+
+## Basic map example
+
+```tsx
+import {useEffect, useRef, useState} from 'react';
+import {AbsoluteFill, useDelayRender, useVideoConfig} from 'remotion';
+import * as maplibregl from 'maplibre-gl';
+import 'maplibre-gl/dist/maplibre-gl.css';
+
+const zurich: [number, number] = [8.5417, 47.3769];
+
+export const MyComposition = () => {
+ const containerRef = useRef(null);
+ const {delayRender, continueRender} = useDelayRender();
+ const {width, height} = useVideoConfig();
+ const [loadingHandle] = useState(() => delayRender('Loading map'));
+
+ useEffect(() => {
+ if (!containerRef.current) {
+ return;
+ }
+
+ maplibregl.setWorkerUrl(
+ URL.createObjectURL(
+ new Blob(
+ [`import "https://unpkg.com/maplibre-gl@${maplibregl.getVersion()}/dist/maplibre-gl-worker.mjs";`],
+ {type: 'text/javascript'},
+ ),
+ ),
+ );
+
+ const mapInstance = new maplibregl.Map({
+ container: containerRef.current,
+ style: 'https://demotiles.maplibre.org/style.json',
+ center: zurich,
+ zoom: 7,
+ interactive: false,
+ attributionControl: false,
+ fadeDuration: 0,
+ canvasContextAttributes: {
+ preserveDrawingBuffer: true,
+ },
+ });
+
+ mapInstance.on('load', () => {
+ mapInstance.jumpTo({center: zurich, zoom: 7});
+ mapInstance.once('idle', () => {
+ continueRender(loadingHandle);
+ });
+ });
+ }, [continueRender, loadingHandle]);
+
+ return (
+
+
+
+ );
+};
+```
+
+Animated examples should keep the loaded map in React state and skip per-frame updates until that state is set.
+
+## Animated flight route example
+
+This example shows the recommended pattern for route animations:
+
+- Turf creates the route and markers.
+- Turf slices the route for line reveal animation.
+- The camera has a separate route from the target route.
+- MapLibre's `calculateCameraOptionsFromTo()` is used for camera movement.
+- Frame 0 is prepared before `continueRender()`.
+
+```tsx
+import * as turf from '@turf/turf';
+import {useEffect, useRef, useState} from 'react';
+import {
+ AbsoluteFill,
+ Easing,
+ interpolate,
+ useCurrentFrame,
+ useDelayRender,
+ useVideoConfig,
+} from 'remotion';
+import * as maplibregl from 'maplibre-gl';
+import {type GeoJSONSource, type Map} from 'maplibre-gl';
+import 'maplibre-gl/dist/maplibre-gl.css';
+
+const zurich: [number, number] = [8.5417, 47.3769];
+const newYork: [number, number] = [-74.006, 40.7128];
+
+const greatCircleLine = (from: [number, number], to: [number, number]) => {
+ const route = turf.greatCircle(from, to, {npoints: 100});
+
+ if (route.geometry.type === 'LineString') {
+ return turf.lineString(route.geometry.coordinates);
+ }
+
+ // Great-circle routes crossing the antimeridian can become MultiLineString.
+ // Keep the example valid by choosing the longest segment.
+ const longestSegment = route.geometry.coordinates.reduce((longest, segment) => {
+ return segment.length > longest.length ? segment : longest;
+ });
+
+ return turf.lineString(longestSegment);
+};
+
+const targetRoute = greatCircleLine(zurich, newYork);
+const targetRouteDistance = turf.length(targetRoute);
+
+const cameraRoute = greatCircleLine(zurich, newYork);
+const cameraRouteDistance = turf.length(cameraRoute);
+
+const cityMarkers = turf.featureCollection([
+ turf.point(zurich, {name: 'Zurich'}),
+ turf.point(newYork, {name: 'New York'}),
+]);
+
+const clampProgress = (progress: number) => Math.min(1, Math.max(0, progress));
+
+const distanceAlong = (totalDistance: number, progress: number) => {
+ // Keep the route non-empty at progress 0; Turf can error on zero-length slices.
+ return Math.max(0.001, totalDistance * clampProgress(progress));
+};
+
+const getPartialTargetRoute = (progress: number) => {
+ return turf.lineSliceAlong(
+ targetRoute,
+ 0,
+ distanceAlong(targetRouteDistance, progress),
+ );
+};
+
+const getCameraOptions = (
+ map: Map,
+ progress: number,
+ cameraAltitudeMeters: number,
+ cameraLatitudeOffset: number,
+) => {
+ const target = turf.along(
+ targetRoute,
+ distanceAlong(targetRouteDistance, progress),
+ ).geometry.coordinates;
+ const camera = turf.along(
+ cameraRoute,
+ distanceAlong(cameraRouteDistance, progress),
+ ).geometry.coordinates;
+
+ return map.calculateCameraOptionsFromTo(
+ new maplibregl.LngLat(camera[0], camera[1] - cameraLatitudeOffset),
+ cameraAltitudeMeters,
+ new maplibregl.LngLat(target[0], target[1]),
+ );
+};
+
+export const MyComposition = () => {
+ const containerRef = useRef(null);
+ const frame = useCurrentFrame();
+ const {delayRender, continueRender} = useDelayRender();
+ const {durationInFrames, height, width} = useVideoConfig();
+ const [map, setMap] = useState(null);
+ const [loadingHandle] = useState(() => delayRender('Loading MapLibre map'));
+
+ useEffect(() => {
+ if (!containerRef.current) {
+ return;
+ }
+
+ maplibregl.setWorkerUrl(
+ URL.createObjectURL(
+ new Blob(
+ [`import "https://unpkg.com/maplibre-gl@${maplibregl.getVersion()}/dist/maplibre-gl-worker.mjs";`],
+ {type: 'text/javascript'},
+ ),
+ ),
+ );
+
+ const mapInstance = new maplibregl.Map({
+ container: containerRef.current,
+ style: 'https://demotiles.maplibre.org/style.json',
+ center: zurich,
+ zoom: 7,
+ interactive: false,
+ attributionControl: false,
+ fadeDuration: 0,
+ canvasContextAttributes: {
+ preserveDrawingBuffer: true,
+ },
+ });
+
+ mapInstance.on('load', () => {
+ mapInstance.addSource('trace', {
+ type: 'geojson',
+ data: getPartialTargetRoute(0),
+ });
+
+ mapInstance.addLayer({
+ id: 'trace-line',
+ type: 'line',
+ source: 'trace',
+ layout: {
+ 'line-cap': 'round',
+ 'line-join': 'round',
+ },
+ paint: {
+ 'line-color': '#111111',
+ 'line-width': 7,
+ },
+ });
+
+ mapInstance.addSource('city-markers', {
+ type: 'geojson',
+ data: cityMarkers,
+ });
+
+ mapInstance.addLayer({
+ id: 'city-marker-dots',
+ type: 'circle',
+ source: 'city-markers',
+ paint: {
+ 'circle-color': '#f03b20',
+ 'circle-radius': 12,
+ 'circle-stroke-color': '#ffffff',
+ 'circle-stroke-width': 4,
+ },
+ });
+
+ mapInstance.addLayer({
+ id: 'city-marker-labels',
+ type: 'symbol',
+ source: 'city-markers',
+ layout: {
+ 'text-allow-overlap': true,
+ 'text-anchor': 'top',
+ 'text-field': ['get', 'name'],
+ 'text-offset': [0, 0.9],
+ 'text-size': 28,
+ },
+ paint: {
+ 'text-color': '#111111',
+ 'text-halo-color': '#ffffff',
+ 'text-halo-width': 3,
+ },
+ });
+
+ mapInstance.jumpTo(getCameraOptions(mapInstance, 0, 180000, 1.1));
+ mapInstance.once('idle', () => {
+ setMap(mapInstance);
+ continueRender(loadingHandle);
+ });
+ });
+ }, [continueRender, loadingHandle]);
+
+ useEffect(() => {
+ if (!map) {
+ return;
+ }
+
+ const handle = delayRender('Rendering MapLibre frame');
+ const timelineProgress = interpolate(frame, [0, durationInFrames - 1], [0, 1], {
+ extrapolateLeft: 'clamp',
+ extrapolateRight: 'clamp',
+ });
+ const travelProgress = interpolate(timelineProgress, [0.2, 0.82], [0, 1], {
+ extrapolateLeft: 'clamp',
+ extrapolateRight: 'clamp',
+ easing: Easing.bezier(0.645, 0.045, 0.355, 1),
+ });
+ const cameraAltitudeMeters = interpolate(
+ timelineProgress,
+ [0, 0.28, 0.74, 1],
+ [180000, 2200000, 2200000, 180000],
+ {
+ extrapolateLeft: 'clamp',
+ extrapolateRight: 'clamp',
+ easing: Easing.bezier(0.645, 0.045, 0.355, 1),
+ },
+ );
+ const cameraLatitudeOffset = interpolate(
+ timelineProgress,
+ [0, 0.28, 0.74, 1],
+ [1.1, 8, 8, 1.1],
+ {
+ extrapolateLeft: 'clamp',
+ extrapolateRight: 'clamp',
+ easing: Easing.bezier(0.645, 0.045, 0.355, 1),
+ },
+ );
+ const trace = map.getSource('trace') as GeoJSONSource | undefined;
+
+ trace?.setData(getPartialTargetRoute(travelProgress));
+ map.jumpTo(
+ getCameraOptions(
+ map,
+ travelProgress,
+ cameraAltitudeMeters,
+ cameraLatitudeOffset,
+ ),
+ );
+
+ map.once('idle', () => continueRender(handle));
+ // Force an idle event even if the camera parameters are unchanged from the previous frame.
+ map.triggerRepaint();
+ }, [continueRender, delayRender, durationInFrames, frame, map]);
+
+ return (
+
+
+
+ );
+};
+```
+
+## Camera guidance
+
+Use MapLibre's camera helper for camera movement:
+
+```ts
+map.calculateCameraOptionsFromTo(cameraLngLat, cameraAltitudeMeters, targetLngLat);
+```
+
+A good pattern is to keep two concepts separate:
+
+- `targetRoute`: where the animated line is and where the camera looks.
+- `cameraRoute`: where the camera moves.
+
+Then use Turf to read positions from both routes for the same progress value:
+
+```ts
+const target = turf.along(targetRoute, targetDistance * progress).geometry.coordinates;
+const camera = turf.along(cameraRoute, cameraDistance * progress).geometry.coordinates;
+
+map.jumpTo(
+ map.calculateCameraOptionsFromTo(
+ new maplibregl.LngLat(camera[0], camera[1]),
+ cameraAltitudeMeters,
+ new maplibregl.LngLat(target[0], target[1]),
+ ),
+);
+```
+
+For zoom-out / travel / zoom-in animations, animate travel progress separately from camera altitude. Camera altitude is measured in meters. This avoids heavy custom camera math.
+
+## Lines
+
+Use GeoJSON sources for lines. Unless the user asks, do not add glow effects or extra decorative points.
+
+For geodesic flight routes, use Turf:
+
+```ts
+const line = greatCircleLine(start, end);
+const distance = turf.length(line);
+const partialLine = turf.lineSliceAlong(
+ line,
+ 0,
+ // Keep the route non-empty at progress 0.
+ Math.max(0.001, distance * progress),
+);
+```
+
+For a visually straight line on the map, use a simple GeoJSON `LineString` between the two points instead of `greatCircle()`.
+
+## Markers and labels
+
+Use map-native GeoJSON layers for markers and labels:
+
+```tsx
+mapInstance.addSource('markers', {
+ type: 'geojson',
+ data: turf.featureCollection([
+ turf.point([-118.2437, 34.0522], {name: 'Los Angeles'}),
+ ]),
+});
+
+mapInstance.addLayer({
+ id: 'marker-dots',
+ type: 'circle',
+ source: 'markers',
+ paint: {
+ 'circle-color': '#f03b20',
+ 'circle-radius': 12,
+ 'circle-stroke-color': '#ffffff',
+ 'circle-stroke-width': 4,
+ },
+});
+
+mapInstance.addLayer({
+ id: 'marker-labels',
+ type: 'symbol',
+ source: 'markers',
+ layout: {
+ 'text-allow-overlap': true,
+ 'text-anchor': 'top',
+ 'text-field': ['get', 'name'],
+ 'text-offset': [0, 0.9],
+ 'text-size': 28,
+ },
+ paint: {
+ 'text-color': '#111111',
+ 'text-halo-color': '#ffffff',
+ 'text-halo-width': 3,
+ },
+});
+```
+
+Make marker sizes and label font sizes large enough for the composition resolution.
+
+## Styles
+
+Default to the stock MapLibre demo style:
+
+```ts
+style: 'https://demotiles.maplibre.org/style.json'
+```
+
+If the user requests another style, use any valid MapLibre style JSON URL.
+
+## Rendering
+
+For WebGL map renders, prefer single concurrency and ANGLE:
+
+```bash
+bunx remotion render [composition-id] out/video.mp4 --gl=angle --concurrency=1
+```
+
+Use the equivalent package runner for the project. In npm projects, use `npx`; in Bun projects, use `bunx`.
diff --git a/remotion-best-practices/remotion-maps/techniques/maplibre/references/render-stability.md b/remotion-best-practices/remotion-maps/techniques/maplibre/references/render-stability.md
new file mode 100644
index 0000000..fc40033
--- /dev/null
+++ b/remotion-best-practices/remotion-maps/techniques/maplibre/references/render-stability.md
@@ -0,0 +1,64 @@
+# Moving Map Render Stability
+
+Read this reference before building a moving 2D MapTiler scene or diagnosing a wavering Remotion render.
+
+## Symptom and cause
+
+If basemap detail shimmers or jitters during a pan/zoom, the likely cause is per-frame `map.jumpTo()`.
+Headless MapTiler capture can resample both vector hillshade and satellite imagery differently frame to
+frame. Tile retries, easing changes, and label changes do not solve that renderer effect.
+
+## Required pattern: fixed map plate
+
+For any 2D pan/zoom:
+
+1. Render the MapTiler canvas once at the largest required zoom in an oversized container. Size it from the camera route and keep each dimension below the browser's reliable WebGL render-buffer limit (commonly 4096 px). Do **not** blindly use 3×: a 1920×1080 composition becomes 5760 px wide and Chromium may silently downsample it, causing visible pixelation during the CSS zoom.
+2. Keep the map's camera static.
+3. For each frame, calculate the approved target centre/zoom, then move the canvas with CSS `translate` + `scale`.
+4. Apply the same transform to every projected HTML overlay.
+5. Continue to animate GeoJSON data and paint properties imperatively; only the renderer camera is frozen.
+
+Keep pitch and bearing constant. Use a 3D engine such as Cesium for genuine changing pitch/bearing or a terrain flythrough.
+
+```ts
+const baseZoom = Math.max(start.zoom, end.zoom);
+const map = new maptilersdk.Map({
+ container,
+ style,
+ center: end.center,
+ zoom: baseZoom,
+ pitch: end.pitch ?? 0,
+ bearing: end.bearing ?? 0,
+ interactive: false,
+ fadeDuration: 0,
+ canvasContextAttributes: {preserveDrawingBuffer: true},
+});
+
+// Per Remotion frame. `camera` is the approved centre/zoom interpolation.
+const projected = map.project(camera.center);
+const scale = 2 ** (camera.zoom - baseZoom);
+const plate = {
+ transform: `translate(${width / 2 - projected.x * scale}px, ${height / 2 - projected.y * scale}px) scale(${scale})`,
+ transformOrigin: "0 0",
+};
+
+// Convert label projection with exactly the same plate transform.
+const labelX = labelPoint.x * scale + width / 2 - projected.x * scale;
+const labelY = labelPoint.y * scale + height / 2 - projected.y * scale;
+```
+
+### Plate sizing and sharpness
+
+- Render at the maximum zoom reached by **any** camera waypoint, including intermediate or hold cameras. The CSS scale should never exceed `1`; otherwise the plate is being enlarged.
+- Centre the frozen map on the midpoint of the camera route's geographic extent, not automatically on the final camera. This minimizes required overscan.
+- Keep the largest canvas dimension at or below 4096 px unless the actual render environment has been tested with a larger `MAX_RENDERBUFFER_SIZE`.
+- For 1920×1080, a 3840×2160 plate is a safe default. For 1080×1920, use approximately 2700×3840 when the route needs extra horizontal pan room.
+- If the route cannot fit within that plate at the required zoom, split the shot into two fixed plates with a deliberate editorial transition. Do not trade sharpness for one enormous canvas.
+- Distinguish failure modes: repeating shimmer means the live renderer is moving; steadily soft tiles during a CSS push means the fixed plate is underspecified, internally downsampled, or being scaled above `1`.
+
+## Verification
+
+- Render a short MP4, not only a Studio preview.
+- Inspect static terrain texture and satellite detail while the camera moves.
+- If any underlying map detail wavers, use the fixed map plate. Do not approve it as a minor preview artefact.
+- Render WebGL with `--gl=angle`, `preserveDrawingBuffer:true`, and conservative concurrency (`1`) while validating.
diff --git a/remotion-best-practices/remotion-maps/techniques/maptiler/TECHNIQUE.md b/remotion-best-practices/remotion-maps/techniques/maptiler/TECHNIQUE.md
new file mode 100644
index 0000000..d358791
--- /dev/null
+++ b/remotion-best-practices/remotion-maps/techniques/maptiler/TECHNIQUE.md
@@ -0,0 +1,80 @@
+# MapTiler maps in Remotion
+
+MapTiler is a good solution for map animations where geographics features should be drawn as annotations on top of the map: Country borders, rivers, labels for POIs.
+
+## MapTiler SDK (`@maptiler/sdk`)
+
+Draw the basemap plus MapTiler Planet vector layers and custom GeoJSON into a WebGL canvas. Default styled-vector starting point: `MapStyle.BASIC`; satellite is an equally valid choice.
+
+## Remotion
+
+Imperatively update `setData`/`setPaintProperty`.
+
+Use `jumpTo` only for a static shot, or a fixed map plate for any pan/zoom.
+Gate with [`delayRender`](https://www.remotion.dev/docs/delay-render.md) until `map.once('idle')`.
+
+Use `preserveDrawingBuffer:true`.
+
+Render labels as positioned [``](https://www.remotion.dev/docs/interactive.md) elements.
+
+Env `REMOTION_MAPTILER_KEY` (unrestricted). Init the map once (ref guard); update imperatively per frame.
+
+When constructing MapLibre/MapTiler layer objects, omit optional properties that are absent.
+In particular, use `...(layer.filter ? {filter: layer.filter} : {})`; do not pass `filter: undefined`. An undefined filter can suppress the layer while separately created halo or border layers continue rendering, producing missing country fills and dark marker halos with no coloured cores.
+
+Drive animation from `useCurrentFrame()` rather than CSS transitions or browser timers.
+
+## Choose the source for each map element
+
+Do not begin by manufacturing GeoJSON. First check whether MapTiler Planet already exposes the element as filtered vector data.
+
+### MapTiler vector
+
+Use it when the feature exists in a provider `source-layer`, its attributes support an exact filter, and provider geometry is editorially acceptable.
+
+### Hybrid
+
+Use it when ordinary geographic context can come from MapTiler while the claim depends on custom
+evidence.
+
+Animate each layer according to its source and meaning.
+
+MapTiler vector features remain split across tiles. Do not use them for a semantic start-to-end line draw; extract, verify, order, and bake that element to GeoJSON first. Read **`references/map-data-sources.md`** and reuse **`assets/MapTilerVectorElement.ts`** for provider-layer setup and per-frame paint updates.
+
+## Motion stability
+
+**Do not call `map.jumpTo()` on every Remotion frame when the camera moves.** In headless capture it can make both MapTiler hillshade **and satellite imagery** shimmer/jitter, even when the source tiles load correctly. This is renderer resampling, not a data, network, or label problem.
+
+For the implementation, read **`references/render-stability.md`** before building or debugging any moving map. It contains the fixed-map-plate recipe, diagnostics, and render checks.
+
+- Use the live MapTiler camera only for a static shot.
+- Keep pitch and bearing constant for a fixed plate. This technique does not implement a genuine changing 3D camera.
+- Verify the moving preview and a short rendered MP4 before approving a beat. If any basemap detail wavers, switch to the fixed-plate pattern; do not try to solve it with tile retries or camera easing.
+
+## Drawing rivers
+
+Use `turf.lineSliceAlong(line, 0, lineKm*reveal)` to draw rivers.
+
+## Source selection
+
+Use MapTiler vector layers for suitable provider features and custom GeoJSON for story-specific or ordered geometry. If the beat needs country-entry triggers or a progressive line draw, run `scripts/prep-geo.mjs` to bake `country-meta.json`, `borders.geojson`, and the ordered line. Details → `references/map-data-sources.md` and `references/map-geo-prep.md`.
+
+## Keep it minmal
+
+Strip clutter on `load`: remove `symbol` layers (place labels) and `/other border/i` (admin-1 inner borders); hide the logo via CSS. Keep country + disputed borders.
+
+## Files
+
+Use as reference:
+
+- `assets/RiverReveal.tsx` — the main component.
+- `assets/MapTilerVectorElement.ts` — filtered MapTiler Planet elements.
+- `assets/CountryLabel.tsx` — reusable example label.
+- `assets/tokens.ts` — example palette and durations.
+- `assets/example-Root.tsx` — minimal composition scaffold.
+- `assets/sample-data/` — example route and generated country metadata.
+- `scripts/prep-geo.mjs` — geo pipeline.
+- `references/map-explainer-architecture.md` — timing model and implementation.
+- `references/map-data-sources.md` — provider vector versus custom GeoJSON selection.
+- `references/map-geo-prep.md` — basemap stripping and geo preparation.
+- `references/render-stability.md` — camera motion and stable headless renders.
diff --git a/remotion-best-practices/remotion-maps/techniques/maptiler/assets/CountryLabel.tsx b/remotion-best-practices/remotion-maps/techniques/maptiler/assets/CountryLabel.tsx
new file mode 100644
index 0000000..3e4b887
--- /dev/null
+++ b/remotion-best-practices/remotion-maps/techniques/maptiler/assets/CountryLabel.tsx
@@ -0,0 +1,70 @@
+import React from 'react';
+import {Easing, interpolate} from 'remotion';
+
+// Reusable country label. Supply typography and final values from the consuming project; the CSS custom
+// properties below provide neutral fallbacks. Positioned by its centre (x,y in screen px).
+export const CountryLabel: React.FC<{
+ name: string;
+ color: string;
+ reveal: number;
+ x: number;
+ y: number;
+}> = ({name, color, reveal, x, y}) => {
+ const e = interpolate(reveal, [0, 1], [0, 1], {
+ extrapolateLeft: 'clamp',
+ extrapolateRight: 'clamp',
+ easing: Easing.bezier(0.3333333333333333, 1, 0.6666666666666666, 1),
+ });
+ return (
+
+
+ {/* accent rule — draws out from the centre in the country's colour */}
+
+
+ {name}
+
+
+
+ );
+};
diff --git a/remotion-best-practices/remotion-maps/techniques/maptiler/assets/MapTilerVectorElement.ts b/remotion-best-practices/remotion-maps/techniques/maptiler/assets/MapTilerVectorElement.ts
new file mode 100644
index 0000000..9d91691
--- /dev/null
+++ b/remotion-best-practices/remotion-maps/techniques/maptiler/assets/MapTilerVectorElement.ts
@@ -0,0 +1,80 @@
+// Surface an existing MapTiler Planet feature without maintaining duplicate GeoJSON.
+// Paint animation is deterministic; geometry slicing is not. For a source-to-end line draw,
+// bake the selected feature to ordered GeoJSON and use RiverReveal.tsx instead.
+
+type VectorLayerType = 'fill' | 'line' | 'circle' | 'symbol';
+
+export type MapTilerVectorElement = {
+ id: string;
+ sourceLayer: string;
+ type: VectorLayerType;
+ filter?: unknown[];
+ minzoom?: number;
+ maxzoom?: number;
+ layout?: Record;
+ paint: Record;
+};
+
+const SOURCE_ID = 'maptiler-planet';
+
+export const addMapTilerVectorElement = (
+ map: any,
+ apiKey: string,
+ element: MapTilerVectorElement,
+ beforeId?: string,
+) => {
+ if (!map.getSource(SOURCE_ID)) {
+ map.addSource(SOURCE_ID, {
+ type: 'vector',
+ url: `https://api.maptiler.com/tiles/v3/tiles.json?key=${apiKey}`,
+ });
+ }
+
+ if (map.getLayer(element.id)) return;
+
+ map.addLayer(
+ {
+ id: element.id,
+ type: element.type,
+ source: SOURCE_ID,
+ 'source-layer': element.sourceLayer,
+ ...(element.filter ? {filter: element.filter} : {}),
+ ...(element.minzoom === undefined ? {} : {minzoom: element.minzoom}),
+ ...(element.maxzoom === undefined ? {} : {maxzoom: element.maxzoom}),
+ ...(element.layout ? {layout: element.layout} : {}),
+ paint: element.paint,
+ },
+ beforeId,
+ );
+};
+
+export const setVectorElementPaint = (
+ map: any,
+ layerId: string,
+ paint: Record,
+) => {
+ for (const [property, value] of Object.entries(paint)) {
+ map.setPaintProperty(layerId, property, value);
+ }
+};
+
+// Example:
+//
+// addMapTilerVectorElement(map, process.env.REMOTION_MAPTILER_KEY!, {
+// id: "story-river",
+// sourceLayer: "waterway",
+// type: "line",
+// filter: [
+// "all",
+// ["==", ["get", "class"], "river"],
+// ["==", ["coalesce", ["get", "name_en"], ["get", "name"]], "Yarlung Tsangpo"],
+// ],
+// layout: {"line-cap": "round", "line-join": "round"},
+// paint: {"line-color": "#E8F7FF", "line-width": 3, "line-opacity": 0},
+// });
+//
+// Per Remotion frame:
+// setVectorElementPaint(map, "story-river", {
+// "line-opacity": reveal,
+// "line-width": 2 + reveal * 2,
+// });
diff --git a/remotion-best-practices/remotion-maps/techniques/maptiler/assets/RiverReveal.tsx b/remotion-best-practices/remotion-maps/techniques/maptiler/assets/RiverReveal.tsx
new file mode 100644
index 0000000..a0ade54
--- /dev/null
+++ b/remotion-best-practices/remotion-maps/techniques/maptiler/assets/RiverReveal.tsx
@@ -0,0 +1,363 @@
+import * as maptilersdk from '@maptiler/sdk';
+import * as turf from '@turf/turf';
+import React, {useEffect, useRef, useState} from 'react';
+import '@maptiler/sdk/dist/maptiler-sdk.css';
+import {
+ AbsoluteFill,
+ Easing,
+ continueRender,
+ delayRender,
+ interpolate,
+ useCurrentFrame,
+ useVideoConfig,
+} from 'remotion';
+import {CountryLabel} from './CountryLabel';
+import countryMeta from './sample-data/country-meta.json';
+import flowCoords from './sample-data/yarlung-flow.json';
+import {COLORS, COUNTRY, COUNTRY_DARK, FILL_OPACITY} from './tokens';
+
+// Sample route reveal. Replace the imported sample geometry, names, timing, and visual tokens in the
+// consuming production. The renderer stays static; approved centre/zoom motion is a CSS plate transform.
+
+maptilersdk.config.apiKey = process.env.REMOTION_MAPTILER_KEY as string;
+
+const line = turf.lineString(flowCoords as [number, number][]);
+const lineKm = turf.length(line);
+
+const START = {
+ center: [89.6, 27.7] as [number, number],
+ zoom: 4.75,
+ pitch: 0,
+ bearing: 0,
+};
+const END = {
+ center: [90.2, 27.0] as [number, number],
+ zoom: 5.05,
+ pitch: 0,
+ bearing: 0,
+};
+const lerp = (a: number, b: number, t: number) => a + (b - a) * t;
+const clamp01 = (v: number) => Math.max(0, Math.min(1, v));
+
+const ORDER = ['china', 'india', 'bangladesh'] as const;
+type Country = (typeof ORDER)[number];
+const META = countryMeta as Record<
+ Country,
+ {stop: number; anchor: [number, number]; border: [number, number][][]}
+>;
+const countryPolygons = {
+ type: 'FeatureCollection' as const,
+ features: ORDER.map((country) => ({
+ type: 'Feature' as const,
+ properties: {country},
+ geometry: {
+ type: 'MultiPolygon' as const,
+ coordinates: META[country].border.map((ring) => [ring]),
+ },
+ })),
+};
+
+// Pre-build each country's border as ordered segments with cumulative lengths (for the multi-segment draw).
+const DRAW = Object.fromEntries(
+ ORDER.map((c) => {
+ const segLines = META[c].border.map((s) => turf.lineString(s));
+ const segLen = segLines.map((l) => turf.length(l));
+ const cum: number[] = [];
+ let acc = 0;
+ for (const L of segLen) {
+ cum.push(acc);
+ acc += L;
+ }
+ return [c, {segLines, segLen, cum, total: acc}];
+ }),
+) as Record<
+ Country,
+ {segLines: any[]; segLen: number[]; cum: number[]; total: number}
+>;
+
+// Reveal the portion of the border between fromKm and toKm as a MultiLineString (no joins across gaps).
+const sliceBorder = (
+ d: (typeof DRAW)[Country],
+ fromKm: number,
+ toKm: number,
+) => {
+ const out: number[][][] = [];
+ for (let i = 0; i < d.segLines.length; i++) {
+ const start = d.cum[i],
+ end = start + d.segLen[i];
+ const a = Math.max(fromKm, start),
+ b = Math.min(toKm, end);
+ if (b - a <= 0.0008) continue;
+ out.push(
+ turf.lineSliceAlong(d.segLines[i], a - start, b - start).geometry
+ .coordinates,
+ );
+ }
+ return {
+ type: 'Feature' as const,
+ properties: {},
+ geometry: {type: 'MultiLineString' as const, coordinates: out},
+ };
+};
+const EMPTY = {
+ type: 'Feature' as const,
+ properties: {},
+ geometry: {type: 'MultiLineString' as const, coordinates: [] as number[][][]},
+};
+
+// --- Timing (seconds). River draws over [RIVER_START, RIVER_END]; each country triggers when the river
+// reaches it (stop · span), then runs border → fill → label. Beat length is derived from these. ---
+const RIVER_START = 0.3;
+const RIVER_END = 8.0;
+const BORDER_S = 2.5;
+const FILL_S = 1.0;
+const LABEL_S = 0.7;
+const trigger = (c: Country) =>
+ RIVER_START + META[c].stop * (RIVER_END - RIVER_START);
+
+export const RiverReveal: React.FC = () => {
+ const ref = useRef(null);
+ const started = useRef(false);
+ const frame = useCurrentFrame();
+ const {fps, durationInFrames, width, height} = useVideoConfig();
+ const [map, setMap] = useState(null);
+ const [labels, setLabels] = useState<
+ Record
+ >({});
+ const [plate, setPlate] = useState({x: 0, y: 0, scale: 1});
+ const [handle] = useState(() => delayRender('maptiler init A'));
+
+ useEffect(() => {
+ if (!ref.current || started.current) return;
+ started.current = true;
+ const m = new maptilersdk.Map({
+ container: ref.current,
+ style: maptilersdk.MapStyle.BASIC,
+ center: END.center,
+ zoom: Math.max(START.zoom, END.zoom),
+ pitch: END.pitch,
+ bearing: END.bearing,
+ interactive: false,
+ attributionControl: true,
+ navigationControl: false,
+ geolocateControl: false,
+ maptilerLogo: true,
+ fadeDuration: 0,
+ canvasContextAttributes: {preserveDrawingBuffer: true},
+ } as any);
+
+ m.on('load', () => {
+ // Strip basemap labels (symbols) AND the inner admin-1 borders ('Other border[ dash]',
+ // admin_level 3–10) to cut basemap clutter. Keep country + disputed borders.
+ for (const l of m.getStyle().layers as any[])
+ if (l.type === 'symbol' || /other border/i.test(l.id))
+ m.removeLayer(l.id);
+
+ m.addSource('countries', {type: 'geojson', data: countryPolygons});
+ for (const c of ORDER) {
+ m.addLayer({
+ id: `fill-${c}`,
+ type: 'fill',
+ source: 'countries',
+ filter: ['==', ['get', 'country'], c],
+ paint: {'fill-color': COUNTRY[c], 'fill-opacity': 0},
+ });
+ }
+ // Per country: just the border that draws on, settled to a darker shade of the country colour
+ // (the electricity now lives on the river, not the borders).
+ for (const c of ORDER) {
+ m.addSource(`trail-${c}`, {type: 'geojson', data: EMPTY});
+ m.addLayer({
+ id: `trail-${c}`,
+ type: 'line',
+ source: `trail-${c}`,
+ layout: {'line-cap': 'round', 'line-join': 'round'},
+ paint: {
+ 'line-color': COUNTRY_DARK[c],
+ 'line-width': 2,
+ 'line-opacity': 0.95,
+ },
+ });
+ }
+
+ const seed = turf.lineSliceAlong(
+ line,
+ 0,
+ Math.max(0.001, lineKm * 0.001),
+ );
+ m.addSource('river', {type: 'geojson', data: seed});
+ m.addSource('river-head', {type: 'geojson', data: seed});
+ // Electric water: soft blue glow → icy core → white-hot leading head with its own glow.
+ m.addLayer({
+ id: 'river-glow',
+ type: 'line',
+ source: 'river',
+ layout: {'line-cap': 'round', 'line-join': 'round'},
+ paint: {
+ 'line-color': '#49C6FF',
+ 'line-width': 11,
+ 'line-opacity': 0.32,
+ 'line-blur': 6,
+ },
+ });
+ m.addLayer({
+ id: 'river-line',
+ type: 'line',
+ source: 'river',
+ layout: {'line-cap': 'round', 'line-join': 'round'},
+ paint: {'line-color': COLORS.river, 'line-width': 3},
+ });
+ m.addLayer({
+ id: 'river-headglow',
+ type: 'line',
+ source: 'river-head',
+ layout: {'line-cap': 'round', 'line-join': 'round'},
+ paint: {
+ 'line-color': COLORS.riverHeadGlow,
+ 'line-width': 16,
+ 'line-opacity': 0,
+ 'line-blur': 9,
+ },
+ });
+ m.addLayer({
+ id: 'river-head',
+ type: 'line',
+ source: 'river-head',
+ layout: {'line-cap': 'round', 'line-join': 'round'},
+ paint: {
+ 'line-color': COLORS.riverHead,
+ 'line-width': 4.5,
+ 'line-opacity': 0,
+ },
+ });
+
+ m.once('idle', () => {
+ setMap(m);
+ continueRender(handle);
+ });
+ });
+ }, [handle]);
+
+ useEffect(() => {
+ if (!map) return;
+ const h = delayRender(`frame A ${frame}`);
+ const t = frame / fps; // seconds
+ const tt = interpolate(frame, [0, durationInFrames - 1], [0, 1], {
+ extrapolateLeft: 'clamp',
+ extrapolateRight: 'clamp',
+ });
+
+ // River draw
+ const reveal = interpolate(t, [RIVER_START, RIVER_END], [0, 1], {
+ extrapolateLeft: 'clamp',
+ extrapolateRight: 'clamp',
+ easing: Easing.bezier(0.645, 0.045, 0.355, 1),
+ });
+ const riverDrawnKm = lineKm * reveal;
+ (map.getSource('river') as any)?.setData(
+ turf.lineSliceAlong(line, 0, Math.max(0.001, riverDrawnKm)),
+ );
+ // Electric draw-head leading the river: white-hot core + glow, fading out once the river completes.
+ const riverHeadKm = lineKm * 0.03;
+ (map.getSource('river-head') as any)?.setData(
+ turf.lineSliceAlong(
+ line,
+ Math.max(0, riverDrawnKm - riverHeadKm),
+ Math.max(0.001, riverDrawnKm),
+ ),
+ );
+ let riverHeadFade = 0;
+ if (reveal > 0.002 && reveal < 0.999) riverHeadFade = 1;
+ else if (reveal >= 0.999)
+ riverHeadFade = 1 - clamp01((t - RIVER_END) / 0.5);
+ map.setPaintProperty(
+ 'river-headglow',
+ 'line-opacity',
+ 0.85 * riverHeadFade,
+ );
+ map.setPaintProperty('river-head', 'line-opacity', riverHeadFade);
+
+ const camera = {
+ center: [
+ lerp(START.center[0], END.center[0], tt),
+ lerp(START.center[1], END.center[1], tt),
+ ] as [number, number],
+ zoom: lerp(START.zoom, END.zoom, tt),
+ };
+ const cameraPoint = map.project(camera.center);
+ const plateScale = 2 ** (camera.zoom - Math.max(START.zoom, END.zoom));
+ const plateX = width / 2 - cameraPoint.x * plateScale;
+ const plateY = height / 2 - cameraPoint.y * plateScale;
+
+ const pos: Record = {};
+ for (const c of ORDER) {
+ const d = DRAW[c];
+ const lt = t - trigger(c); // local seconds since this country triggered
+
+ // 1) border draws on (constant duration), settling to a darker shade — no electric head
+ const bp = interpolate(clamp01(lt / BORDER_S), [0, 1], [0, 1], {
+ easing: Easing.bezier(0.645, 0.045, 0.355, 1),
+ });
+ (map.getSource(`trail-${c}`) as any)?.setData(
+ bp <= 0 ? EMPTY : sliceBorder(d, 0, d.total * bp),
+ );
+
+ // 2) fill blooms in (overshoot then settle) after the border completes
+ const fp = clamp01((lt - BORDER_S) / FILL_S);
+ const fo = interpolate(
+ fp,
+ [0, 0.6, 1],
+ [0, FILL_OPACITY * 1.25, FILL_OPACITY],
+ {
+ extrapolateLeft: 'clamp',
+ extrapolateRight: 'clamp',
+ easing: Easing.bezier(0.3333333333333333, 1, 0.6666666666666666, 1),
+ },
+ );
+ map.setPaintProperty(`fill-${c}`, 'fill-opacity', fp <= 0 ? 0 : fo);
+
+ // 3) label rises in after the fill
+ const lp = clamp01((lt - BORDER_S - FILL_S) / LABEL_S);
+ const p = map.project(META[c].anchor);
+ pos[c] = {
+ x: p.x * plateScale + plateX,
+ y: p.y * plateScale + plateY,
+ reveal: lp,
+ };
+ }
+ setLabels(pos);
+
+ setPlate({x: plateX, y: plateY, scale: plateScale});
+ map.once('idle', () => continueRender(h));
+ map.triggerRepaint();
+ }, [map, frame, fps, durationInFrames, width, height]);
+
+ return (
+
+
+
+ {ORDER.map((c) =>
+ labels[c] ? (
+
+ ) : null,
+ )}
+
+
+ );
+};
diff --git a/remotion-best-practices/remotion-maps/techniques/maptiler/assets/example-Root.tsx b/remotion-best-practices/remotion-maps/techniques/maptiler/assets/example-Root.tsx
new file mode 100644
index 0000000..4e25267
--- /dev/null
+++ b/remotion-best-practices/remotion-maps/techniques/maptiler/assets/example-Root.tsx
@@ -0,0 +1,22 @@
+// Minimal Remotion scaffold for the map explainer. In a Remotion project (`bunx create-video@latest`,
+// blank template), this is `src/Root.tsx`; `src/index.ts` is just `registerRoot(RemotionRoot)`.
+//
+// The Composition sets DURATION (the beat) and dimensions. The component reads durationInFrames / width /
+// height from useVideoConfig(). The beat must be long enough for the last country's full sequence after
+// the river reaches it. See references/map-explainer-architecture.md §2.
+// Render with: bunx remotion render src/index.ts MapExplainer out.mp4 --gl=angle --concurrency=1 --timeout=120000
+
+import React from 'react';
+import {Composition} from 'remotion';
+import {RiverReveal} from './RiverReveal'; // → src/components/RiverReveal.tsx in your project
+
+export const RemotionRoot: React.FC = () => (
+
+);
diff --git a/remotion-best-practices/remotion-maps/techniques/maptiler/assets/sample-data/country-meta.json b/remotion-best-practices/remotion-maps/techniques/maptiler/assets/sample-data/country-meta.json
new file mode 100644
index 0000000..59ed681
--- /dev/null
+++ b/remotion-best-practices/remotion-maps/techniques/maptiler/assets/sample-data/country-meta.json
@@ -0,0 +1,7535 @@
+{
+ "china": {
+ "stop": 0,
+ "anchor": [87.78260869565217, 30.663811291452628],
+ "border": [
+ [
+ [104, 22.607404598007214],
+ [103.99006555200009, 22.58534088100008],
+ [103.98556970200013, 22.57025136400007],
+ [103.98556970200013, 22.554541728000103],
+ [103.98737837800013, 22.540175680000104],
+ [103.9853629970001, 22.527153219000056],
+ [103.97399418100008, 22.515267639000044],
+ [103.95952478000004, 22.507102763000105],
+ [103.95094649200013, 22.516456197000068],
+ [103.94071455900007, 22.52467275],
+ [103.92541833500007, 22.528238424000065],
+ [103.91704675300014, 22.533251038000017],
+ [103.90278405800007, 22.55857249000009],
+ [103.89461918200004, 22.56921783500009],
+ [103.88867639200004, 22.571749980000064],
+ [103.87265669800007, 22.573610332000086],
+ [103.86681726100005, 22.575419007000065],
+ [103.84418298400004, 22.599293519000057],
+ [103.8363281660001, 22.60275583900001],
+ [103.82966190600007, 22.609163717000044],
+ [103.80966312700014, 22.638722636000082],
+ [103.80532230700004, 22.647404277000035],
+ [103.79421187400004, 22.659444886000088],
+ [103.72641239500012, 22.716288961000046],
+ [103.65850956200006, 22.79320933000004],
+ [103.64693404200005, 22.799048768000134],
+ [103.60383589700012, 22.776026917000067],
+ [103.59003829000005, 22.76801707],
+ [103.58254520700012, 22.755795593000087],
+ [103.57680912300009, 22.740835267000122],
+ [103.56833418800005, 22.724970602000027],
+ [103.5471468500001, 22.70068267900011],
+ [103.54456302900013, 22.691019185000087],
+ [103.54992302200003, 22.64866216800003],
+ [103.55091923000003, 22.640789694000134],
+ [103.54621667500004, 22.631436259000097],
+ [103.5142806400001, 22.587356262000114],
+ [103.5036352950001, 22.581413473000012],
+ [103.48544519000006, 22.584100647000028],
+ [103.47314620000003, 22.59164540600007],
+ [103.44751469000005, 22.61825876900012],
+ [103.41092777500012, 22.674741109000067],
+ [103.40431319200013, 22.68879709900007],
+ [103.4023494870001, 22.706522115],
+ [103.40400313400005, 22.723885397000018],
+ [103.4017293710001, 22.737838033000102],
+ [103.38751835200003, 22.745176087000104],
+ [103.37894006300013, 22.756777446000044],
+ [103.36875980700006, 22.767138570000057],
+ [103.35708093300008, 22.776026917000067],
+ [103.34416182500007, 22.782977397000067],
+ [103.32157922400012, 22.790392965000095],
+ [103.30964196800011, 22.78793833400003],
+ [103.2699544680001, 22.723265279000046],
+ [103.25248783400008, 22.67856516500011],
+ [103.2448913980001, 22.66869496700012],
+ [103.22840661600003, 22.655827536000018],
+ [103.16846195500011, 22.626475321000058],
+ [103.14174524000009, 22.60704498300008],
+ [103.13001469000005, 22.57795115100005],
+ [103.13259851100008, 22.569786276000045],
+ [103.14469079600008, 22.55578196300003],
+ [103.14572432500006, 22.54555002900007],
+ [103.14200362100013, 22.537798564000056],
+ [103.09125736500005, 22.50508738200007],
+ [103.07441084800007, 22.49816274000007],
+ [103.05828780100006, 22.495475566000053],
+ [103.04418013600008, 22.486483867000018],
+ [103.04485192900006, 22.4728929650001],
+ [103.04908939600011, 22.45682159400006],
+ [103.04505863500009, 22.440543518000126],
+ [103.02903894100007, 22.43015655500001],
+ [103.00893680900009, 22.43031158500004],
+ [102.9890930580001, 22.437597962000027],
+ [102.95653690600005, 22.45971547400005],
+ [102.9195882570001, 22.469223938000127],
+ [102.90258671100008, 22.47723378500008],
+ [102.89369836400004, 22.487362366000056],
+ [102.85928186100011, 22.550510966],
+ [102.85313236500014, 22.568442689000065],
+ [102.8451741940001, 22.585237529000054],
+ [102.83184167500008, 22.599706930000067],
+ [102.81339318800013, 22.608698629000017],
+ [102.77122522000008, 22.617793681000094],
+ [102.75189823400007, 22.625286764000023],
+ [102.69272871900006, 22.6705036420001],
+ [102.67216149900008, 22.67835845900005],
+ [102.63226729400003, 22.684973043000056],
+ [102.61247522000008, 22.691587626000043],
+ [102.60611901900012, 22.696703593000038],
+ [102.59118453000008, 22.712568258000132],
+ [102.58668868000007, 22.716082256000092],
+ [102.5761983650001, 22.713808493000087],
+ [102.57035892700003, 22.70709055600004],
+ [102.56575972500008, 22.699545797],
+ [102.55836999500008, 22.694946595000047],
+ [102.53578739400012, 22.695825094],
+ [102.52891442900005, 22.707814026000037],
+ [102.52633060700003, 22.72595245400008],
+ [102.51578861500008, 22.745176087000104],
+ [102.49434289600009, 22.76039479600003],
+ [102.46778121000006, 22.76858551000005],
+ [102.44271814000012, 22.765174866000038],
+ [102.42561324100006, 22.745305278000032],
+ [102.42561324100006, 22.745176087000104],
+ [102.41522627800009, 22.7098294070001],
+ [102.4072681070001, 22.693447978000037],
+ [102.39496911700007, 22.680528870000032],
+ [102.38463383000004, 22.677738343000087],
+ [102.37316166200003, 22.67835845900005],
+ [102.36272302300011, 22.677428283],
+ [102.35585005700005, 22.669935201000058],
+ [102.35626346800007, 22.658721415000016],
+ [102.3633431400001, 22.65143503800003],
+ [102.37269657400003, 22.64575063100007],
+ [102.37858768800004, 22.639084371000067],
+ [102.38246342000008, 22.63081614200003],
+ [102.38432377100008, 22.628852437000077],
+ [102.37688236500003, 22.615571595000077],
+ [102.25254886900007, 22.495475566000053],
+ [102.24252364200004, 22.477182109000083],
+ [102.23663252800003, 22.443437398000114],
+ [102.23130985600011, 22.426332500000072],
+ [102.2180290120001, 22.410674540000016],
+ [102.20355961100006, 22.41248321500011],
+ [102.18655806500004, 22.421061503000132],
+ [102.16454390500007, 22.425505676000043],
+ [102.14702559400007, 22.421061503000132],
+ [102.12883549000003, 22.410881246000073],
+ [102.11865523300008, 22.39754872600004],
+ [102.10734543400008, 22.39754872600004],
+ [102.10062015800008, 22.405765280000068],
+ [102.0999483650001, 22.414860331000042],
+ [102.09534916200005, 22.423128561000098],
+ [102.08553064000006, 22.429123027000017],
+ [102.07591882300005, 22.432430319000034],
+ [102.01457889800008, 22.446072896000132],
+ [101.9949935300001, 22.4474164840001],
+ [101.97421960500003, 22.445142720000078],
+ [101.95287723800004, 22.436874491000125],
+ [101.90936568200004, 22.435892639000073],
+ [101.89164066600011, 22.42969146700007],
+ [101.88151208500005, 22.412173157000026],
+ [101.87727461800011, 22.39186431900002],
+ [101.86792118300008, 22.378841858000058],
+ [101.84259973100006, 22.38333770800007],
+ [101.81779504400004, 22.406333720000035],
+ [101.7848771570001, 22.472221171000044],
+ [101.75505985600012, 22.49552724300007],
+ [101.7506156820001, 22.496044007000094],
+ [101.74177901200011, 22.496044007000094],
+ [101.7131502680001, 22.491548157000082],
+ [101.68912072800009, 22.478887431000047],
+ [101.66865686100004, 22.46229929700003],
+ [101.65454919500007, 22.446124573000034],
+ [101.64509240800004, 22.42421376500009],
+ [101.64416223200004, 22.4040082800001],
+ [101.64571252500008, 22.384526266000094],
+ [101.64369714400004, 22.364682516000116],
+ [101.64111332200014, 22.363287252000035],
+ [101.62369836500011, 22.346647441000115],
+ [101.6225098060001, 22.342358297000047],
+ [101.61987430900007, 22.32644195500002],
+ [101.60612837700012, 22.284842427000015],
+ [101.60121911700008, 22.27698761000009],
+ [101.58798995000012, 22.27135487900007],
+ [101.5757426350001, 22.27311187800005],
+ [101.56370202700009, 22.276780905000024],
+ [101.55098962400007, 22.276677552000095],
+ [101.54065433700003, 22.271458232000086],
+ [101.5317143150001, 22.263396708000087],
+ [101.51574629800007, 22.245361634000105],
+ [101.51822676600005, 22.22820505800003],
+ [101.54902592000013, 22.19353017200011],
+ [101.56153161700013, 22.17611521400009],
+ [101.56695764200009, 22.149346822000027],
+ [101.5618416750001, 22.13007151300006],
+ [101.55502038600014, 22.112398173000074],
+ [101.55543379800014, 22.090332337000078],
+ [101.56494226100006, 22.069506734000115],
+ [101.59217574100006, 22.02811391300007],
+ [101.60039229400007, 22.007495016000078],
+ [101.60680017100003, 21.96760081000012],
+ [101.61630863500011, 21.953648173000133],
+ [101.6381160890001, 21.940884094000054],
+ [101.67366947500005, 21.931375631],
+ [101.68059411600007, 21.9226423140001],
+ [101.68245446800006, 21.91483917300009],
+ [101.68307458600003, 21.907139384000104],
+ [101.68586511300009, 21.898612773000067],
+ [101.70870609600007, 21.869570618000083],
+ [101.72126346900012, 21.844352519000054],
+ [101.72617272900004, 21.837272848000012],
+ [101.7510807700001, 21.81613718700008],
+ [101.75154585800004, 21.806370341000033],
+ [101.73165043200004, 21.75050811800004],
+ [101.72798140500004, 21.7326797490001],
+ [101.72854984500009, 21.717538554000086],
+ [101.73278731300013, 21.71144073500004],
+ [101.74911706500006, 21.698056539000092],
+ [101.75480147300004, 21.689788310000054],
+ [101.75562829600005, 21.68002146400009],
+ [101.75232100500006, 21.659144186000034],
+ [101.75593835500013, 21.648653870000075],
+ [101.77082116700007, 21.638835348],
+ [101.78952803600004, 21.634029440000077],
+ [101.80384240700005, 21.62591623900009],
+ [101.8061678470001, 21.60596913700006],
+ [101.79355879700006, 21.588244121000045],
+ [101.77268151900006, 21.582508036],
+ [101.75092574100006, 21.57966583300002],
+ [101.73619795800005, 21.570880839000026],
+ [101.73475101700006, 21.554396057000062],
+ [101.74823856600005, 21.514501852000123],
+ [101.74425948100009, 21.495588277000067],
+ [101.72968672700011, 21.474245911000068],
+ [101.7255526130001, 21.37538889600002],
+ [101.71557906100008, 21.338181865000095],
+ [101.71511397300003, 21.321128642000062],
+ [101.72250370300003, 21.30423044800007],
+ [101.73650801600007, 21.292293193000134],
+ [101.7885461840001, 21.274206442000022],
+ [101.80115523300003, 21.267075094000077],
+ [101.81226566600003, 21.25813507100007],
+ [101.82022383600008, 21.247283020000012],
+ [101.82373783400004, 21.234467265000134],
+ [101.8228076580001, 21.224131979000035],
+ [101.82149033400009, 21.221071138000084],
+ [101.81929366100013, 21.215967102000022],
+ [101.81329919500013, 21.209559225000064],
+ [101.80523767100004, 21.204494934000095],
+ [101.79603926600004, 21.20294464100006],
+ [101.77356001800013, 21.207388815000073],
+ [101.76007246900008, 21.19596832300006],
+ [101.7635864660001, 21.18465118400009],
+ [101.77020105000003, 21.170440166000034],
+ [101.76845334900003, 21.16044957700005],
+ [101.76673872900005, 21.150648092000054],
+ [101.75599003200006, 21.143258362000054],
+ [101.73748986800013, 21.137573954000104],
+ [101.71790450000009, 21.134473369000048],
+ [101.70426192200011, 21.135093485000127],
+ [101.68829390500014, 21.145842183000056],
+ [101.67015547700004, 21.17705474900002],
+ [101.65511763500012, 21.18919871100003],
+ [101.63594567900003, 21.189457092000097],
+ [101.59651656100004, 21.173385722000134],
+ [101.58178877800003, 21.175659485000054],
+ [101.57724125200008, 21.18516794800003],
+ [101.58096195500008, 21.194728089000037],
+ [101.58664636300006, 21.204236552000012],
+ [101.58819665600004, 21.21333160400009],
+ [101.58395918800011, 21.2243903600001],
+ [101.57967004400012, 21.227594299000074],
+ [101.57290043100011, 21.228162740000116],
+ [101.53910404500004, 21.23885976100003],
+ [101.51760664900007, 21.242632141000044],
+ [101.49512740100005, 21.2428388470001],
+ [101.38149092600008, 21.22247833200008],
+ [101.36226729400005, 21.215812073000066],
+ [101.31389815300014, 21.184754537000018],
+ [101.29271081600007, 21.176072897000054],
+ [101.27529585800005, 21.174109192000046],
+ [101.25974125100004, 21.179483541000096],
+ [101.24434167500004, 21.192867737000128],
+ [101.23478153500014, 21.206251933000075],
+ [101.22036381100003, 21.23369211800012],
+ [101.20899499500013, 21.245526021000032],
+ [101.21907189900008, 21.28247467100006],
+ [101.22036381100003, 21.296272278000018],
+ [101.2184001060001, 21.29994130500002],
+ [101.20951176000005, 21.308674622000083],
+ [101.20744470200003, 21.31482411700007],
+ [101.22284427900007, 21.33508127800006],
+ [101.23478153500014, 21.363658345000132],
+ [101.23312788900006, 21.371719869000017],
+ [101.23080244900007, 21.371771546000033],
+ [101.22646163000007, 21.370893046],
+ [101.20796146700013, 21.38350209600013],
+ [101.17912601800003, 21.39817820200001],
+ [101.17142622900013, 21.403397522000134],
+ [101.16827396700006, 21.424533183000065],
+ [101.18775598100007, 21.505871887000083],
+ [101.18656742400003, 21.53532745400007],
+ [101.17452681500004, 21.551657206000115],
+ [101.15902388500007, 21.5526907350001],
+ [101.15421797700003, 21.568038635000065],
+ [101.1577319750001, 21.586228740000095],
+ [101.16765384900009, 21.600181376000094],
+ [101.17385502100007, 21.611911926000076],
+ [101.16672367300004, 21.623280742000063],
+ [101.1688424080001, 21.637853496000034],
+ [101.1614526780001, 21.65836903900002],
+ [101.14925704000007, 21.676765849],
+ [101.13633793100007, 21.684724019000058],
+ [101.12765629100005, 21.695162659000104],
+ [101.12486576400005, 21.74415191700011],
+ [101.11887129800004, 21.759809876000062],
+ [101.08280114800004, 21.766734518000064],
+ [101.06869348200013, 21.76203196200008],
+ [101.05530928600007, 21.754538880000027],
+ [101.04290694200012, 21.745392152000065],
+ [100.99278080300007, 21.71144073500004],
+ [100.97428064000007, 21.704154358000054],
+ [100.87749068200003, 21.677334290000047],
+ [100.83490930200009, 21.657542217000085],
+ [100.79703047700008, 21.626122946000052],
+ [100.75661950700004, 21.569847310000043],
+ [100.70396122300008, 21.51641387900004],
+ [100.66153487100007, 21.49553660100007],
+ [100.66132816600003, 21.495329896],
+ [100.64577356000007, 21.479878642000116],
+ [100.62174401800007, 21.469078268000075],
+ [100.57182458500012, 21.45507395500006],
+ [100.5459863690001, 21.453006897000094],
+ [100.49710046400003, 21.4617918900001],
+ [100.4742594810001, 21.45683095300005],
+ [100.45668949400005, 21.455022278000044],
+ [100.44346032800013, 21.463497213000053],
+ [100.43426192300012, 21.478380026000096],
+ [100.42930098500005, 21.495381572000028],
+ [100.39912194900006, 21.518894348000018],
+ [100.38367069500009, 21.527834371000054],
+ [100.36325850400004, 21.53176178000011],
+ [100.34196781400004, 21.53036651700002],
+ [100.32651656100006, 21.524268698000057],
+ [100.31463098200004, 21.512951559],
+ [100.30248702000011, 21.49553660100007],
+ [100.30228031400009, 21.495329896],
+ [100.28951623500012, 21.483134258000078],
+ [100.27520186400011, 21.475176087000037],
+ [100.24409265100007, 21.464530742000036],
+ [100.23024336800012, 21.45683095300005],
+ [100.19789392100012, 21.433214824000046],
+ [100.18714522300007, 21.427892151],
+ [100.16249556500009, 21.43636708600009],
+ [100.12833744300008, 21.482359110000075],
+ [100.1077702230001, 21.49553660100007],
+ [100.09727990800008, 21.508300680000033],
+ [100.08999353000007, 21.528919577000025],
+ [100.08606612200003, 21.550933737000022],
+ [100.08560103400009, 21.567573548000027],
+ [100.08864994300012, 21.581836243000012],
+ [100.0948511150001, 21.59883778900003],
+ [100.10394616700006, 21.615632629000103],
+ [100.11572839400009, 21.629481914000067],
+ [100.12611535700012, 21.6348562620001],
+ [100.13619226100013, 21.63681996700005],
+ [100.14373702000006, 21.640023906000025],
+ [100.14632084200008, 21.649222310000127],
+ [100.14280684400012, 21.654906718000078],
+ [100.13515873200004, 21.662348124000076],
+ [100.12053430200007, 21.673665263000075],
+ [100.08234541900003, 21.684465638000106],
+ [99.99671757100003, 21.686119283000053],
+ [99.96069909700003, 21.70477447500012],
+ [99.95026045800012, 21.72115590400007],
+ [99.93920170100012, 21.77701812800005],
+ [99.92209680200006, 21.812261455000012],
+ [99.91796268700006, 21.8291596480001],
+ [99.92018477400006, 21.852000631000024],
+ [99.95527307100008, 21.924554342000036],
+ [99.96566003400011, 21.963001608000084],
+ [99.95046716400009, 21.995351054000068],
+ [99.9398218180001, 22.005893046000025],
+ [99.93434411600009, 22.018863831000047],
+ [99.93491255700013, 22.03250640900005],
+ [99.94240564000006, 22.04552886900011],
+ [99.86685469600008, 22.057879537000062],
+ [99.84783776900008, 22.055037333000072],
+ [99.84230839000008, 22.047027486],
+ [99.84173995000003, 22.027080384000087],
+ [99.83367842700005, 22.01948394800003],
+ [99.82101770100007, 22.017778626000066],
+ [99.81342126500004, 22.022997946000075],
+ [99.80747847600003, 22.03095611600004],
+ [99.79988204000006, 22.037467347000117],
+ [99.73916223200007, 22.066767884000072],
+ [99.72365930200004, 22.07059194000003],
+ [99.70381555200004, 22.061238505000077],
+ [99.69379032400013, 22.046924133000076],
+ [99.68386844900004, 22.039017639000022],
+ [99.66381799300007, 22.04873280900007],
+ [99.65927046800005, 22.054572245000045],
+ [99.65007206200005, 22.071935527000065],
+ [99.64221724500004, 22.079945374000047],
+ [99.63353560400009, 22.084751282000056],
+ [99.53896773300005, 22.106713766000027],
+ [99.50506799400006, 22.103354798000012],
+ [99.49039188700004, 22.104336650000064],
+ [99.43861210200009, 22.12423207600007],
+ [99.42496952300007, 22.12242340100009],
+ [99.36492150900006, 22.098858948],
+ [99.32998824100008, 22.095551656000097],
+ [99.25288700400006, 22.102786357000056],
+ [99.2122693280001, 22.112449849000072],
+ [99.16638065600006, 22.13208689400001],
+ [99.14446984900007, 22.153532613000053],
+ [99.17506229700007, 22.168673808000065],
+ [99.15935266100013, 22.184693502000115],
+ [99.16638065600006, 22.204640605000023],
+ [99.1993502200001, 22.245258281000062],
+ [99.20617150900006, 22.261329651000025],
+ [99.21836714700004, 22.310008851000063],
+ [99.22570520000005, 22.321222637000105],
+ [99.24368859900005, 22.34122141600004],
+ [99.2483394780001, 22.353675435000028],
+ [99.24637577300007, 22.365922750000053],
+ [99.24058801300009, 22.372950745000068],
+ [99.23738407400003, 22.38013376900001],
+ [99.24306848200007, 22.39315623000006],
+ [99.28275598100004, 22.411914775000056],
+ [99.3450777590001, 22.472841288],
+ [99.35344934100004, 22.484106751000056],
+ [99.35779016200013, 22.495475566000053],
+ [99.35634322100003, 22.50617258700005],
+ [99.34662805200003, 22.523070781000044],
+ [99.34414758300005, 22.533251038000017],
+ [99.34704146400003, 22.55335317000008],
+ [99.35737675000013, 22.587097881000048],
+ [99.35499963400008, 22.60854360000006],
+ [99.30787072800007, 22.719596252000045],
+ [99.30797408000012, 22.745176087000104],
+ [99.31696578000003, 22.754116109000037],
+ [99.32719771300003, 22.76049814900007],
+ [99.33846317600006, 22.764916484000068],
+ [99.3506588140001, 22.76814626100004],
+ [99.3590303960001, 22.77489003500007],
+ [99.37887414600004, 22.813233948000075],
+ [99.40357548100008, 22.841061707000065],
+ [99.41442753200005, 22.856900533000058],
+ [99.416908, 22.874341330000092],
+ [99.41122359200006, 22.919248149000097],
+ [99.41339400300006, 22.930746155000023],
+ [99.42993046000004, 22.936740622000045],
+ [99.48450077400008, 22.910256450000063],
+ [99.51529992700006, 22.90880951000007],
+ [99.53803755700011, 22.92643117300004],
+ [99.53462691200008, 22.949323832000076],
+ [99.49876346900004, 22.99516082800004],
+ [99.49039188700004, 23.0120073450001],
+ [99.49163212100012, 23.028207906000105],
+ [99.49504276500005, 23.043478292000046],
+ [99.49307906100012, 23.057379252000132],
+ [99.47819624900006, 23.0657508340001],
+ [99.40326542100007, 23.068334656],
+ [99.38104455600006, 23.08164133800001],
+ [99.35096887200007, 23.11926178000003],
+ [99.33381229700012, 23.129622904000044],
+ [99.31407189900006, 23.126470642000086],
+ [99.30218632100014, 23.112595520000028],
+ [99.29402144400012, 23.096782532000034],
+ [99.28482303900012, 23.088152568000098],
+ [99.26673628800012, 23.08386342400003],
+ [99.25743452900008, 23.07921254500006],
+ [99.23614384000007, 23.062314352000058],
+ [99.22487837700004, 23.056888327000095],
+ [99.21661014900008, 23.057379252000132],
+ [99.20958215400009, 23.061539206000063],
+ [99.20214074800003, 23.067275289000023],
+ [99.19966027900006, 23.073838196000096],
+ [99.1993502200001, 23.09226084400011],
+ [99.1941825770001, 23.09577484200007],
+ [99.18488081900006, 23.0948446660001],
+ [99.18271040800005, 23.095206401],
+ [99.17867964700008, 23.09642079700005],
+ [99.16400354000007, 23.09768687000009],
+ [99.1386820890001, 23.105205790000028],
+ [99.13000044800003, 23.10623931900001],
+ [99.09217329900008, 23.101510926000017],
+ [99.0749133710001, 23.10166595500006],
+ [99.05506962100009, 23.109598287000026],
+ [99.0392566330001, 23.127142436000085],
+ [99.03315881300006, 23.146417745000022],
+ [99.02644087800013, 23.160447897000026],
+ [99.00938765500007, 23.162153218000086],
+ [98.99037072800013, 23.160034485000025],
+ [98.9707336840001, 23.162204895000016],
+ [98.93342330000013, 23.172152608000104],
+ [98.85900923700012, 23.179387309000063],
+ [98.86014611800005, 23.212279358000032],
+ [98.91068566900009, 23.297597148000094],
+ [98.89652632700012, 23.323280335000064],
+ [98.86045617700012, 23.322375997000037],
+ [98.85342818200007, 23.3248823040001],
+ [98.85322147600004, 23.334985047000046],
+ [98.86210982300008, 23.340591940000067],
+ [98.87378869600013, 23.344571025000064],
+ [98.88185022000005, 23.34968699200006],
+ [98.89011844900006, 23.3679029340001],
+ [98.89228886000006, 23.386894023000067],
+ [98.88960168400013, 23.406789449000073],
+ [98.87554569500003, 23.44642527300003],
+ [98.86397017400009, 23.46660491900012],
+ [98.84888065700005, 23.480402527000066],
+ [98.83007043500004, 23.480014954000055],
+ [98.80981327300003, 23.474098002000048],
+ [98.7999947510001, 23.48073842400005],
+ [98.78087447100006, 23.532854106000016],
+ [98.78438846900013, 23.54703928700006],
+ [98.7962740480001, 23.557917175000043],
+ [98.84329960100007, 23.5840137740001],
+ [98.85022424400012, 23.590628357000114],
+ [98.85735559100004, 23.604348450000046],
+ [98.85601200400009, 23.610007020000083],
+ [98.84960412600009, 23.614735413000076],
+ [98.80795292200003, 23.67579111800005],
+ [98.80030481000006, 23.69271514900005],
+ [98.79906457500005, 23.743228862000066],
+ [98.79317346200003, 23.758473409000104],
+ [98.77787723800009, 23.76929962100006],
+ [98.73839644400005, 23.77555247000005],
+ [98.70832076000005, 23.78469919800004],
+ [98.68496301300013, 23.784802551000084],
+ [98.67566125500008, 23.787386373000075],
+ [98.66367232300013, 23.796946513000066],
+ [98.66356897000003, 23.803070171000044],
+ [98.66832320200012, 23.808702902000064],
+ [98.67142378700004, 23.816738587000046],
+ [98.66418908700007, 23.89037750200005],
+ [98.66480920400005, 23.9033741250001],
+ [98.67297408100006, 23.928308004000073],
+ [98.6745243740001, 23.936886292000096],
+ [98.6657393800001, 23.953216045000133],
+ [98.65881473800005, 23.961122539000073],
+ [98.66325891200012, 23.969545797000066],
+ [98.67989872200008, 23.976263733000096],
+ [98.69922570900007, 23.981560568000035],
+ [98.71679569500009, 23.988407695],
+ [98.76557824800005, 24.02706166600008],
+ [98.85621871000006, 24.083802388000024],
+ [98.87347863800005, 24.11449819000005],
+ [98.86696740800011, 24.143256124000075],
+ [98.86572717300004, 24.145684917000025],
+ [98.85528853400012, 24.13896698000009],
+ [98.8180815020001, 24.12896759100009],
+ [98.7161755780001, 24.12134531700012],
+ [98.68175907400007, 24.106875916],
+ [98.64041792900014, 24.100752258000014],
+ [98.61251265500005, 24.087548930000125],
+ [98.59711307800006, 24.083078919000016],
+ [98.58522749900004, 24.075715027000015],
+ [98.57024133400006, 24.08209706600006],
+ [98.54305953000005, 24.093956807000083],
+ [98.50326867700005, 24.121267802000077],
+ [98.47453658000006, 24.127830709000065],
+ [98.43495243300009, 24.130259501000026],
+ [98.39557499200009, 24.128063253000036],
+ [98.37872847500012, 24.122404684000102],
+ [98.3473092050001, 24.10493804900007],
+ [98.33066939300005, 24.099486186000078],
+ [98.2932556560001, 24.10013214100006],
+ [98.21915165200005, 24.117366231000048],
+ [98.18153120900013, 24.118658142000086],
+ [98.10505009000008, 24.101527405000027],
+ [97.88997277800013, 24.022617493],
+ [97.87664025900011, 24.014400940000044],
+ [97.83633264200006, 23.971767883000084],
+ [97.81783247900012, 23.95815114400007],
+ [97.8040865480001, 23.954507955000068],
+ [97.78951379400013, 23.95313853],
+ [97.76780969300012, 23.946472270000086],
+ [97.74817264900008, 23.93406992600002],
+ [97.69680627400004, 23.887121887000077],
+ [97.67696252500014, 23.878698629000084],
+ [97.65567183400009, 23.87254913300002],
+ [97.64734483100005, 23.868524415000067],
+ [97.63706831900004, 23.86355743500006],
+ [97.62466597500003, 23.846710918],
+ [97.61970503700007, 23.865986226000032],
+ [97.61546757000013, 23.875132955000097],
+ [97.60988651500003, 23.88314280200008],
+ [97.5726794840001, 23.907559916000125],
+ [97.53299198400003, 23.92370880200012],
+ [97.51645552600013, 23.942829081000113],
+ [97.70765832500007, 24.12529856400009],
+ [97.72006066900008, 24.1474419150001],
+ [97.72305790200005, 24.171264751000066],
+ [97.71871708200007, 24.181548361000083],
+ [97.70455774000004, 24.19924753800008],
+ [97.70156050600013, 24.210926412000063],
+ [97.70466109300008, 24.221726786000076],
+ [97.71117232300003, 24.228470561000037],
+ [97.71851037600004, 24.233974101000015],
+ [97.72409143100003, 24.241518860000056],
+ [97.71840702300011, 24.277666524],
+ [97.64450972500003, 24.302393698000103],
+ [97.63820520100012, 24.328102722],
+ [97.65360477700011, 24.338722229000084],
+ [97.67427535100012, 24.340840963000048],
+ [97.68957157400007, 24.346473694000068],
+ [97.68833134000005, 24.36771270800004],
+ [97.68099328600005, 24.377763774000087],
+ [97.66259647700014, 24.390062765000025],
+ [97.65732548000011, 24.402000020000074],
+ [97.6554651290001, 24.412076925000108],
+ [97.65226119000005, 24.422722270000108],
+ [97.6473002520001, 24.432334086000097],
+ [97.6398588460001, 24.439284567000087],
+ [97.62435591600007, 24.442281799000014],
+ [97.60068811000014, 24.44192006400003],
+ [97.51955611200009, 24.430783794],
+ [97.51325158700007, 24.438586935],
+ [97.51387170400005, 24.46168629900008],
+ [97.53857303900003, 24.597259420000015],
+ [97.53278527800006, 24.723324077000072],
+ [97.53609257000005, 24.745028178000084],
+ [97.5361959230001, 24.745079854],
+ [97.60399540200012, 24.78644683900002],
+ [97.6425460210001, 24.816780904000055],
+ [97.66394006400003, 24.829777527000104],
+ [97.68595422400011, 24.833524068000102],
+ [97.72657190000012, 24.826289368000047],
+ [97.74848270700011, 24.826470235],
+ [97.76522587100004, 24.834660950000043],
+ [97.77297733600005, 24.85468556800008],
+ [97.76098840300006, 24.870291850000015],
+ [97.72409143100003, 24.897215272000025],
+ [97.70827844300004, 24.927290955],
+ [97.70331750500003, 24.960415548000086],
+ [97.70517785700014, 25.02883514400007],
+ [97.69959680200009, 25.065008647000113],
+ [97.7036275640001, 25.073922831000047],
+ [97.72161096200006, 25.079271342000098],
+ [97.73752730300009, 25.090510967000043],
+ [97.7540637620001, 25.11355865500009],
+ [97.77700809800012, 25.15862050400004],
+ [97.80098596300013, 25.237633769000112],
+ [97.82362023900009, 25.26161163300013],
+ [97.86031050700007, 25.244093323000058],
+ [97.87178267400009, 25.227660217],
+ [97.87881066900007, 25.213552551000063],
+ [97.88893925000013, 25.205646057000124],
+ [97.90991988100006, 25.20755808500006],
+ [97.93079716000011, 25.218513489000102],
+ [97.97627242100009, 25.27225697900012],
+ [97.99239546700005, 25.28248891200009],
+ [98.03352990700012, 25.301299134000104],
+ [98.04489872300013, 25.311944479000104],
+ [98.06257206300012, 25.35431915300002],
+ [98.0756978760001, 25.376074932000037],
+ [98.08996057100006, 25.385945129],
+ [98.10835738100008, 25.388890686000096],
+ [98.11207808500006, 25.396228739000023],
+ [98.11021773300007, 25.410439759000056],
+ [98.11197473100003, 25.448473613000104],
+ [98.10887414600012, 25.458240459000066],
+ [98.10474003100006, 25.466973775000028],
+ [98.09946903500003, 25.493328756],
+ [98.09977909300005, 25.50004669200011],
+ [98.10463667800013, 25.506764628000056],
+ [98.12303348900014, 25.522215882000054],
+ [98.13419559800008, 25.534618225000102],
+ [98.13936324100007, 25.550224508000056],
+ [98.13843306500013, 25.598955384000092],
+ [98.1400867110001, 25.611461080000097],
+ [98.15021529100005, 25.613063050000036],
+ [98.23238081900007, 25.586553040000027],
+ [98.24716027900007, 25.579163310000112],
+ [98.2766158450001, 25.552446594000045],
+ [98.28943160000006, 25.550379538000087],
+ [98.31206587700012, 25.55745920800011],
+ [98.3326330970001, 25.566967672000104],
+ [98.34710249800003, 25.577819723000047],
+ [98.35723107900009, 25.592754212],
+ [98.36984012900012, 25.636782532000055],
+ [98.37521447800009, 25.649288229000078],
+ [98.41324833200008, 25.69207631400009],
+ [98.41634891800004, 25.700189514],
+ [98.41665897600012, 25.712591859000057],
+ [98.41872603400009, 25.724219056000024],
+ [98.42472050000003, 25.730833639000124],
+ [98.43226525900008, 25.736104635000046],
+ [98.43929325400006, 25.7435977170001],
+ [98.45262577300008, 25.777962545000022],
+ [98.46130741400009, 25.79465403300007],
+ [98.47453658000006, 25.80576446500008],
+ [98.49810103400006, 25.830724183000072],
+ [98.50946984900003, 25.838062236000056],
+ [98.52683313100005, 25.838785706000053],
+ [98.53954553200003, 25.833721415000085],
+ [98.56238651600012, 25.816358135000073],
+ [98.59091190600009, 25.806384583000053],
+ [98.60031701600013, 25.801733704000085],
+ [98.61003218700006, 25.800596822000088],
+ [98.62605188000003, 25.806487936000067],
+ [98.6778316650001, 25.843281555000075],
+ [98.68485966000003, 25.853100078000054],
+ [98.69023400900005, 25.86555409700013],
+ [98.69240441900007, 25.87898997100008],
+ [98.68982059800004, 25.8915990200001],
+ [98.68465295400006, 25.897593486000048],
+ [98.67235396300009, 25.90183095400009],
+ [98.66728967300003, 25.905758362000043],
+ [98.65809126800013, 25.925033671000094],
+ [98.62532841000012, 25.969992168000104],
+ [98.61623335800004, 25.979397278000064],
+ [98.6042444260001, 25.982497864],
+ [98.59246219900007, 25.98074086500013],
+ [98.5824369720001, 25.98229115900004],
+ [98.57540897700005, 25.99510691300013],
+ [98.57716597500013, 26.01732778000006],
+ [98.5726184500001, 26.035569560000013],
+ [98.5538082280001, 26.071071269000058],
+ [98.54729699800004, 26.088279521000047],
+ [98.54553999900003, 26.105642803000066],
+ [98.55019087800008, 26.12078399700006],
+ [98.5630066330001, 26.131222636000118],
+ [98.60217736800013, 26.13995595300007],
+ [98.61933394400012, 26.145743714000062],
+ [98.62574182200012, 26.144348450000066],
+ [98.62429488100014, 26.108485006000038],
+ [98.63080611200013, 26.096909485000097],
+ [98.64444869000005, 26.097891337000064],
+ [98.68082889800013, 26.12496978800003],
+ [98.68672001200008, 26.133238017000068],
+ [98.68651330600005, 26.15411529600003],
+ [98.69240441900007, 26.159954732000116],
+ [98.70025923700007, 26.16532908200007],
+ [98.7055302330001, 26.174940898000088],
+ [98.70149947100003, 26.191167298],
+ [98.67700484200009, 26.239329733000076],
+ [98.66821984900008, 26.248218079000097],
+ [98.64816939300005, 26.244807434000066],
+ [98.6421749270001, 26.25452260400003],
+ [98.64455204300003, 26.271575827000035],
+ [98.64951298000011, 26.290592753000013],
+ [98.65778120900006, 26.31162506100013],
+ [98.6976754150001, 26.35405141200006],
+ [98.70739058400011, 26.371052959000068],
+ [98.7134884030001, 26.389449768000063],
+ [98.7172091060001, 26.408725077000028],
+ [98.72113651600006, 26.538898011000086],
+ [98.72795780400003, 26.57259104500004],
+ [98.74852502400012, 26.6059740190001],
+ [98.7555530190001, 26.625042623000084],
+ [98.75069543500007, 26.646126607000028],
+ [98.74707808400012, 26.655738424000035],
+ [98.74676802600004, 26.664420064000083],
+ [98.74738814300008, 26.672688293000036],
+ [98.74645796800013, 26.681059876000106],
+ [98.73198856700003, 26.71351267500002],
+ [98.73436568300014, 26.73428660100008],
+ [98.74924849500007, 26.77144195600006],
+ [98.75038537600011, 26.792009176000064],
+ [98.74242720500013, 26.81040598600005],
+ [98.71813928200004, 26.842497050000063],
+ [98.71452193200008, 26.862030741000083],
+ [98.71865604700008, 26.872676087000073],
+ [98.73312544800012, 26.88792063400011],
+ [98.73632938600008, 26.89825592100003],
+ [98.73570927000003, 26.907299296000062],
+ [98.71266158100008, 26.995149231000042],
+ [98.72061975100013, 27.013959452000066],
+ [98.73167850700003, 27.031064352],
+ [98.73777632600007, 27.048686015],
+ [98.73136844900006, 27.068788147000063],
+ [98.71648563700012, 27.082482402000082],
+ [98.70273970500006, 27.086823222000064],
+ [98.69137089100008, 27.092404276000067],
+ [98.68268925000012, 27.110077617000073],
+ [98.67256066900006, 27.17560333200008],
+ [98.67359419800005, 27.207901103000054],
+ [98.68020878100003, 27.237046611000082],
+ [98.70418664600004, 27.304174296000028],
+ [98.70770064400011, 27.337247213000083],
+ [98.69736535700008, 27.368924866],
+ [98.69106083200006, 27.373162334000043],
+ [98.6837227790001, 27.37362742200007],
+ [98.67731490100005, 27.376107890000057],
+ [98.67442102100006, 27.3865982060001],
+ [98.66832320200012, 27.475249126000094],
+ [98.67111372900007, 27.516151022000102],
+ [98.68175907400007, 27.55648447700007],
+ [98.67927860500009, 27.57733591800003],
+ [98.67421431500003, 27.586120911000123],
+ [98.6657393800001, 27.597076315],
+ [98.65592085800006, 27.60676564500004],
+ [98.6472392170001, 27.611726583000078],
+ [98.63504357900007, 27.611054789],
+ [98.62584517500005, 27.6055512490001],
+ [98.61654341700006, 27.59841990200006],
+ [98.60455448400006, 27.59273549400011],
+ [98.5784062090001, 27.59172780400003],
+ [98.56435022000005, 27.603535869000055],
+ [98.54336958800008, 27.642525737000042],
+ [98.5221822520001, 27.656297506000087],
+ [98.4923132730001, 27.643430074],
+ [98.47453658000006, 27.65717600500004],
+ [98.42224003100006, 27.680895487000058],
+ [98.4102510990001, 27.68425445600009],
+ [98.40001916500012, 27.675727844000065],
+ [98.3974353430001, 27.656814270000027],
+ [98.39815881400011, 27.619813945000075],
+ [98.39288781700009, 27.587154440000106],
+ [98.38327600100007, 27.55578684500007],
+ [98.36394901500012, 27.532170716000067],
+ [98.32860233600007, 27.52286895700003],
+ [98.29470259600009, 27.536614889000063],
+ [98.27568566900004, 27.570101217000072],
+ [98.25439497900004, 27.648132629000074],
+ [98.23806522600012, 27.680223694000077],
+ [98.20437219300004, 27.727300924000062],
+ [98.20178837100013, 27.736551005000095],
+ [98.21150354000008, 27.760322164000044],
+ [98.20840295400006, 27.766161601000036],
+ [98.20209842900005, 27.7712517290001],
+ [98.1978609620001, 27.780631002000078],
+ [98.19848107900003, 27.800448914000057],
+ [98.20065148900005, 27.813600565000016],
+ [98.19662072800003, 27.823186544000023],
+ [98.16241092900003, 27.842849427000075],
+ [98.14577111900013, 27.860729472000045],
+ [98.1400867110001, 27.878557841000074],
+ [98.1567265220001, 27.889203187000064],
+ [98.17667362500003, 27.898117371000083],
+ [98.17729374200007, 27.91292266900011],
+ [98.16582157400006, 27.92969167100007],
+ [98.14897505700009, 27.944548645000012],
+ [98.11352502500006, 27.96170522100006],
+ [98.10711714700011, 27.973074036000057],
+ [98.11848596200014, 27.99472646100004],
+ [98.12251672400004, 28.015448710000058],
+ [98.1279944260001, 28.105469056000018],
+ [98.12696089700012, 28.124279277000042],
+ [98.11869266800005, 28.140789897000033],
+ [98.1150022760001, 28.14388835700008],
+ [98.04861942600013, 28.199623515000027],
+ [98.03135949800003, 28.208330994000065],
+ [97.9910518800001, 28.214015401000026],
+ [97.98485070800012, 28.2242214970001],
+ [97.99384240800003, 28.25254018200009],
+ [97.9929122320001, 28.26892161100004],
+ [97.97875288900013, 28.280600484],
+ [97.9447497970001, 28.29884226500006],
+ [97.8975175380001, 28.35532460500012],
+ [97.85907027200005, 28.370129903000034],
+ [97.79726525900003, 28.34392995200001],
+ [97.76532922400008, 28.352430725000133],
+ [97.74000777200007, 28.38260976200003],
+ [97.69959680200009, 28.48802968300008],
+ [97.67045129400009, 28.511284079000077],
+ [97.6410990810001, 28.498364970000083],
+ [97.61360721800003, 28.481983541000133],
+ [97.58993941300008, 28.49469594300008],
+ [97.56751184100011, 28.525495097000046],
+ [97.54622115100011, 28.53846588100008],
+ [97.52772098800011, 28.52952585900006],
+ [97.51397505800009, 28.49469594300008],
+ [97.50301965300008, 28.47772023600008],
+ [97.48813684100003, 28.44193430600005],
+ [97.47459761600004, 28.426198832000082],
+ [97.47149703000014, 28.414959209000116],
+ [97.46570927000005, 28.40669097900006],
+ [97.45010298700004, 28.39191152000005],
+ [97.44534875500011, 28.382971497000128],
+ [97.4467956950001, 28.374005636000092],
+ [97.45020634000014, 28.364858907],
+ [97.45237674900005, 28.355479635000066],
+ [97.45237674900005, 28.317678324000084],
+ [97.44782922400009, 28.29760203100004],
+ [97.43666711400004, 28.286414083000082],
+ [97.41672001200004, 28.286052348000098],
+ [97.3982198490001, 28.28889455200006],
+ [97.38437056500004, 28.284837952000075],
+ [97.3778593350001, 28.26359893900009],
+ [97.36959110600003, 28.25347035700004],
+ [97.33383101400011, 28.235254415],
+ [97.32349572800013, 28.217477723000073],
+ [97.2852551680001, 28.235667827],
+ [97.22965132700011, 28.274606018000085],
+ [97.22076298000007, 28.28339101200008],
+ [97.21053104700013, 28.308092346000066],
+ [97.20277958200012, 28.31155466700004],
+ [97.19327111900003, 28.311399638000083],
+ [97.18272912600008, 28.31499115000007],
+ [97.11554976400004, 28.366564230000066],
+ [97.07844608600004, 28.3751425170001],
+ [97.03297082600005, 28.357029928000074],
+ [96.9974174400001, 28.337082825000053],
+ [96.96579146400012, 28.330468242000066],
+ [96.93395878200005, 28.336617737000026],
+ [96.89788863200005, 28.354704489000042],
+ [96.71692392905247, 28.436539447625634],
+ [96.60442611830537, 28.444534241434948],
+ [96.5615177204665, 28.44729288316006],
+ [96.51238244700005, 28.428808492000073],
+ [96.49522587100006, 28.42147043900009],
+ [96.44112658162652, 28.39541577691665],
+ [96.36964414401973, 28.378115826943503],
+ [96.30185249373439, 28.420710938634112],
+ [96.33645875408492, 28.47966681390912],
+ [96.40901887262294, 28.558928647938785],
+ [96.50237514126326, 28.644476217418358],
+ [96.50104350465409, 28.687631303142155],
+ [96.59800971353144, 28.709910398443995],
+ [96.59258426900004, 28.757884013000094],
+ [96.57666792800006, 28.808526917000066],
+ [96.52375126100003, 28.864414979000045],
+ [96.51083215400013, 28.885524801000074],
+ [96.50039351400005, 28.929243062000054],
+ [96.49222863800003, 28.94800160700005],
+ [96.47465865100008, 28.962057597000054],
+ [96.46008589700011, 28.963349507000103],
+ [96.45212772700006, 28.970377502000034],
+ [96.45119755100012, 28.98138458300012],
+ [96.45760542900013, 28.99458791100001],
+ [96.36656829155606, 29.036536563468914],
+ [96.29465549772947, 28.99232448388489],
+ [96.24858762565306, 28.945343306324006],
+ [96.19532275757172, 28.941105845485463],
+ [96.17595371463305, 29.017353609711428],
+ [96.17462528500005, 29.108844503000043],
+ [96.1835136310001, 29.123778992000027],
+ [96.19364221300003, 29.13693064400009],
+ [96.21007531700008, 29.145767314000082],
+ [96.31642541500008, 29.171863912000063],
+ [96.32748417200008, 29.180442200000087],
+ [96.34236698400014, 29.21064707500001],
+ [96.36686161300008, 29.24421091700013],
+ [96.36624149600004, 29.257233379000056],
+ [96.34991174300006, 29.274234924],
+ [96.33709598900009, 29.27971262700008],
+ [96.32324670400004, 29.275010071000096],
+ [96.30412642400006, 29.261212464000053],
+ [96.26784956900008, 29.24173044900006],
+ [96.23529341600005, 29.241213684000016],
+ [96.20542443800014, 29.256949158000097],
+ [96.17627893100013, 29.28645640100011],
+ [96.16604699800013, 29.303173726000054],
+ [96.15095747900011, 29.35407501200008],
+ [96.14196578000008, 29.368466899000097],
+ [96.07453626532634, 29.369285607240855],
+ [96.01413548284108, 29.364252208700393],
+ [95.95373470035588, 29.35921881015993],
+ [95.86313352662813, 29.32398502037684],
+ [95.79594038900007, 29.352886455000046],
+ [95.77640669800007, 29.345548401000073],
+ [95.74478072100004, 29.340432435000068],
+ [95.7473653601981, 29.27365103497256],
+ [95.71716496895556, 29.218283651027733],
+ [95.64669738938943, 29.22835044810863],
+ [95.59233524600006, 29.249688619000025],
+ [95.58168990100006, 29.24746653300012],
+ [95.57290490800006, 29.247259827000065],
+ [95.56442997300007, 29.2456061810001],
+ [95.55378462800007, 29.239043275000128],
+ [95.55068404100012, 29.230284119000046],
+ [95.55202762800008, 29.220129700000072],
+ [95.55016727700007, 29.212481588000017],
+ [95.51533736200014, 29.209432679000074],
+ [95.51192671700011, 29.19754709900006],
+ [95.52267541500004, 29.161192729000064],
+ [95.52143518100007, 29.13786082000003],
+ [95.51130660000013, 29.131788839000095],
+ [95.48757683710141, 29.068994487006023],
+ [95.42982403198397, 29.046524645630395],
+ [95.36740605062847, 29.03649616327051],
+ [95.2815531820001, 29.052672221000094],
+ [95.22491581200012, 29.05936431900001],
+ [95.21633752500009, 29.06499705000003],
+ [95.21406376100009, 29.07308441200003],
+ [95.21282352700013, 29.08186940500012],
+ [95.2078625900001, 29.089595032000105],
+ [95.19969771300003, 29.094245911000073],
+ [95.19153283800006, 29.096829733000092],
+ [95.11691206900008, 29.108095195000047],
+ [95.09903202400011, 29.113779603000083],
+ [95.04766564900007, 29.140806377000033],
+ [94.98906457600003, 29.15398386700012],
+ [94.89129276600005, 29.160495097000094],
+ [94.85408573500007, 29.17000356000007],
+ [94.81543176300005, 29.16886667900006],
+ [94.79879195200004, 29.1664378870001],
+ [94.77657108500011, 29.16669626900007],
+ [94.76148156800008, 29.174706116000053],
+ [94.76768273900007, 29.21385101300008],
+ [94.75641727800013, 29.230516663000017],
+ [94.70422408000013, 29.284699402000044],
+ [94.66846399000013, 29.306610209000084],
+ [94.6304301350001, 29.319451803000064],
+ [94.59994104000009, 29.316635437000016],
+ [94.5826811120001, 29.302915345000073],
+ [94.52862756400003, 29.2312401330001],
+ [94.51477828000009, 29.22105987600004],
+ [94.49824182200007, 29.21522043900005],
+ [94.47498742700003, 29.210802104000052],
+ [94.42238081900007, 29.210492045000066],
+ [94.39643925000013, 29.207081400000035],
+ [94.37287479700012, 29.19630686500001],
+ [94.36253951000009, 29.185325623000026],
+ [94.34631311100009, 29.1590739950001],
+ [94.33577111900013, 29.149617208000038],
+ [94.32378218600007, 29.146025696000052],
+ [94.28750533100003, 29.147937724000073],
+ [94.27078578096348, 29.097929973215642],
+ [94.30904814105469, 29.059667613124404],
+ [94.34731050114596, 29.024348511501685],
+ [94.29138859024334, 28.977256376004746],
+ [94.2501829716835, 28.933107498976327],
+ [94.17365825150097, 28.930164240507835],
+ [94.1353958914097, 28.897788397353693],
+ [94.07947398050715, 28.883072105010925],
+ [94.02684940600011, 28.864182435000075],
+ [94.01144982900013, 28.85302032500003],
+ [93.99201949100012, 28.844648743000064],
+ [93.99313607399837, 28.80188742309345],
+ [93.9815905577272, 28.768130860141966],
+ [93.96109345404737, 28.72994349590268],
+ [93.92778566056765, 28.68275160171495],
+ [93.86307969177443, 28.704870831024095],
+ [93.78174379684887, 28.68050383781251],
+ [93.72247522000009, 28.696647441000053],
+ [93.70552535000007, 28.69189320900007],
+ [93.66490848182954, 28.690238755807428],
+ [93.64341027900008, 28.680240174000105],
+ [93.62553023300006, 28.67235951800005],
+ [93.60713342300005, 28.672204488000105],
+ [93.55173628800009, 28.67894826200005],
+ [93.44621301300003, 28.671894430000023],
+ [93.35543239724171, 28.624065359777703],
+ [93.31717003715039, 28.603462550497838],
+ [93.30284340070244, 28.556921073348917],
+ [93.2869721652333, 28.520517242676647],
+ [93.25906765301328, 28.496023260000364],
+ [93.21883846222534, 28.457435846387227],
+ [93.1862858334245, 28.431995228097378],
+ [93.21807344565363, 28.39464655767386],
+ [93.20782489381371, 28.340539283245555],
+ [93.12982812476821, 28.325961566073488],
+ [93.04639880818196, 28.302097099545048],
+ [92.97492395000006, 28.28230580700007],
+ [92.96035119600003, 28.270213521000088],
+ [92.92200728300008, 28.25863800100005],
+ [92.90381717900004, 28.2496979780001],
+ [92.88955448400009, 28.23582285600004],
+ [92.8653699140001, 28.20520457000002],
+ [92.85028039600013, 28.19194956500003],
+ [92.8347774660001, 28.183526306000132],
+ [92.81989465400005, 28.17926300100008],
+ [92.80532190000008, 28.17802276700003],
+ [92.79023238100007, 28.178901266000068],
+ [92.78537479700009, 28.183293762000076],
+ [92.78289432800011, 28.190941874000046],
+ [92.77917362500011, 28.195902812],
+ [92.7700785720001, 28.192182108000097],
+ [92.70786014900011, 28.155414328000106],
+ [92.67861128800007, 28.133064270000105],
+ [92.65484012900009, 28.105830790000127],
+ [92.63727014200003, 28.071982728000123],
+ [92.63892378800006, 28.057487488000092],
+ [92.65422001100012, 28.052087301000128],
+ [92.68925663200014, 28.048314921],
+ [92.70134891800006, 28.037824606000058],
+ [92.70134891800006, 28.025241394000133],
+ [92.73639150917766, 27.98590893651867],
+ [92.71077012957788, 27.949702392409918],
+ [92.68367428669768, 27.910450219011963],
+ [92.63646812873851, 27.89536981004999],
+ [92.59291178341888, 27.868193283595886],
+ [92.57497681769904, 27.847806414432647],
+ [92.51815087726021, 27.839468002981643],
+ [92.47510949800005, 27.846595968000074],
+ [92.43903934800005, 27.823289897000066],
+ [92.42756717900005, 27.82117116400009],
+ [92.41733524600005, 27.828948466],
+ [92.40441613800004, 27.85383066900006],
+ [92.39284061800004, 27.85602691700005],
+ [92.38105839100012, 27.842461853000074],
+ [92.37558068800013, 27.821119487000075],
+ [92.36793257700003, 27.80383372000007],
+ [92.35005253100007, 27.802541809000033],
+ [92.33982059800013, 27.815564270000053],
+ [92.33465295400003, 27.83127390600002],
+ [92.32917525300013, 27.832927552000072],
+ [92.31728967300006, 27.80367869100003],
+ [92.30385380100006, 27.786160380000055],
+ [92.28876428200005, 27.793085022000056],
+ [92.27522505700006, 27.81168853700011],
+ [92.25827518700004, 27.848197937000023],
+ [92.24918013500007, 27.862641500000038],
+ [92.23956831900006, 27.865276998000056],
+ [92.1262935790001, 27.81272206600009],
+ [92.10615954418942, 27.786080717238843],
+ [92.06487820550117, 27.76172129397611],
+ [91.98889765320416, 27.76939841380579],
+ [91.96800093766346, 27.746278233869482],
+ [91.95224735500011, 27.724820455],
+ [91.90873579900006, 27.731900126000127],
+ [91.86491418500009, 27.72998809800002],
+ [91.85637335954294, 27.764539482011514],
+ [91.82658872441321, 27.807627271770244],
+ [91.72987134422583, 27.804136158001306],
+ [91.68013149075769, 27.849823277598603],
+ [91.6283394780001, 27.852693787000035],
+ [91.6371244710001, 27.87724009300011],
+ [91.64890669800008, 27.897213033000057],
+ [91.65283410700005, 27.91674672500004],
+ [91.63795129500011, 27.93974273700009],
+ [91.62172489400012, 27.950723979000074],
+ [91.6006409100001, 27.959276429000013],
+ [91.57862675000007, 27.96470245400009],
+ [91.53749231000012, 27.969353333000058],
+ [91.49749475100003, 27.98408111600004],
+ [91.4609078370001, 27.98436533600004],
+ [91.44643843600005, 27.986354879000075],
+ [91.43648287100012, 27.989375107000015],
+ [91.41884322100009, 27.99472646100004],
+ [91.34143192600004, 28.03056406700007],
+ [91.3095992430001, 28.056402283000082],
+ [91.29016890500003, 28.0914130660001],
+ [91.26970503800004, 28.072861227000075],
+ [91.24614058500003, 28.071465963],
+ [91.2206124270001, 28.07487660700012],
+ [91.19467085800005, 28.07058746400004],
+ [91.17586063600004, 28.057487488000092],
+ [91.13379602000003, 28.01410512300002],
+ [91.11963667900005, 27.994881490000083],
+ [91.11942997200003, 27.99472646100004],
+ [91.09255822800003, 27.97167877200006],
+ [91.05194055200008, 27.96279042600007],
+ [91.00884240800008, 27.966769512000056],
+ [90.97514937400013, 27.982091573],
+ [90.96057662000004, 27.99472646100004],
+ [90.90952030400007, 28.032656963000036],
+ [90.85091923100009, 28.044025777000044],
+ [90.78870080600007, 28.047488098000073],
+ [90.75527753600005, 28.055173215000096],
+ [90.7268957930001, 28.06169911800005],
+ [90.6839010010001, 28.087072245000044],
+ [90.66746789600012, 28.090327860000016],
+ [90.65103479000004, 28.086994731000104],
+ [90.62188928300003, 28.0729645790001],
+ [90.59739465400008, 28.07058746400004],
+ [90.57527714000008, 28.06583323200006],
+ [90.51006148300007, 28.074101461000012],
+ [90.49259484900011, 28.074411519000094],
+ [90.4752315670001, 28.07234446300002],
+ [90.48566935150171, 28.12465735277827],
+ [90.51529856561535, 28.154286566892026],
+ [90.54821991463052, 28.157578701793526],
+ [90.56797272403975, 28.19050005080878],
+ [90.59760193815339, 28.200376455513336],
+ [90.58772553344886, 28.233297804528476],
+ [90.54821991463052, 28.246466344134532],
+ [90.50542216091083, 28.249758479036117],
+ [90.45604013738802, 28.282679828051258],
+ [90.41653451856979, 28.282679828051258],
+ [90.38690530445604, 28.2991405025589],
+ [90.35398395544087, 28.2991405025589],
+ [90.32950402800009, 28.25579579700006],
+ [90.29147017500009, 28.261351014000084],
+ [90.2618041781983, 28.2991405025589],
+ [90.2618041781983, 28.335353986475624],
+ [90.22559069428155, 28.358398930786237],
+ [90.1992536150695, 28.34852252608168],
+ [90.1762086707588, 28.325477581771068],
+ [90.15316372644816, 28.322185446869483],
+ [90.12353451233452, 28.335353986475624],
+ [90.07086035391018, 28.34523039118018],
+ [89.99045495700005, 28.32062388100009],
+ [89.97159305900004, 28.318040060000087],
+ [89.95252445500006, 28.30824737600004],
+ [89.91613001353875, 28.31560117706651],
+ [89.88131433100011, 28.29752451600011],
+ [89.87361454300003, 28.300599263000052],
+ [89.86291752100004, 28.295793356000033],
+ [89.85402917500011, 28.28726674400012],
+ [89.83862959800013, 28.267913921000073],
+ [89.82974125100003, 28.259154765000076],
+ [89.79604821800007, 28.240189515000054],
+ [89.78085534700011, 28.228769023000027],
+ [89.77362064600004, 28.21277516700009],
+ [89.75584395400011, 28.184378967000058],
+ [89.71781010000007, 28.169082744000022],
+ [89.59781742400008, 28.149807434000067],
+ [89.57942061400007, 28.144639791000074],
+ [89.56148889100012, 28.134640401000055],
+ [89.51503177900008, 28.081904602000023],
+ [89.49534305900005, 28.06800364200005],
+ [89.47534428000012, 28.061337382000133],
+ [89.45880782100011, 28.04779815700006],
+ [89.44454512600004, 28.031184184000054],
+ [89.42118737800007, 27.99472646100004],
+ [89.42098067200004, 27.99472646100004],
+ [89.41736367800007, 27.988654027000038],
+ [89.37013106300003, 27.90935699500004],
+ [89.33602461800007, 27.8690752160001],
+ [89.29948938000013, 27.844244690000053],
+ [89.25871667500007, 27.827553203000022],
+ [89.22492028800008, 27.807812806000058],
+ [89.21659020133723, 27.77114152368786],
+ [89.19820315021519, 27.730581852095057],
+ [89.15602109175876, 27.665686377546805],
+ [89.1273589238333, 27.627289888438966],
+ [89.12465494572706, 27.614851589150547],
+ [89.11948401016275, 27.61820054938572],
+ [89.10956515172722, 27.62225826420017],
+ [89.1058645948479, 27.62295211861509],
+ [89.10235143650146, 27.623610835805025],
+ [89.09153086366274, 27.62586512181302],
+ [89.06402857436444, 27.615946263377637],
+ [89.05095371551772, 27.60828169095022],
+ [89.0396822854774, 27.594305117700188],
+ [89.03337028465484, 27.57897597284547],
+ [89.01623771099366, 27.57581997243416],
+ [89.00271199494523, 27.560490827579358],
+ [89.00496628095334, 27.549670254740633],
+ [88.99279313650976, 27.53749711029714],
+ [88.97836570605818, 27.53028339507135],
+ [88.97295541963888, 27.517659393426257],
+ [88.97520970564693, 27.506838820587532],
+ [88.98004625332288, 27.497980380569217],
+ [88.98296649296316, 27.49263177875116],
+ [88.96620182870481, 27.478030296977792],
+ [88.95754909876507, 27.456939267749547],
+ [88.95105955131027, 27.433144260415148],
+ [88.96401118394226, 27.392923642327176],
+ [88.98117510746783, 27.35463488984705],
+ [88.99701872918376, 27.33086945727318],
+ [88.97193299480028, 27.312385231937938],
+ [88.95080816584573, 27.32822885365387],
+ [88.91516001698494, 27.33086945727318],
+ [88.89233077000011, 27.315543111000082],
+ [88.86463220200005, 27.332389628000087],
+ [88.85202315300006, 27.342363180000078],
+ [88.8308358160001, 27.36732289600006],
+ [88.8198287350001, 27.37362742200007],
+ [88.80820153800005, 27.378381653000062],
+ [88.79538578300009, 27.385926412000018],
+ [88.77357832900003, 27.408509013000057],
+ [88.75978072200007, 27.435070699000065],
+ [88.75435469600012, 27.464216207000092],
+ [88.75719689900006, 27.49496368400004],
+ [88.75755863400008, 27.511448466000033],
+ [88.74164229300004, 27.531679789000023],
+ [88.7410221770001, 27.545709941000027],
+ [88.74815352400003, 27.560127666000042],
+ [88.76737715600007, 27.586198425000035],
+ [88.78308679200012, 27.622036031000064],
+ [88.80566939300007, 27.655108948000063],
+ [88.85388350400007, 27.843676249000097],
+ [88.85507206300008, 27.859179179000094],
+ [88.85155806500012, 27.877162577],
+ [88.84277307100012, 27.892407125000133],
+ [88.81889856000004, 27.91519643200003],
+ [88.81068200700014, 27.927857158000066],
+ [88.80975183200007, 27.9444969690001],
+ [88.81967370600006, 27.977337342000013],
+ [88.81771000200013, 27.99472646100004],
+ [88.81771000200013, 27.994881490000083],
+ [88.8175032960001, 27.994881490000083],
+ [88.80293054200013, 28.011004537000062],
+ [88.78014123500003, 28.028341980000064],
+ [88.73564782700004, 28.055265402000074],
+ [88.7101196700001, 28.061983337000115],
+ [88.65203536000013, 28.069398906000018],
+ [88.63167484600007, 28.083351542000017],
+ [88.61048750800012, 28.105830790000127],
+ [88.59400272600004, 28.106605937000026],
+ [88.55281660900005, 28.078054708000067],
+ [88.53080245000007, 28.0590119430001],
+ [88.5171598720001, 28.039581604000105],
+ [88.50207035300008, 28.02888458300002],
+ [88.47540531400011, 28.036248474000033],
+ [88.45576827000008, 28.03152008100004],
+ [88.39990604700012, 27.994881490000083],
+ [88.39985437100012, 27.99472646100004],
+ [88.39975101800007, 27.99472646100004],
+ [88.37877038600004, 27.982634176000047],
+ [88.19785119700003, 27.95829457600003],
+ [88.17485518400008, 27.94976796500002],
+ [88.16296960500006, 27.946899923000032],
+ [88.15118737800003, 27.947209982000018],
+ [88.12669274900009, 27.950439759000105],
+ [88.11573734600012, 27.947261658000045],
+ [88.09992435700008, 27.928322246000093],
+ [88.09749556500003, 27.904008484000073],
+ [88.10488529500003, 27.8797205610001],
+ [88.11821781400005, 27.860884501000058],
+ [88.09573856600008, 27.86532867500007],
+ [88.05279545100012, 27.88651601100004],
+ [88.02995446800008, 27.893337301000074],
+ [88.01812056500006, 27.892148743000078],
+ [87.99181726100005, 27.882640280000075],
+ [87.9784330650001, 27.880521545000093],
+ [87.96639245600011, 27.8827436320001],
+ [87.9452051190001, 27.892303772],
+ [87.93455977400009, 27.895301006000025],
+ [87.85611495000006, 27.898608297000024],
+ [87.83668461200006, 27.908323467000073],
+ [87.82588423700014, 27.906566467000076],
+ [87.81415368700004, 27.890960185000054],
+ [87.79865075700013, 27.863468323000077],
+ [87.77984053500012, 27.839438782000045],
+ [87.75637943500004, 27.82037017900005],
+ [87.72682051600003, 27.807761129000042],
+ [87.70046553600008, 27.80564239500005],
+ [87.67852882500011, 27.813351022000077],
+ [87.65995121300006, 27.819879252000035],
+ [87.63607670100009, 27.82365163200005],
+ [87.62109053600011, 27.81954335600004],
+ [87.58998132300013, 27.804608867000084],
+ [87.57334151200013, 27.805022278000095],
+ [87.56507328300006, 27.810861715000087],
+ [87.55980228700014, 27.819078268000013],
+ [87.5559782310001, 27.827088115],
+ [87.55132735200004, 27.83189402300009],
+ [87.53158695500008, 27.836803284000027],
+ [87.51453373200013, 27.835201314000088],
+ [87.47556970200009, 27.82670054200007],
+ [87.38678959100014, 27.804402161000027],
+ [87.36911625200014, 27.803937073],
+ [87.36911625200014, 27.819078268000013],
+ [87.38069177200009, 27.83582143200006],
+ [87.38534265100003, 27.849412334000064],
+ [87.36384525500011, 27.855251770000038],
+ [87.33583662900008, 27.846363424000018],
+ [87.31392582200004, 27.8285867310001],
+ [87.29051639800008, 27.816081035000096],
+ [87.23289717600005, 27.829723613000013],
+ [87.18199589000011, 27.82450429300009],
+ [87.15579593900009, 27.825796204000042],
+ [87.11652185100013, 27.84458058700004],
+ [87.06200321500012, 27.9084268190001],
+ [87.03053226700013, 27.938089091000037],
+ [87.0056759040001, 27.951499126],
+ [86.98872603400008, 27.952480978000054],
+ [86.98209267100003, 27.950674405000072],
+ [86.97022587100014, 27.947442525],
+ [86.94035689300006, 27.943101705000018],
+ [86.91472538200009, 27.945117086000053],
+ [86.89307295800012, 27.954186300000018],
+ [86.87689823400012, 27.970645243],
+ [86.86816491700012, 27.99472646100004],
+ [86.86816491700012, 27.994881490000083],
+ [86.84046634900011, 28.014776917000077],
+ [86.76997969600006, 28.01208974300006],
+ [86.73980065900014, 28.02149485300002],
+ [86.7322042240001, 28.03495656300008],
+ [86.73597660400003, 28.064851380000093],
+ [86.73173913600004, 28.07691782600007],
+ [86.71768314700006, 28.088260804000058],
+ [86.69964807100013, 28.098751119],
+ [86.68006270300003, 28.105727437],
+ [86.66197595200009, 28.106838481000082],
+ [86.64947025600003, 28.101179911000074],
+ [86.62714603700005, 28.08348073300006],
+ [86.6123149010001, 28.080276794000085],
+ [86.59686364700013, 28.086503805000078],
+ [86.58311771700005, 28.098027649000088],
+ [86.56952681500007, 28.106605937000026],
+ [86.55355879700005, 28.104151306000077],
+ [86.54415368700006, 28.09301503600004],
+ [86.54125980600003, 28.078209738000012],
+ [86.54074304200009, 28.06216420600005],
+ [86.53836592600004, 28.047178040000077],
+ [86.5309245200001, 28.03369049100003],
+ [86.52229455600013, 28.02371694000003],
+ [86.51619673700009, 28.012244771],
+ [86.51645511900006, 27.99472646100004],
+ [86.51676433500006, 27.971432200000024],
+ [86.51046065300005, 27.952429301000038],
+ [86.49692142700007, 27.937882385000094],
+ [86.47547570800003, 27.927598775],
+ [86.43883711700005, 27.91085561100006],
+ [86.42529789200012, 27.909925435],
+ [86.40571252400008, 27.917005107000122],
+ [86.37196781400013, 27.941964824000095],
+ [86.36297611500004, 27.946098938000105],
+ [86.35367435800003, 27.944807028000085],
+ [86.34561283400006, 27.940931295000027],
+ [86.33755131000004, 27.93803741500004],
+ [86.3277327880001, 27.93969106100009],
+ [86.31822432400003, 27.945788880000052],
+ [86.29465987200012, 27.97237640400006],
+ [86.27807173600007, 27.98369354300003],
+ [86.25900313300014, 27.987646790000028],
+ [86.23853926600003, 27.98955881800005],
+ [86.21838545700007, 27.99472646100004],
+ [86.21792037000006, 27.99493316600008],
+ [86.21776534000003, 27.99498484300001],
+ [86.20303755700013, 28.00258127900007],
+ [86.19600956200009, 28.01457021100002],
+ [86.18913659700013, 28.043612366000033],
+ [86.18185022000006, 28.054877828000073],
+ [86.17446049000006, 28.062448425000028],
+ [86.17223840400004, 28.071827698000092],
+ [86.18076501500008, 28.088751729000094],
+ [86.18717289300008, 28.108698832000087],
+ [86.18603601100011, 28.133529358000047],
+ [86.17601078300004, 28.15301137300004],
+ [86.1559603280001, 28.156525371],
+ [86.06873050900003, 28.07676279700003],
+ [86.07017745000013, 28.066711731000098],
+ [86.0815462650001, 28.0516997270001],
+ [86.08469852700006, 28.04387074800009],
+ [86.08392338100003, 28.038548076000055],
+ [86.07953088400006, 28.021649882000062],
+ [86.07953088400006, 28.013329977000083],
+ [86.07761885600013, 28.00694793700005],
+ [86.07916914900005, 28.001134339000075],
+ [86.08929772900012, 27.994881490000083],
+ [86.08940108300004, 27.994881490000083],
+ [86.08940108300004, 27.99472646100004],
+ [86.09813439900012, 27.985631409000078],
+ [86.09803104700006, 27.977518209000053],
+ [86.09508549000009, 27.968888245000116],
+ [86.09560225500013, 27.957855326000114],
+ [86.10056319200004, 27.950233053000048],
+ [86.10717777500008, 27.9442385870001],
+ [86.11224206500003, 27.93726226900013],
+ [86.11286218300012, 27.926797791000084],
+ [86.10717777500008, 27.922844544],
+ [86.07565515100009, 27.894784241000067],
+ [86.06170251500009, 27.889048157000033],
+ [86.05459969400005, 27.888013072],
+ [86.0514189050001, 27.887549540000023],
+ [86.02645918800005, 27.88992665600007],
+ [85.98026045800009, 27.88517242400006],
+ [85.9626904700001, 27.891373596000065],
+ [85.95121830300008, 27.916229961000013],
+ [85.95183841900007, 27.936797181000102],
+ [85.95628259300008, 27.956873474000062],
+ [85.95659265100005, 27.9762262980001],
+ [85.94398360200012, 27.99472646100004],
+ [85.9089469810001, 28.022425029000075],
+ [85.8983016360001, 28.03601593000006],
+ [85.89044681900009, 28.059192810000056],
+ [85.88982670100012, 28.071259257000023],
+ [85.89106693500014, 28.080896912000057],
+ [85.88910323100004, 28.090276184000103],
+ [85.87173995000006, 28.110920919000094],
+ [85.86703739500012, 28.13293508],
+ [85.86336836800012, 28.14334788000012],
+ [85.84827885000004, 28.158928325000048],
+ [85.82688480700011, 28.170478007],
+ [85.78275313300003, 28.188099671000074],
+ [85.7566048590001, 28.203240866],
+ [85.7344873450001, 28.221534323000057],
+ [85.71557377100004, 28.243367615000082],
+ [85.69976078300004, 28.269102478],
+ [85.6980037840001, 28.31344085700003],
+ [85.69293949400003, 28.33522247300006],
+ [85.67914188700007, 28.332897034000027],
+ [85.67598962500011, 28.32473215800009],
+ [85.67619633000004, 28.315120341000082],
+ [85.67505944900006, 28.306387024000017],
+ [85.66813480600007, 28.30054758800013],
+ [85.6469474700001, 28.293700460000068],
+ [85.6390926520001, 28.287886862000093],
+ [85.61180749500005, 28.251144918000094],
+ [85.59894006300004, 28.25083486000004],
+ [85.58550419100004, 28.263185526000072],
+ [85.56529870600014, 28.27538116400008],
+ [85.54369795800005, 28.28039377900005],
+ [85.5206502690001, 28.282925924000054],
+ [85.49755090300005, 28.282615865000068],
+ [85.47569177300011, 28.279101868000012],
+ [85.4466496170001, 28.29215016700006],
+ [85.43156010000007, 28.297059428000082],
+ [85.41523034700003, 28.2964393110001],
+ [85.40138106300009, 28.288791199000045],
+ [85.37781661000008, 28.265976054000035],
+ [85.36257206200014, 28.259671529000016],
+ [85.3453638100001, 28.261247660000052],
+ [85.33482181800008, 28.268689067000068],
+ [85.32572676600006, 28.277396546000134],
+ [85.31260095200008, 28.282770895000098],
+ [85.30102543200013, 28.28106557200003],
+ [85.27312015800004, 28.269825949000094],
+ [85.25958093300005, 28.266932068000088],
+ [85.24340620900006, 28.267913921000073],
+ [85.22392419500005, 28.2716863000001],
+ [85.20573409100012, 28.278275045000086],
+ [85.1735913490001, 28.30431996600005],
+ [85.15457442200005, 28.30085764600001],
+ [85.13416223200011, 28.291969300000105],
+ [85.10940922100008, 28.292253520000074],
+ [85.08739506100005, 28.304113261000097],
+ [85.08021203600003, 28.318789368000083],
+ [85.0818671020001, 28.331702005000082],
+ [85.08568973800004, 28.361525777000097],
+ [85.08568973800004, 28.38100779200009],
+ [85.07757653800013, 28.435681457000058],
+ [85.08367435700006, 28.44552581800012],
+ [85.10946089700008, 28.45929758700005],
+ [85.11555871600012, 28.4727334600001],
+ [85.11566206800006, 28.491492005000012],
+ [85.11721236200009, 28.4973314410001],
+ [85.1231551510001, 28.504591980000058],
+ [85.14036340400008, 28.510922343000075],
+ [85.14764978100004, 28.515831604000127],
+ [85.15374760000003, 28.52490081800009],
+ [85.1569515380001, 28.533143209000045],
+ [85.16801029400006, 28.583191833000043],
+ [85.16098230000006, 28.59499989900003],
+ [85.11188968900012, 28.6088233440001],
+ [85.07504439300004, 28.6316643280001],
+ [85.05494226100006, 28.63869232200001],
+ [85.03210127800014, 28.634067281000043],
+ [85.02527998900013, 28.62840871200011],
+ [85.01876875900012, 28.619856262],
+ [85.00915694200012, 28.60254465700008],
+ [85.00249068200003, 28.594431458000074],
+ [84.99406742400004, 28.5908141070001],
+ [84.9847656660001, 28.588592021000082],
+ [84.95494836400007, 28.57430348700011],
+ [84.94895389800007, 28.568283183000077],
+ [84.93644820200007, 28.544770406000097],
+ [84.92849003100008, 28.53846588100008],
+ [84.91872318600014, 28.535675354000105],
+ [84.90787113500011, 28.537018942000074],
+ [84.89143802900003, 28.541773173000067],
+ [84.87929406700005, 28.54363352400007],
+ [84.82394860900007, 28.540532939000045],
+ [84.81195967600013, 28.54197987900004],
+ [84.79914392100005, 28.54663075800009],
+ [84.78178064000014, 28.558903910000126],
+ [84.75563236500005, 28.58541392100004],
+ [84.73661543800006, 28.594173075000114],
+ [84.69083011900005, 28.596136780000037],
+ [84.67775598100008, 28.604405009000075],
+ [84.68297530100011, 28.65075876900009],
+ [84.67114139800009, 28.658949483000114],
+ [84.65227950100007, 28.66238596600006],
+ [84.63264245600004, 28.668793844000092],
+ [84.62582116700008, 28.676080221000078],
+ [84.61620935100007, 28.693650207000033],
+ [84.6072176510001, 28.69819773400006],
+ [84.55182051600008, 28.7063884490001],
+ [84.53197676600007, 28.712692973000017],
+ [84.51564701300003, 28.721400452000083],
+ [84.49859379100008, 28.72786000600003],
+ [84.4757528080001, 28.727291565000073],
+ [84.45084476800014, 28.73388031000006],
+ [84.43782230700009, 28.753336487000055],
+ [84.42273278800008, 28.79917348300002],
+ [84.41430953000008, 28.808268534],
+ [84.39307051600014, 28.82433990500006],
+ [84.37658573500005, 28.848834534],
+ [84.36630212500006, 28.85674102800006],
+ [84.3540031330001, 28.861288554000097],
+ [84.28599694900004, 28.873742574000076],
+ [84.23514733900004, 28.900020040000115],
+ [84.2252905100001, 28.914115306],
+ [84.20672530100012, 28.940663554000068],
+ [84.2314266360001, 29.025981343000026],
+ [84.22057458500007, 29.03890045200005],
+ [84.19819869000008, 29.045308329000093],
+ [84.17546106000009, 29.05740061400006],
+ [84.16972497600005, 29.08892323900004],
+ [84.16621097900008, 29.098457540000126],
+ [84.16011316000004, 29.105485535000028],
+ [84.13799564600004, 29.124657492000054],
+ [84.13225956200006, 29.143803609000045],
+ [84.14171634900003, 29.160262554000028],
+ [84.15520389800008, 29.175946351000093],
+ [84.16166345300007, 29.19253448500008],
+ [84.15546228100004, 29.206642151000025],
+ [84.14197473200011, 29.208269959000077],
+ [84.12600671400008, 29.2062545780001],
+ [84.11236413600005, 29.20909678200009],
+ [84.10533614100007, 29.219922994000044],
+ [84.09913496900009, 29.247001445000095],
+ [84.08972985800011, 29.256613261],
+ [84.07205651900011, 29.256974996000096],
+ [84.05303959200006, 29.25036041300011],
+ [84.0352112220001, 29.24762156200005],
+ [84.02151696800007, 29.25976552300007],
+ [84.01252526900004, 29.270204163000088],
+ [84.00089807100005, 29.27252960200012],
+ [83.98823734600012, 29.269532369],
+ [83.97583500200005, 29.263744609000028],
+ [83.97325118100008, 29.277025452000046],
+ [83.96725671400003, 29.284699402000044],
+ [83.9579549560001, 29.289040222000025],
+ [83.94555261300013, 29.291830750000074],
+ [83.93315026800008, 29.291779073000058],
+ [83.91439172400004, 29.28940195700001],
+ [83.88343754100003, 29.282012228],
+ [83.87739139900003, 29.276767070000076],
+ [83.86886478700012, 29.263434550000042],
+ [83.86163008600005, 29.26020477300007],
+ [83.83785892700007, 29.254003601000093],
+ [83.79321049000004, 29.23475413100006],
+ [83.77062788900008, 29.232247824000083],
+ [83.74535811400006, 29.234469910000072],
+ [83.71972660300008, 29.233591411000035],
+ [83.6954903570001, 29.22617584200013],
+ [83.67507816600005, 29.208760885000103],
+ [83.66774011200005, 29.192327780000127],
+ [83.66339929300005, 29.174809469000067],
+ [83.65600956200007, 29.160779318000053],
+ [83.65499238900003, 29.160413575000078],
+ [83.63926639800013, 29.15475901300003],
+ [83.62443526200008, 29.155456645000115],
+ [83.58381758700006, 29.16214874300003],
+ [83.57203536000003, 29.168401592000023],
+ [83.56139001500003, 29.176230570000072],
+ [83.53596521000003, 29.179227804000064],
+ [83.52371789500012, 29.183594462000073],
+ [83.51705163600008, 29.19170766200007],
+ [83.51457116700004, 29.201810405000018],
+ [83.51250410900008, 29.223488668000087],
+ [83.50299564700009, 29.26103159600011],
+ [83.49338383000008, 29.276146952000104],
+ [83.47581384300008, 29.28692148900005],
+ [83.44821862800012, 29.29676584900001],
+ [83.4372115480001, 29.30524078400002],
+ [83.42816817300007, 29.33345611600008],
+ [83.41778120900005, 29.340897523000095],
+ [83.40501713000009, 29.3464785770001],
+ [83.39313155100012, 29.35624542300006],
+ [83.38827396600004, 29.37022389700006],
+ [83.38941084800013, 29.382445374],
+ [83.38724043800005, 29.393504130000096],
+ [83.35700972500013, 29.415363261000024],
+ [83.35520105000012, 29.427972310000072],
+ [83.35778487100004, 29.44275177100006],
+ [83.35520105000012, 29.460735168000056],
+ [83.32796757000006, 29.48502309200005],
+ [83.26394047000014, 29.47300832100008],
+ [83.24719730600009, 29.49473826100011],
+ [83.24874760000012, 29.506572164000104],
+ [83.25401859500005, 29.513290101000038],
+ [83.25990970900006, 29.518767802000028],
+ [83.26332035400009, 29.52708770800008],
+ [83.26083988500011, 29.542048035000064],
+ [83.25257165600004, 29.555199687000126],
+ [83.22931726100012, 29.575947774000056],
+ [83.22187585400007, 29.579823507000114],
+ [83.2049259850001, 29.58491363600011],
+ [83.19717452000009, 29.58909942700005],
+ [83.19448734600007, 29.59364695300006],
+ [83.19086999600006, 29.606901957000062],
+ [83.18725264500011, 29.612095439000072],
+ [83.17355839100009, 29.62126800500009],
+ [83.16208622200014, 29.625169576000033],
+ [83.15004561400008, 29.62563466400006],
+ [83.12668786600005, 29.623412577000053],
+ [83.10028120900006, 29.617676493000104],
+ [83.09335656700006, 29.615144349000033],
+ [83.08844730700014, 29.604421488000085],
+ [83.08555342600005, 29.59039133800009],
+ [83.07955896000004, 29.579642640000074],
+ [83.06493453000007, 29.57878997800013],
+ [83.05449589000011, 29.586050517],
+ [83.04090498800014, 29.610286764000094],
+ [83.03289514200009, 29.620467021000067],
+ [82.9758960370001, 29.664030253000092],
+ [82.96432051600004, 29.665890605000087],
+ [82.9420996500001, 29.6629450490001],
+ [82.93191939300004, 29.664185283000037],
+ [82.92370284000009, 29.669662984000027],
+ [82.90913008600012, 29.684623312],
+ [82.89972497600007, 29.688421529000024],
+ [82.88008793200004, 29.68110931400004],
+ [82.8574536540001, 29.666200664000073],
+ [82.83657637600004, 29.65979278600004],
+ [82.82236535700014, 29.67795705200008],
+ [82.81554406800012, 29.690126851000073],
+ [82.80515710500009, 29.695966289000083],
+ [82.7930648200001, 29.699506124000052],
+ [82.78107588700004, 29.705113017000073],
+ [82.77012048400007, 29.71415639300001],
+ [82.75151696800003, 29.73932281500005],
+ [82.69095218900003, 29.780741476000017],
+ [82.68175378500007, 29.797717183000103],
+ [82.68464766500006, 29.809706116000072],
+ [82.68919519100007, 29.81957631400006],
+ [82.68898848500004, 29.827741191000072],
+ [82.67730961100006, 29.834407451000075],
+ [82.66697432500013, 29.83502756700007],
+ [82.64640710500004, 29.82934316100001],
+ [82.63586511200009, 29.829033101000036],
+ [82.61850183100006, 29.839833476000067],
+ [82.54181400500005, 29.923239238000022],
+ [82.52424401900004, 29.932385966000098],
+ [82.47582320100008, 29.945511780000075],
+ [82.4570646570001, 29.9540900680001],
+ [82.43892622900006, 29.965768942000082],
+ [82.4228548590001, 29.979669902000055],
+ [82.40978072100006, 29.99460439100001],
+ [82.39443282100007, 30.00313100200013],
+ [82.37913659700013, 30.00323435500006],
+ [82.36373702000003, 30.001167298],
+ [82.34730391400007, 30.003441061000032],
+ [82.33908736200004, 30.009228821000093],
+ [82.32715010600009, 30.025713603000057],
+ [82.31888187700014, 30.031811422000132],
+ [82.2965059820001, 30.036824036],
+ [82.27599043800012, 30.036927388000024],
+ [82.25573327600011, 30.039666240000074],
+ [82.21067142800007, 30.064419251000075],
+ [82.19217126400014, 30.06147369400007],
+ [82.17423954300006, 30.055479228000067],
+ [82.15382735200012, 30.058166402],
+ [82.14452559400007, 30.069431865000055],
+ [82.13522383600014, 30.08974070200007],
+ [82.12871260600008, 30.110773010000074],
+ [82.1275757250001, 30.124363912000078],
+ [82.15098514800013, 30.162242737000057],
+ [82.15568770300013, 30.181363017000066],
+ [82.14039148000006, 30.194023743000102],
+ [82.11424320500004, 30.202188619000125],
+ [82.09589807100008, 30.21345408200007],
+ [82.0849943450001, 30.2308173630001],
+ [82.08210046400012, 30.25732737300011],
+ [82.09321089700006, 30.31473988900011],
+ [82.08876672400004, 30.330087789000075],
+ [82.07321211800013, 30.337219137000105],
+ [82.04985437000005, 30.339234518000055],
+ [82.00763472500006, 30.336805726000094],
+ [81.99817793800014, 30.33406687500006],
+ [81.98846276900008, 30.329777731],
+ [81.97885095300006, 30.326832174000074],
+ [81.96903243000008, 30.32827911400007],
+ [81.96210778900013, 30.333653463000033],
+ [81.95011885600007, 30.348381246000045],
+ [81.94123050900004, 30.353962301000067],
+ [81.92149011200007, 30.35737294600007],
+ [81.88717696200007, 30.35499583000005],
+ [81.84438887500005, 30.371170553000027],
+ [81.82278812700008, 30.368173320000025],
+ [81.80149743700008, 30.36130035400005],
+ [81.77901818800007, 30.35804473900008],
+ [81.7573657640001, 30.362902324000075],
+ [81.63571944200004, 30.410961406000055],
+ [81.61401534000004, 30.416904195000072],
+ [81.59158776800007, 30.414268697000054],
+ [81.58507653800007, 30.408119202000066],
+ [81.58197595200005, 30.399437561000113],
+ [81.57670495600007, 30.390962626000103],
+ [81.56326908400007, 30.385588277000053],
+ [81.54425215700007, 30.38264272100004],
+ [81.53681075100008, 30.378560283000056],
+ [81.53195316600005, 30.370343730000016],
+ [81.52068770400007, 30.33194814000008],
+ [81.5093705650001, 30.328382467000026],
+ [81.48306726100009, 30.331896464000053],
+ [81.46281010000007, 30.34135325100003],
+ [81.4261198320001, 30.372514140000092],
+ [81.40741296400012, 30.37918040000001],
+ [81.38751753800011, 30.37390940300007],
+ [81.3848820400001, 30.360938619000066],
+ [81.38725915500004, 30.345125631000045],
+ [81.38214318800004, 30.3312763470001],
+ [81.37154952000009, 30.3169102990001],
+ [81.36803552300012, 30.30104563400009],
+ [81.36901737500006, 30.26606068900007],
+ [81.3705159910001, 30.257275696000093],
+ [81.37692386900011, 30.241204325000027],
+ [81.37785404500005, 30.232626038],
+ [81.37439172400013, 30.223117574000113],
+ [81.36183435100014, 30.20477244100003],
+ [81.35728682500007, 30.173559876000056],
+ [81.35005212400011, 30.157230123000105],
+ [81.33826989700003, 30.143535868000086],
+ [81.3224052330001, 30.133769023000028],
+ [81.30953780200008, 30.132063701000064],
+ [81.29325972600009, 30.132838847000087],
+ [81.27770511900007, 30.131856995000092],
+ [81.26695642100003, 30.125087382000075],
+ [81.26633630400005, 30.117749329000063],
+ [81.27450118000007, 30.10219472300004],
+ [81.27594812100006, 30.09537343300009],
+ [81.27202071100004, 30.07992218],
+ [81.2679026460001, 30.07205300500003],
+ [81.2668013920001, 30.06994862900008],
+ [81.25708622300004, 30.063540752000037],
+ [81.2395162360001, 30.058786520000055],
+ [81.22571862800004, 30.050466614000086],
+ [81.22726892100007, 30.022457987000095],
+ [81.21683028200005, 30.008195292000025],
+ [81.19450606300006, 30.004474589],
+ [81.14810062700013, 30.02323313400008],
+ [81.12458785000007, 30.02276804700007],
+ [81.09776778200006, 30.01692860900009],
+ [81.08484867400006, 30.026178690000094],
+ [81.08445364600004, 30.027875774000094],
+ [81.07420332800007, 30.071912334000032],
+ [81.06660689300008, 30.08715688100007],
+ [81.04366255800005, 30.12022979700005],
+ [81.0308984780001, 30.152734274000082],
+ [81.01942631000009, 30.172267965000074],
+ [81.00650720200008, 30.188907776000107],
+ [80.99601688700011, 30.19696930000002],
+ [81.00330326400012, 30.212730611000083],
+ [80.99627526900008, 30.226889954000043],
+ [80.97601810700007, 30.255208638000042],
+ [80.94377201300011, 30.270143128000072],
+ [80.86698083500005, 30.28848826100007],
+ [80.78166304500007, 30.320992737],
+ [80.76719364400003, 30.331431376000026],
+ [80.75499800600005, 30.345797425000043],
+ [80.73536096200007, 30.378198547000054],
+ [80.72306197200004, 30.392047832000102],
+ [80.69474328600006, 30.41173655200005],
+ [80.59635136000003, 30.45979563500002],
+ [80.57526737500012, 30.466255188000062],
+ [80.55997115100007, 30.465118306000065],
+ [80.54508833800008, 30.461035869000042],
+ [80.52514123600008, 30.458607076000092],
+ [80.5082947190001, 30.46232777900009],
+ [80.47542850700006, 30.48046620700002],
+ [80.42499230900006, 30.49782948800005],
+ [80.32587691200013, 30.54650868700007],
+ [80.2528064380001, 30.565008851000087],
+ [80.21621952300006, 30.566817526000094],
+ [80.17983931500004, 30.559479472000092],
+ [80.18841760200007, 30.576997783000067],
+ [80.19782271300005, 30.591363831000066],
+ [80.20330041600005, 30.60634999600005],
+ [80.19988977100013, 30.62588368700004],
+ [80.19058801300008, 30.637975973000025],
+ [80.17725549300008, 30.649861552000047],
+ [80.16692020700003, 30.661902161000043],
+ [80.16661014800007, 30.674407858000038],
+ [80.1729146730001, 30.67916208900003],
+ [80.18200972500006, 30.680040589000058],
+ [80.19172489400012, 30.679678853000055],
+ [80.19988977100013, 30.68071238200004],
+ [80.20702111900005, 30.68613840700003],
+ [80.23141239400007, 30.724947408000062],
+ [80.22459110500012, 30.734094137000042],
+ [80.19606571500009, 30.748098450000057],
+ [80.16929732200009, 30.78525380400005],
+ [80.15710168400011, 30.793160299000093],
+ [80.14066858000012, 30.79321197500009],
+ [80.10924930900006, 30.778122458],
+ [80.09219608500007, 30.774505107000024],
+ [80.06253381400006, 30.784788717000097],
+ [80.04444706200007, 30.80669952400008],
+ [80.02863407400008, 30.830780742000016],
+ [80.00558638600012, 30.847265524000093],
+ [79.93489302600011, 30.872535299000063],
+ [79.91936951600007, 30.88118194500005],
+ [79.91463535600008, 30.88381888700009],
+ [79.90316369700008, 30.89020863900005],
+ [79.8804260660001, 30.912842916],
+ [79.86285607900004, 30.941523336],
+ [79.85035038300003, 30.954494120000035],
+ [79.83350386600006, 30.96152211500005],
+ [79.76064009600009, 30.977231751000105],
+ [79.73903934800012, 30.979247131000065],
+ [79.68849979700008, 30.96741322900003],
+ [79.64819217900003, 30.965759583000093],
+ [79.63031213400006, 30.962503967000103],
+ [79.58948775300007, 30.94023142500005],
+ [79.57780887900009, 30.938371074000045],
+ [79.56592329900008, 30.942453512000057],
+ [79.54421919800006, 30.947414449000107],
+ [79.5296464440001, 30.953563945000084],
+ [79.51269657400007, 30.966172994000104],
+ [79.4976070560001, 30.981210836000074],
+ [79.48820194600006, 30.99449167900009],
+ [79.48685835800006, 31.00022776300004],
+ [79.4842745360001, 31.005447083000078],
+ [79.48076053900013, 31.01004628500003],
+ [79.47641971900003, 31.014025371000102],
+ [79.46164025900003, 31.02110504200003],
+ [79.4463440350001, 31.023792216000047],
+ [79.43073775300013, 31.023172099000092],
+ [79.414408, 31.02038157100013],
+ [79.40159224500013, 31.02363718700012],
+ [79.3949776610001, 31.036711324000052],
+ [79.38836307800011, 31.069474182000064],
+ [79.38259259500006, 31.07833466600009],
+ [79.37234338400009, 31.094072165000043],
+ [79.3670479880583, 31.111559061766084],
+ [79.31941711251294, 31.142279974197177],
+ [79.30216249530298, 31.163450395319558],
+ [79.30320907773682, 31.183103768324315],
+ [79.29807839147153, 31.203242202430214],
+ [79.28832134985049, 31.225473994629226],
+ [79.2783162706794, 31.240043992036647],
+ [79.2528602604927, 31.24543676949139],
+ [79.24843045010522, 31.256703749478504],
+ [79.26202358591979, 31.27851309060668],
+ [79.25411000876994, 31.29900573432724],
+ [79.2392392007286, 31.311723913427898],
+ [79.23831863759511, 31.3296556045226],
+ [79.20762798854088, 31.351372703987124],
+ [79.19244185390846, 31.369789449823315],
+ [79.17921754805144, 31.393795999286],
+ [79.15769333967592, 31.414925750622956],
+ [79.13139720595568, 31.438433157420082],
+ [79.07799043411131, 31.461664353726974],
+ [79.07021024772884, 31.461381390199218],
+ [79.04993667283924, 31.422952683719416],
+ [79.01552948833853, 31.383397147758455],
+ [78.98880090300014, 31.34325592100005],
+ [78.95955204300003, 31.325117493000036],
+ [78.94028174400734, 31.301576298907094],
+ [78.92100839989331, 31.269685496828163],
+ [78.88697183608144, 31.28417089736905],
+ [78.86198693800009, 31.291476135],
+ [78.84865441900007, 31.29090769500003],
+ [78.82198938000005, 31.29369822200009],
+ [78.79604781100005, 31.288117167000067],
+ [78.78447229000005, 31.288272197000097],
+ [78.75315637200003, 31.30196645100004],
+ [78.74509484900005, 31.308115947000104],
+ [78.74085738200006, 31.317727763000036],
+ [78.73848026600012, 31.334987691000023],
+ [78.74550826100005, 31.373538310000086],
+ [78.7600810140001, 31.412037252000047],
+ [78.76256148300007, 31.44511016900013],
+ [78.73300256300007, 31.467744446000083],
+ [78.69538212100014, 31.488104961000104],
+ [78.69951623500003, 31.51001576800006],
+ [78.79697798700005, 31.578848775000054],
+ [78.81403120900006, 31.59502349900005],
+ [78.81888879400009, 31.607374166000014],
+ [78.79532434100008, 31.633780823000095],
+ [78.75811731000005, 31.666595358],
+ [78.73982385300008, 31.666026917000053],
+ [78.7313489180001, 31.668042298],
+ [78.72401086500008, 31.67331329300005],
+ [78.71842981000009, 31.680599671000024],
+ [78.71047164000004, 31.698169658],
+ [78.69806929500004, 31.71103709000009],
+ [78.69321171100006, 31.71853017200003],
+ [78.69259159400008, 31.728400370000102],
+ [78.69517541500005, 31.737960511],
+ [78.69558882600006, 31.746693827000072],
+ [78.67088749200008, 31.770516663000038],
+ [78.67409143000003, 31.786949768000014],
+ [78.7003430580001, 31.821676331000035],
+ [78.70664758300006, 31.840796611000044],
+ [78.71419234300004, 31.88301625600012],
+ [78.72018680900004, 31.902911682000124],
+ [78.7419942630001, 31.945338033000056],
+ [78.74457808500011, 31.964199931000067],
+ [78.73382938700007, 31.984663798000028],
+ [78.72215051300009, 31.99458567300003],
+ [78.67832889800007, 32.01675486300006],
+ [78.64928674300012, 32.036443583],
+ [78.55182499200004, 32.15039011700007],
+ [78.53497847500006, 32.18134429900006],
+ [78.51306766800008, 32.2075700890001],
+ [78.47648075400014, 32.22441660600008],
+ [78.46901739200007, 32.226532615000096],
+ [78.46854076900007, 32.22666774700009],
+ [78.45798059100014, 32.229661764000085],
+ [78.45632694500006, 32.24211578400009],
+ [78.46139123600005, 32.26015085900009],
+ [78.46273482300012, 32.28180328400008],
+ [78.43886031100004, 32.37329640700004],
+ [78.43596643100005, 32.377973125],
+ [78.43451949100006, 32.38376088500006],
+ [78.43637984200006, 32.39616322900004],
+ [78.44144413200013, 32.40494822200013],
+ [78.44816206900003, 32.41065846800008],
+ [78.45219283000006, 32.41678212500004],
+ [78.44878218600013, 32.42678151500006],
+ [78.40919803900005, 32.4766234340001],
+ [78.3809827070001, 32.528041484000084],
+ [78.38480676200004, 32.54754933700006],
+ [78.40816451000006, 32.55837555],
+ [78.44754195200011, 32.566256205000045],
+ [78.58985884700007, 32.569925232000045],
+ [78.63016646300008, 32.57801259400004],
+ [78.64773645100007, 32.58597076500011],
+ [78.66489302600013, 32.59901906300006],
+ [78.69445194500008, 32.629663188000066],
+ [78.7132621670001, 32.637518006],
+ [78.73682661900011, 32.629844056000124],
+ [78.75098596200013, 32.61279083300009],
+ [78.74912561100012, 32.5958668010001],
+ [78.74065067600003, 32.578684387000024],
+ [78.73496626800011, 32.56064931300004],
+ [78.73692997300003, 32.54579233800008],
+ [78.75470666500013, 32.493805847000075],
+ [78.77144982900012, 32.461663106000046],
+ [78.85568241400006, 32.40045237300011],
+ [78.88152063000013, 32.37626780200013],
+ [78.9112862550001, 32.35474456800007],
+ [78.94342899600014, 32.346372986000105],
+ [78.97619185400004, 32.36161753300006],
+ [78.98983443200012, 32.364098003000024],
+ [79.01474247300007, 32.373994039000095],
+ [79.02817834500007, 32.377094626000044],
+ [79.03965051300008, 32.37598358100006],
+ [79.0663155520001, 32.37006663100006],
+ [79.07530725100014, 32.370790100000036],
+ [79.0917403570001, 32.39055633500003],
+ [79.10290246600005, 32.449855042000124],
+ [79.11292769400006, 32.47238596700005],
+ [79.13287479700011, 32.4854601040001],
+ [79.16140018800013, 32.496467184],
+ [79.19116581200012, 32.504270325],
+ [79.21524703000006, 32.507913513000105],
+ [79.23560754400012, 32.504296163000035],
+ [79.28741156145267, 32.53257939116813],
+ [79.32046626650504, 32.59226722135526],
+ [79.37947682579494, 32.57644972217696],
+ [79.40682034478317, 32.52968335070614],
+ [79.44349727169374, 32.53477259180094],
+ [79.47211298523796, 32.56547177661887],
+ [79.51574063362341, 32.608119744630585],
+ [79.53120131304826, 32.648316794003655],
+ [79.57617012539868, 32.6706463645242],
+ [79.62067291506752, 32.72872513425561],
+ [79.61391341067542, 32.76503545442273],
+ [79.56409288128151, 32.793927891059354],
+ [79.4710886681076, 32.908959488689504],
+ [79.41408948759245, 32.9720529162554],
+ [79.3784615590933, 32.97888079862581],
+ [79.33358605900014, 32.99429209500006],
+ [79.33978723100012, 33.013257345000014],
+ [79.39927298712544, 33.026877543090805],
+ [79.38106298759733, 33.06176785943445],
+ [79.3731702070001, 33.11214019800006],
+ [79.42347470306436, 33.15782502934888],
+ [79.45609607657275, 33.25039903388836],
+ [79.42008441515759, 33.27516911050025],
+ [79.34030669939472, 33.27513188662732],
+ [79.26006124250934, 33.29177628972042],
+ [79.15021349475705, 33.29255492117272],
+ [79.12503824122189, 33.29020260316764],
+ [79.09802822725385, 33.28765466454805],
+ [79.07504815721146, 33.29574255484219],
+ [79.05327756453967, 33.307872984457326],
+ [79.02304063027336, 33.31798038693261],
+ [78.99344870739196, 33.330781826020484],
+ [78.96498571648198, 33.344254148471954],
+ [78.91769413200012, 33.386257833000045]
+ ]
+ ]
+ },
+ "india": {
+ "stop": 0.5622801389605236,
+ "anchor": [80.10836486026088, 22.5],
+ "border": [
+ [
+ [78.79898227941202, 33.5],
+ [78.80090539600008, 33.494235738],
+ [78.82426314300005, 33.46105946900006],
+ [78.91594777500006, 33.387655981000094],
+ [78.91769413200012, 33.386257833000045],
+ [78.96498571648198, 33.344254148471954],
+ [78.99344870739196, 33.330781826020484],
+ [79.02304063027336, 33.31798038693261],
+ [79.05327756453967, 33.307872984457326],
+ [79.07504815721146, 33.29574255484219],
+ [79.09802822725385, 33.28765466454805],
+ [79.12503824122189, 33.29020260316764],
+ [79.15021349475705, 33.29255492117272],
+ [79.26006124250934, 33.29177628972042],
+ [79.34030669939472, 33.27513188662732],
+ [79.42008441515759, 33.27516911050025],
+ [79.45609607657275, 33.25039903388836],
+ [79.42347470306436, 33.15782502934888],
+ [79.3731702070001, 33.11214019800006],
+ [79.38106298759733, 33.06176785943445],
+ [79.39927298712544, 33.026877543090805],
+ [79.33978723100012, 33.013257345000014],
+ [79.33358605900014, 32.99429209500006],
+ [79.3784615590933, 32.97888079862581],
+ [79.41408948759245, 32.9720529162554],
+ [79.4710886681076, 32.908959488689504],
+ [79.56409288128151, 32.793927891059354],
+ [79.61391341067542, 32.76503545442273],
+ [79.62067291506752, 32.72872513425561],
+ [79.57617012539868, 32.6706463645242],
+ [79.53120131304826, 32.648316794003655],
+ [79.51574063362341, 32.608119744630585],
+ [79.47211298523796, 32.56547177661887],
+ [79.44349727169374, 32.53477259180094],
+ [79.40682034478317, 32.52968335070614],
+ [79.37947682579494, 32.57644972217696],
+ [79.32046626650504, 32.59226722135526],
+ [79.28741156145267, 32.53257939116813],
+ [79.23560754400012, 32.504296163000035],
+ [79.21524703000006, 32.507913513000105],
+ [79.19116581200012, 32.504270325],
+ [79.16140018800013, 32.496467184],
+ [79.13287479700011, 32.4854601040001],
+ [79.11292769400006, 32.47238596700005],
+ [79.10290246600005, 32.449855042000124],
+ [79.0917403570001, 32.39055633500003],
+ [79.07530725100014, 32.370790100000036],
+ [79.0663155520001, 32.37006663100006],
+ [79.03965051300008, 32.37598358100006],
+ [79.02817834500007, 32.377094626000044],
+ [79.01474247300007, 32.373994039000095],
+ [78.98983443200012, 32.364098003000024],
+ [78.97619185400004, 32.36161753300006],
+ [78.94342899600014, 32.346372986000105],
+ [78.9112862550001, 32.35474456800007],
+ [78.88152063000013, 32.37626780200013],
+ [78.85568241400006, 32.40045237300011],
+ [78.77144982900012, 32.461663106000046],
+ [78.75470666500013, 32.493805847000075],
+ [78.73692997300003, 32.54579233800008],
+ [78.73496626800011, 32.56064931300004],
+ [78.74065067600003, 32.578684387000024],
+ [78.74912561100012, 32.5958668010001],
+ [78.75098596200013, 32.61279083300009],
+ [78.73682661900011, 32.629844056000124],
+ [78.7132621670001, 32.637518006],
+ [78.69445194500008, 32.629663188000066],
+ [78.66489302600013, 32.59901906300006],
+ [78.64773645100007, 32.58597076500011],
+ [78.63016646300008, 32.57801259400004],
+ [78.58985884700007, 32.569925232000045],
+ [78.44754195200011, 32.566256205000045],
+ [78.40816451000006, 32.55837555],
+ [78.38480676200004, 32.54754933700006],
+ [78.3809827070001, 32.528041484000084],
+ [78.40919803900005, 32.4766234340001],
+ [78.44878218600013, 32.42678151500006],
+ [78.45219283000006, 32.41678212500004],
+ [78.44816206900003, 32.41065846800008],
+ [78.44144413200013, 32.40494822200013],
+ [78.43637984200006, 32.39616322900004],
+ [78.43451949100006, 32.38376088500006],
+ [78.43596643100005, 32.377973125],
+ [78.43886031100004, 32.37329640700004],
+ [78.46273482300012, 32.28180328400008],
+ [78.46139123600005, 32.26015085900009],
+ [78.45632694500006, 32.24211578400009],
+ [78.45798059100014, 32.229661764000085],
+ [78.46854076900007, 32.22666774700009],
+ [78.46901739200007, 32.226532615000096],
+ [78.47648075400014, 32.22441660600008],
+ [78.51306766800008, 32.2075700890001],
+ [78.53497847500006, 32.18134429900006],
+ [78.55182499200004, 32.15039011700007],
+ [78.64928674300012, 32.036443583],
+ [78.67832889800007, 32.01675486300006],
+ [78.72215051300009, 31.99458567300003],
+ [78.73382938700007, 31.984663798000028],
+ [78.74457808500011, 31.964199931000067],
+ [78.7419942630001, 31.945338033000056],
+ [78.72018680900004, 31.902911682000124],
+ [78.71419234300004, 31.88301625600012],
+ [78.70664758300006, 31.840796611000044],
+ [78.7003430580001, 31.821676331000035],
+ [78.67409143000003, 31.786949768000014],
+ [78.67088749200008, 31.770516663000038],
+ [78.69558882600006, 31.746693827000072],
+ [78.69517541500005, 31.737960511],
+ [78.69259159400008, 31.728400370000102],
+ [78.69321171100006, 31.71853017200003],
+ [78.69806929500004, 31.71103709000009],
+ [78.71047164000004, 31.698169658],
+ [78.71842981000009, 31.680599671000024],
+ [78.72401086500008, 31.67331329300005],
+ [78.7313489180001, 31.668042298],
+ [78.73982385300008, 31.666026917000053],
+ [78.75811731000005, 31.666595358],
+ [78.79532434100008, 31.633780823000095],
+ [78.81888879400009, 31.607374166000014],
+ [78.81403120900006, 31.59502349900005],
+ [78.79697798700005, 31.578848775000054],
+ [78.69951623500003, 31.51001576800006],
+ [78.69538212100014, 31.488104961000104],
+ [78.73300256300007, 31.467744446000083],
+ [78.76256148300007, 31.44511016900013],
+ [78.7600810140001, 31.412037252000047],
+ [78.74550826100005, 31.373538310000086],
+ [78.73848026600012, 31.334987691000023],
+ [78.74085738200006, 31.317727763000036],
+ [78.74509484900005, 31.308115947000104],
+ [78.75315637200003, 31.30196645100004],
+ [78.78447229000005, 31.288272197000097],
+ [78.79604781100005, 31.288117167000067],
+ [78.82198938000005, 31.29369822200009],
+ [78.84865441900007, 31.29090769500003],
+ [78.86198693800009, 31.291476135],
+ [78.88697183608144, 31.28417089736905],
+ [78.92100839989331, 31.269685496828163],
+ [78.94028174400734, 31.301576298907094],
+ [78.95955204300003, 31.325117493000036],
+ [78.98880090300014, 31.34325592100005],
+ [79.01552948833853, 31.383397147758455],
+ [79.04993667283924, 31.422952683719416],
+ [79.07021024772884, 31.461381390199218],
+ [79.07799043411131, 31.461664353726974],
+ [79.13139720595568, 31.438433157420082],
+ [79.15769333967592, 31.414925750622956],
+ [79.17921754805144, 31.393795999286],
+ [79.19244185390846, 31.369789449823315],
+ [79.20762798854088, 31.351372703987124],
+ [79.23831863759511, 31.3296556045226],
+ [79.2392392007286, 31.311723913427898],
+ [79.25411000876994, 31.29900573432724],
+ [79.26202358591979, 31.27851309060668],
+ [79.24843045010522, 31.256703749478504],
+ [79.2528602604927, 31.24543676949139],
+ [79.2783162706794, 31.240043992036647],
+ [79.28832134985049, 31.225473994629226],
+ [79.29807839147153, 31.203242202430214],
+ [79.30320907773682, 31.183103768324315],
+ [79.30216249530298, 31.163450395319558],
+ [79.31941711251294, 31.142279974197177],
+ [79.3670479880583, 31.111559061766084],
+ [79.37234338400009, 31.094072165000043],
+ [79.38259259500006, 31.07833466600009],
+ [79.38836307800011, 31.069474182000064],
+ [79.3949776610001, 31.036711324000052],
+ [79.40159224500013, 31.02363718700012],
+ [79.414408, 31.02038157100013],
+ [79.43073775300013, 31.023172099000092],
+ [79.4463440350001, 31.023792216000047],
+ [79.46164025900003, 31.02110504200003],
+ [79.47641971900003, 31.014025371000102],
+ [79.48076053900013, 31.01004628500003],
+ [79.4842745360001, 31.005447083000078],
+ [79.48685835800006, 31.00022776300004],
+ [79.48820194600006, 30.99449167900009],
+ [79.4976070560001, 30.981210836000074],
+ [79.51269657400007, 30.966172994000104],
+ [79.5296464440001, 30.953563945000084],
+ [79.54421919800006, 30.947414449000107],
+ [79.56592329900008, 30.942453512000057],
+ [79.57780887900009, 30.938371074000045],
+ [79.58948775300007, 30.94023142500005],
+ [79.63031213400006, 30.962503967000103],
+ [79.64819217900003, 30.965759583000093],
+ [79.68849979700008, 30.96741322900003],
+ [79.73903934800012, 30.979247131000065],
+ [79.76064009600009, 30.977231751000105],
+ [79.83350386600006, 30.96152211500005],
+ [79.85035038300003, 30.954494120000035],
+ [79.86285607900004, 30.941523336],
+ [79.8804260660001, 30.912842916],
+ [79.90316369700008, 30.89020863900005],
+ [79.91463535600008, 30.88381888700009],
+ [79.91936951600007, 30.88118194500005],
+ [79.93489302600011, 30.872535299000063],
+ [80.00558638600012, 30.847265524000093],
+ [80.02863407400008, 30.830780742000016],
+ [80.04444706200007, 30.80669952400008],
+ [80.06253381400006, 30.784788717000097],
+ [80.09219608500007, 30.774505107000024],
+ [80.10924930900006, 30.778122458],
+ [80.14066858000012, 30.79321197500009],
+ [80.15710168400011, 30.793160299000093],
+ [80.16929732200009, 30.78525380400005],
+ [80.19606571500009, 30.748098450000057],
+ [80.22459110500012, 30.734094137000042],
+ [80.23141239400007, 30.724947408000062],
+ [80.20702111900005, 30.68613840700003],
+ [80.19988977100013, 30.68071238200004],
+ [80.19172489400012, 30.679678853000055],
+ [80.18200972500006, 30.680040589000058],
+ [80.1729146730001, 30.67916208900003],
+ [80.16661014800007, 30.674407858000038],
+ [80.16692020700003, 30.661902161000043],
+ [80.17725549300008, 30.649861552000047],
+ [80.19058801300008, 30.637975973000025],
+ [80.19988977100013, 30.62588368700004],
+ [80.20330041600005, 30.60634999600005],
+ [80.19782271300005, 30.591363831000066],
+ [80.18841760200007, 30.576997783000067],
+ [80.17983931500004, 30.559479472000092],
+ [80.21621952300006, 30.566817526000094],
+ [80.2528064380001, 30.565008851000087],
+ [80.32587691200013, 30.54650868700007],
+ [80.42499230900006, 30.49782948800005],
+ [80.47542850700006, 30.48046620700002],
+ [80.5082947190001, 30.46232777900009],
+ [80.52514123600008, 30.458607076000092],
+ [80.54508833800008, 30.461035869000042],
+ [80.55997115100007, 30.465118306000065],
+ [80.57526737500012, 30.466255188000062],
+ [80.59635136000003, 30.45979563500002],
+ [80.69474328600006, 30.41173655200005],
+ [80.72306197200004, 30.392047832000102],
+ [80.73536096200007, 30.378198547000054],
+ [80.75499800600005, 30.345797425000043],
+ [80.76719364400003, 30.331431376000026],
+ [80.78166304500007, 30.320992737],
+ [80.86698083500005, 30.28848826100007],
+ [80.94377201300011, 30.270143128000072],
+ [80.97601810700007, 30.255208638000042],
+ [80.99627526900008, 30.226889954000043],
+ [81.00330326400012, 30.212730611000083],
+ [80.99601688700011, 30.19696930000002],
+ [80.98816225269584, 30.196555926350566],
+ [80.92082703591576, 30.176660408536822],
+ [80.903309336412, 30.180432806924035],
+ [80.89364690080846, 30.198104359137524],
+ [80.8838787660946, 30.210405146915726],
+ [80.88368373459112, 30.210280032524576],
+ [80.8679110110001, 30.200173238000062],
+ [80.85039270000004, 30.181931458000022],
+ [80.83644006400004, 30.170045879000085],
+ [80.84966923100006, 30.143380840000034],
+ [80.82982548000007, 30.11712921200011],
+ [80.76967411300012, 30.077286682000093],
+ [80.75572147700012, 30.06457428000003],
+ [80.72574914600011, 30.02276804700007],
+ [80.71582727100008, 30.013311259000105],
+ [80.68017053200003, 29.99207224500013],
+ [80.65412561000005, 29.970574849000073],
+ [80.64141320800007, 29.96344350200006],
+ [80.62229292800009, 29.958172506000025],
+ [80.58622277800009, 29.95414174500003],
+ [80.57133996600004, 29.946855367000055],
+ [80.56286503100006, 29.92969879200008],
+ [80.5495325120001, 29.893680319000097],
+ [80.52731164500005, 29.86241607700002],
+ [80.47615197800008, 29.806140442000114],
+ [80.45486128700009, 29.79058583600009],
+ [80.39522668500007, 29.776581523000075],
+ [80.36897505700006, 29.757926330000103],
+ [80.35429895100009, 29.730279440000103],
+ [80.35440230300009, 29.704880473000102],
+ [80.36391076700005, 29.679714050000072],
+ [80.37755334500008, 29.652945659000082],
+ [80.38675175000009, 29.626823222],
+ [80.38520145600006, 29.604834900000114],
+ [80.37331587800003, 29.58419016500001],
+ [80.35078495300013, 29.562072652],
+ [80.3451005450001, 29.558351949000084],
+ [80.33269820200007, 29.552460836000094],
+ [80.32722050000012, 29.548585103000036],
+ [80.32360314900012, 29.541660462000053],
+ [80.3250500900001, 29.535510966000075],
+ [80.32763391200012, 29.529929911000053],
+ [80.32722050000012, 29.524839783000075],
+ [80.3200891520001, 29.515822245000024],
+ [80.31151086400013, 29.508122457000027],
+ [80.29146040900008, 29.49473826100011],
+ [80.29115035000012, 29.494609070000067],
+ [80.28205529800005, 29.48429962200005],
+ [80.27306359800008, 29.47866689100003],
+ [80.26624231000005, 29.47212982200007],
+ [80.26345178200006, 29.459236552000064],
+ [80.25745731700005, 29.450063986000075],
+ [80.22831180800006, 29.441718242],
+ [80.21766646400005, 29.434638570000075],
+ [80.21373905400009, 29.416887716000062],
+ [80.22097375500005, 29.4001187140001],
+ [80.24216109200012, 29.367407532000087],
+ [80.24949914600006, 29.326996562000105],
+ [80.25497684700008, 29.316635437000016],
+ [80.26355513600004, 29.315317688000064],
+ [80.27275354000011, 29.315705261000048],
+ [80.28009159300012, 29.310150045000043],
+ [80.28277876900012, 29.29131398500003],
+ [80.27874800600006, 29.26808542900001],
+ [80.25818078600014, 29.202456360000085],
+ [80.24867232300005, 29.204394226000105],
+ [80.23606327400006, 29.213075867000057],
+ [80.21880334400004, 29.21108632400002],
+ [80.21373905400009, 29.196565246],
+ [80.23048221800013, 29.154733174000015],
+ [80.23306604000004, 29.139307760000023],
+ [80.22066369600003, 29.12607859300003],
+ [80.20144006400005, 29.121169332000093],
+ [80.18056278500006, 29.12132436100005],
+ [80.16350956300005, 29.1233655810001],
+ [80.13260705600004, 29.11021392800002],
+ [80.11307336500005, 29.072205913000104],
+ [80.10470178300005, 29.027609151000078],
+ [80.10790572100012, 28.99476877900007],
+ [80.10790572100012, 28.99458791100001],
+ [80.09943078600008, 28.977276306000093],
+ [80.08516809100013, 28.967483623000035],
+ [80.06842492700008, 28.959938864],
+ [80.05292199700006, 28.94911265000006],
+ [80.04051965400004, 28.932808737000116],
+ [80.03390507000012, 28.915936381000037],
+ [80.03111454300006, 28.897797953000108],
+ [80.03028772000005, 28.877669983000132],
+ [80.0363855390001, 28.837026469000094],
+ [80.05478234800006, 28.824184876000103],
+ [80.07305357600006, 28.820924647000098],
+ [80.08186079900014, 28.819353129],
+ [80.11421024600014, 28.80258412700003],
+ [80.14759322100008, 28.763310038000057],
+ [80.16206262200012, 28.753284811000057],
+ [80.18118290200005, 28.74729034500011],
+ [80.21642622900009, 28.74194183400006],
+ [80.23327274600007, 28.732717591000053],
+ [80.23895715300011, 28.726258037],
+ [80.24939579300008, 28.71021250500003],
+ [80.25704390500005, 28.7027452600001],
+ [80.26520878100007, 28.69928293800008],
+ [80.28339888500011, 28.6953555300001],
+ [80.29104699700008, 28.689671123000053],
+ [80.31833215400007, 28.64011342400009],
+ [80.32970096800005, 28.627478537000073],
+ [80.34975142400003, 28.620217998000086],
+ [80.3690784100001, 28.622646789000058],
+ [80.38830204300012, 28.627245993000102],
+ [80.40835249900005, 28.626341655000047],
+ [80.42654260300009, 28.616807353000056],
+ [80.46881392500006, 28.571848857000035],
+ [80.48845096900004, 28.562443746],
+ [80.49341190600006, 28.575647074000088],
+ [80.48493697100008, 28.63928660100008],
+ [80.4876241450001, 28.65646901500004],
+ [80.49754602100006, 28.670137431000043],
+ [80.51759647600005, 28.680033468000133],
+ [80.53444380100007, 28.679555368000095],
+ [80.55583703600013, 28.67894826200005],
+ [80.55904097500007, 28.67303131200005],
+ [80.55738732900005, 28.664349671000068],
+ [80.55687056500011, 28.655022075000048],
+ [80.56358850100014, 28.647038066000064],
+ [80.58136519400006, 28.638950704000067],
+ [80.59852176900012, 28.633783061000074],
+ [80.6356254480001, 28.627866109000067],
+ [80.64833785000008, 28.61975291000006],
+ [80.66818160000014, 28.586344097000094],
+ [80.6786202400001, 28.57471689800012],
+ [80.69577681500004, 28.567508036000063],
+ [80.72709273300006, 28.559679057000054],
+ [80.74352583900003, 28.549963887],
+ [80.78166304500007, 28.514746399000032],
+ [80.79840620900012, 28.505703024000084],
+ [80.8170097260001, 28.502550761000023],
+ [80.85798913600013, 28.502447409000084],
+ [80.87225183100009, 28.496866353000073],
+ [80.88036503100011, 28.481880189],
+ [80.88186364800004, 28.46684234700011],
+ [80.88666955600013, 28.452786357],
+ [80.90527307200006, 28.44084910100004],
+ [80.92134444200013, 28.436198222000073],
+ [80.94118819200014, 28.432684225000045],
+ [80.9605151780001, 28.432270814000034],
+ [80.97601810700007, 28.43692169200007],
+ [80.9878003340001, 28.430978902000064],
+ [80.99131433200006, 28.420256043000066],
+ [80.99317468300006, 28.407827861000087],
+ [81.00040938300003, 28.397001649000046],
+ [81.04706637000004, 28.389087804],
+ [81.14634362800007, 28.3722486380001],
+ [81.16970137600003, 28.361319072000057],
+ [81.19037194900005, 28.33811635300013],
+ [81.21073246300006, 28.27863678000007],
+ [81.22432336400004, 28.25078318300011],
+ [81.28235599800013, 28.191587830000017],
+ [81.2959469000001, 28.167454936000055],
+ [81.2807540280001, 28.161977234000076],
+ [81.27677494300008, 28.153786520000054],
+ [81.28307946800004, 28.146086731000068],
+ [81.29940922000009, 28.1425210580001],
+ [81.29620528100008, 28.128310038000038],
+ [81.30705733200006, 28.1238141890001],
+ [81.32369714400005, 28.12624298100006],
+ [81.3381148690001, 28.132728373000035],
+ [81.34726159700006, 28.144433086],
+ [81.35144738800011, 28.156809591000084],
+ [81.35790694200006, 28.165982157000073],
+ [81.37320316600011, 28.167842509000067],
+ [81.39604414900003, 28.16063364700001],
+ [81.41733483900009, 28.147016907000122],
+ [81.43526656100005, 28.12978281600003],
+ [81.4482373460001, 28.111411845000035],
+ [81.4529399010001, 28.097045797000035],
+ [81.45402510600007, 28.086607157000103],
+ [81.45821089700013, 28.077279562000072],
+ [81.47345544400014, 28.066401672000026],
+ [81.56192549700006, 28.025990703000033],
+ [81.58218265800008, 28.013278300000067],
+ [81.59510176600008, 27.994881490000083],
+ [81.59536014800005, 27.994778138000058],
+ [81.61504886900013, 27.98123891300007],
+ [81.66543339000003, 27.97080027300005],
+ [81.6889461670001, 27.96320383700008],
+ [81.71039188600014, 27.9475200400001],
+ [81.75013106300014, 27.909667054000025],
+ [81.80015384900008, 27.88408722000007],
+ [81.82785241700003, 27.86563873300007],
+ [81.85565433700009, 27.850936788000055],
+ [81.88319787600005, 27.84905059900005],
+ [81.90609053500009, 27.863106588000065],
+ [81.94639815300013, 27.905352072000042],
+ [81.97590539600009, 27.91695343000002],
+ [82.0272200930001, 27.912405904000067],
+ [82.05021249900011, 27.90558612200006],
+ [82.05161136900006, 27.90517120300011],
+ [82.07166182500009, 27.890030009],
+ [82.09036869300007, 27.87233083100007],
+ [82.10742191600008, 27.863571675000102],
+ [82.15103682400007, 27.84827545200004],
+ [82.27040938300007, 27.760477193],
+ [82.34792403200004, 27.726009013000024],
+ [82.40192590400011, 27.67717478400006],
+ [82.44068322800007, 27.666426086000044],
+ [82.52615604700009, 27.67521108000004],
+ [82.65214318800008, 27.704149883000085],
+ [82.67389143300011, 27.696458430000078],
+ [82.6796867270001, 27.694408875000036],
+ [82.69705000800008, 27.669397481000047],
+ [82.70924564600011, 27.630924377],
+ [82.71885746300012, 27.556122742000056],
+ [82.7297095130001, 27.518166402000062],
+ [82.75213708500007, 27.49496368400004],
+ [82.87626387600011, 27.487548116000127],
+ [82.90127526900011, 27.48036509200007],
+ [82.94716394100004, 27.457317403000033],
+ [83.01046757100005, 27.443390604000044],
+ [83.13278568600009, 27.444217428000073],
+ [83.16963098200011, 27.431194967000025],
+ [83.2192403570001, 27.393781230000045],
+ [83.23159102400007, 27.381223856000034],
+ [83.24311486900007, 27.36215525300007],
+ [83.2494193930001, 27.348099263000037],
+ [83.25949629800004, 27.338125713000025],
+ [83.28244063400007, 27.330942688000093],
+ [83.30486820500005, 27.33192454100005],
+ [83.32435022000004, 27.341691386000022],
+ [83.34114506000003, 27.35693593300006],
+ [83.3627458090001, 27.38561635400005],
+ [83.36956709800012, 27.398173726000053],
+ [83.37096236200011, 27.41021433500002],
+ [83.35582116800009, 27.42866282200005],
+ [83.35385746300005, 27.440290019000102],
+ [83.35592452000003, 27.45248565700011],
+ [83.36098881100008, 27.462200826000057],
+ [83.38703373200008, 27.470469056000084],
+ [83.48098148600008, 27.469745585000098],
+ [83.59043217000004, 27.456619771000035],
+ [83.66339929300005, 27.432280172000034],
+ [83.80199548400003, 27.365927633000084],
+ [83.84798750900012, 27.35104482000004],
+ [83.85334011200007, 27.346194023000052],
+ [83.8546020920001, 27.345050354000122],
+ [83.86173343900003, 27.354507142000088],
+ [83.86752120000006, 27.358382873000053],
+ [83.87739139900003, 27.361741842000058],
+ [83.87764978000007, 27.36990671900007],
+ [83.8736706950001, 27.380086975000026],
+ [83.87119022600012, 27.389440410000063],
+ [83.8427165120001, 27.418069153000047],
+ [83.83408654800013, 27.43403717000008],
+ [83.85351688700013, 27.440961813000072],
+ [83.89987064700011, 27.44385569200007],
+ [83.92204311000006, 27.449695761],
+ [83.92302168800012, 27.449953511000032],
+ [83.93594079600012, 27.446077780000067],
+ [83.97583500200005, 27.439721578000032],
+ [84.00766768400013, 27.440806783000127],
+ [84.02890669800007, 27.453725891000047],
+ [84.07960127800004, 27.509536438000012],
+ [84.0995483800001, 27.51687449100011],
+ [84.11717004400009, 27.51328297900004],
+ [84.12156254100006, 27.49496368400004],
+ [84.1309676510001, 27.486411235000034],
+ [84.14171634900003, 27.480752666000072],
+ [84.16574589100009, 27.472174378000048],
+ [84.17509932500008, 27.46297597300007],
+ [84.18584802300012, 27.43863637400004],
+ [84.1952531340001, 27.43605255100003],
+ [84.22553552300008, 27.440393372000116],
+ [84.23902307100008, 27.43114329100011],
+ [84.24889327000005, 27.412436422000027],
+ [84.26770349200007, 27.388561910000035],
+ [84.28940759300008, 27.376107890000057],
+ [84.5770386150001, 27.329030660000072],
+ [84.60654585800012, 27.310478821000018],
+ [84.63191898600013, 27.277044169000035],
+ [84.64819706300005, 27.240715637000065],
+ [84.65765384900004, 27.203405253000128],
+ [84.65982426000011, 27.165113017000024],
+ [84.65439823400004, 27.12537384100004],
+ [84.64452803500006, 27.103721415000038],
+ [84.63036869400008, 27.08082875600003],
+ [84.6214803470001, 27.057987773000022],
+ [84.62726810700008, 27.036490377000078],
+ [84.64023889200007, 27.02837717700008],
+ [84.7606966560001, 26.999024963000082],
+ [84.77196211800009, 26.999179993000055],
+ [84.78550134300013, 27.008481751000076],
+ [84.80193444900004, 27.013752747000083],
+ [84.81748905400013, 27.01060048400005],
+ [84.82813440000012, 26.994942526000088],
+ [84.82828942900005, 26.994839172000056],
+ [84.85175052900007, 26.982126770000022],
+ [84.90156661000009, 26.967192281000038],
+ [84.92404585800011, 26.95566843700003],
+ [84.93856693500004, 26.936599834000035],
+ [84.94425134300008, 26.915722554000055],
+ [84.95272627800011, 26.897635803000057],
+ [84.97577396700007, 26.886887105000127],
+ [84.98817631000003, 26.883786520000072],
+ [85.00083703600006, 26.882236227000064],
+ [85.01804528800005, 26.874433086000053],
+ [85.01685673100013, 26.859240214000025],
+ [85.01856205200005, 26.84580434200008],
+ [85.0439868580001, 26.843737284],
+ [85.10021081500008, 26.863529358000093],
+ [85.12284509300008, 26.865699768000084],
+ [85.16201582800005, 26.851023662000088],
+ [85.16552982600012, 26.82079294900008],
+ [85.16568485500005, 26.786273092],
+ [85.1949337160001, 26.75888458300004],
+ [85.28727950000007, 26.736973776000085],
+ [85.30236901900008, 26.73733551],
+ [85.33704390500003, 26.746792298000074],
+ [85.35321862800009, 26.757592672],
+ [85.35535245800008, 26.759912352000086],
+ [85.36923832200006, 26.77500762900003],
+ [85.38587813300006, 26.788443502000078],
+ [85.4031897380001, 26.787616679000067],
+ [85.42153487200005, 26.782655742000102],
+ [85.43962162300011, 26.787720032],
+ [85.47569177300011, 26.805238343000056],
+ [85.51946171000009, 26.8264256800001],
+ [85.59857832800009, 26.854382630000103],
+ [85.60937870300012, 26.851023662000088],
+ [85.6877718500001, 26.811852926000043],
+ [85.70182784000013, 26.7966083780001],
+ [85.70963098200014, 26.762450256000122],
+ [85.70224125100003, 26.68844960600002],
+ [85.71288659700014, 26.65320627900003],
+ [85.72704593900005, 26.637599996000105],
+ [85.78099613500012, 26.599204407000073],
+ [85.7899878340001, 26.597033997000082],
+ [85.80006473800012, 26.600703023000065],
+ [85.80972823100007, 26.603028463],
+ [85.81763472500006, 26.596723938000096],
+ [85.81954675300011, 26.588300680000103],
+ [85.81975345900008, 26.579515687000097],
+ [85.82161381000009, 26.571712545000096],
+ [85.82853845200003, 26.566131490000075],
+ [85.84476485200008, 26.568508606000123],
+ [85.86636560100004, 26.579929098000022],
+ [85.93468184400007, 26.632897441000026],
+ [85.95214847900013, 26.6420441690001],
+ [85.97571293100003, 26.644369609000037],
+ [86.01136967000014, 26.65444651300008],
+ [86.04170373500006, 26.645454814000047],
+ [86.11069177300004, 26.60674916600003],
+ [86.11585941500005, 26.602563375000088],
+ [86.12206058800012, 26.600289612000054],
+ [86.14479821800006, 26.601529847000094],
+ [86.14635461800009, 26.60135577600009],
+ [86.15265303600012, 26.600651347000067],
+ [86.16779423000014, 26.596620585000053],
+ [86.17446049000006, 26.593313293000065],
+ [86.17926639900003, 26.58861073800007],
+ [86.18536421800007, 26.584424947000045],
+ [86.19585453300004, 26.582667949000083],
+ [86.20288252800009, 26.584579977000075],
+ [86.22515507100013, 26.597395732000066],
+ [86.26308557100003, 26.60907460600005],
+ [86.28442793800014, 26.612020162000036],
+ [86.30137780800004, 26.609022930000023],
+ [86.30861250800007, 26.60214996300006],
+ [86.30902592000012, 26.58799062200002],
+ [86.31600223800012, 26.58096262700009],
+ [86.32318526200004, 26.580084127000063],
+ [86.34483768800004, 26.582616272000067],
+ [86.35367435800003, 26.582616272000067],
+ [86.38364668800006, 26.572849427],
+ [86.4448315840001, 26.543083802000112],
+ [86.47547570800003, 26.531973368000095],
+ [86.4949060460001, 26.527839254000085],
+ [86.5106156820001, 26.52013946600009],
+ [86.52430993700011, 26.509080709000088],
+ [86.53774580900006, 26.4948696900001],
+ [86.53795251500003, 26.4948696900001],
+ [86.55789961800014, 26.484017639000072],
+ [86.62533736100005, 26.45631907100004],
+ [86.69520389800005, 26.418233541000077],
+ [86.71360070900005, 26.414564515000095],
+ [86.72409102400007, 26.421954244000105],
+ [86.73070560700006, 26.43378814800012],
+ [86.7381986900001, 26.44371002200002],
+ [86.75189294500012, 26.44551869700011],
+ [86.78723962400005, 26.43306467700002],
+ [86.79643802900006, 26.431514384000096],
+ [86.82186283400006, 26.438128967000083],
+ [86.84635746300012, 26.452650045000055],
+ [86.86568444800014, 26.472442119000036],
+ [86.87596805800007, 26.494921367000032],
+ [86.9071289470001, 26.51150950100005],
+ [86.93515347300013, 26.520289336000033],
+ [86.97244795800009, 26.531973368000095],
+ [86.98521203600012, 26.540655009000048],
+ [87.01544274900004, 26.568973694000064],
+ [87.02991215000009, 26.579774068000077],
+ [87.04133264100005, 26.580187480000106],
+ [87.04443322800012, 26.561170553000025],
+ [87.04500166800005, 26.544272359000033],
+ [87.05647383700011, 26.494921367000032],
+ [87.05668054200004, 26.4948696900001],
+ [87.06670577000006, 26.46562082900006],
+ [87.08329390500006, 26.43208282500005],
+ [87.10628991700014, 26.40474599300002],
+ [87.13502201400013, 26.394204],
+ [87.18845544500005, 26.399578349000123],
+ [87.2190995690001, 26.408104960000045],
+ [87.22943485500008, 26.398751526000083],
+ [87.23630782100014, 26.383300273000103],
+ [87.24529952000012, 26.370226136000056],
+ [87.25842533400004, 26.36293975800008],
+ [87.3004899500001, 26.345989888000062],
+ [87.31402917500009, 26.343767802000073],
+ [87.32622481300007, 26.353327942000064],
+ [87.3449316820001, 26.389346416000038],
+ [87.35640384900006, 26.403712464000037],
+ [87.38420577000005, 26.418646953000106],
+ [87.41645186400012, 26.426966858000057],
+ [87.44962813400014, 26.428620504000023],
+ [87.48032393400007, 26.423401185],
+ [87.55205082300006, 26.38671091700003],
+ [87.58698409000004, 26.378029277000067],
+ [87.6239844160001, 26.392912089],
+ [87.64874495200013, 26.40999327100006],
+ [87.6596411540001, 26.417510071],
+ [87.68119022600013, 26.424228007000025],
+ [87.6975716550001, 26.41626983700006],
+ [87.71090417500011, 26.405676168000085],
+ [87.72754398600011, 26.403764140000064],
+ [87.74222009300013, 26.410482076000093],
+ [87.7494547930001, 26.425726624000035],
+ [87.75617273000012, 26.446913961000078],
+ [87.76898848500008, 26.451461487000117],
+ [87.78593835400011, 26.445983785000024],
+ [87.80443851800004, 26.437353821000087],
+ [87.8215950930001, 26.437508851000032],
+ [87.85208418800005, 26.460659892000123],
+ [87.86980920500008, 26.464638978],
+ [87.87068770400003, 26.460711569000026],
+ [87.89476892100004, 26.442934876000024],
+ [87.89730106600007, 26.44345164000005],
+ [87.90200362200005, 26.43528676300012],
+ [87.90851485200011, 26.417820130000067],
+ [87.91476770100007, 26.408259990000076],
+ [87.92897871900004, 26.396426086000062],
+ [87.96122481300011, 26.378959453000036],
+ [87.97548750900012, 26.366557108000066],
+ [88.00664839700005, 26.369864400000054],
+ [88.04432051600008, 26.405676168000085],
+ [88.07418949400011, 26.453941955000104],
+ [88.08225101700009, 26.4948696900001],
+ [88.07915043200006, 26.507375387000096],
+ [88.07982222500004, 26.51755564400007],
+ [88.08713624100011, 26.539100004000105],
+ [88.10168135600009, 26.581944479000086],
+ [88.14663985200008, 26.661216126000014],
+ [88.16338301600007, 26.70514109300005],
+ [88.16751713100007, 26.725036519000057],
+ [88.1690674240001, 26.74400177000011],
+ [88.16782718900004, 26.762915344000035],
+ [88.15904219600009, 26.802551169000097],
+ [88.15532149300003, 26.845597636000022],
+ [88.15139408400006, 26.862805888000096],
+ [88.14281579600004, 26.878412170000033],
+ [88.12043990100005, 26.9088495890001],
+ [88.11180993700003, 26.924300842],
+ [88.09682377100006, 26.95933746400003],
+ [88.07687666900006, 26.991790263000027],
+ [88.05594771400007, 27.018041891000067],
+ [88.04282190000009, 27.028945618000122],
+ [88.02737064700011, 27.03535349500008],
+ [88.00949060100004, 27.04563710500007],
+ [87.99130049700011, 27.08150055],
+ [87.97548750900012, 27.095143128000117],
+ [87.97073327700008, 27.10273956300007],
+ [87.96918298300005, 27.11080108700007],
+ [87.97083663000012, 27.119224345000063],
+ [87.9854610590001, 27.148369853000062],
+ [87.98933679200007, 27.2183914190001],
+ [88.0046627590001, 27.249163088],
+ [88.02902429200003, 27.298076477000066],
+ [88.03512211100008, 27.322571106000012],
+ [88.0325382900001, 27.333888245000068],
+ [88.02013594600004, 27.353370260000062],
+ [88.01579512500007, 27.364222311000034],
+ [88.01476159700007, 27.378071594000076],
+ [88.01724206500006, 27.389233704000034],
+ [88.02582035300009, 27.412074686000025],
+ [88.02959273300007, 27.418740947000046],
+ [88.03481205300011, 27.42380523700011],
+ [88.03930790200013, 27.42948964400007],
+ [88.04163334200007, 27.438067933000085],
+ [88.03977299000007, 27.442357077000068],
+ [88.03078129100004, 27.450728659000035],
+ [88.02809411600009, 27.45512115500013],
+ [88.02333988400011, 27.474654847000025],
+ [88.02209965000009, 27.48424082500013],
+ [88.02333988400011, 27.494912008000128],
+ [88.04876468900011, 27.545348206000043],
+ [88.11087976100009, 27.639502666000013],
+ [88.1348576260001, 27.723166809000062],
+ [88.14932702700014, 27.748772482],
+ [88.15966231300013, 27.774119772000105],
+ [88.15459802200007, 27.815150859000042],
+ [88.16658695500013, 27.83359934600007],
+ [88.16462325100008, 27.84535573400005],
+ [88.15640669800007, 27.85127268500007],
+ [88.14302250200012, 27.855716858000065],
+ [88.11821781400005, 27.860884501000058],
+ [88.10488529500003, 27.8797205610001],
+ [88.09749556500003, 27.904008484000073],
+ [88.09992435700008, 27.928322246000093],
+ [88.11573734600012, 27.947261658000045],
+ [88.12669274900009, 27.950439759000105],
+ [88.15118737800003, 27.947209982000018],
+ [88.16296960500006, 27.946899923000032],
+ [88.17485518400008, 27.94976796500002],
+ [88.19785119700003, 27.95829457600003],
+ [88.37877038600004, 27.982634176000047],
+ [88.39975101800007, 27.99472646100004],
+ [88.39985437100012, 27.99472646100004],
+ [88.39990604700012, 27.994881490000083],
+ [88.45576827000008, 28.03152008100004],
+ [88.47540531400011, 28.036248474000033],
+ [88.50207035300008, 28.02888458300002],
+ [88.5171598720001, 28.039581604000105],
+ [88.53080245000007, 28.0590119430001],
+ [88.55281660900005, 28.078054708000067],
+ [88.59400272600004, 28.106605937000026],
+ [88.61048750800012, 28.105830790000127],
+ [88.63167484600007, 28.083351542000017],
+ [88.65203536000013, 28.069398906000018],
+ [88.7101196700001, 28.061983337000115],
+ [88.73564782700004, 28.055265402000074],
+ [88.78014123500003, 28.028341980000064],
+ [88.80293054200013, 28.011004537000062],
+ [88.8175032960001, 27.994881490000083],
+ [88.81771000200013, 27.994881490000083],
+ [88.81771000200013, 27.99472646100004],
+ [88.81967370600006, 27.977337342000013],
+ [88.80975183200007, 27.9444969690001],
+ [88.81068200700014, 27.927857158000066],
+ [88.81889856000004, 27.91519643200003],
+ [88.84277307100012, 27.892407125000133],
+ [88.85155806500012, 27.877162577],
+ [88.85507206300008, 27.859179179000094],
+ [88.85388350400007, 27.843676249000097],
+ [88.80566939300007, 27.655108948000063],
+ [88.78308679200012, 27.622036031000064],
+ [88.76737715600007, 27.586198425000035],
+ [88.74815352400003, 27.560127666000042],
+ [88.7410221770001, 27.545709941000027],
+ [88.74164229300004, 27.531679789000023],
+ [88.75755863400008, 27.511448466000033],
+ [88.75719689900006, 27.49496368400004],
+ [88.75435469600012, 27.464216207000092],
+ [88.75978072200007, 27.435070699000065],
+ [88.77357832900003, 27.408509013000057],
+ [88.79538578300009, 27.385926412000018],
+ [88.80820153800005, 27.378381653000062],
+ [88.8198287350001, 27.37362742200007],
+ [88.8308358160001, 27.36732289600006],
+ [88.85202315300006, 27.342363180000078],
+ [88.86463220200005, 27.332389628000087],
+ [88.89233077000011, 27.315543111000082],
+ [88.88463098200003, 27.286345927000056],
+ [88.87611560500005, 27.28048567900005],
+ [88.86142826300011, 27.270377910000022],
+ [88.80117354300006, 27.256425273000033],
+ [88.77585209100005, 27.240870667000095],
+ [88.75435469600012, 27.21260365800002],
+ [88.7384383540001, 27.17978912300002],
+ [88.73006677200004, 27.150953674000064],
+ [88.73308231500005, 27.148972387000114],
+ [88.74257246900004, 27.142737122000042],
+ [88.80525598100013, 27.11302317300006],
+ [88.82763187700004, 27.097881979000064],
+ [88.84080936700008, 27.075247701000094],
+ [88.84561527500011, 27.04956451400004],
+ [88.84561527500011, 26.994942526000088],
+ [88.84561527500011, 26.994839172000056],
+ [88.85171309400005, 26.94543650400003],
+ [88.86711267100003, 26.964246725000052],
+ [88.8864396570001, 26.978974508000064],
+ [88.90664514100007, 26.98109324200003],
+ [88.92447351100003, 26.96166290300006],
+ [88.92695398000012, 26.94941558800012],
+ [88.9254036860001, 26.939028626],
+ [88.92530033400004, 26.929365133000076],
+ [88.9323283280001, 26.9192365520001],
+ [88.94276696800011, 26.913707174000123],
+ [88.95454919500008, 26.91262196900003],
+ [88.96581465700007, 26.915464173000103],
+ [88.97532312000004, 26.921717021000077],
+ [88.99661381100003, 26.92275054900007],
+ [89.02157352700004, 26.912673645000027],
+ [89.04487959900007, 26.897119039000117],
+ [89.06069258700006, 26.88146108000005],
+ [89.07433516500004, 26.856398010000035],
+ [89.08244836400007, 26.836037496000117],
+ [89.0965043540001, 26.821413066000034],
+ [89.12807865500008, 26.813454895000078],
+ [89.18461267100014, 26.81056101500009],
+ [89.21282800300008, 26.813041484000067],
+ [89.24083662900011, 26.819759420000096],
+ [89.25261885600008, 26.826787415000084],
+ [89.26295414200013, 26.836347555000103],
+ [89.27359948700007, 26.84389231400006],
+ [89.28636356600009, 26.84497751900004],
+ [89.3001611730001, 26.844409078000083],
+ [89.34165734900012, 26.854330953000087],
+ [89.36889455700003, 26.837358593000076],
+ [89.40733809400012, 26.81340321900005],
+ [89.44289148000007, 26.797021789000027],
+ [89.50541996200008, 26.80368804900003],
+ [89.54650272600003, 26.79753855400004],
+ [89.5860868740001, 26.784051005],
+ [89.61135664900007, 26.76596425400008],
+ [89.61347538300004, 26.748549296000036],
+ [89.59750736500013, 26.720954081000045],
+ [89.60980635600004, 26.712220765000083],
+ [89.6283065180001, 26.71253082300005],
+ [89.66323978700007, 26.725501607000083],
+ [89.68515059500004, 26.72457143100003],
+ [89.73873905400006, 26.703280742000047],
+ [89.75466966300013, 26.700988568000113],
+ [89.76028812700014, 26.700180156],
+ [89.80007898000014, 26.700490214000084],
+ [89.80405806500005, 26.699766744000087],
+ [89.81366988200006, 26.696149394000102],
+ [89.81728723200013, 26.6962010700001],
+ [89.82209314000005, 26.70100697900004],
+ [89.82524540200006, 26.70767323900013],
+ [89.8267956950001, 26.71351267500002],
+ [89.8267440190001, 26.715683085000094],
+ [89.82726078300004, 26.7179051720001],
+ [89.82767419500004, 26.722452698000055],
+ [89.82974125100003, 26.727620341000048],
+ [89.83496057100012, 26.73154775000002],
+ [89.83904301000013, 26.731237691000032],
+ [89.84700118000012, 26.724829814000103],
+ [89.85077355900012, 26.72317616800005],
+ [89.85870063400006, 26.722056524000052],
+ [89.85992028800013, 26.7218842570001],
+ [89.88028080200013, 26.71625152600008],
+ [89.89040938400007, 26.714856262000083],
+ [89.91211348500008, 26.716716614000077],
+ [89.97526208500005, 26.73185780900009],
+ [90.0891569420001, 26.741728008000095],
+ [90.12719079600004, 26.75139150000011],
+ [90.15220218900004, 26.771752014000057],
+ [90.17742028900005, 26.832058410000045],
+ [90.21090661700009, 26.85148875000003],
+ [90.22914839700013, 26.852884013000093],
+ [90.26599369300004, 26.851592103000044],
+ [90.28444218000004, 26.857069804000034],
+ [90.30087528500013, 26.868283590000075],
+ [90.31420780500014, 26.88037587500007],
+ [90.32857385300014, 26.890659485000057],
+ [90.34883101400004, 26.89665395100009],
+ [90.38262740100004, 26.891796367000055],
+ [90.4752315670001, 26.832420146000047],
+ [90.58778283800007, 26.78007192000011],
+ [90.71707727100011, 26.767049459000063],
+ [90.94449258000003, 26.778869550000096],
+ [91.00739546800008, 26.78213897700006],
+ [91.01278080700007, 26.784348086000065],
+ [91.06206913300014, 26.804566549000057],
+ [91.09193811100005, 26.80477325500003],
+ [91.12707808500011, 26.800897522000056],
+ [91.19818485600013, 26.80234446200005],
+ [91.23249800600013, 26.795161438000022],
+ [91.26195357300003, 26.779038392000032],
+ [91.27600956200007, 26.77407745400008],
+ [91.29657678200005, 26.77459421800002],
+ [91.31321659300005, 26.77867665700002],
+ [91.33006311000014, 26.785497945000074],
+ [91.34556604000005, 26.79469635000008],
+ [91.35838179600006, 26.806168519],
+ [91.37006066900011, 26.824668681000034],
+ [91.37812219300008, 26.84280710800006],
+ [91.38845747900012, 26.858465068],
+ [91.4063375240001, 26.869523824000012],
+ [91.42018680900003, 26.871539205000047],
+ [91.46059777800014, 26.869368795000057],
+ [91.47506717900006, 26.86554473900013],
+ [91.4844722900001, 26.852728984000052],
+ [91.50741662600007, 26.80802887],
+ [91.52064579300003, 26.79759023000007],
+ [91.53935266200011, 26.798830465000023],
+ [91.5756295170001, 26.81014760300009],
+ [91.5937162680001, 26.81076772100006],
+ [91.63795129500011, 26.798985494000036],
+ [91.6537642830001, 26.797951965000053],
+ [91.70213342300013, 26.803481344000076],
+ [91.73158898900004, 26.816193746000025],
+ [91.79525435400006, 26.853504131000065],
+ [91.82512333200009, 26.858465068],
+ [91.84393355300006, 26.849370015000133],
+ [91.8495146080001, 26.834745586000068],
+ [91.8524084880001, 26.818519185000056],
+ [91.8630538330001, 26.80477325500003],
+ [91.8786601160001, 26.80301625600005],
+ [91.88692834500006, 26.814436747000045],
+ [91.88589481600008, 26.830869853000095],
+ [91.87400923700005, 26.84430572500007],
+ [91.89550663300008, 26.853504131000065],
+ [91.89550663300008, 26.868283590000075],
+ [91.89312951700003, 26.881357727000122],
+ [91.90821903500006, 26.885181784000068],
+ [91.92568566900007, 26.878670553000106],
+ [91.9574149980001, 26.85427927700006],
+ [91.97508833800003, 26.84663116500009],
+ [92.03585982200013, 26.85484771800013],
+ [92.07275679500003, 26.88776560500007],
+ [92.08037091600005, 26.921570891000087],
+ [92.08391890500008, 26.937323303000127],
+ [92.06696903500006, 26.994839172000056],
+ [92.06696903500006, 26.994942526000088],
+ [92.04970910700007, 27.026826885000062],
+ [91.99989302600005, 27.071526998000095],
+ [91.98769738800013, 27.104031474000024],
+ [91.9879040940001, 27.122273255],
+ [91.99079797400009, 27.140773418000023],
+ [91.99586226400004, 27.158033346000096],
+ [92.00299361200007, 27.172606100000067],
+ [92.00578806200014, 27.1761123430001],
+ [92.00847131400008, 27.179479065000024],
+ [92.02149377500012, 27.19182973300009],
+ [92.02707482900013, 27.199839580000074],
+ [92.02996871000005, 27.208469544000096],
+ [92.03317264800012, 27.227434794000047],
+ [92.03678999800007, 27.236478170000012],
+ [92.05063928300012, 27.25141265900008],
+ [92.08185184800004, 27.2751321410001],
+ [92.08877648900011, 27.292340394000078],
+ [92.08484908100013, 27.30422597300013],
+ [92.02359761663678, 27.446779847112282],
+ [91.97508833800003, 27.472432760000018],
+ [91.96330611200011, 27.468918763000076],
+ [91.90059085495413, 27.459729852655357],
+ [91.8565776472989, 27.46623873822671],
+ [91.8162322069483, 27.4613571100768],
+ [91.77955453390229, 27.45647526576099],
+ [91.72709172100008, 27.45994159900009],
+ [91.72704146300003, 27.46000457700005],
+ [91.70492395000008, 27.468763733000046],
+ [91.6802226160001, 27.47284617100003],
+ [91.65738163300011, 27.479150696000048],
+ [91.6416719980001, 27.49496368400004],
+ [91.63288700400005, 27.51165517200009],
+ [91.60446496600008, 27.53214487700005],
+ [91.59505985500004, 27.54638173400012],
+ [91.57325240100005, 27.619710592000033],
+ [91.57986698400003, 27.65797699000005],
+ [91.62668583200013, 27.716423035000034],
+ [91.6349570594208, 27.746570816190285],
+ [91.63576961127859, 27.78252481766623],
+ [91.60533558693375, 27.810658168996827],
+ [91.5660232169979, 27.821073950502466],
+ [91.56435452404213, 27.85137236654151],
+ [91.6283394780001, 27.852693787000035],
+ [91.68013149075769, 27.849823277598603],
+ [91.72987134422583, 27.804136158001306],
+ [91.82658872441321, 27.807627271770244],
+ [91.85637335954294, 27.764539482011514],
+ [91.86491418500009, 27.72998809800002],
+ [91.90873579900006, 27.731900126000127],
+ [91.95224735500011, 27.724820455],
+ [91.96800093766346, 27.746278233869482],
+ [91.98889765320416, 27.76939841380579],
+ [92.06487820550117, 27.76172129397611],
+ [92.10615954418942, 27.786080717238843],
+ [92.1262935790001, 27.81272206600009],
+ [92.23956831900006, 27.865276998000056],
+ [92.24918013500007, 27.862641500000038],
+ [92.25827518700004, 27.848197937000023],
+ [92.27522505700006, 27.81168853700011],
+ [92.28876428200005, 27.793085022000056],
+ [92.30385380100006, 27.786160380000055],
+ [92.31728967300006, 27.80367869100003],
+ [92.32917525300013, 27.832927552000072],
+ [92.33465295400003, 27.83127390600002],
+ [92.33982059800013, 27.815564270000053],
+ [92.35005253100007, 27.802541809000033],
+ [92.36793257700003, 27.80383372000007],
+ [92.37558068800013, 27.821119487000075],
+ [92.38105839100012, 27.842461853000074],
+ [92.39284061800004, 27.85602691700005],
+ [92.40441613800004, 27.85383066900006],
+ [92.41733524600005, 27.828948466],
+ [92.42756717900005, 27.82117116400009],
+ [92.43903934800005, 27.823289897000066],
+ [92.47510949800005, 27.846595968000074],
+ [92.51815087726021, 27.839468002981643],
+ [92.57497681769904, 27.847806414432647],
+ [92.59291178341888, 27.868193283595886],
+ [92.63646812873851, 27.89536981004999],
+ [92.68367428669768, 27.910450219011963],
+ [92.71077012957788, 27.949702392409918],
+ [92.73639150917766, 27.98590893651867],
+ [92.70134891800006, 28.025241394000133],
+ [92.70134891800006, 28.037824606000058],
+ [92.68925663200014, 28.048314921],
+ [92.65422001100012, 28.052087301000128],
+ [92.63892378800006, 28.057487488000092],
+ [92.63727014200003, 28.071982728000123],
+ [92.65484012900009, 28.105830790000127],
+ [92.67861128800007, 28.133064270000105],
+ [92.70786014900011, 28.155414328000106],
+ [92.7700785720001, 28.192182108000097],
+ [92.77917362500011, 28.195902812],
+ [92.78289432800011, 28.190941874000046],
+ [92.78537479700009, 28.183293762000076],
+ [92.79023238100007, 28.178901266000068],
+ [92.80532190000008, 28.17802276700003],
+ [92.81989465400005, 28.17926300100008],
+ [92.8347774660001, 28.183526306000132],
+ [92.85028039600013, 28.19194956500003],
+ [92.8653699140001, 28.20520457000002],
+ [92.88955448400009, 28.23582285600004],
+ [92.90381717900004, 28.2496979780001],
+ [92.92200728300008, 28.25863800100005],
+ [92.96035119600003, 28.270213521000088],
+ [92.97492395000006, 28.28230580700007],
+ [93.04639880818196, 28.302097099545048],
+ [93.12982812476821, 28.325961566073488],
+ [93.20782489381371, 28.340539283245555],
+ [93.21807344565363, 28.39464655767386],
+ [93.1862858334245, 28.431995228097378],
+ [93.21883846222534, 28.457435846387227],
+ [93.25906765301328, 28.496023260000364],
+ [93.2869721652333, 28.520517242676647],
+ [93.30284340070244, 28.556921073348917],
+ [93.31717003715039, 28.603462550497838],
+ [93.35543239724171, 28.624065359777703],
+ [93.44621301300003, 28.671894430000023],
+ [93.55173628800009, 28.67894826200005],
+ [93.60713342300005, 28.672204488000105],
+ [93.62553023300006, 28.67235951800005],
+ [93.64341027900008, 28.680240174000105],
+ [93.66490848182954, 28.690238755807428],
+ [93.70552535000007, 28.69189320900007],
+ [93.72247522000009, 28.696647441000053],
+ [93.78174379684887, 28.68050383781251],
+ [93.86307969177443, 28.704870831024095],
+ [93.92778566056765, 28.68275160171495],
+ [93.96109345404737, 28.72994349590268],
+ [93.9815905577272, 28.768130860141966],
+ [93.99313607399837, 28.80188742309345],
+ [93.99201949100012, 28.844648743000064],
+ [94.01144982900013, 28.85302032500003],
+ [94.02684940600011, 28.864182435000075],
+ [94.07947398050715, 28.883072105010925],
+ [94.1353958914097, 28.897788397353693],
+ [94.17365825150097, 28.930164240507835],
+ [94.2501829716835, 28.933107498976327],
+ [94.29138859024334, 28.977256376004746],
+ [94.34731050114596, 29.024348511501685],
+ [94.30904814105469, 29.059667613124404],
+ [94.27078578096348, 29.097929973215642],
+ [94.28750533100003, 29.147937724000073],
+ [94.32378218600007, 29.146025696000052],
+ [94.33577111900013, 29.149617208000038],
+ [94.34631311100009, 29.1590739950001],
+ [94.36253951000009, 29.185325623000026],
+ [94.37287479700012, 29.19630686500001],
+ [94.39643925000013, 29.207081400000035],
+ [94.42238081900007, 29.210492045000066],
+ [94.47498742700003, 29.210802104000052],
+ [94.49824182200007, 29.21522043900005],
+ [94.51477828000009, 29.22105987600004],
+ [94.52862756400003, 29.2312401330001],
+ [94.5826811120001, 29.302915345000073],
+ [94.59994104000009, 29.316635437000016],
+ [94.6304301350001, 29.319451803000064],
+ [94.66846399000013, 29.306610209000084],
+ [94.70422408000013, 29.284699402000044],
+ [94.75641727800013, 29.230516663000017],
+ [94.76768273900007, 29.21385101300008],
+ [94.76148156800008, 29.174706116000053],
+ [94.77657108500011, 29.16669626900007],
+ [94.79879195200004, 29.1664378870001],
+ [94.81543176300005, 29.16886667900006],
+ [94.85408573500007, 29.17000356000007],
+ [94.89129276600005, 29.160495097000094],
+ [94.98906457600003, 29.15398386700012],
+ [95.04766564900007, 29.140806377000033],
+ [95.09903202400011, 29.113779603000083],
+ [95.11691206900008, 29.108095195000047],
+ [95.19153283800006, 29.096829733000092],
+ [95.19969771300003, 29.094245911000073],
+ [95.2078625900001, 29.089595032000105],
+ [95.21282352700013, 29.08186940500012],
+ [95.21406376100009, 29.07308441200003],
+ [95.21633752500009, 29.06499705000003],
+ [95.22491581200012, 29.05936431900001],
+ [95.2815531820001, 29.052672221000094],
+ [95.36740605062847, 29.03649616327051],
+ [95.42982403198397, 29.046524645630395],
+ [95.48757683710141, 29.068994487006023],
+ [95.51130660000013, 29.131788839000095],
+ [95.52143518100007, 29.13786082000003],
+ [95.52267541500004, 29.161192729000064],
+ [95.51192671700011, 29.19754709900006],
+ [95.51533736200014, 29.209432679000074],
+ [95.55016727700007, 29.212481588000017],
+ [95.55202762800008, 29.220129700000072],
+ [95.55068404100012, 29.230284119000046],
+ [95.55378462800007, 29.239043275000128],
+ [95.56442997300007, 29.2456061810001],
+ [95.57290490800006, 29.247259827000065],
+ [95.58168990100006, 29.24746653300012],
+ [95.59233524600006, 29.249688619000025],
+ [95.64669738938943, 29.22835044810863],
+ [95.71716496895556, 29.218283651027733],
+ [95.7473653601981, 29.27365103497256],
+ [95.74478072100004, 29.340432435000068],
+ [95.77640669800007, 29.345548401000073],
+ [95.79594038900007, 29.352886455000046],
+ [95.86313352662813, 29.32398502037684],
+ [95.95373470035588, 29.35921881015993],
+ [96.01413548284108, 29.364252208700393],
+ [96.07453626532634, 29.369285607240855],
+ [96.14196578000008, 29.368466899000097],
+ [96.15095747900011, 29.35407501200008],
+ [96.16604699800013, 29.303173726000054],
+ [96.17627893100013, 29.28645640100011],
+ [96.20542443800014, 29.256949158000097],
+ [96.23529341600005, 29.241213684000016],
+ [96.26784956900008, 29.24173044900006],
+ [96.30412642400006, 29.261212464000053],
+ [96.32324670400004, 29.275010071000096],
+ [96.33709598900009, 29.27971262700008],
+ [96.34991174300006, 29.274234924],
+ [96.36624149600004, 29.257233379000056],
+ [96.36686161300008, 29.24421091700013],
+ [96.34236698400014, 29.21064707500001],
+ [96.32748417200008, 29.180442200000087],
+ [96.31642541500008, 29.171863912000063],
+ [96.21007531700008, 29.145767314000082],
+ [96.19364221300003, 29.13693064400009],
+ [96.1835136310001, 29.123778992000027],
+ [96.17462528500005, 29.108844503000043],
+ [96.17595371463305, 29.017353609711428],
+ [96.19532275757172, 28.941105845485463],
+ [96.24858762565306, 28.945343306324006],
+ [96.29465549772947, 28.99232448388489],
+ [96.36656829155606, 29.036536563468914],
+ [96.45760542900013, 28.99458791100001],
+ [96.45119755100012, 28.98138458300012],
+ [96.45212772700006, 28.970377502000034],
+ [96.46008589700011, 28.963349507000103],
+ [96.47465865100008, 28.962057597000054],
+ [96.49222863800003, 28.94800160700005],
+ [96.50039351400005, 28.929243062000054],
+ [96.51083215400013, 28.885524801000074],
+ [96.52375126100003, 28.864414979000045],
+ [96.57666792800006, 28.808526917000066],
+ [96.59258426900004, 28.757884013000094],
+ [96.59800971353144, 28.709910398443995],
+ [96.50104350465409, 28.687631303142155],
+ [96.50237514126326, 28.644476217418358],
+ [96.40901887262294, 28.558928647938785],
+ [96.33645875408492, 28.47966681390912],
+ [96.30185249373439, 28.420710938634112],
+ [96.36964414401973, 28.378115826943503],
+ [96.44112658162652, 28.39541577691665],
+ [96.49522587100006, 28.42147043900009],
+ [96.51238244700005, 28.428808492000073],
+ [96.5615177204665, 28.44729288316006],
+ [96.60442611830537, 28.444534241434948],
+ [96.71692392905247, 28.436539447625634],
+ [96.89788863200005, 28.354704489000042],
+ [96.93395878200005, 28.336617737000026],
+ [96.96579146400012, 28.330468242000066],
+ [96.9974174400001, 28.337082825000053],
+ [97.03297082600005, 28.357029928000074],
+ [97.07844608600004, 28.3751425170001],
+ [97.11554976400004, 28.366564230000066],
+ [97.18272912600008, 28.31499115000007],
+ [97.19327111900003, 28.311399638000083],
+ [97.20277958200012, 28.31155466700004],
+ [97.21053104700013, 28.308092346000066],
+ [97.22076298000007, 28.28339101200008],
+ [97.22965132700011, 28.274606018000085],
+ [97.2852551680001, 28.235667827],
+ [97.32349572800013, 28.217477723000073],
+ [97.32866337100012, 28.190011699000095],
+ [97.29889774600014, 28.12924021400009],
+ [97.29290328000008, 28.095082092],
+ [97.3065458580001, 28.0696572880001],
+ [97.3551217050001, 28.02304514600003],
+ [97.36225305200003, 27.994881490000083],
+ [97.35677535000013, 27.98056711800008],
+ [97.34003218600003, 27.951809184000084],
+ [97.33569136600005, 27.93560862200006],
+ [97.33631148300009, 27.91318105100008],
+ [97.33817183500008, 27.90155385300004],
+ [97.33352095600003, 27.894164124000028],
+ [97.3149174400001, 27.884603983000105],
+ [97.29290328000008, 27.877550151],
+ [97.28866581300014, 27.88434560200004],
+ [97.28804569500005, 27.8977556360001],
+ [97.27636682200011, 27.910338847],
+ [97.26065718600006, 27.912044170000073],
+ [97.24122684700006, 27.907858379000047],
+ [97.2229333900001, 27.899719341000022],
+ [97.21094445800003, 27.88951324500006],
+ [97.19802535100013, 27.87326100700004],
+ [97.1821090090001, 27.857267151000073],
+ [97.13177616400003, 27.816856181],
+ [97.12319787600006, 27.812153625000022],
+ [97.11244917900007, 27.809208069000036],
+ [97.10604130000013, 27.805539043000024],
+ [97.09818648300006, 27.791017965],
+ [97.09219201700006, 27.785488587000074],
+ [97.07234826700005, 27.779184062000084],
+ [97.06532027200006, 27.773990581000064],
+ [97.06201298100007, 27.763345235000074],
+ [97.06035933400011, 27.750451965000067],
+ [97.05674198400004, 27.746782939000056],
+ [97.05054081200007, 27.746782939000056],
+ [97.03617476400007, 27.742920068000032],
+ [97.00403202400008, 27.73427724200006],
+ [96.99090621000005, 27.72662913000009],
+ [96.95700647000012, 27.68807851200002],
+ [96.93953983600011, 27.6740225220001],
+ [96.89974898300005, 27.649476217000128],
+ [96.88352258400005, 27.636324565000066],
+ [96.87019006400004, 27.61909047500008],
+ [96.86212854000007, 27.599298401000098],
+ [96.86202518800013, 27.57836944600011],
+ [96.86615930200003, 27.56844757100002],
+ [96.87732141200007, 27.553073832000038],
+ [96.88031864400011, 27.543849589000033],
+ [96.88104211500007, 27.534392802000056],
+ [96.88465946500008, 27.515840963000116],
+ [96.88848352100013, 27.507185160000077],
+ [96.89024051900009, 27.492483215000064],
+ [96.87701135200007, 27.463079325000095],
+ [96.8813521730001, 27.44411407500003],
+ [96.90512333200013, 27.408405660000128],
+ [97.06790409400008, 27.21709950800006],
+ [97.09549930900005, 27.19126129200002],
+ [97.10128706900014, 27.183303121000066],
+ [97.10170048100014, 27.165268046000065],
+ [97.1043876550001, 27.15601796500006],
+ [97.11172570800005, 27.14883494100009],
+ [97.12082076100006, 27.143925680000066],
+ [97.12929569600004, 27.137879537000018],
+ [97.13477339700012, 27.12733754500006],
+ [97.13301639900004, 27.119586080000047],
+ [97.1228878170001, 27.093696188000123],
+ [97.1191671140001, 27.08728831000009],
+ [97.10604130000013, 27.08258575400002],
+ [97.09797977800014, 27.085893046000095],
+ [97.08991825400005, 27.09219757100003],
+ [97.07720585100009, 27.09648671500007],
+ [97.06697391800003, 27.095246480000057],
+ [97.05882660700013, 27.092075635000057],
+ [97.0478536380001, 27.087805074000116],
+ [97.03803511600006, 27.087029928],
+ [97.02676965400008, 27.091474101000117],
+ [97.01891483600014, 27.098708802000075],
+ [97.01188684100003, 27.107028707000055],
+ [97.00299849500004, 27.11452179000007],
+ [96.86533247900013, 27.1716242480001],
+ [96.84269820200007, 27.188522441000075],
+ [96.84176802600012, 27.204387106000084],
+ [96.85127649000003, 27.221181946000073],
+ [96.85964807200008, 27.240715637000065],
+ [96.85375695800008, 27.248725485000037],
+ [96.82171757000009, 27.273065084000066],
+ [96.80993534400005, 27.285777487000118],
+ [96.78916141700012, 27.31797190400006],
+ [96.77634566300003, 27.330632630000096],
+ [96.75887902800008, 27.341743063000123],
+ [96.72415246600008, 27.35626414000005],
+ [96.70523889200012, 27.360759989000073],
+ [96.68725549300012, 27.361741842000058],
+ [96.67588667900003, 27.357659404000046],
+ [96.65924686700004, 27.341433004000024],
+ [96.64901493300005, 27.336213685000118],
+ [96.63640588400011, 27.335541891000034],
+ [96.62927453600008, 27.338694153000077],
+ [96.62317671800014, 27.34365509100003],
+ [96.61418501800006, 27.34840932300004],
+ [96.58689986200005, 27.353576966000034],
+ [96.57604781100014, 27.34541208900002],
+ [96.5674695240001, 27.328307191000064],
+ [96.54731571500014, 27.306448059000033],
+ [96.53181278500011, 27.298541565000065],
+ [96.51093550700006, 27.292495422000044],
+ [96.49005822700008, 27.290738424000054],
+ [96.47465865100008, 27.29538930300002],
+ [96.40778934700012, 27.29817983000008],
+ [96.14258589700006, 27.25751047800013],
+ [96.07416630100005, 27.22986358600012],
+ [96.01318811100009, 27.190796204000023],
+ [95.97484419800008, 27.142892151000083],
+ [95.93836063700007, 27.079898580000062],
+ [95.91644983000003, 27.051373189000017],
+ [95.88885461500013, 27.0270335900001],
+ [95.86146610500009, 27.014217835000025],
+ [95.8049320880001, 27.00476104800005],
+ [95.77795699100005, 26.995149231000042],
+ [95.73496219900011, 26.947296855000033],
+ [95.70922733600003, 26.907454326000035],
+ [95.69930546100011, 26.896188863000063],
+ [95.68607629400003, 26.89127960300003],
+ [95.63998091600007, 26.88642201800009],
+ [95.62427128100012, 26.880737610000054],
+ [95.61331587700005, 26.867921855000063],
+ [95.60339400200013, 26.844254049000043],
+ [95.59130171700008, 26.823738505000065],
+ [95.57476525900006, 26.81614207000011],
+ [95.55440474400012, 26.816607157000035],
+ [95.53135705600005, 26.820276185000026],
+ [95.4898092040001, 26.810716044000046],
+ [95.46273075300013, 26.777178040000123],
+ [95.43999312400007, 26.73537180600006],
+ [95.4106409100001, 26.701627096],
+ [95.3926575110001, 26.691756898],
+ [95.31596968600007, 26.66907094300005],
+ [95.27896936100012, 26.65294789700006],
+ [95.26057255100011, 26.647625224000123],
+ [95.24693311800007, 26.64890392100004],
+ [95.23907515500008, 26.649640605000073],
+ [95.22326216700009, 26.67036285400009],
+ [95.20486535700007, 26.66757232700003],
+ [95.19556359900014, 26.660751038000072],
+ [95.18161096200004, 26.641682435000106],
+ [95.1732393800001, 26.63382761700008],
+ [95.16342085800011, 26.62974517800005],
+ [95.14140669800014, 26.624990946000068],
+ [95.13262170500013, 26.620805155000127],
+ [95.12280318300009, 26.611606751000025],
+ [95.11908247900004, 26.604217021000025],
+ [95.1158785400001, 26.575639954000067],
+ [95.11618859900005, 26.56933542900005],
+ [95.11494836400004, 26.562565816000117],
+ [95.10957401600007, 26.55130035400005],
+ [95.09923872900009, 26.536107484000027],
+ [95.06988651600011, 26.506238506],
+ [95.05438358600009, 26.494921367000032],
+ [95.04063765500013, 26.47559438100008],
+ [95.04260135900006, 26.459678040000043],
+ [95.0617216390001, 26.426605123000073],
+ [95.06606245900014, 26.407433167000065],
+ [95.06420210800013, 26.392602031000123],
+ [95.05045617700011, 26.359064026000013],
+ [95.04363488800004, 26.327696432],
+ [95.04177453600005, 26.287595520000096],
+ [95.04632206200006, 26.24795969700004],
+ [95.05872440600007, 26.217677307000102],
+ [95.06637251800004, 26.2110110470001],
+ [95.07453739500005, 26.208323873000055],
+ [95.08280562300007, 26.20661855100009],
+ [95.09076379400005, 26.202691142000035],
+ [95.09448449700005, 26.195043030000065],
+ [95.08973026500007, 26.187601624000123],
+ [95.08239221200006, 26.179798483000113],
+ [95.07836145100009, 26.171323548000103],
+ [95.08817997300008, 26.10409250900004],
+ [95.10171919800013, 26.09339548800004],
+ [95.13747928900005, 26.082956848],
+ [95.1500883380001, 26.070967916000043],
+ [95.15122522000007, 26.04993560800004],
+ [95.13954634600003, 26.02993682900008],
+ [95.10823042800013, 25.99510691300013],
+ [95.0658557540001, 25.953817444000023],
+ [95.04942264900012, 25.943740540000064],
+ [95.01200891200006, 25.93144154900004],
+ [95.0006400960001, 25.922036438000063],
+ [94.99402551300005, 25.90043569],
+ [94.99319869000004, 25.88095367400011],
+ [95.01345585200005, 25.777704163000053],
+ [95.01531620300005, 25.755121562000014],
+ [95.00880497300011, 25.73713816300004],
+ [94.99991662700006, 25.731557109000036],
+ [94.97862593600007, 25.72907664000006],
+ [94.96901412000005, 25.725614319],
+ [94.96146936100013, 25.717966207000032],
+ [94.87165572100014, 25.59802520800004],
+ [94.86803837100007, 25.59471791600005],
+ [94.85749637900005, 25.589343567000085],
+ [94.8534656170001, 25.58603627500007],
+ [94.85294885300004, 25.58076528000005],
+ [94.86101037600014, 25.571411846],
+ [94.86028690600006, 25.567174378000047],
+ [94.85077844300014, 25.56278188100005],
+ [94.83103804600012, 25.56247182300008],
+ [94.82235640500005, 25.559112854000077],
+ [94.80799035600012, 25.542628072000085],
+ [94.78235884600008, 25.504594219000055],
+ [94.76437544800007, 25.49167511000003],
+ [94.74577193200014, 25.486610820000053],
+ [94.71114872200013, 25.482786764000124],
+ [94.69202844200004, 25.476327210000065],
+ [94.65947229000005, 25.45550160800012],
+ [94.6503600370001, 25.446649705000098],
+ [94.63053348800008, 25.427389629000075],
+ [94.60800256400012, 25.394626770000073],
+ [94.55012496000006, 25.245281881],
+ [94.55332889800013, 25.20414744000003],
+ [94.57689335200013, 25.173606670000126],
+ [94.61296350100014, 25.1613593550001],
+ [94.65327111800008, 25.15412465400003],
+ [94.68913456300004, 25.138518372000092],
+ [94.70680790300014, 25.10994130500002],
+ [94.71383589700014, 25.068264262000085],
+ [94.7085649010001, 25.025889587000094],
+ [94.68975467900003, 24.99509043400012],
+ [94.67352828000008, 24.974807434000112],
+ [94.65482141100011, 24.889153748000027],
+ [94.63911177600005, 24.862798767000058],
+ [94.59901086400004, 24.813473612000067],
+ [94.59322310400006, 24.7837855020001],
+ [94.59322310400006, 24.765931295000044],
+ [94.58950240100006, 24.747250264000073],
+ [94.58154423100012, 24.73011952800003],
+ [94.56945194600013, 24.716399434],
+ [94.55570601400007, 24.70885467600006],
+ [94.54340702300004, 24.70733022000003],
+ [94.53100468000008, 24.70748525000006],
+ [94.51632857300007, 24.704953105000087],
+ [94.50795699100013, 24.689010925000062],
+ [94.48707971200014, 24.620462138000036],
+ [94.47498742700003, 24.597388611000056],
+ [94.43023563600008, 24.570904439000074],
+ [94.4184534100001, 24.56031077100009],
+ [94.41080529800013, 24.54594472300009],
+ [94.39705936700005, 24.495069275000063],
+ [94.38186649600004, 24.486310120000084],
+ [94.37039432800003, 24.47773183300005],
+ [94.36367639200012, 24.46582041500001],
+ [94.36119592300014, 24.425409444000124],
+ [94.35220422300011, 24.413937277000016],
+ [94.34000858600007, 24.40600494400006],
+ [94.32874312400003, 24.39448110000002],
+ [94.32832971200003, 24.388486634000103],
+ [94.33174035600013, 24.371097514000084],
+ [94.33070682800013, 24.36285512300013],
+ [94.32367883300003, 24.35466440800009],
+ [94.30280155400004, 24.341021831000106],
+ [94.29536014800004, 24.332598572],
+ [94.28998580000007, 24.316759746000017],
+ [94.28688521300006, 24.283066712000064],
+ [94.28275109900011, 24.26642690100003],
+ [94.23396854600009, 24.160335185000108],
+ [94.22218632100004, 24.122637228000073],
+ [94.21846561700005, 24.086670431000087],
+ [94.21412479700007, 24.069177959000044],
+ [94.20368615700005, 24.05775746700003],
+ [94.19913863200003, 24.048093974000025],
+ [94.19386763500006, 24.00967254700008],
+ [94.1902502850001, 23.995280660000063],
+ [94.14487837800004, 23.93887583400003],
+ [94.13505985500007, 23.919006246000052],
+ [94.13361291500007, 23.899162496000045],
+ [94.13505985500007, 23.877303365],
+ [94.13185591700011, 23.856968689000084],
+ [94.12885926700005, 23.853904873000076],
+ [94.11686975100014, 23.84164662700003],
+ [94.09971317600008, 23.842628479000084],
+ [94.08534712700009, 23.857511292000126],
+ [94.07108443200008, 23.876114808000082],
+ [94.05506473800006, 23.88794871],
+ [93.99791060400014, 23.916965027000074],
+ [93.97506962100005, 23.920918274000044],
+ [93.94054976400014, 23.928876445000114],
+ [93.91233443200008, 23.93900502500007],
+ [93.88318892500007, 23.94530955000009],
+ [93.80371057200006, 23.936059469000057],
+ [93.78283329300007, 23.94546457900013],
+ [93.74304244000007, 23.995280660000063],
+ [93.71110640500012, 24.005460917000036],
+ [93.66046350100004, 24.011222839000098],
+ [93.61240441900009, 24.00905243000001],
+ [93.58801314300007, 23.995228984000036],
+ [93.58563602700008, 23.98729665100008],
+ [93.58181197200008, 23.979596863],
+ [93.57695438700006, 23.97300811800001],
+ [93.57106327400004, 23.968021343000046],
+ [93.5613481040001, 23.965695903000025],
+ [93.55525028500006, 23.97099273700006],
+ [93.54997928900013, 23.978020732000076],
+ [93.54346805900013, 23.980888774000064],
+ [93.52682824700014, 23.97538523300007],
+ [93.49571903500009, 23.959132996000037],
+ [93.47484175700009, 23.957505189000088],
+ [93.45665165200006, 23.959959819000076],
+ [93.44900354000009, 23.96892568],
+ [93.44559289600005, 23.98161224400006],
+ [93.4391850180001, 23.995228984000036],
+ [93.40652551300013, 24.025847270000057],
+ [93.39650028500012, 24.03752614400004],
+ [93.36828495300006, 24.078479716000075],
+ [93.34854455600009, 24.088892517000104],
+ [93.32218957500004, 24.080055847],
+ [93.30968387900003, 24.063984477000034],
+ [93.30296594200013, 24.041143494000025],
+ [93.30255946900013, 24.035774655000083],
+ [93.30110559100012, 24.016571350000035],
+ [93.30296594200013, 23.995280660000063],
+ [93.30813358600011, 23.977503968000022],
+ [93.31609175600005, 23.961096700000084],
+ [93.33758915200013, 23.928411357000087],
+ [93.34596073400007, 23.918696188000055],
+ [93.35185184800008, 23.913916117000056],
+ [93.35598596200003, 23.906991475000083],
+ [93.3591899010001, 23.89094594300012],
+ [93.35825972500004, 23.85526336700012],
+ [93.37479618400005, 23.739017232000023],
+ [93.4063188070001, 23.719121806000132],
+ [93.41231327300011, 23.708709005000102],
+ [93.42595585100014, 23.69080312100003],
+ [93.43029667200011, 23.6803386430001],
+ [93.43236372900009, 23.647317404000106],
+ [93.40022098800011, 23.454021709000088],
+ [93.3998075770001, 23.426090597000027],
+ [93.4059053960001, 23.367670390000043],
+ [93.4077657470001, 23.35637908900007],
+ [93.40724898300004, 23.34725819900008],
+ [93.40373498600007, 23.338757426000072],
+ [93.38420129400009, 23.313125916000033],
+ [93.37789676900007, 23.29682200100008],
+ [93.37644982900008, 23.279484559000068],
+ [93.38079065000005, 23.237264913],
+ [93.37272912600008, 23.169827169000072],
+ [93.37303918400005, 23.15422088700005],
+ [93.37520959500006, 23.142154439000066],
+ [93.37489953600004, 23.129726257000087],
+ [93.33335168500008, 23.05228912300005],
+ [93.31826216700006, 23.033659770000085],
+ [93.29883182800006, 23.01795013400003],
+ [93.27278690600008, 23.005909526000053],
+ [93.24653527900006, 23.00448842400006],
+ [93.22555464700008, 23.020378927000067],
+ [93.21211877500014, 23.03988678000006],
+ [93.19651249200007, 23.053839417000077],
+ [93.17708215400012, 23.058438619000114],
+ [93.15238081900009, 23.049937846000105],
+ [93.14008182800006, 23.031902771000105],
+ [93.13822147700006, 23.005263570000054],
+ [93.14318241400008, 22.97751332600002],
+ [93.15114058400007, 22.95622263600005],
+ [93.17108768700007, 22.92043670700012],
+ [93.17739221200009, 22.900205384000017],
+ [93.17553186100008, 22.881705220000086],
+ [93.16106246000004, 22.86098297200006],
+ [93.12530236800012, 22.821553854000044],
+ [93.11589725800007, 22.79840281200005],
+ [93.11238326000012, 22.799953105000085],
+ [93.07951704900012, 22.772719626000068],
+ [93.07083540900004, 22.69287953700008],
+ [93.07393599400007, 22.671898905000077],
+ [93.08189416500005, 22.652830302000027],
+ [93.10442509000006, 22.61593332900007],
+ [93.11052290900011, 22.596347962000053],
+ [93.10907596900012, 22.57469553600008],
+ [93.09822391800009, 22.535266419000052],
+ [93.09915409300004, 22.511960347000027],
+ [93.10959273300006, 22.479042460000088],
+ [93.11786096200012, 22.46286773700008],
+ [93.15351770000012, 22.427521057],
+ [93.16592004400007, 22.38659332300007],
+ [93.17429162700006, 22.26939117400012],
+ [93.17367150900009, 22.259417623000033],
+ [93.16902063000003, 22.246911927000028],
+ [93.16126916500008, 22.24251943000003],
+ [93.15145064300003, 22.24096913700002],
+ [93.12974654200013, 22.23161570200007],
+ [93.12478560400007, 22.23228749600004],
+ [93.12354537000004, 22.230685527],
+ [93.12313195800004, 22.218386536000068],
+ [93.14173547400009, 22.18727732400002],
+ [93.11951460800009, 22.180972799000088],
+ [93.10432173700013, 22.187173970000075],
+ [93.09057580600012, 22.197147522000094],
+ [93.07248905400007, 22.202470195000032],
+ [93.04582401500005, 22.20686269100004],
+ [93.03641890500006, 22.206242575000076],
+ [93.02453332500005, 22.201901754000076],
+ [93.02236291600008, 22.19621734600004],
+ [93.02391320800007, 22.18882761700003],
+ [93.02256962100012, 22.120976461000097],
+ [93.0254635010001, 22.1129149370001],
+ [93.00748010300003, 22.1059386190001],
+ [92.99518111200007, 22.103251445000083],
+ [92.98546594300012, 22.095965068000012],
+ [92.9671724860001, 22.06268544600006],
+ [92.96531213400004, 22.049559632000083],
+ [92.96841272000012, 22.03617543500006],
+ [92.97492395000006, 22.02330800400007],
+ [92.97792118400008, 22.016486715000028],
+ [92.97957482900006, 22.009355367000083],
+ [92.97988488800013, 22.00227569600004],
+ [92.97895471200007, 21.995351054000068],
+ [92.97709436100007, 21.993025615000036],
+ [92.97492395000006, 21.990906881000072],
+ [92.96810266200004, 21.98723785400007],
+ [92.9616947830001, 21.98687611900006],
+ [92.95559696500004, 21.98961497],
+ [92.95032596900006, 21.995351054000068],
+ [92.93740686000007, 22.013024394000055],
+ [92.92097375600014, 22.02180938700006],
+ [92.90619429500009, 22.01731353800004],
+ [92.89864953600005, 21.995402731000084],
+ [92.88924442500007, 21.966722311000083],
+ [92.87746219900009, 21.95700714200005],
+ [92.86702356000006, 21.966515605000026],
+ [92.8620626230001, 21.995402731000084],
+ [92.85389774600009, 22.024134827000083],
+ [92.83612105300006, 22.046510722000065],
+ [92.77162886600013, 22.104181621000052],
+ [92.7080668540001, 22.14795155800003],
+ [92.68377893100006, 22.154307760000066],
+ [92.67396040900007, 22.147073059],
+ [92.67106652800004, 22.133895569000018],
+ [92.6746838790001, 22.105576884000115],
+ [92.67396040900007, 22.0952415980001],
+ [92.6695162360001, 22.092657777000014],
+ [92.66455529800004, 22.093846334000133],
+ [92.66207482900006, 22.094776510000074],
+ [92.65618371600004, 22.075294495],
+ [92.65608036300006, 22.060566711],
+ [92.65835412600006, 22.04656239800009],
+ [92.65835412600006, 22.032816468000036],
+ [92.65091272000012, 22.019173890000033],
+ [92.63985396300012, 22.013386129000068],
+ [92.6275549720001, 22.012352600000085],
+ [92.61525598200006, 22.0087869260001],
+ [92.60388716700004, 21.995402731000084],
+ [92.59799605400008, 21.989304912000122],
+ [92.59127811700006, 21.98424062200006],
+ [92.58383671100012, 21.98031321200007],
+ [92.57587854000013, 21.977574362000027],
+ [92.57515507000005, 21.98656606100009],
+ [92.57308801300007, 21.995402731000084],
+ [92.55996219900004, 22.061341859],
+ [92.5373279210001, 22.128624573000067],
+ [92.54931685400004, 22.138494772000072],
+ [92.56419966700008, 22.1383397420001],
+ [92.57556848200005, 22.143300680000053],
+ [92.57701542200004, 22.168673808000065],
+ [92.51893111200008, 22.49537221300004],
+ [92.51738081900004, 22.512580465],
+ [92.50456506400008, 22.54379303000009],
+ [92.50084436000009, 22.560536194000022],
+ [92.50291141800011, 22.618620504000106],
+ [92.49588342300012, 22.695618388000028],
+ [92.49154260200004, 22.711069641000037],
+ [92.48069055200011, 22.726159159000034],
+ [92.45371545400008, 22.74796661400005],
+ [92.44203658000009, 22.762926941000032],
+ [92.4350085860001, 22.793286846000072],
+ [92.42632694500003, 22.871059876000103],
+ [92.4118575440001, 22.887932231],
+ [92.37868127500008, 22.900437928000073],
+ [92.35987105300006, 22.92661204000008],
+ [92.3522229410001, 22.96033091300005],
+ [92.3530497650001, 23.02991322800007],
+ [92.3276249590001, 23.171429138000022],
+ [92.32855513500004, 23.211194153000022],
+ [92.3326892500001, 23.226257833000105],
+ [92.35067264900005, 23.26098439500005],
+ [92.35749393700013, 23.278941956000025],
+ [92.35687382000003, 23.289122213],
+ [92.3522229410001, 23.29883738200003],
+ [92.3470552980001, 23.315425517000037],
+ [92.34674523900009, 23.325295715000024],
+ [92.34953576700013, 23.344958598000076],
+ [92.34860559100008, 23.354105326000038],
+ [92.34488488800008, 23.359117940000104],
+ [92.33165572100012, 23.368652243],
+ [92.32669478400004, 23.375266825],
+ [92.32535119700009, 23.382165629000085],
+ [92.32690149000013, 23.39601491300003],
+ [92.32535119700009, 23.403507995000083],
+ [92.31977014200004, 23.412163798000037],
+ [92.30674768100005, 23.423868510000105],
+ [92.30147668500007, 23.431800842000072],
+ [92.29682580600013, 23.446580302000072],
+ [92.29103804500005, 23.49528534000011],
+ [92.25279748500009, 23.609309388],
+ [92.25000695800003, 23.642614848000036],
+ [92.26168583200007, 23.68511871300008],
+ [92.25973660500011, 23.702640572000078],
+ [92.25930871600013, 23.706486918000095],
+ [92.23874149600005, 23.7168480430001],
+ [92.22210168500004, 23.70777882900005],
+ [92.20938928200007, 23.661605937],
+ [92.19429976400005, 23.648144226000042],
+ [92.18076053900012, 23.665378317000105],
+ [92.17063195800006, 23.70364471400002],
+ [92.15078820800005, 23.731653341000126],
+ [92.10841353400014, 23.718243307000094],
+ [92.09218713400003, 23.701345114],
+ [92.05963098100005, 23.659487203000126],
+ [92.04237105300007, 23.64556040500004],
+ [92.01901330600003, 23.640056865000034],
+ [92.00351037700005, 23.647420757000035],
+ [91.96165246600009, 23.691139018000015],
+ [91.94914677000008, 23.709768372000084],
+ [91.93664107300009, 23.723540141000043],
+ [91.9226884360001, 23.72297170000006],
+ [91.91648726400007, 23.7098717250001],
+ [91.91442020700003, 23.68832265300007],
+ [91.91597050000007, 23.650159607000077],
+ [91.94232548000008, 23.534430237000052],
+ [91.94077518800009, 23.495181986000077],
+ [91.91814091000003, 23.459938660000105],
+ [91.9051184490001, 23.446631979000088],
+ [91.88909875500013, 23.43593495800009],
+ [91.83380497300004, 23.413894959000103],
+ [91.81768192600003, 23.40092417400008],
+ [91.79163700400005, 23.368342183000024],
+ [91.7625948490001, 23.321549174],
+ [91.74368127400004, 23.27232737300004],
+ [91.74915897700004, 23.232407329000083],
+ [91.76393843600005, 23.200626323000037],
+ [91.77902795400013, 23.131767476000036],
+ [91.79194706200013, 23.101149190000015],
+ [91.79556441200003, 23.08949615500005],
+ [91.7913269450001, 23.080375265000086],
+ [91.77623742700007, 23.065259909000062],
+ [91.77375695800004, 23.06489817300006],
+ [91.76424849400013, 23.065647481000084],
+ [91.76094120300013, 23.065492453000033],
+ [91.75598026500006, 23.061539206000063],
+ [91.75556685400005, 23.05683665000008],
+ [91.75629032400008, 23.052159933000027],
+ [91.75505009000011, 23.048232524000056],
+ [91.73830692600006, 23.02466807100005],
+ [91.73127893100008, 23.017330018000038],
+ [91.7144324140001, 23.00311899800009],
+ [91.70699100800005, 22.995367534000067],
+ [91.69469201700014, 22.98813283300011],
+ [91.66761356600006, 22.982629293000016],
+ [91.65407434100007, 22.978055929000064],
+ [91.64694299300004, 22.97658315000008],
+ [91.63991499800005, 22.978004253000066],
+ [91.63278365100012, 22.98030385300008],
+ [91.62575565600008, 22.98154408800012],
+ [91.61666060400012, 22.978055929000064],
+ [91.61200972500006, 22.969839376000053],
+ [91.60828902200006, 22.96033091300005],
+ [91.60239790900005, 22.95296702100005],
+ [91.58606815600012, 22.94446624800004],
+ [91.58296757000005, 22.94790273100007],
+ [91.5830709230001, 22.957798767000057],
+ [91.57676639900006, 22.96880584800006],
+ [91.5631238200001, 22.974981181000132],
+ [91.54979130000004, 22.977229106000053],
+ [91.53656213400006, 22.981854146],
+ [91.52364302600006, 22.995212504000037],
+ [91.51940555800007, 23.005625305000066],
+ [91.51816532400005, 23.03508087200008],
+ [91.51558150200009, 23.03880157500008],
+ [91.50607303900006, 23.041178691000127],
+ [91.50328251200011, 23.0444084680001],
+ [91.49811486900012, 23.069962464000056],
+ [91.47506717900006, 23.14308461500012],
+ [91.47041630100011, 23.153290711000082],
+ [91.46359501200004, 23.184115702000057],
+ [91.46121789600011, 23.184425761000043],
+ [91.44643843600005, 23.1978874710001],
+ [91.44540490800011, 23.203029277],
+ [91.44674849500007, 23.20879119900006],
+ [91.44643843600005, 23.215534973],
+ [91.43992720500012, 23.223518983000062],
+ [91.43961714700004, 23.22264048200013],
+ [91.43620650200012, 23.215715841000062],
+ [91.43651656100008, 23.214863180000023],
+ [91.42814498000013, 23.229513449000095],
+ [91.41357222500005, 23.248633728000087],
+ [91.39434859200003, 23.2626638790001],
+ [91.37212772600009, 23.261888733000077],
+ [91.36096561700003, 23.247522685],
+ [91.35569462100011, 23.224139099000027],
+ [91.35590132700008, 23.17964569100006],
+ [91.37460819500006, 23.095723165000052],
+ [91.37088749200007, 23.06277944],
+ [91.33740116400003, 23.071073507000037],
+ [91.31352665200006, 23.101045838000076],
+ [91.30050419200012, 23.14230946900001],
+ [91.27724979600009, 23.303255717000027],
+ [91.27290897700004, 23.313487651000017],
+ [91.26753462700009, 23.321549174],
+ [91.26577762900007, 23.329352315000037],
+ [91.27290897700004, 23.338499044000017],
+ [91.28293420400007, 23.34764577300008],
+ [91.28727502500004, 23.35555226700005],
+ [91.28396773300005, 23.36144338000004],
+ [91.27094527200006, 23.3645956430001],
+ [91.2581295170001, 23.37363901800005],
+ [91.24789758300005, 23.393766989000127],
+ [91.23446171100005, 23.436270854000085],
+ [91.22970747900007, 23.461178894000042],
+ [91.22733036300014, 23.4687753300001],
+ [91.22081913300008, 23.47789622000009],
+ [91.20335249900012, 23.487921448000108],
+ [91.19508426900006, 23.495181986000077],
+ [91.1858858650001, 23.511563416000044],
+ [91.17751428300011, 23.544274597000125],
+ [91.16986617000003, 23.561973776000045],
+ [91.14082401500013, 23.61209991500006],
+ [91.13627648900012, 23.629514872000087],
+ [91.13968713400004, 23.65357025100012],
+ [91.15229618400014, 23.655094707000032],
+ [91.1664555260001, 23.654087016000048],
+ [91.1752405200001, 23.67031341600007],
+ [91.16893599500008, 23.685377096000067],
+ [91.15239953700006, 23.691009827000087],
+ [91.13658654800008, 23.698890483000028],
+ [91.13234908000004, 23.720646261000056],
+ [91.14175419100008, 23.73989573200008],
+ [91.15756717900007, 23.744985861000046],
+ [91.17658410700005, 23.746536154000083],
+ [91.19498091600013, 23.755166118000105],
+ [91.20521285000012, 23.77157338500008],
+ [91.2252633060001, 23.82614369800011],
+ [91.22815718600009, 23.844979757000104],
+ [91.22402307100003, 23.857485453000024],
+ [91.2127576090001, 23.880739848000033],
+ [91.21193078600004, 23.89445994100008],
+ [91.21627160700012, 23.90838673900005],
+ [91.25037805200003, 23.96404225700006],
+ [91.26092004400004, 23.97727142400008],
+ [91.27414921100006, 23.988226827000048],
+ [91.29161584500008, 23.994815573000025],
+ [91.30494836400004, 23.993859558000068],
+ [91.30843257700013, 23.992501035000103],
+ [91.31621382700007, 23.989467062000088],
+ [91.32706587800004, 23.987865092000035],
+ [91.3390548100001, 23.995228984000036],
+ [91.34928674300005, 24.036053366000132],
+ [91.35083703600009, 24.074242249000022],
+ [91.36303267500011, 24.099847921000062],
+ [91.40458052600007, 24.103129374000062],
+ [91.48044152900013, 24.088014018000067],
+ [91.51754520700007, 24.085197652000076],
+ [91.55867964700008, 24.089667663000014],
+ [91.58183068900007, 24.096101380000064],
+ [91.59650679500004, 24.104989726000056],
+ [91.60601525900012, 24.11886484800003],
+ [91.61376672300014, 24.140103862],
+ [91.62451542100007, 24.203459168000037],
+ [91.62906294800007, 24.21531890900006],
+ [91.63950158700004, 24.211701559000076],
+ [91.65717492700003, 24.17136810400011],
+ [91.66616662600006, 24.155916850000025],
+ [91.68415002500006, 24.145478211000082],
+ [91.70368371600006, 24.14294606500009],
+ [91.72115035100012, 24.148992208000024],
+ [91.73262251800003, 24.164314270000077],
+ [91.73200240000006, 24.181677551000107],
+ [91.72580122900007, 24.202063904000042],
+ [91.72301070200012, 24.22097747800008],
+ [91.73293257600011, 24.234284159000097],
+ [91.79659794100013, 24.221597595000063],
+ [91.80703658100003, 24.221132507000036],
+ [91.8097237550001, 24.214543763000037],
+ [91.81137740100013, 24.192038676000024],
+ [91.81375451700006, 24.183124492],
+ [91.84424361200007, 24.155322571000042],
+ [91.86450077300009, 24.15059417700006],
+ [91.87710982300007, 24.158035584000075],
+ [91.88434452300004, 24.17555389500005],
+ [91.90594527200011, 24.260639140000066],
+ [91.90687544800005, 24.28035369900003],
+ [91.89643680900014, 24.32011871400003],
+ [91.89984745300006, 24.338050435000085],
+ [91.92186161300003, 24.34450999000005],
+ [91.93095666500011, 24.336965231000093],
+ [91.95307417800012, 24.322986755],
+ [91.97219445900004, 24.316062114000104],
+ [91.97136763500009, 24.329678853000118],
+ [91.94883671100007, 24.363526917000016],
+ [91.9499735920001, 24.37538665800004],
+ [92.03337935400003, 24.368849590000067],
+ [92.06273156800012, 24.37102],
+ [92.08825972500006, 24.38163950700003],
+ [92.10758671100012, 24.40597910600006],
+ [92.11120406100008, 24.43429779100005],
+ [92.10593306500004, 24.495250143000092],
+ [92.11089400300011, 24.514292908000087],
+ [92.12319299300003, 24.525377503000087],
+ [92.13859257000013, 24.533723246000065],
+ [92.14997986200007, 24.54218295400004],
+ [92.1531653240001, 24.54454945900001],
+ [92.16360396300013, 24.55919972800008],
+ [92.16887496000004, 24.574315084000077],
+ [92.1734224860001, 24.60839569200006],
+ [92.18293094900008, 24.647256368000015],
+ [92.23378055900008, 24.777532654000098],
+ [92.23646773300004, 24.793035584],
+ [92.23688114400005, 24.808590190000032],
+ [92.23502079300005, 24.824764914000028],
+ [92.23492786100007, 24.82499071000008],
+ [92.22179162600014, 24.856907654000068],
+ [92.22175905800003, 24.857046883000052],
+ [92.21765751100003, 24.874580994000084],
+ [92.2230318610001, 24.89137583400013],
+ [92.2521773680001, 24.902977194000087],
+ [92.29024450000003, 24.891351286000045],
+ [92.29041792900011, 24.891298320000104],
+ [92.35814605200005, 24.853748899000024],
+ [92.35832076000014, 24.853652039000096],
+ [92.35932057700006, 24.84642836600004],
+ [92.35935428900012, 24.846184794000052],
+ [92.36350740900014, 24.841120014000026],
+ [92.36359175600006, 24.84101715100006],
+ [92.37092980900007, 24.837916565000015],
+ [92.38074833200005, 24.836702169000077],
+ [92.44203658000009, 24.855409037000058],
+ [92.47769331900008, 24.863909810000067],
+ [92.49154260200004, 24.883727722000046],
+ [92.49453983600006, 24.894863993000072],
+ [92.49133589700006, 24.91227895100012],
+ [92.49126714800008, 24.912424218000055],
+ [92.48379113800013, 24.92822113000004],
+ [92.4743860270001, 24.93667022800004],
+ [92.4742723330001, 24.936715371000062],
+ [92.4497880460001, 24.946437073000098],
+ [92.45002848600006, 24.94663618700004],
+ [92.45805627500005, 24.953284201000045],
+ [92.45782812800007, 24.953557685000035],
+ [92.45402551300003, 24.95811594700008],
+ [92.45376877000012, 24.9582310630001],
+ [92.44451704900007, 24.96237925200002],
+ [92.44444627300004, 24.962427197000082],
+ [92.41247766200007, 24.98408335400002],
+ [92.41246032100014, 24.98436081700008],
+ [92.4122709560001, 24.987390646000037],
+ [92.41213950000014, 24.987434336],
+ [92.41186000600004, 24.987527227000058],
+ [92.39470096900004, 24.993230082000096],
+ [92.38694950400003, 24.99509043400012],
+ [92.38692635100006, 24.99520183],
+ [92.38687592400004, 24.9954444560001],
+ [92.38493703500006, 25.004773236000048],
+ [92.38105839100012, 25.02343495700002],
+ [92.35625370300005, 25.037000021],
+ [92.32814172400003, 25.048007101000096],
+ [92.31212203000007, 25.0686001590001],
+ [92.30354374200004, 25.07428456600003],
+ [92.25155725100012, 25.080795797000107],
+ [92.2336772060001, 25.08495575000005],
+ [92.22013798000012, 25.090381775000097],
+ [92.20804569500012, 25.098107401],
+ [92.19409305900012, 25.109166159000026],
+ [92.17921024600008, 25.126684469000068],
+ [92.17269901600008, 25.131955465000104],
+ [92.16474084500004, 25.133557434000053],
+ [92.15099491400008, 25.129733379000086],
+ [92.14551721200013, 25.13169708200003],
+ [92.13859257000013, 25.136399638000015],
+ [92.12412316900003, 25.136968079000056],
+ [92.11616499900003, 25.139448548000033],
+ [92.11037723800007, 25.144874573000024],
+ [92.1004553630001, 25.159085592000068],
+ [92.09291060400011, 25.164718323],
+ [92.06603886000005, 25.174536845000077],
+ [92.03399947100013, 25.181668193000107],
+ [92.00175337700006, 25.18296010400006],
+ [91.97508833800003, 25.175363668],
+ [91.95627811700012, 25.169782613000066],
+ [91.90057092300009, 25.177585754000106],
+ [91.79370406100003, 25.16533844000007],
+ [91.74533492100011, 25.169369202000055],
+ [91.73014204900005, 25.167457174000063],
+ [91.72373417200004, 25.161927796000057],
+ [91.71773970600009, 25.149835511000063],
+ [91.7107117110001, 25.14466786800007],
+ [91.70182336400006, 25.14714833600003],
+ [91.68890425700005, 25.15298777300002],
+ [91.67743208800005, 25.152626038000037],
+ [91.67226444500005, 25.13650299100003],
+ [91.66203251100006, 25.127201233],
+ [91.63867476400003, 25.12404897100005],
+ [91.61314660700009, 25.12513417600006],
+ [91.59619673700007, 25.128906555000086],
+ [91.5801770430001, 25.140895488000027],
+ [91.57345910700008, 25.152264302000034],
+ [91.56612105300007, 25.15996409100002],
+ [91.5487577720001, 25.161100973000103],
+ [91.54017948400013, 25.157638652000074],
+ [91.52343632100008, 25.145184632000095],
+ [91.51165409400011, 25.14249745700006],
+ [91.50090539600006, 25.14115387],
+ [91.4807515870001, 25.135262757000092],
+ [91.47103641800004, 25.133919170000027],
+ [91.43186568300013, 25.137949931000023],
+ [91.28396773300005, 25.178981018000073],
+ [91.23570194500013, 25.201925354000096],
+ [91.22495324700009, 25.201615296000043],
+ [91.20314579300009, 25.191331686000026],
+ [91.19084680200012, 25.189471334000032],
+ [91.13534631400006, 25.191228333000097],
+ [90.97514937400013, 25.167818909000047],
+ [90.9434200450001, 25.15743194600013],
+ [90.93482138600007, 25.156359858000044],
+ [90.82198042800007, 25.142290752000108],
+ [90.7939718020001, 25.14539133700005],
+ [90.77939904800013, 25.151954244000038],
+ [90.76689335100014, 25.16053253200006],
+ [90.75397424300013, 25.167560527000077],
+ [90.73795454900005, 25.16942087900007],
+ [90.73268355400006, 25.16688873300008],
+ [90.72203820800007, 25.15660512300009],
+ [90.71635380000009, 25.153556214000062],
+ [90.70767216000013, 25.15298777300002],
+ [90.67056848100009, 25.158775533],
+ [90.64896773300012, 25.167818909000047],
+ [90.6375989180001, 25.171074524000048],
+ [90.62343957500008, 25.171436259000032],
+ [90.58333866400005, 25.16203114900007],
+ [90.50137984200012, 25.168800761000014],
+ [90.39978397700008, 25.149008687000034],
+ [90.36464400300014, 25.149990540000104],
+ [90.28692264800003, 25.180066223000082],
+ [90.13008467700013, 25.211588847000044],
+ [89.90813440000011, 25.29690663700002],
+ [89.87020389800011, 25.29556305000007],
+ [89.83459883600011, 25.282437236000092],
+ [89.81904423000009, 25.284969381000067],
+ [89.80736535600005, 25.304503073],
+ [89.79852868700004, 25.340056458000035],
+ [89.79501469000007, 25.374162903000112],
+ [89.79923403500004, 25.402892809000022],
+ [89.80069909700012, 25.41286855100013],
+ [89.80856794000005, 25.439507112000015],
+ [89.82323002100003, 25.489142965000056],
+ [89.82509037300014, 25.56448720300004],
+ [89.83439213000008, 25.63476715100002],
+ [89.82421187300008, 25.674092916000106],
+ [89.80152592000013, 25.72468414400005],
+ [89.78312911000006, 25.81444610700005],
+ [89.7869531660001, 25.839147441000065],
+ [89.83005131100009, 25.90798044900005],
+ [89.83439213000008, 25.931751608000113],
+ [89.82643396000003, 25.937487691000072],
+ [89.81072432500014, 25.938779603000015],
+ [89.79201745600005, 25.94911488900003],
+ [89.81155114700005, 25.955212708000076],
+ [89.82560713700008, 25.965703024000035],
+ [89.82865604700004, 25.979397278000064],
+ [89.8152718500001, 25.99510691300013],
+ [89.81413496900007, 25.99614044200011],
+ [89.81268802900007, 25.996347148000055],
+ [89.81103438300005, 25.99603708900007],
+ [89.80932906100008, 25.995210266000058],
+ [89.80917403100011, 25.99510691300013],
+ [89.80886397300003, 25.99510691300013],
+ [89.80204268400007, 25.98864736000006],
+ [89.79553145400013, 25.985960185000053],
+ [89.78943363500014, 25.9879755650001],
+ [89.78395593200008, 25.99510691300013],
+ [89.77641117400003, 26.008232727000077],
+ [89.75584395400011, 26.032417297000066],
+ [89.75021122300012, 26.041564026000046],
+ [89.74871260600008, 26.05903066000009],
+ [89.75114139900006, 26.071536357000085],
+ [89.74984948700012, 26.08388702400005],
+ [89.73672367300003, 26.100578511],
+ [89.72876550300009, 26.114169413000084],
+ [89.72432133000007, 26.130654195000048],
+ [89.7184818930001, 26.14553700800009],
+ [89.70654463700004, 26.154166972000056],
+ [89.69765629100004, 26.154787089000095],
+ [89.67770918800011, 26.153133443000073],
+ [89.6703711340001, 26.15411529600003],
+ [89.65817549700012, 26.159231262000034],
+ [89.65579838100007, 26.161298320000085],
+ [89.65724532100006, 26.165380758000097],
+ [89.6578286080001, 26.18717448300005],
+ [89.65838220200004, 26.207858785000028],
+ [89.65300785400007, 26.222689921000054],
+ [89.63492110200008, 26.22584218300001],
+ [89.61332035300012, 26.219382629000066],
+ [89.60639571100012, 26.2110110470001],
+ [89.60846276900008, 26.180676982000037],
+ [89.61528405800004, 26.169101461000096],
+ [89.6144055580001, 26.164192200000073],
+ [89.59399336800004, 26.16972157800008],
+ [89.58675866700008, 26.169204814000025],
+ [89.57993737800012, 26.166104228000094],
+ [89.57342614800007, 26.16072987900013],
+ [89.56278080300007, 26.142591452000104],
+ [89.56939538600005, 26.130085754],
+ [89.58577681500003, 26.122902731000053],
+ [89.60422530100004, 26.120732320000073],
+ [89.59254642800005, 26.113962708000102],
+ [89.57787032100009, 26.107244771000083],
+ [89.56691491700008, 26.098976543000063],
+ [89.56701827000012, 26.087090963000023],
+ [89.57694014500004, 26.082646790000112],
+ [89.5907894290001, 26.085023906000046],
+ [89.60386356700013, 26.084662171000062],
+ [89.61135664900007, 26.072208150000066],
+ [89.60288171400009, 26.055258280000075],
+ [89.55916345200006, 26.02223704],
+ [89.55068851700008, 25.995055237000102],
+ [89.55182539900011, 25.98151601200003],
+ [89.54908654800005, 25.96885528600008],
+ [89.54169681900004, 25.959708558],
+ [89.52841597500003, 25.957124735000022],
+ [89.51818404200003, 25.96208567400005],
+ [89.50945072500008, 25.97262766500002],
+ [89.49534305900005, 25.995055237000102],
+ [89.49064050300007, 25.997329],
+ [89.4856278900001, 25.998724263000028],
+ [89.48061527500005, 25.999241028000043],
+ [89.42640669700012, 25.995055237000102],
+ [89.42635502100012, 25.994951884000088],
+ [89.42118737800007, 25.993194885000023],
+ [89.41612308700013, 25.992626444000066],
+ [89.4112655030001, 25.993194885000023],
+ [89.40661462500003, 25.995055237000102],
+ [89.39142175300003, 26.015467428000065],
+ [89.37974287900005, 26.015312399000024],
+ [89.3677539470001, 26.005442200000047],
+ [89.35147587100005, 25.996863912000023],
+ [89.33530114700005, 25.998569235000062],
+ [89.31514733900008, 26.006785787000084],
+ [89.29690555800005, 26.0181546030001],
+ [89.27297937100013, 26.043476054000067],
+ [89.23763269000011, 26.058100484000036],
+ [89.22926110800006, 26.067195537000103],
+ [89.22305993600008, 26.086574198000065],
+ [89.21262129800004, 26.098976543000063],
+ [89.19784183700011, 26.107709859000025],
+ [89.13159265100012, 26.133754781],
+ [89.11919030800004, 26.1466222130001],
+ [89.11169722500011, 26.16450225900006],
+ [89.10337732000005, 26.22517039000003],
+ [89.09588423700012, 26.24103505500004],
+ [89.07588545700008, 26.271059062000106],
+ [89.06942590300014, 26.287388815000057],
+ [89.0688574620001, 26.314260559000033],
+ [89.0803296310001, 26.315604146000013],
+ [89.09479903200014, 26.30950632700005],
+ [89.10353234900009, 26.313692118000077],
+ [89.10291223200011, 26.327334696],
+ [89.09572920800008, 26.33451772100004],
+ [89.07185469600006, 26.34061554],
+ [89.05521488500005, 26.347023417000045],
+ [89.05407800300003, 26.353948059000018],
+ [89.05728194200003, 26.362629700000085],
+ [89.05263106300004, 26.374618632000036],
+ [89.04374271700004, 26.381078186000096],
+ [89.02178023300007, 26.38624582900009],
+ [89.01087650500011, 26.390173239000077],
+ [89.00178145400014, 26.397149557000077],
+ [88.98653690600008, 26.4127041630001],
+ [88.97532312000004, 26.417871806000093],
+ [88.95930342700012, 26.428568828],
+ [88.95015669700012, 26.436940410000076],
+ [88.94100996900005, 26.439420878000064],
+ [88.92457686400007, 26.43213450100008],
+ [88.91196781400004, 26.421230774000023],
+ [88.89946211800003, 26.40448761000006],
+ [88.89124556500013, 26.38578074100006],
+ [88.89186568200006, 26.368779196000062],
+ [88.91243290200009, 26.348935445000066],
+ [88.94121667500008, 26.340098775000072],
+ [88.96602136200005, 26.328471578000105],
+ [88.97532312000004, 26.29994618800005],
+ [88.9817309980001, 26.291832987000063],
+ [88.98968916900009, 26.289404195000074],
+ [88.99862919200007, 26.291522929000067],
+ [89.00798262600011, 26.29715566],
+ [89.00436527500005, 26.275709941000073],
+ [89.01159997600013, 26.2691987110001],
+ [89.02353723100003, 26.2688369750001],
+ [89.03433760600007, 26.26578806600007],
+ [89.03971195500003, 26.24718455000003],
+ [89.01945479300014, 26.23447214800005],
+ [88.97532312000004, 26.22434356700002],
+ [88.94684940600013, 26.232921855000043],
+ [88.90271773300003, 26.272919414000015],
+ [88.8757943110001, 26.27736358600002],
+ [88.85564050400012, 26.2651162720001],
+ [88.84065433800009, 26.2320433550001],
+ [88.82484134900005, 26.22656565400011],
+ [88.80799483200008, 26.23343861900007],
+ [88.7984863690001, 26.247649638000055],
+ [88.79202681500004, 26.264599508000046],
+ [88.78401696800006, 26.27994740900003],
+ [88.74794681800006, 26.292504782000023],
+ [88.6634041750001, 26.26444447900009],
+ [88.64583418800004, 26.27601999900004],
+ [88.65327559400004, 26.283099671000073],
+ [88.69012089100005, 26.299842835000035],
+ [88.70298832200007, 26.309661357],
+ [88.71223840300007, 26.328264872000048],
+ [88.70970625900009, 26.34061554],
+ [88.69627038600004, 26.350279032000046],
+ [88.67337772700012, 26.360717672000064],
+ [88.66743493700011, 26.36815907800009],
+ [88.66852014200009, 26.385729065000064],
+ [88.66107873600009, 26.388881328000124],
+ [88.6522420660001, 26.39151682600003],
+ [88.64986495000005, 26.3983897910001],
+ [88.65193200700008, 26.407071432000052],
+ [88.65627282700007, 26.41513295500006],
+ [88.63301843300013, 26.4200938930001],
+ [88.62237308800007, 26.424538066000096],
+ [88.6115210370001, 26.43084259100003],
+ [88.60356286700005, 26.44019602500005],
+ [88.59787845900007, 26.451461487000117],
+ [88.59116052200005, 26.46122833300008],
+ [88.57917159000004, 26.466034241000088],
+ [88.55798425300009, 26.465724182000102],
+ [88.54976770000013, 26.466654358000042],
+ [88.52682336400011, 26.475387676000125],
+ [88.50682458500006, 26.487634989000057],
+ [88.49865970900004, 26.4948696900001],
+ [88.48791101100011, 26.50577341800009],
+ [88.47540531400011, 26.514971823000067],
+ [88.46238285300007, 26.528821106000052],
+ [88.44646651200009, 26.53553904300007],
+ [88.41101648000011, 26.545099182000072],
+ [88.39789066600008, 26.558690084000048],
+ [88.39499678600009, 26.578378805000014],
+ [88.39592696100004, 26.599566142000057],
+ [88.39437666800012, 26.61801462800007],
+ [88.38528161700003, 26.623544007000064],
+ [88.37251753700008, 26.611606751000025],
+ [88.36027022300004, 26.59310658800011],
+ [88.35282881700005, 26.578688864000085],
+ [88.33236495000006, 26.514661764],
+ [88.31934248900012, 26.494921367000032],
+ [88.31386478700006, 26.481537170000095],
+ [88.31510502100008, 26.465052389],
+ [88.32254642700008, 26.451771546000103],
+ [88.33562056500006, 26.44820587200003],
+ [88.34021976700006, 26.454148662000065],
+ [88.34301029400007, 26.477196351000103],
+ [88.34652429200008, 26.484017639000072],
+ [88.35355228700013, 26.484586080000028],
+ [88.37691003500004, 26.475335999000023],
+ [88.43458093200013, 26.465155741000032],
+ [88.46114261900004, 26.453890280000067],
+ [88.47540531400011, 26.432031148000036],
+ [88.49545577000009, 26.378080953000094],
+ [88.49762618100004, 26.352707825],
+ [88.47540531400011, 26.35580841100004],
+ [88.46791223200006, 26.35405141200006],
+ [88.4579903560001, 26.353017883000078],
+ [88.44863692200005, 26.353431295000078],
+ [88.44202233900006, 26.356118470000112],
+ [88.43168705300013, 26.362216289000074],
+ [88.4260026450001, 26.35792714500009],
+ [88.42119673700012, 26.348728740000112],
+ [88.41380700700006, 26.340202129000076],
+ [88.36678145400003, 26.31343373600002],
+ [88.35169193600012, 26.300979717000033],
+ [88.33660241700011, 26.281807760000035],
+ [88.33293339100004, 26.267235006000064],
+ [88.33453536000013, 26.23080312100008],
+ [88.32626713100012, 26.215920309000026],
+ [88.30869714400012, 26.206101787000065],
+ [88.25030277600007, 26.18801503500005],
+ [88.22978723200009, 26.18403595000005],
+ [88.21888350500012, 26.180160217000022],
+ [88.21195886300006, 26.173752340000064],
+ [88.20565433800004, 26.16641428700008],
+ [88.19692102100004, 26.159644674000035],
+ [88.16379642800007, 26.140472717000122],
+ [88.15563155100006, 26.128483785000057],
+ [88.14446944200012, 26.095875957000104],
+ [88.14136885600004, 26.090501607000036],
+ [88.13992191600005, 26.085333964000043],
+ [88.14116215000013, 26.075463766000055],
+ [88.14477950000008, 26.0705028280001],
+ [88.15098067200006, 26.066988830000057],
+ [88.15640669800007, 26.061407776000053],
+ [88.15790531400006, 26.050452373000056],
+ [88.1510323490001, 26.031332093000074],
+ [88.12586592600007, 26.013400371],
+ [88.10653894000012, 25.97996571900002],
+ [88.08803877800005, 25.923224996],
+ [88.08266442900003, 25.9159386190001],
+ [88.07739343300005, 25.91278635700006],
+ [88.07439620000008, 25.90813547800009],
+ [88.08204431200005, 25.86384877600007],
+ [88.08896895400005, 25.84865590400004],
+ [88.08757369000006, 25.839974264000077],
+ [88.08757369000006, 25.830982564000024],
+ [88.10333500200005, 25.814807841000047],
+ [88.1080375570001, 25.806281230000124],
+ [88.11491052200006, 25.787264303000043],
+ [88.12772627800007, 25.77491363500009],
+ [88.14643314600005, 25.77574045800013],
+ [88.16622522000011, 25.78364695300006],
+ [88.18271000200008, 25.792431946000065],
+ [88.22746179300003, 25.80426584900006],
+ [88.25991459200009, 25.789021301000034],
+ [88.32027266500006, 25.725252584000103],
+ [88.39298140400012, 25.680759176000024],
+ [88.41943973800011, 25.653784078000072],
+ [88.42378055900008, 25.592237447000073],
+ [88.43778487200012, 25.579835104],
+ [88.47540531400011, 25.56257517600001],
+ [88.48558557100012, 25.542628072000085],
+ [88.51276737500007, 25.523714498000047],
+ [88.52046716400008, 25.50929677400002],
+ [88.53028568600013, 25.500201721000067],
+ [88.55095625800004, 25.49648101800004],
+ [88.59358931500003, 25.495085755000062],
+ [88.61317468300007, 25.486404114000024],
+ [88.64542077600004, 25.46733551000004],
+ [88.66634973200013, 25.46289133800012],
+ [88.67808028100006, 25.465888570000047],
+ [88.68707198100003, 25.47389841700003],
+ [88.69565026900005, 25.48361358600006],
+ [88.70619226100013, 25.49167511000003],
+ [88.71415043100006, 25.492811992000057],
+ [88.72314213100003, 25.49141672800006],
+ [88.73265059500011, 25.49100331700005],
+ [88.74257246900004, 25.495189108000105],
+ [88.74195235200006, 25.51275909400006],
+ [88.77233809500012, 25.501958720000047],
+ [88.78096805800004, 25.495189108000105],
+ [88.79311202000014, 25.481959941000085],
+ [88.80582442200011, 25.471676331000097],
+ [88.81491947500007, 25.45860219300006],
+ [88.81631473800007, 25.437208151000036],
+ [88.79931319200006, 25.401706442000105],
+ [88.79962325000014, 25.39560862300003],
+ [88.81037194800012, 25.388425598000097],
+ [88.81326582800011, 25.380054016000102],
+ [88.81404097600006, 25.370390524000086],
+ [88.81833011900011, 25.35964182600007],
+ [88.84199792500004, 25.332821757000076],
+ [88.84902592000003, 25.327189026000056],
+ [88.85925785400013, 25.32470855700008],
+ [88.88018680800008, 25.32346832300003],
+ [88.88612959800014, 25.31907582600006],
+ [88.90287276200007, 25.30341786700008],
+ [88.92648889200007, 25.300472310000075],
+ [88.97532312000004, 25.302642721000083],
+ [88.98271285000004, 25.29447784400007],
+ [88.98493493700005, 25.284969381000067],
+ [88.98235111500009, 25.27489247700005],
+ [88.97532312000004, 25.265228984000103],
+ [88.93775435400005, 25.240165914],
+ [88.9290727130001, 25.229417216000073],
+ [88.9279875090001, 25.215929667000026],
+ [88.93077803600005, 25.202648825000026],
+ [88.92788415600006, 25.192726949000118],
+ [88.90964237500003, 25.189161275000046],
+ [88.92416345200007, 25.167870585000074],
+ [88.89863529500013, 25.169317526000057],
+ [88.83021569900012, 25.191331686000026],
+ [88.82360111500003, 25.194845683],
+ [88.81708988500009, 25.19680938700013],
+ [88.8091317140001, 25.195259094],
+ [88.80251713100012, 25.188127747000053],
+ [88.79233687400006, 25.166578675000025],
+ [88.78422367300004, 25.16094594400009],
+ [88.72453739400004, 25.166475322000068],
+ [88.66459273300012, 25.18688751200004],
+ [88.6342586670001, 25.19226186200008],
+ [88.59911869300004, 25.193140361000033],
+ [88.59012699400012, 25.190143127000013],
+ [88.57772465000005, 25.177482401000063],
+ [88.57069665500012, 25.173244935000028],
+ [88.55937951600004, 25.17076446600005],
+ [88.55467696100004, 25.171126201000035],
+ [88.5500260820001, 25.1731415820001],
+ [88.5231543380001, 25.179807841000112],
+ [88.49183842000008, 25.191124980000083],
+ [88.47540531400011, 25.195104065000052],
+ [88.44129886900004, 25.189729716],
+ [88.4314803470001, 25.173038229000056],
+ [88.43416752100012, 25.11665924100005],
+ [88.42579593900007, 25.051056010000124],
+ [88.41411706500008, 25.021522929000085],
+ [88.39101770100007, 24.99509043400012],
+ [88.38786543800006, 24.968761292000053],
+ [88.37566980000014, 24.945610251000076],
+ [88.34089156100009, 24.904139913],
+ [88.32275313400004, 24.8746843470001],
+ [88.31360640500009, 24.868302307000064],
+ [88.29681156400011, 24.86969757100006],
+ [88.25485030100009, 24.87995534300005],
+ [88.24275801600004, 24.880601299000105],
+ [88.24187951700009, 24.898765564000044],
+ [88.23283614100012, 24.918273417000037],
+ [88.21878015100009, 24.93514577200004],
+ [88.20245039900004, 24.945300191000072],
+ [88.1830200610001, 24.946979675000037],
+ [88.16451989700005, 24.941114400000046],
+ [88.11491052200006, 24.916413066000032],
+ [88.11491052200006, 24.912020569000035],
+ [88.12033654800007, 24.906775411000027],
+ [88.12493575100012, 24.89814544700006],
+ [88.13806156400005, 24.863496399000056],
+ [88.14095544500003, 24.844582825000103],
+ [88.13124027500004, 24.831767070000055],
+ [88.11739099100004, 24.81926137300003],
+ [88.10777917500013, 24.801097107000103],
+ [88.09480839000008, 24.803112488000053],
+ [88.08824548300004, 24.796136170000054],
+ [88.08535160400004, 24.78401804600007],
+ [88.0840080160001, 24.770452983000084],
+ [88.07698002200004, 24.761177063000062],
+ [88.06426761900013, 24.759161682000112],
+ [88.05320886200013, 24.754975891000086],
+ [88.04845463100014, 24.71120595300009],
+ [88.0354321690001, 24.69381683400006],
+ [88.02716394100014, 24.675730082000044],
+ [88.02178959200006, 24.64560272200005],
+ [88.04090987200004, 24.640435079000056],
+ [88.05723962400003, 24.63410471600004],
+ [88.06726485200005, 24.613666687000077],
+ [88.08183760600008, 24.599869080000033],
+ [88.08498986800004, 24.593874614000086],
+ [88.08498986800004, 24.541733093000047],
+ [88.08602339700013, 24.536720480000085],
+ [88.09000248300003, 24.532999777000057],
+ [88.0987874760001, 24.5224836230001],
+ [88.10793420400006, 24.50796254500007],
+ [88.10994958500004, 24.50098622700007],
+ [88.13878503400008, 24.495250143000092],
+ [88.40130131100011, 24.36941803000012],
+ [88.47540531400011, 24.315467835000064],
+ [88.49834965000008, 24.31097198500005],
+ [88.56310021900003, 24.308207296000077],
+ [88.61245121300004, 24.292885234000025],
+ [88.63451705000006, 24.294125468000047],
+ [88.64950321500004, 24.31536448200002],
+ [88.66014856000004, 24.338257141000057],
+ [88.68180098500011, 24.333890483000076],
+ [88.71456384300012, 24.315416158000048],
+ [88.73750817900003, 24.28709747300006],
+ [88.74303755700004, 24.24753916500002],
+ [88.74494958500009, 24.24337921200008],
+ [88.74748173000006, 24.226971945000017],
+ [88.74980717000005, 24.223251242000103],
+ [88.74639652500014, 24.21407867500001],
+ [88.73482100400008, 24.19842071500007],
+ [88.73161706600013, 24.18984242800012],
+ [88.73145573500011, 24.1897713150001],
+ [88.71590743000007, 24.182917786000033],
+ [88.69378991700006, 24.17532135100008],
+ [88.68376468900004, 24.166536356000094],
+ [88.67808028100006, 24.154289043000077],
+ [88.67828698800014, 24.144651388000042],
+ [88.68298954300013, 24.12429087300002],
+ [88.68180098500011, 24.112663676000054],
+ [88.67539310700005, 24.09183807400008],
+ [88.67410119700003, 24.082639669000102],
+ [88.67901045700006, 24.071219178],
+ [88.69782067900007, 24.05625885000002],
+ [88.70092126500009, 24.043649801000086],
+ [88.72500248200004, 24.03837880500008],
+ [88.72546757000009, 24.028896179000085],
+ [88.7138403730001, 24.01468516100003],
+ [88.70159305800007, 23.995280660000063],
+ [88.70836267100003, 23.98355011000008],
+ [88.71435713700004, 23.964403992000072],
+ [88.71714766500003, 23.9431391400001],
+ [88.71415043100006, 23.925155742000115],
+ [88.70443526200006, 23.913709412000102],
+ [88.66650476100006, 23.87949961400001],
+ [88.65312056500011, 23.869784445000064],
+ [88.63394860900007, 23.866141256000063],
+ [88.61317468300007, 23.867846578000027],
+ [88.59358931500003, 23.866916402000086],
+ [88.57762129700012, 23.855160014000077],
+ [88.57436568200012, 23.845625712000086],
+ [88.5754508870001, 23.836556499000025],
+ [88.57762129700012, 23.827616476000102],
+ [88.57751794500007, 23.818521424000025],
+ [88.57235030200007, 23.806894226000068],
+ [88.55767419400007, 23.785681051000026],
+ [88.55271325700005, 23.774984029],
+ [88.55250655100008, 23.765423890000093],
+ [88.55974125200004, 23.75028269500008],
+ [88.56118819200003, 23.74100677500006],
+ [88.54010420800012, 23.64995290100005],
+ [88.54155114800011, 23.63876495400008],
+ [88.55095625800004, 23.6344241340001],
+ [88.56123986800003, 23.632486268],
+ [88.56635583500014, 23.628739726000063],
+ [88.56439213100009, 23.61620819100007],
+ [88.5610848390001, 23.608611756000087],
+ [88.56170495600009, 23.602023010000025],
+ [88.57142012600013, 23.592333679000077],
+ [88.58154870600009, 23.58832875600008],
+ [88.60128910400005, 23.59034413700003],
+ [88.6092472740001, 23.588793844000023],
+ [88.62423344000007, 23.573859355000067],
+ [88.64764286400003, 23.535076193000023],
+ [88.66448938000008, 23.518307190000073],
+ [88.69378991700006, 23.499807028000035],
+ [88.70464196800003, 23.495181986000077],
+ [88.71942142800003, 23.468103536000015],
+ [88.73192712400004, 23.472625224000055],
+ [88.74370935100012, 23.489316711000086],
+ [88.7568351650001, 23.49879933700005],
+ [88.77016768400011, 23.48882578600005],
+ [88.76789392100011, 23.467276713],
+ [88.71926639800006, 23.348291728000063],
+ [88.69503015100008, 23.312609152000064],
+ [88.68593510000005, 23.293308004000025],
+ [88.68660689300003, 23.271603902000024],
+ [88.69658044500011, 23.252354432000104],
+ [88.71001631700005, 23.241218160000088],
+ [88.77569706300011, 23.22163279200005],
+ [88.78618737800008, 23.221529439000037],
+ [88.79419722500006, 23.224965922000067],
+ [88.80096683800008, 23.23075368300003],
+ [88.80954512500011, 23.236050517000066],
+ [88.82267093900009, 23.237962545000087],
+ [88.83962080900011, 23.234810283000044],
+ [88.90964237500003, 23.212434388000062],
+ [88.91806563300008, 23.208584493],
+ [88.92695398000012, 23.206517436000055],
+ [88.95423913600013, 23.207421773000092],
+ [88.9599752200001, 23.2026933800001],
+ [88.95982019100006, 23.19445098900006],
+ [88.95470422400007, 23.18380564400009],
+ [88.94586755400007, 23.174348857000027],
+ [88.91909916200007, 23.153859152000038],
+ [88.86478723200014, 23.10027069100009],
+ [88.85129968300004, 23.07513010700005],
+ [88.84871586100007, 23.02384124800001],
+ [88.83941410300014, 22.995367534000067],
+ [88.83879398700009, 22.975808004000058],
+ [88.84277307100012, 22.964568380000017],
+ [88.86173832200006, 22.942399190000074],
+ [88.87217696100004, 22.926767070000054],
+ [88.89346765200008, 22.879638164000127],
+ [88.90514652600007, 22.86643483500005],
+ [88.93310347500011, 22.85811492900008],
+ [88.94452396600008, 22.848012187000037],
+ [88.94679773000013, 22.834524638000076],
+ [88.94514408400005, 22.815094300000098],
+ [88.94121667500008, 22.795663961000017],
+ [88.9368758550001, 22.782331441000096],
+ [88.92623051000004, 22.767035218000032],
+ [88.91496504800006, 22.75440033000011],
+ [88.90814375800011, 22.74078359000002],
+ [88.91057255100009, 22.722593486000065],
+ [88.92250980600011, 22.69370636000012],
+ [88.92592045100014, 22.680838928000114],
+ [88.93000288900004, 22.658618063000077],
+ [88.9423535570001, 22.637482402000032],
+ [88.95201704900012, 22.611902568000076],
+ [88.95640954600003, 22.584979146000066],
+ [88.95031172700004, 22.561983134000016],
+ [88.9279875090001, 22.54813385000007],
+ [88.95904504400005, 22.53681671100007],
+ [88.97098230000006, 22.52792836500008],
+ [88.979974, 22.490928039000025],
+ [88.99837080900011, 22.45124053900004],
+ [89.00250492300006, 22.427986145000105],
+ [89.00074792500004, 22.420131328000068],
+ [88.99216963700013, 22.406953837000103],
+ [88.98948246300012, 22.396670227000115],
+ [88.98958581600004, 22.386903382000057],
+ [89.00152307100007, 22.333676656000094],
+ [89.00694909700013, 22.32142934200006],
+ [89.02353723100003, 22.294815979000035],
+ [89.00911950700004, 22.285617575000046],
+ [89.01862797100011, 22.26468861900004],
+ [89.06229455500011, 22.21156524700011],
+ [89.07071781400009, 22.194822083000062],
+ [89.07619551700009, 22.175030009000082],
+ [89.07815922000009, 22.150845439000122],
+ [89.06069258700006, 22.130484925000076],
+ [89.06039472700007, 22.12986888200004],
+ [89.06031334700003, 22.130601304000038],
+ [89.04371178500003, 22.13739655200004],
+ [89.04859459700003, 22.12295156500005],
+ [89.04566491000003, 22.11204661700009],
+ [89.03988691500007, 22.100897528000075],
+ [89.03687584700003, 22.085598049000055],
+ [89.04004967500003, 22.069525458000044],
+ [89.05404707100007, 22.04364655200004],
+ [89.05738366000003, 22.03123607000009],
+ [89.06560306100005, 21.96710846600007],
+ [89.06088300900007, 21.93846263200004],
+ [89.03687584700003, 21.925116278000075],
+ [89.02312259200005, 21.93109772300005],
+ [89.01303144600007, 21.929429429000038],
+ [89.00806725400008, 21.92055898600006],
+ [89.00953209700003, 21.90460846600007],
+ [88.99301191500007, 21.912665106000077],
+ [88.96045983200008, 21.93431224200009],
+ [88.94467207100007, 21.938788153000075],
+ [88.93783613400007, 21.94871653900009],
+ [88.93458092500003, 21.969305731000077],
+ [88.92872155000003, 21.98655833500004],
+ [88.91391035200007, 21.98655833500004],
+ [88.90503991000003, 21.96942780200004],
+ [88.91081790500004, 21.946478583000044],
+ [88.92408287900008, 21.926336981000077],
+ [88.93783613400007, 21.917669989000046],
+ [88.95191491000003, 21.913885809000078],
+ [88.96827233200008, 21.904730536000045],
+ [88.99586022200003, 21.88418203300006],
+ [89.01587975400008, 21.853338934000078],
+ [89.03093509200005, 21.770453192000048],
+ [89.04371178500003, 21.733343817000048],
+ [89.04786217500003, 21.72801341400009],
+ [89.06788170700008, 21.709133205000057],
+ [89.08277428500003, 21.678208726000037],
+ [89.08521569100003, 21.674709377000056],
+ [89.08822675900007, 21.633734442000048],
+ [89.08269290500004, 21.617336330000057],
+ [89.06421959700003, 21.609198309000078],
+ [89.05323326900003, 21.609808661000045],
+ [89.04468834700003, 21.61351146000004],
+ [89.03882897200003, 21.61945221600007],
+ [89.03687584700003, 21.626898505000042],
+ [89.03394616000003, 21.633246161000045],
+ [89.02759850400008, 21.62457916900007],
+ [89.02165774800005, 21.611802476000037],
+ [89.01978600400008, 21.60610586100006],
+ [89.00025475400008, 21.60342031500005],
+ [88.97575931100005, 21.61591217700004],
+ [88.93384850400008, 21.64394765800006],
+ [88.89698326900003, 21.650132554000038],
+ [88.89161217500003, 21.653509833000044],
+ [88.88607832100007, 21.661810614000046],
+ [88.88160241000003, 21.672023830000057],
+ [88.87208092500003, 21.74900950700004],
+ [88.86605879000007, 21.766831773000035],
+ [88.85865319100003, 21.766831773000035],
+ [88.85572350400008, 21.748846747000073],
+ [88.84156334700003, 21.71625397300005],
+ [88.83822675900007, 21.701971747000073],
+ [88.84294681100005, 21.684149481000077],
+ [88.85987389400003, 21.65257396000004],
+ [88.85865319100003, 21.636542059000078],
+ [88.84424889400003, 21.622219143000052],
+ [88.82398522200003, 21.617254950000074],
+ [88.80583743600005, 21.622870184000078],
+ [88.79786217500003, 21.64020416900007],
+ [88.81478925900007, 21.65387604400007],
+ [88.81836998800003, 21.65761953300006],
+ [88.81853274800005, 21.665838934000078],
+ [88.81666100400008, 21.675034898000035],
+ [88.81088300900007, 21.69171784100007],
+ [88.80494225400008, 21.67186107000009],
+ [88.80046634200005, 21.661851304000038],
+ [88.79420006600003, 21.65761953300006],
+ [88.78402754000007, 21.655951239000046],
+ [88.77906334700003, 21.651190497000073],
+ [88.77711022200003, 21.64354075700004],
+ [88.77686608200008, 21.63344961100006],
+ [88.78174889400003, 21.61424388200004],
+ [88.79102623800003, 21.598863023000035],
+ [88.79664147200003, 21.584418036000045],
+ [88.79053795700008, 21.56826406500005],
+ [88.76246178500003, 21.555853583000044],
+ [88.72787519600007, 21.559881903000075],
+ [88.70753014400003, 21.57831452000005],
+ [88.72217858200008, 21.609198309000078],
+ [88.68799889400003, 21.678127346000053],
+ [88.68490644600007, 21.697211005000042],
+ [88.70362389400003, 21.810614325000074],
+ [88.69800866000003, 21.825506903000075],
+ [88.69450931100005, 21.83982982000009],
+ [88.71469160200007, 21.89785390800006],
+ [88.71697024800005, 21.951971747000073],
+ [88.72217858200008, 21.966131903000075],
+ [88.73316491000003, 21.97719961100006],
+ [88.74683678500003, 21.987127997000073],
+ [88.75831139400003, 21.99945709800005],
+ [88.76303144600007, 22.017279364000046],
+ [88.75464928500003, 22.037583726000037],
+ [88.71705162900008, 22.05805084800005],
+ [88.70850670700008, 22.072211005000042],
+ [88.71485436300003, 22.08698151200008],
+ [88.73015384200005, 22.103583075000074],
+ [88.76303144600007, 22.130560614000046],
+ [88.74390709700003, 22.129339911000045],
+ [88.72657311300003, 22.121161200000074],
+ [88.71216881600003, 22.109035549000055],
+ [88.70167076900003, 22.095851955000057],
+ [88.69483483200008, 22.08152903900009],
+ [88.69288170700008, 22.06586334800005],
+ [88.69947350400008, 22.053208726000037],
+ [88.71851647200003, 22.048041083000044],
+ [88.73072350400008, 22.037176825000074],
+ [88.72331790500004, 22.01308828300006],
+ [88.70167076900003, 21.97601959800005],
+ [88.69841556100005, 21.962591864000046],
+ [88.68995201900003, 21.94599030200004],
+ [88.67872155000003, 21.936672268000052],
+ [88.66700280000003, 21.945013739000046],
+ [88.65626061300003, 21.941066799000055],
+ [88.64258873800003, 21.94090403900009],
+ [88.63086998800003, 21.945461330000057],
+ [88.62598717500003, 21.955511786000045],
+ [88.62745201900003, 21.970404364000046],
+ [88.63168379000007, 21.979803778000075],
+ [88.64633222700007, 22.00023021000004],
+ [88.65349368600005, 22.018011786000045],
+ [88.65259850400008, 22.031805731000077],
+ [88.64877363400007, 22.046047268000052],
+ [88.64503014400003, 22.075140692000048],
+ [88.63949629000007, 22.09723541900007],
+ [88.63949629000007, 22.109523830000057],
+ [88.65699303500003, 22.15106842700004],
+ [88.67400149800005, 22.162054755000042],
+ [88.68311608200008, 22.18496328300006],
+ [88.67994225400008, 22.204413153000075],
+ [88.66016686300003, 22.205023505000042],
+ [88.66114342500003, 22.198960679000038],
+ [88.65601647200003, 22.183254299000055],
+ [88.64966881600003, 22.169094143000052],
+ [88.64633222700007, 22.167792059000078],
+ [88.64429772200003, 22.16229889500005],
+ [88.63493899800005, 22.144964911000045],
+ [88.63086998800003, 22.125799872000073],
+ [88.62208092500003, 22.116034247000073],
+ [88.61915123800003, 22.109523830000057],
+ [88.61833743600005, 22.10297272300005],
+ [88.61996504000007, 22.07831452000005],
+ [88.62549889400003, 22.05927155200004],
+ [88.62598717500003, 22.048041083000044],
+ [88.62037194100003, 22.02997467700004],
+ [88.60254967500003, 22.006415106000077],
+ [88.59864342500003, 21.990301825000074],
+ [88.60027103000004, 21.947211005000042],
+ [88.59839928500003, 21.929348049000055],
+ [88.56706790500004, 21.850816148000035],
+ [88.56462649800005, 21.83234284100007],
+ [88.56544030000003, 21.771185614000046],
+ [88.56462649800005, 21.766831773000035],
+ [88.58130944100003, 21.76943594000005],
+ [88.60417728000004, 21.77875397300005],
+ [88.62403405000003, 21.77802155200004],
+ [88.63282311300003, 21.750067450000074],
+ [88.63021894600007, 21.731756903000075],
+ [88.62338300900007, 21.710272528000075],
+ [88.61264082100007, 21.69749583500004],
+ [88.59864342500003, 21.70538971600007],
+ [88.59180748800003, 21.70538971600007],
+ [88.59961998800003, 21.637274481000077],
+ [88.59506269600007, 21.612127997000073],
+ [88.57813561300003, 21.623439846000053],
+ [88.57813561300003, 21.57168203300006],
+ [88.57227623800003, 21.557928778000075],
+ [88.55892988400007, 21.555568752000056],
+ [88.54476972700007, 21.56199778900009],
+ [88.53646894600007, 21.575100002000056],
+ [88.53028405000003, 21.564398505000042],
+ [88.52963300900007, 21.55337148600006],
+ [88.53443444100003, 21.542914130000042],
+ [88.54395592500003, 21.534084377000056],
+ [88.51295006600003, 21.524644273000035],
+ [88.49390709700003, 21.534816799000055],
+ [88.48796634200005, 21.55654531500005],
+ [88.49561608200008, 21.581854559000078],
+ [88.50212649800005, 21.58934153900009],
+ [88.50879967500003, 21.59438711100006],
+ [88.51400800900007, 21.600816148000035],
+ [88.51612389400003, 21.612616278000075],
+ [88.51661217500003, 21.62641022300005],
+ [88.51880944100003, 21.639146226000037],
+ [88.52295983200008, 21.64988841400009],
+ [88.52963300900007, 21.65761953300006],
+ [88.50953209700003, 21.71230703300006],
+ [88.50489342500003, 21.741522528000075],
+ [88.51270592500003, 21.763413804000038],
+ [88.53288821700005, 21.795314846000053],
+ [88.53101647200003, 21.82412344000005],
+ [88.51587975400008, 21.850816148000035],
+ [88.49561608200008, 21.876695054000038],
+ [88.51465905000003, 21.91620514500005],
+ [88.51498457100007, 21.937201239000046],
+ [88.49561608200008, 21.95180898600006],
+ [88.49984785200007, 21.933661200000074],
+ [88.49236087300005, 21.922023830000057],
+ [88.48121178500003, 21.909898179000038],
+ [88.47445722700007, 21.890326239000046],
+ [88.47706139400003, 21.87181224200009],
+ [88.49203535200007, 21.837144273000035],
+ [88.49561608200008, 21.81867096600007],
+ [88.49350019600007, 21.805161851000037],
+ [88.48829186300003, 21.803656317000048],
+ [88.48145592500003, 21.805161851000037],
+ [88.47445722700007, 21.80097077000005],
+ [88.46827233200008, 21.77724844000005],
+ [88.45769290500004, 21.75885651200008],
+ [88.45337975400008, 21.74176666900007],
+ [88.45215905000003, 21.722805080000057],
+ [88.45476321700005, 21.70538971600007],
+ [88.46859785200007, 21.67715078300006],
+ [88.47217858200008, 21.663275458000044],
+ [88.46827233200008, 21.64394765800006],
+ [88.45630944100003, 21.62400950700004],
+ [88.44190514400003, 21.616156317000048],
+ [88.42611738400007, 21.611029364000046],
+ [88.40967858200008, 21.599269924000055],
+ [88.39307701900003, 21.60024648600006],
+ [88.38355553500003, 21.631415106000077],
+ [88.38282311300003, 21.67133209800005],
+ [88.39258873800003, 21.698553778000075],
+ [88.38062584700003, 21.696193752000056],
+ [88.36451256600003, 21.68695709800005],
+ [88.35572350400008, 21.68496328300006],
+ [88.34620201900003, 21.688625393000052],
+ [88.34066816500007, 21.69749583500004],
+ [88.33643639400003, 21.708726304000038],
+ [88.33122806100005, 21.71906159100007],
+ [88.32634524800005, 21.711086330000057],
+ [88.32471764400003, 21.70136139500005],
+ [88.32740319100003, 21.691107489000046],
+ [88.34571373800003, 21.67059967700004],
+ [88.34945722700007, 21.660956122000073],
+ [88.34880618600005, 21.65029531500005],
+ [88.34546959700003, 21.636542059000078],
+ [88.33545983200008, 21.615790106000077],
+ [88.32178795700008, 21.60565827000005],
+ [88.30974368600005, 21.610174872000073],
+ [88.30445397200003, 21.63344961100006],
+ [88.30201256600003, 21.74518463700008],
+ [88.29818769600007, 21.764105536000045],
+ [88.28980553500003, 21.780218817000048],
+ [88.27312259200005, 21.79791901200008],
+ [88.26156660200007, 21.798651434000078],
+ [88.26417076900003, 21.77529531500005],
+ [88.29542076900003, 21.676581122000073],
+ [88.29704837300005, 21.65387604400007],
+ [88.29444420700008, 21.64280833500004],
+ [88.28419030000003, 21.621242580000057],
+ [88.28337649800005, 21.609198309000078],
+ [88.28760826900003, 21.60028717700004],
+ [88.30062910200007, 21.58934153900009],
+ [88.30445397200003, 21.581854559000078],
+ [88.30583743600005, 21.57168203300006],
+ [88.30372155000003, 21.568793036000045],
+ [88.29786217500003, 21.566555080000057],
+ [88.28711998800003, 21.558294989000046],
+ [88.27898196700005, 21.555161851000037],
+ [88.26612389400003, 21.553859768000052],
+ [88.25440514400003, 21.55467357000009],
+ [88.24927819100003, 21.558294989000046],
+ [88.24594160200007, 21.579901434000078],
+ [88.23747806100005, 21.601711330000057],
+ [88.22437584700003, 21.613023179000038],
+ [88.20826256600003, 21.60297272300005],
+ [88.18946373800003, 21.641791083000044],
+ [88.18189537900008, 21.665228583000044],
+ [88.18091881600003, 21.68496328300006],
+ [88.19044030000003, 21.70408763200004],
+ [88.20346113400007, 21.724351304000038],
+ [88.21045983200008, 21.747259833000044],
+ [88.20142662900008, 21.774318752000056],
+ [88.20972741000003, 21.78856028900009],
+ [88.20378665500004, 21.80540599200009],
+ [88.15406334700003, 21.88808828300006],
+ [88.15642337300005, 21.89785390800006],
+ [88.15943444100003, 21.90615469000005],
+ [88.14673912900008, 21.95921458500004],
+ [88.14991295700008, 21.976385809000078],
+ [88.15626061300003, 21.99087148600006],
+ [88.16431725400008, 22.003119208000044],
+ [88.20679772200003, 22.05337148600006],
+ [88.22242272200003, 22.077948309000078],
+ [88.21273847700007, 22.100043036000045],
+ [88.20337975400008, 22.15176015800006],
+ [88.19800866000003, 22.167792059000078],
+ [88.16529381600003, 22.18500397300005],
+ [88.11841881600003, 22.20018138200004],
+ [88.08130944100003, 22.217352606000077],
+ [88.07732181100005, 22.24042389500005],
+ [88.05974368600005, 22.22947825700004],
+ [88.04346764400003, 22.224758205000057],
+ [88.02702884200005, 22.227850653000075],
+ [88.00904381600003, 22.24042389500005],
+ [87.98511803500003, 22.26593659100007],
+ [87.97266686300003, 22.28318919500009],
+ [87.96745853000004, 22.298488674000055],
+ [87.96420332100007, 22.319281317000048],
+ [87.95069420700008, 22.35618724200009],
+ [87.94752037900008, 22.373846747000073],
+ [87.94613691500007, 22.394924221000053],
+ [87.94044030000003, 22.413031317000048],
+ [87.92798912900008, 22.424221096000053],
+ [87.90658613400007, 22.424750067000048],
+ [87.90658613400007, 22.41860586100006],
+ [87.92286217500003, 22.397772528000075],
+ [87.93580162900008, 22.355169989000046],
+ [87.94752037900008, 22.27765534100007],
+ [87.95281009200005, 22.26243724200009],
+ [87.96534264400003, 22.24481842700004],
+ [87.99195397200003, 22.21588776200008],
+ [88.00847415500004, 22.204901434000078],
+ [88.02540123800003, 22.200913804000038],
+ [88.05738366000003, 22.198879299000055],
+ [88.09546959700003, 22.191229559000078],
+ [88.13257897200003, 22.17914459800005],
+ [88.16098066500007, 22.15656159100007],
+ [88.17351321700005, 22.116888739000046],
+ [88.16431725400008, 22.089789130000042],
+ [88.14063561300003, 22.06012604400007],
+ [88.11117597700007, 22.034857489000046],
+ [88.08472741000003, 22.020697333000044],
+ [88.04859459700003, 22.020738023000035],
+ [88.04314212300005, 22.017279364000046],
+ [88.04517662900008, 22.00653717700004],
+ [88.04900149800005, 21.995428778000075],
+ [88.05079186300003, 21.98501211100006],
+ [88.04688561300003, 21.97601959800005],
+ [88.03239993600005, 21.957180080000057],
+ [87.98365319100003, 21.85419342700004],
+ [87.97046959700003, 21.836493231000077],
+ [87.95777428500003, 21.828924872000073],
+ [87.94800866000003, 21.825384833000044],
+ [87.90902754000007, 21.79881419500009],
+ [87.90219160200007, 21.796820380000042],
+ [87.89918053500003, 21.79482656500005],
+ [87.89568118600005, 21.78937409100007],
+ [87.89478600400008, 21.77875397300005],
+ [87.89291425900007, 21.774318752000056],
+ [87.86719811300003, 21.750799872000073],
+ [87.83399498800003, 21.729315497000073],
+ [87.75570722700007, 21.69171784100007],
+ [87.70378665500004, 21.655503648000035],
+ [87.68384850400008, 21.650132554000038],
+ [87.64210045700008, 21.652085679000038],
+ [87.62134850400008, 21.65062083500004],
+ [87.47738691500007, 21.61359284100007],
+ [87.46876061300003, 21.611395575000074],
+ [87.40495853000004, 21.58665599200009],
+ [87.34180748800003, 21.56240469000005],
+ [87.29346764400003, 21.553656317000048],
+ [87.25611412900008, 21.56199778900009],
+ [87.24594160200007, 21.556586005000042],
+ [87.23519941500007, 21.554510809000078],
+ [87.21143639400003, 21.55459219000005],
+ [87.20093834700003, 21.551988023000035],
+ [87.11304772200003, 21.507961330000057],
+ [87.06373131600003, 21.475002346000053],
+ [86.91765384200005, 21.327378648000035],
+ [86.86695397200003, 21.25604889500005],
+ [86.83725019600007, 21.174709377000056],
+ [86.84400475400008, 21.08222077000005],
+ [86.95215905000003, 20.84910716400009],
+ [86.96566816500007, 20.805975653000075],
+ [86.95386803500003, 20.780585028000075],
+ [86.93628991000003, 20.787502346000053],
+ [86.91651451900003, 20.78807200700004],
+ [86.87875410200007, 20.780585028000075],
+ [86.88933353000004, 20.764471747000073],
+ [86.91065514400003, 20.756415106000077],
+ [86.95720462300005, 20.753241278000075],
+ [86.97999108200008, 20.755560614000046],
+ [86.98658287900008, 20.75185781500005],
+ [86.99488366000003, 20.73895905200004],
+ [87.00001061300003, 20.728216864000046],
+ [87.00180097700007, 20.71898021000004],
+ [86.99870853000004, 20.71112702000005],
+ [86.98861738400007, 20.704250393000052],
+ [86.97575931100005, 20.710679429000038],
+ [86.96119225400008, 20.712836005000042],
+ [86.94825280000003, 20.709051825000074],
+ [86.94019616000003, 20.69798411700009],
+ [86.95191491000003, 20.697007554000038],
+ [86.96119225400008, 20.695054429000038],
+ [86.96851647200003, 20.691148179000038],
+ [86.97429446700005, 20.684393622000073],
+ [86.98170006600003, 20.685370184000078],
+ [86.98650149800005, 20.684393622000073],
+ [86.99024498800003, 20.67999909100007],
+ [86.99488366000003, 20.670721747000073],
+ [87.01937910200007, 20.68036530200004],
+ [87.03337649800005, 20.69017161700009],
+ [87.04322350400008, 20.69798411700009],
+ [87.02751712300005, 20.67967357000009],
+ [87.00359134200005, 20.657049872000073],
+ [86.97624759200005, 20.637884833000044],
+ [86.92318769600007, 20.62173086100006],
+ [86.77418053500003, 20.51194896000004],
+ [86.75147545700008, 20.489162502000056],
+ [86.73389733200008, 20.462225653000075],
+ [86.72461998800003, 20.43195221600007],
+ [86.72046959700003, 20.368475653000075],
+ [86.74195397200003, 20.37954336100006],
+ [86.75635826900003, 20.393744208000044],
+ [86.76978600400008, 20.40070221600007],
+ [86.78874759200005, 20.39012278900009],
+ [86.78825931100005, 20.402818101000037],
+ [86.78980553500003, 20.41469961100006],
+ [86.79615319100003, 20.437323309000078],
+ [86.80982506600003, 20.41510651200008],
+ [86.79420006600003, 20.378159898000035],
+ [86.76832116000003, 20.343451239000046],
+ [86.75147545700008, 20.328070380000042],
+ [86.73926842500003, 20.32420482000009],
+ [86.71973717500003, 20.31509023600006],
+ [86.70167076900003, 20.30377838700008],
+ [86.69369550900007, 20.29393138200004],
+ [86.70167076900003, 20.28465403900009],
+ [86.71973717500003, 20.29173411700009],
+ [86.75464928500003, 20.31443919500009],
+ [86.71745853000004, 20.286932684000078],
+ [86.62818444100003, 20.235256252000056],
+ [86.58383222700007, 20.21820709800005],
+ [86.53419030000003, 20.20612213700008],
+ [86.51148522200003, 20.19745514500005],
+ [86.49512780000003, 20.184068101000037],
+ [86.49040774800005, 20.17405833500004],
+ [86.47885175900007, 20.129339911000045],
+ [86.46851647200003, 20.10927969000005],
+ [86.46713300900007, 20.094671942000048],
+ [86.41504967500003, 20.036322333000044],
+ [86.39144941500007, 20.02020905200004],
+ [86.39673912900008, 20.00995514500005],
+ [86.40414472700007, 20.00263092700004],
+ [86.41407311300003, 19.998846747000073],
+ [86.42628014400003, 19.999172268000052],
+ [86.39722741000003, 19.982855536000045],
+ [86.34839928500003, 20.00885651200008],
+ [86.27540123800003, 20.06736888200004],
+ [86.23129316500007, 20.064886786000045],
+ [86.20915774800005, 20.06663646000004],
+ [86.19971764400003, 20.077948309000078],
+ [86.19597415500004, 20.08030833500004],
+ [86.17302493600005, 20.10219961100006],
+ [86.16846764400003, 20.11318594000005],
+ [86.16309655000003, 20.134833075000074],
+ [86.15870201900003, 20.143133856000077],
+ [86.15251712300005, 20.143133856000077],
+ [86.14503014400003, 20.122015692000048],
+ [86.15430748800003, 20.089992580000057],
+ [86.15870201900003, 20.08104075700004],
+ [86.16773522200003, 20.07294342700004],
+ [86.18775475400008, 20.063666083000044],
+ [86.21371504000007, 20.04242584800005],
+ [86.23023522200003, 20.035305080000057],
+ [86.26856530000003, 20.02643463700008],
+ [86.27344811300003, 20.026190497000073],
+ [86.28467858200008, 20.027492580000057],
+ [86.28907311300003, 20.02643463700008],
+ [86.29322350400008, 20.021429755000042],
+ [86.29411868600005, 20.015692450000074],
+ [86.29420006600003, 20.01040273600006],
+ [86.29590905000003, 20.00657786700009],
+ [86.30290774800005, 19.99909088700008],
+ [86.30811608200008, 19.99209219000005],
+ [86.31495201900003, 19.986883856000077],
+ [86.32667076900003, 19.984849351000037],
+ [86.34156334700003, 19.97988515800006],
+ [86.35645592500003, 19.970404364000046],
+ [86.37240644600007, 19.964992580000057],
+ [86.26856530000003, 19.91034577000005],
+ [86.11158287900008, 19.85569896000004],
+ [86.08904056100005, 19.844224351000037],
+ [86.07837975400008, 19.843573309000078],
+ [86.06674238400007, 19.851996161000045],
+ [86.05665123800003, 19.85687897300005],
+ [86.04656009200005, 19.85252513200004],
+ [86.03793379000007, 19.84528229400007],
+ [86.03207441500007, 19.841498114000046],
+ [86.01351972700007, 19.839056708000044],
+ [85.88884524800005, 19.80296458500004],
+ [85.84636478000004, 19.795843817000048],
+ [85.80860436300003, 19.773382880000042],
+ [85.78882897200003, 19.765692450000074],
+ [85.77808678500003, 19.76463450700004],
+ [85.74439537900008, 19.765692450000074],
+ [85.73438561300003, 19.763617255000042],
+ [85.71485436300003, 19.75421784100007],
+ [85.68458092500003, 19.747748114000046],
+ [85.62427819100003, 19.718573309000078],
+ [85.62598717500003, 19.72288646000004],
+ [85.63599694100003, 19.726629950000074],
+ [85.63795006600003, 19.731634833000044],
+ [85.61426842500003, 19.72793203300006],
+ [85.54916425900007, 19.690619208000044],
+ [85.48047936300003, 19.66632721600007],
+ [85.45679772200003, 19.663316148000035],
+ [85.44988040500004, 19.66669342700004],
+ [85.44752037900008, 19.674627997000073],
+ [85.44678795700008, 19.690619208000044],
+ [85.44312584700003, 19.69245026200008],
+ [85.43685957100007, 19.691351630000042],
+ [85.43043053500003, 19.69171784100007],
+ [85.42628014400003, 19.69745514500005],
+ [85.42701256600003, 19.70408763200004],
+ [85.43165123800003, 19.704901434000078],
+ [85.43685957100007, 19.70465729400007],
+ [85.43930097700007, 19.70799388200004],
+ [85.45085696700005, 19.71629466400009],
+ [85.47754967500003, 19.723863023000035],
+ [85.52198326900003, 19.739081122000073],
+ [85.52556399800005, 19.734035549000055],
+ [85.52344811300003, 19.72870514500005],
+ [85.51889082100007, 19.721584377000056],
+ [85.51498457100007, 19.71112702000005],
+ [85.55884850400008, 19.738104559000078],
+ [85.57650800900007, 19.745835679000038],
+ [85.56763756600003, 19.750799872000073],
+ [85.56324303500003, 19.75690338700008],
+ [85.56413821700005, 19.76439036700009],
+ [85.57032311300003, 19.773179429000038],
+ [85.56714928500003, 19.79165273600006],
+ [85.57032311300003, 19.87563711100006],
+ [85.55713951900003, 19.881781317000048],
+ [85.51498457100007, 19.88930898600006],
+ [85.47681725400008, 19.90102773600006],
+ [85.46355228000004, 19.902899481000077],
+ [85.44011478000004, 19.896226304000038],
+ [85.41627037900008, 19.879787502000056],
+ [85.37452233200008, 19.83779531500005],
+ [85.31959069100003, 19.79364655200004],
+ [85.30420983200008, 19.792669989000046],
+ [85.29029381600003, 19.789943752000056],
+ [85.27808678500003, 19.785589911000045],
+ [85.26807701900003, 19.78001536700009],
+ [85.24683678500003, 19.762640692000048],
+ [85.22095787900008, 19.736029364000046],
+ [85.20337975400008, 19.70726146000004],
+ [85.20655358200008, 19.68378327000005],
+ [85.18995201900003, 19.67096588700008],
+ [85.17514082100007, 19.63690827000005],
+ [85.16553795700008, 19.625799872000073],
+ [85.15015709700003, 19.61347077000005],
+ [85.14014733200008, 19.596584377000056],
+ [85.13933353000004, 19.579779364000046],
+ [85.15137780000003, 19.56777578300006],
+ [85.15137780000003, 19.560288804000038],
+ [85.13917076900003, 19.557074286000045],
+ [85.12289472700007, 19.54901764500005],
+ [85.10889733200008, 19.53896719000005],
+ [85.10287519600007, 19.52960846600007],
+ [85.10450280000003, 19.514878648000035],
+ [85.10873457100007, 19.506781317000048],
+ [85.11548912900008, 19.507473049000055],
+ [85.12403405000003, 19.519354559000078],
+ [85.12875410200007, 19.509507554000038],
+ [85.13021894600007, 19.49872467700004],
+ [85.12867272200003, 19.487982489000046],
+ [85.12403405000003, 19.478338934000078],
+ [85.13575280000003, 19.481594143000052],
+ [85.14177493600005, 19.487127997000073],
+ [85.14576256600003, 19.493475653000075],
+ [85.15137780000003, 19.498846747000073],
+ [85.16244550900007, 19.50348541900007],
+ [85.17115319100003, 19.504461981000077],
+ [85.17855879000007, 19.504299221000053],
+ [85.18555748800003, 19.505682684000078],
+ [85.20289147200003, 19.51715729400007],
+ [85.20191491000003, 19.527085679000038],
+ [85.19629967500003, 19.53847890800006],
+ [85.19922936300003, 19.55410390800006],
+ [85.20630944100003, 19.548000393000052],
+ [85.21452884200005, 19.547267971000053],
+ [85.22364342500003, 19.549953518000052],
+ [85.23324629000007, 19.55410390800006],
+ [85.20378665500004, 19.57050202000005],
+ [85.19304446700005, 19.573919989000046],
+ [85.19304446700005, 19.58079661700009],
+ [85.21290123800003, 19.58112213700008],
+ [85.22364342500003, 19.590236721000053],
+ [85.23259524800005, 19.60154857000009],
+ [85.24756920700008, 19.608710028000075],
+ [85.24756920700008, 19.614935614000046],
+ [85.24187259200005, 19.617010809000078],
+ [85.23731530000003, 19.62055084800005],
+ [85.23438561300003, 19.62567780200004],
+ [85.23324629000007, 19.632554429000038],
+ [85.23633873800003, 19.635321356000077],
+ [85.24781334700003, 19.653143622000073],
+ [85.24756920700008, 19.65648021000004],
+ [85.26075280000003, 19.656073309000078],
+ [85.30909264400003, 19.642238674000055],
+ [85.35059655000003, 19.67763906500005],
+ [85.36378014400003, 19.67804596600007],
+ [85.37435957100007, 19.674709377000056],
+ [85.38306725400008, 19.67609284100007],
+ [85.39144941500007, 19.690619208000044],
+ [85.39918053500003, 19.67914459800005],
+ [85.40316816500007, 19.67129140800006],
+ [85.40495853000004, 19.661932684000078],
+ [85.40528405000003, 19.64594147300005],
+ [85.40219160200007, 19.64398834800005],
+ [85.38868248800003, 19.63825104400007],
+ [85.38461347700007, 19.635972398000035],
+ [85.38217207100007, 19.63108958500004],
+ [85.38038170700008, 19.619614976000037],
+ [85.37794030000003, 19.614935614000046],
+ [85.36841881600003, 19.60809967700004],
+ [85.35230553500003, 19.599432684000078],
+ [85.33676191500007, 19.596096096000053],
+ [85.33008873800003, 19.60496653900009],
+ [85.32642662900008, 19.618801174000055],
+ [85.31836998800003, 19.619533596000053],
+ [85.31104576900003, 19.610500393000052],
+ [85.30909264400003, 19.595038153000075],
+ [85.30347741000003, 19.597479559000078],
+ [85.29379316500007, 19.599554755000042],
+ [85.28842207100007, 19.601263739000046],
+ [85.30250084700003, 19.58665599200009],
+ [85.30583743600005, 19.580145575000074],
+ [85.30290774800005, 19.573919989000046],
+ [85.33057701900003, 19.57640208500004],
+ [85.57650800900007, 19.690619208000044],
+ [85.54029381600003, 19.669582424000055],
+ [85.46338951900003, 19.63104889500005],
+ [85.38021894600007, 19.593817450000074],
+ [85.33668053500003, 19.57518138200004],
+ [85.28541100400008, 19.536281643000052],
+ [85.24057050900007, 19.518052476000037],
+ [85.18043053500003, 19.475002346000053],
+ [85.06950931100005, 19.37213776200008],
+ [84.99586022200003, 19.32330963700008],
+ [84.87208092500003, 19.219875393000052],
+ [84.79102623800003, 19.12059153900009],
+ [84.77776126400005, 19.11619700700004],
+ [84.77515709700003, 19.115301825000074],
+ [84.76441491000003, 19.123439846000053],
+ [84.75066165500004, 19.138373114000046],
+ [84.73878014400003, 19.147650458000044],
+ [84.73365319100003, 19.139146226000037],
+ [84.73121178500003, 19.12881094000005],
+ [84.72095787900008, 19.11424388200004],
+ [84.71998131600003, 19.101629950000074],
+ [84.72282962300005, 19.09601471600007],
+ [84.73536217500003, 19.083197333000044],
+ [84.74048912900008, 19.07367584800005],
+ [84.75684655000003, 19.09764232000009],
+ [84.76099694100003, 19.101629950000074],
+ [84.76783287900008, 19.10179271000004],
+ [84.77523847700007, 19.100490627000056],
+ [84.78003991000003, 19.09707265800006],
+ [84.77833092500003, 19.091009833000044],
+ [84.75114993600005, 19.053900458000044],
+ [84.74105879000007, 19.028143622000073],
+ [84.69947350400008, 18.977484442000048],
+ [84.67953535200007, 18.945705471000053],
+ [84.66504967500003, 18.930121161000045],
+ [84.63086998800003, 18.915716864000046],
+ [84.54786217500003, 18.796087958000044],
+ [84.54184004000007, 18.775783596000053],
+ [84.44825280000003, 18.68065013200004],
+ [84.43718509200005, 18.66278717700004],
+ [84.43262780000003, 18.645697333000044],
+ [84.42367597700007, 18.636460679000038],
+ [84.37045332100007, 18.601304429000038],
+ [84.34945722700007, 18.56981028900009],
+ [84.33285566500007, 18.55369700700004],
+ [84.31226647200003, 18.546698309000078],
+ [84.30632571700005, 18.54368724200009],
+ [84.28858483200008, 18.529771226000037],
+ [84.28174889400003, 18.52558014500005],
+ [84.27271569100003, 18.524318752000056],
+ [84.25001061300003, 18.524237372000073],
+ [84.24691816500007, 18.52558014500005],
+ [84.23764082100007, 18.510931708000044],
+ [84.24935957100007, 18.501654364000046],
+ [84.27100670700008, 18.50018952000005],
+ [84.29769941500007, 18.51630280200004],
+ [84.32618248800003, 18.53742096600007],
+ [84.34994550900007, 18.55292389500005],
+ [84.33122806100005, 18.53864166900007],
+ [84.28793379000007, 18.50576406500005],
+ [84.24008222700007, 18.460760809000078],
+ [84.23047936300003, 18.446234442000048],
+ [84.18832441500007, 18.418036200000074],
+ [84.17448978000004, 18.39984772300005],
+ [84.15284264400003, 18.383612372000073],
+ [84.14389082100007, 18.374823309000078],
+ [84.13892662900008, 18.364162502000056],
+ [84.13648522200003, 18.353583075000074],
+ [84.13282311300003, 18.343410549000055],
+ [84.12403405000003, 18.333807684000078],
+ [84.11312910200007, 18.29828522300005],
+ [84.07740319100003, 18.271551825000074],
+ [83.77515709700003, 18.139593817000048],
+ [83.61394290500004, 18.04515208500004],
+ [83.58228600400008, 18.01911041900007],
+ [83.57618248800003, 18.00975169500009],
+ [83.56283613400007, 17.98309967700004],
+ [83.55836022200003, 17.97752513200004],
+ [83.55665123800003, 17.973456122000073],
+ [83.53891035200007, 17.956284898000092],
+ [83.53443444100003, 17.95331452000005],
+ [83.52613366000003, 17.942531643000052],
+ [83.48658287900008, 17.916896877000056],
+ [83.47291100400008, 17.902492580000057],
+ [83.46558678500003, 17.902492580000057],
+ [83.46290123800003, 17.90851471600007],
+ [83.45191491000003, 17.92291901200008],
+ [83.44898522200003, 17.90688711100006],
+ [83.45240319100003, 17.88621653900009],
+ [83.45297285200007, 17.868475653000075],
+ [83.43116295700008, 17.85423411700009],
+ [83.42530358200008, 17.83860911700009],
+ [83.41773522200003, 17.80621979400007],
+ [83.40235436300003, 17.784491278000075],
+ [83.34131920700008, 17.71743398600006],
+ [83.31910241000003, 17.703192450000074],
+ [83.31324303500003, 17.70115794500009],
+ [83.30437259200005, 17.692206122000073],
+ [83.29859459700003, 17.69013092700004],
+ [83.29273522200003, 17.691148179000038],
+ [83.28956139400003, 17.69326406500005],
+ [83.28744550900007, 17.695379950000074],
+ [83.28467858200008, 17.69635651200008],
+ [83.28223717500003, 17.699286200000074],
+ [83.28028405000003, 17.705959377000056],
+ [83.27637780000003, 17.71308014500005],
+ [83.26823978000004, 17.71747467700004],
+ [83.24691816500007, 17.71625397300005],
+ [83.24203535200007, 17.70652903900009],
+ [83.24927819100003, 17.695379950000074],
+ [83.27198326900003, 17.68813711100006],
+ [83.29249108200008, 17.677476304000038],
+ [83.29859459700003, 17.672796942000048],
+ [83.29908287900008, 17.66429271000004],
+ [83.28923587300005, 17.65761953300006],
+ [83.26823978000004, 17.648586330000057],
+ [83.25513756600003, 17.63812897300005],
+ [83.24691816500007, 17.63422272300005],
+ [83.21290123800003, 17.634914455000057],
+ [83.23389733200008, 17.60773346600007],
+ [83.23894290500004, 17.592962958000044],
+ [83.22291100400008, 17.586493231000077],
+ [83.20923912900008, 17.583685614000046],
+ [83.19613691500007, 17.57680898600006],
+ [83.17139733200008, 17.559800523000092],
+ [83.08822675900007, 17.53070709800005],
+ [83.05323326900003, 17.50649648600006],
+ [83.01986738400007, 17.49091217700004],
+ [82.99642988400007, 17.473456122000073],
+ [82.97584069100003, 17.453680731000077],
+ [82.96957441500007, 17.450100002000056],
+ [82.95281009200005, 17.44594961100006],
+ [82.94548587300005, 17.443101304000038],
+ [82.89682050900007, 17.409328518000052],
+ [82.88868248800003, 17.41014232000009],
+ [82.88331139400003, 17.42206452000005],
+ [82.86915123800003, 17.414007880000042],
+ [82.85425866000008, 17.402818101000037],
+ [82.83765709700003, 17.39276764500005],
+ [82.79639733200008, 17.38304271000004],
+ [82.75814863400007, 17.359198309000078],
+ [82.71851647200003, 17.34861888200004],
+ [82.47486412900008, 17.205959377000056],
+ [82.45191491000008, 17.182440497000073],
+ [82.43506920700008, 17.15379466400009],
+ [82.42286217500003, 17.139960028000075],
+ [82.38770592500003, 17.12693919500009],
+ [82.37037194100003, 17.11009349200009],
+ [82.34205162900008, 17.073187567000048],
+ [82.31169681100005, 17.046616929000038],
+ [82.29932701900003, 17.03034088700008],
+ [82.29167728000004, 16.998439846000053],
+ [82.25269616000008, 16.92918528900009],
+ [82.25074303500008, 16.907863674000055],
+ [82.25513756600003, 16.885321356000077],
+ [82.26791425900007, 16.86749909100007],
+ [82.29835045700008, 16.85846588700008],
+ [82.30355879000007, 16.85419342700004],
+ [82.30811608200008, 16.849554755000042],
+ [82.31421959700003, 16.846625067000048],
+ [82.31959069100003, 16.84723541900007],
+ [82.32715905000003, 16.849432684000078],
+ [82.33334394600007, 16.852118231000077],
+ [82.33464603000004, 16.854071356000077],
+ [82.35206139400003, 16.845404364000046],
+ [82.36247806100005, 16.859076239000046],
+ [82.36117597700007, 16.89134349200009],
+ [82.35743248800003, 16.92487213700008],
+ [82.34888756600003, 16.95648834800005],
+ [82.36117597700007, 16.936021226000037],
+ [82.36654707100007, 16.908636786000045],
+ [82.36744225400008, 16.860296942000048],
+ [82.36557050900007, 16.81159088700008],
+ [82.35206139400003, 16.76129791900007],
+ [82.34595787900008, 16.70612213700008],
+ [82.33814537900008, 16.67841217700004],
+ [82.31421959700003, 16.628159898000092],
+ [82.31234785200007, 16.61985911700009],
+ [82.31381269600007, 16.612982489000046],
+ [82.31283613400007, 16.60814036700009],
+ [82.30396569100003, 16.60643138200004],
+ [82.29932701900003, 16.61009349200009],
+ [82.29379316500007, 16.62563711100006],
+ [82.28687584700003, 16.628159898000092],
+ [82.28093509200005, 16.620835679000038],
+ [82.28549238400007, 16.60651276200008],
+ [82.29607181100005, 16.591009833000044],
+ [82.30738366000008, 16.579779364000046],
+ [82.25904381600003, 16.56549713700008],
+ [82.20346113400007, 16.51268138200004],
+ [82.18824303500008, 16.504055080000057],
+ [82.17302493600005, 16.500921942000048],
+ [82.12289472700007, 16.477362372000073],
+ [82.09066816500007, 16.454779364000046],
+ [82.06861412900008, 16.444281317000048],
+ [82.03736412900008, 16.447658596000053],
+ [82.02271569100003, 16.43573639500005],
+ [82.00782311300003, 16.419582424000055],
+ [81.99268639400003, 16.40843333500004],
+ [81.98170006600003, 16.407863674000055],
+ [81.96794681100005, 16.40892161700009],
+ [81.95622806100005, 16.407171942000048],
+ [81.94809004000007, 16.391546942000048],
+ [81.94076582100007, 16.388373114000046],
+ [81.89991295700008, 16.38580963700008],
+ [81.88054446700005, 16.381659247000073],
+ [81.86166425900007, 16.375392971000053],
+ [81.78321373800003, 16.33856842700004],
+ [81.76295006600003, 16.32257721600007],
+ [81.71762129000007, 16.312201239000046],
+ [81.71159915500004, 16.312201239000046],
+ [81.69605553500008, 16.314927476000037],
+ [81.67693118600005, 16.327378648000092],
+ [81.65626061300003, 16.33734772300005],
+ [81.63640384200005, 16.33270905200004],
+ [81.62094160200007, 16.339504299000055],
+ [81.58497155000003, 16.34210846600007],
+ [81.56812584700003, 16.34638092700004],
+ [81.57390384200005, 16.358343817000048],
+ [81.56918379000007, 16.367580471000053],
+ [81.55697675900007, 16.37303294500009],
+ [81.54021243600005, 16.37368398600006],
+ [81.54908287900008, 16.352362372000073],
+ [81.53598066500007, 16.350043036000045],
+ [81.49586022200003, 16.360663153000075],
+ [81.47535241000008, 16.358628648000092],
+ [81.41667728000004, 16.34015534100007],
+ [81.42115319100003, 16.35097890800006],
+ [81.42611738400007, 16.358710028000075],
+ [81.42823326900003, 16.365668036000045],
+ [81.42408287900008, 16.37368398600006],
+ [81.41138756600003, 16.382513739000046],
+ [81.39893639400003, 16.382635809000078],
+ [81.38697350400008, 16.376776434000078],
+ [81.37574303500008, 16.36749909100007],
+ [81.35962975400008, 16.374335028000075],
+ [81.34522545700008, 16.373602606000077],
+ [81.33155358200008, 16.36977773600006],
+ [81.31739342500003, 16.36749909100007],
+ [81.25961347700007, 16.33270905200004],
+ [81.24854576900003, 16.320135809000078],
+ [81.24984785200007, 16.311021226000037],
+ [81.25603274800005, 16.30182526200008],
+ [81.25961347700007, 16.28864166900007],
+ [81.25416100400008, 16.271307684000078],
+ [81.23031660200007, 16.24359772300005],
+ [81.21851647200003, 16.19944896000004],
+ [81.19027754000007, 16.13886139500005],
+ [81.18002363400007, 16.086737372000073],
+ [81.16195722700007, 16.057074286000045],
+ [81.15601647200003, 16.03851959800005],
+ [81.15544681100005, 15.985500393000052],
+ [81.14975019600007, 15.969631252000056],
+ [81.13510175900007, 15.966498114000046],
+ [81.08822675900007, 15.921210028000075],
+ [81.04330488400007, 15.894110419000071],
+ [81.02686608200008, 15.88084544500009],
+ [80.99887129000007, 15.84674713700008],
+ [80.99838300900007, 15.83470286700009],
+ [81.00294030000003, 15.82526276200008],
+ [81.00879967500003, 15.81781647300005],
+ [81.01254316500007, 15.81195709800005],
+ [81.01921634200005, 15.792385158000059],
+ [81.01905358200008, 15.78416575700004],
+ [81.01254316500007, 15.777818101000037],
+ [81.00473066500007, 15.778509833000044],
+ [80.99586022200003, 15.784328518000052],
+ [80.98829186300003, 15.791205145000049],
+ [80.97901451900003, 15.803412177000041],
+ [80.94947350400008, 15.827866929000038],
+ [80.94068444100003, 15.83299388200004],
+ [80.92164147200003, 15.83860911700009],
+ [80.91000410200007, 15.852687893000052],
+ [80.90430748800003, 15.871283270000049],
+ [80.90267988400007, 15.890814520000049],
+ [80.91016686300003, 15.96588776200008],
+ [80.90894616000008, 15.98346588700008],
+ [80.90601647200003, 15.999823309000078],
+ [80.89649498800003, 16.031073309000078],
+ [80.89226321700005, 16.02094147300005],
+ [80.89649498800003, 16.010565497000073],
+ [80.88900800900007, 16.003729559000078],
+ [80.88575280000003, 16.008693752000056],
+ [80.88282311300003, 16.011460679000038],
+ [80.87533613400007, 16.017401434000078],
+ [80.89128665500004, 15.978257554000038],
+ [80.89576256600003, 15.936021226000037],
+ [80.89014733200008, 15.89524974200009],
+ [80.85572350400008, 15.822699286000045],
+ [80.83025149800005, 15.747626044000071],
+ [80.82007897200003, 15.72687409100007],
+ [80.80713951900003, 15.716376044000071],
+ [80.80836022200003, 15.803941148000092],
+ [80.80274498800003, 15.84243398600006],
+ [80.77613366000008, 15.884263414000088],
+ [80.76010175900007, 15.892971096000053],
+ [80.73633873800003, 15.897609768000052],
+ [80.69044030000003, 15.90070221600007],
+ [80.68246504000007, 15.903265692000048],
+ [80.67628014400003, 15.907171942000048],
+ [80.67017662900008, 15.907700914000088],
+ [80.66309655000003, 15.90070221600007],
+ [80.66041100400008, 15.893947658000059],
+ [80.66285241000008, 15.889349677000041],
+ [80.61841881600003, 15.88768138200004],
+ [80.60010826900003, 15.882228908000059],
+ [80.58432050900007, 15.872544664000088],
+ [80.57113691500007, 15.868719794000071],
+ [80.56072024800005, 15.88084544500009],
+ [80.55388431100005, 15.88084544500009],
+ [80.54167728000004, 15.868068752000056],
+ [80.52588951900003, 15.856919664000088],
+ [80.49187259200005, 15.839260158000059],
+ [80.48267662900008, 15.836411851000037],
+ [80.47559655000003, 15.83592357000009],
+ [80.46908613400007, 15.834662177000041],
+ [80.46143639400003, 15.829657294000071],
+ [80.44548587300005, 15.814398505000042],
+ [80.43628991000008, 15.808294989000046],
+ [80.39332116000008, 15.797023830000057],
+ [80.35962975400008, 15.775824286000045],
+ [80.27963300900007, 15.700669664000088],
+ [80.26319420700008, 15.67454661700009],
+ [80.21949303500008, 15.56745026200008],
+ [80.21745853000004, 15.548163153000075],
+ [80.20134524800005, 15.51829661700009],
+ [80.19760175900007, 15.503078518000052],
+ [80.21119225400008, 15.496649481000077],
+ [80.20045006600003, 15.482163804000038],
+ [80.18384850400008, 15.452297268000052],
+ [80.17286217500003, 15.438299872000073],
+ [80.14031009200005, 15.406398830000057],
+ [80.12680097700007, 15.38812897300005],
+ [80.12126712300005, 15.370021877000056],
+ [80.09058678500008, 15.304877020000049],
+ [80.09253991000008, 15.296576239000046],
+ [80.08236738400007, 15.20408763200004],
+ [80.05298912900008, 15.092596747000073],
+ [80.05453535200007, 15.014146226000037],
+ [80.06153405000003, 14.974676825000074],
+ [80.07341556100005, 14.94204336100006],
+ [80.07300866000008, 14.92055898600006],
+ [80.10515384200005, 14.763861395000049],
+ [80.10816491000008, 14.714341539000088],
+ [80.11068769600007, 14.704779364000046],
+ [80.11695397200003, 14.698146877000056],
+ [80.12818444100003, 14.68846263200004],
+ [80.15186608200008, 14.672796942000048],
+ [80.15984134200005, 14.662665106000077],
+ [80.16635175900007, 14.628159898000092],
+ [80.17359459700003, 14.616522528000075],
+ [80.17847741000008, 14.60578034100007],
+ [80.17595462300005, 14.592962958000044],
+ [80.16968834700003, 14.58584219000005],
+ [80.16089928500008, 14.579820054000038],
+ [80.14185631600003, 14.571234442000048],
+ [80.14918053500008, 14.565008856000077],
+ [80.15935306100005, 14.565741278000075],
+ [80.18327884200005, 14.571112372000073],
+ [80.19019616000008, 14.571234442000048],
+ [80.19695071700005, 14.565008856000077],
+ [80.19605553500008, 14.559027411000045],
+ [80.19239342500003, 14.553208726000037],
+ [80.19019616000008, 14.54759349200009],
+ [80.18824303500008, 14.52570221600007],
+ [80.17595462300005, 14.46873607000009],
+ [80.17872155000003, 14.38939036700009],
+ [80.17497806100005, 14.344549872000073],
+ [80.15943444100003, 14.324774481000077],
+ [80.13705488400007, 14.269924221000053],
+ [80.12818444100003, 14.256537177000041],
+ [80.09791100400008, 14.254299221000053],
+ [80.08716881600003, 14.25031159100007],
+ [80.07178795700008, 14.232245184000078],
+ [80.07007897200003, 14.229193427000041],
+ [80.05502363400007, 14.221584377000056],
+ [80.04664147200003, 14.206610419000071],
+ [80.05062910200007, 14.196112372000073],
+ [80.07349694100003, 14.201849677000041],
+ [80.09099368600005, 14.216742255000042],
+ [80.10661868600005, 14.234035549000055],
+ [80.12110436300003, 14.242010809000078],
+ [80.13559004000007, 14.229193427000041],
+ [80.12338300900007, 14.193508205000057],
+ [80.12582441500007, 14.148504950000074],
+ [80.14966881600003, 14.027736721000053],
+ [80.159605204927, 14]
+ ]
+ ]
+ },
+ "bangladesh": {
+ "stop": 0.897488737517874,
+ "anchor": [89.83003108960874, 23.720784795521794],
+ "border": [
+ [
+ [92.57587854000013, 21.977574362000027],
+ [92.59024458800008, 21.91716461200012],
+ [92.59303511600012, 21.886933899000027],
+ [92.57556848200005, 21.73397166000005],
+ [92.59024458800008, 21.49553660100007],
+ [92.59272505700005, 21.470163472000067],
+ [92.60326704900007, 21.42008901000007],
+ [92.63923384600008, 21.3186998500001],
+ [92.64103990600012, 21.30858591800002],
+ [92.64285119700003, 21.298442688000094],
+ [92.63375614400007, 21.28221628900009],
+ [92.61432580600007, 21.26314768500002],
+ [92.59086470600005, 21.248884990000036],
+ [92.57060754400004, 21.247283020000012],
+ [92.55872196500007, 21.259840393000033],
+ [92.55159061700004, 21.28051096600005],
+ [92.54394250500008, 21.320921937000023],
+ [92.52451216700007, 21.361126201000033],
+ [92.49867395000007, 21.366603902000023],
+ [92.46539432800012, 21.35983429],
+ [92.42312300700013, 21.363658345000132],
+ [92.40028202400003, 21.370996400000124],
+ [92.38963667800004, 21.37652577800013],
+ [92.38116174400005, 21.384794006000064],
+ [92.37423710100006, 21.40231231800003],
+ [92.37217004400003, 21.419055481000086],
+ [92.36793257700003, 21.435436910000035],
+ [92.35470341000007, 21.451818340000088],
+ [92.32266402200014, 21.46189524300003],
+ [92.2845268150001, 21.419055481000086],
+ [92.25290083800007, 21.419520569000028],
+ [92.23626102800006, 21.41709177700004],
+ [92.22509891700014, 21.3974547320001],
+ [92.21155969200004, 21.35487335200004],
+ [92.1836544190001, 21.317201233],
+ [92.17828007100013, 21.299734599000075],
+ [92.17807336400006, 21.28014923100004],
+ [92.18520471200003, 21.240410055000055],
+ [92.18396447700007, 21.220876364000034],
+ [92.17838342300007, 21.191265767000075],
+ [92.17497277900003, 21.175607809000027],
+ [92.18076053900012, 21.157882793000013],
+ [92.18830529800005, 21.144085185000066],
+ [92.21176639800012, 21.12351796500009],
+ [92.21838098200004, 21.108635152000133],
+ [92.22427209500012, 21.09318389900004],
+ [92.26514733200008, 21.061102606000077],
+ [92.25855553500003, 21.02252838700008],
+ [92.25709069100003, 20.98110586100006],
+ [92.26148522200003, 20.940252997000073],
+ [92.27198326900003, 20.903509833000044],
+ [92.30062910200007, 20.86237213700008],
+ [92.30543053500003, 20.851955471000053],
+ [92.30762780000003, 20.833197333000044],
+ [92.32593834700003, 20.780585028000075],
+ [92.33326256600003, 20.767726955000057],
+ [92.33627363400007, 20.757147528000075],
+ [92.33399498800003, 20.74640534100007],
+ [92.32553144600007, 20.738714911000045],
+ [92.31934655000003, 20.742010809000078],
+ [92.31421959700003, 20.749253648000035],
+ [92.30909264400003, 20.753241278000075],
+ [92.30103600400008, 20.762274481000077],
+ [92.27808678500003, 20.814113674000055],
+ [92.20972741000003, 20.930812893000052],
+ [92.19288170700008, 20.99567291900007],
+ [92.18628991000003, 21.00584544500009],
+ [92.13412519600007, 21.04751211100006],
+ [92.12435957100007, 21.06045156500005],
+ [92.10808353000004, 21.089911200000074],
+ [92.09685306100005, 21.105861721000053],
+ [92.05250084700003, 21.154771226000037],
+ [92.04542076900003, 21.17096588700008],
+ [92.04395592500003, 21.19204336100006],
+ [92.05225670700008, 21.256659247000073],
+ [92.05046634200005, 21.280462958000044],
+ [92.04525800900007, 21.29954661700009],
+ [91.98975670700008, 21.394232489000046],
+ [91.98047936300003, 21.40375397300005],
+ [91.96941165500004, 21.40961334800005],
+ [91.95972741000003, 21.423976955000057],
+ [91.95297285200007, 21.441839911000045],
+ [91.94971764400003, 21.45840078300006],
+ [91.95590254000007, 21.45840078300006],
+ [91.95801842500003, 21.455023505000042],
+ [91.95883222700007, 21.454413153000075],
+ [91.96013431100005, 21.454250393000052],
+ [91.96338951900003, 21.45213450700004],
+ [91.97087649800005, 21.470038153000075],
+ [91.98292076900003, 21.488836981000077],
+ [91.99903405000003, 21.49949778900009],
+ [92.01791425900007, 21.493109442000048],
+ [92.00538170700008, 21.504299221000053],
+ [91.99537194100003, 21.522609768000052],
+ [91.98975670700008, 21.543402411000045],
+ [91.99000084700003, 21.56199778900009],
+ [91.99854576900003, 21.573187567000048],
+ [92.01246178500003, 21.58539459800005],
+ [92.02214603000004, 21.599351304000038],
+ [92.01791425900007, 21.616034247000073],
+ [92.03296959700003, 21.63300202000005],
+ [92.03581790500004, 21.640448309000078],
+ [92.03174889400003, 21.650132554000038],
+ [92.03777103000004, 21.65957265800006],
+ [92.03589928500003, 21.66815827000005],
+ [92.02857506600003, 21.67479075700004],
+ [92.02279707100007, 21.67682526200008],
+ [92.02556399800005, 21.687241929000038],
+ [92.02930748800003, 21.696234442000048],
+ [92.02930748800003, 21.704901434000078],
+ [92.02540123800003, 21.712836005000042],
+ [92.02393639400003, 21.70465729400007],
+ [92.02214603000004, 21.701564846000053],
+ [92.01791425900007, 21.698553778000075],
+ [92.02540123800003, 21.698553778000075],
+ [92.01238040500004, 21.664211330000057],
+ [92.00074303500003, 21.64980703300006],
+ [91.98389733200008, 21.650132554000038],
+ [91.97608483200008, 21.662054755000042],
+ [91.97885175900007, 21.67772044500009],
+ [91.98422285200007, 21.693508205000057],
+ [91.98389733200008, 21.70538971600007],
+ [91.97706139400003, 21.70538971600007],
+ [91.97193444100003, 21.68821849200009],
+ [91.96265709700003, 21.689520575000074],
+ [91.95362389400003, 21.70140208500004],
+ [91.94971764400003, 21.715969143000052],
+ [91.95297285200007, 21.738348700000074],
+ [91.96192467500003, 21.743841864000046],
+ [91.97478274800005, 21.746486721000053],
+ [91.99000084700003, 21.75999583500004],
+ [91.98389733200008, 21.766831773000035],
+ [91.96729576900003, 21.75543854400007],
+ [91.96029707100007, 21.763820705000057],
+ [91.96656334700003, 21.77887604400007],
+ [91.99000084700003, 21.787909247000073],
+ [91.99000084700003, 21.79482656500005],
+ [91.94369550900007, 21.791408596000053],
+ [91.92408287900008, 21.785223700000074],
+ [91.90870201900003, 21.78115469000005],
+ [91.89926191500007, 21.789496161000045],
+ [91.90088951900003, 21.813299872000073],
+ [91.91138756600003, 21.83470286700009],
+ [91.92937259200005, 21.84316640800006],
+ [91.92164147200003, 21.85342031500005],
+ [91.92554772200003, 21.86286041900007],
+ [91.93628991000003, 21.870835679000038],
+ [91.94971764400003, 21.876695054000038],
+ [91.94971764400003, 21.88418203300006],
+ [91.93921959700003, 21.88304271000004],
+ [91.92994225400008, 21.878648179000038],
+ [91.92212975400008, 21.871568101000037],
+ [91.91570071700005, 21.862453518000052],
+ [91.91032962300005, 21.87490469000005],
+ [91.90560957100007, 21.89557526200008],
+ [91.90121504000007, 21.935370184000078],
+ [91.89820397200003, 21.94489166900007],
+ [91.88404381600003, 21.960150458000044],
+ [91.88086998800003, 21.969183661000045],
+ [91.88086998800003, 22.007025458000044],
+ [91.85523522200003, 22.109198309000078],
+ [91.85352623800003, 22.14362213700008],
+ [91.86394290500004, 22.139593817000048],
+ [91.86719811300003, 22.13739655200004],
+ [91.86207116000003, 22.15062083500004],
+ [91.85328209700003, 22.14874909100007],
+ [91.84603925900007, 22.135972398000035],
+ [91.84603925900007, 22.116888739000046],
+ [91.83985436300003, 22.116888739000046],
+ [91.82911217500003, 22.134100653000075],
+ [91.81934655000003, 22.155951239000046],
+ [91.81299889400003, 22.18032461100006],
+ [91.81202233200008, 22.205023505000042],
+ [91.81690514400003, 22.22028229400007],
+ [91.82585696700005, 22.23004791900007],
+ [91.83472741000003, 22.237616278000075],
+ [91.83985436300003, 22.246649481000077],
+ [91.83838951900003, 22.26308828300006],
+ [91.82984459700003, 22.271307684000078],
+ [91.81918379000007, 22.275824286000045],
+ [91.81202233200008, 22.281398830000057],
+ [91.80884850400008, 22.306341864000046],
+ [91.82650800900007, 22.31826406500005],
+ [91.85238691500007, 22.325344143000052],
+ [91.87403405000003, 22.336004950000074],
+ [91.88493899800005, 22.35382721600007],
+ [91.90805097700007, 22.424750067000048],
+ [91.90186608200008, 22.42405833500004],
+ [91.88770592500003, 22.424750067000048],
+ [91.88550866000003, 22.40965403900009],
+ [91.87574303500003, 22.37107982000009],
+ [91.87745201900003, 22.363348700000074],
+ [91.87045332100007, 22.35809967700004],
+ [91.85914147200003, 22.346625067000048],
+ [91.84400475400008, 22.33494700700004],
+ [91.82634524800005, 22.32916901200008],
+ [91.82325280000003, 22.324164130000042],
+ [91.79859459700003, 22.31191640800006],
+ [91.79135175900007, 22.301906643000052],
+ [91.79395592500003, 22.286037502000056],
+ [91.80453535200007, 22.278469143000052],
+ [91.81723066500007, 22.27407461100006],
+ [91.82634524800005, 22.26776764500005],
+ [91.82593834700003, 22.248480536000045],
+ [91.80892988400007, 22.236273505000042],
+ [91.78711998800003, 22.237941799000055],
+ [91.77165774800005, 22.260321356000077],
+ [91.75440514400003, 22.374660549000055],
+ [91.74366295700008, 22.411078192000048],
+ [91.67603600400008, 22.53461334800005],
+ [91.54810631600003, 22.700344143000052],
+ [91.51636803500003, 22.712225653000075],
+ [91.49870853000004, 22.72728099200009],
+ [91.48462975400008, 22.74551015800006],
+ [91.47681725400008, 22.76117584800005],
+ [91.46900475400008, 22.757066148000035],
+ [91.46241295700008, 22.76190827000005],
+ [91.45801842500003, 22.772284247000073],
+ [91.45630944100003, 22.784816799000055],
+ [91.45834394600007, 22.79706452000005],
+ [91.46778405000003, 22.80931224200009],
+ [91.47396894600007, 22.838324286000045],
+ [91.49000084700003, 22.880560614000046],
+ [91.49048912900008, 22.90452708500004],
+ [91.48308353000004, 22.90452708500004],
+ [91.47966556100005, 22.885891018000052],
+ [91.46241295700008, 22.83344147300005],
+ [91.45248457100007, 22.822658596000053],
+ [91.43043053500003, 22.81631094000005],
+ [91.41675866000003, 22.799994208000044],
+ [91.41163170700008, 22.777818101000037],
+ [91.41472415500004, 22.753729559000078],
+ [91.39966881600003, 22.76430898600006],
+ [91.38502037900008, 22.770697333000044],
+ [91.36833743600005, 22.773993231000077],
+ [91.34644616000003, 22.77484772300005],
+ [91.34644616000003, 22.767401434000078],
+ [91.36744225400008, 22.761664130000042],
+ [91.37012780000003, 22.75218333500004],
+ [91.36011803500003, 22.743394273000035],
+ [91.34262129000007, 22.739447333000044],
+ [91.29078209700003, 22.738430080000057],
+ [91.30884850400008, 22.73309967700004],
+ [91.32504316500007, 22.72614166900007],
+ [91.33277428500003, 22.72020091400009],
+ [91.32992597700007, 22.70571523600006],
+ [91.31739342500003, 22.697211005000042],
+ [91.30054772200003, 22.69326406500005],
+ [91.28443444100003, 22.692287502000056],
+ [91.28345787900008, 22.69334544500009],
+ [91.25277754000007, 22.699286200000074],
+ [91.24838300900007, 22.69822825700004],
+ [91.24480228000004, 22.698391018000052],
+ [91.24341881600003, 22.70221588700008],
+ [91.24390709700003, 22.71743398600006],
+ [91.24341881600003, 22.72020091400009],
+ [91.23121178500003, 22.724310614000046],
+ [91.21607506600003, 22.72606028900009],
+ [91.18189537900008, 22.72646719000005],
+ [91.18189537900008, 22.72020091400009],
+ [91.19459069100003, 22.70966217700004],
+ [91.19922936300003, 22.69879791900007],
+ [91.19214928500003, 22.69163646000004],
+ [91.16895592500003, 22.692287502000056],
+ [91.16895592500003, 22.684881903000075],
+ [91.22689863400007, 22.671087958000044],
+ [91.25342858200008, 22.660711981000077],
+ [91.26449629000007, 22.64081452000005],
+ [91.26107832100007, 22.627875067000048],
+ [91.25310306100005, 22.613836981000077],
+ [91.24156880000004, 22.575395765000053],
+ [91.22136457600004, 22.55719260500007],
+ [91.20274304600008, 22.543219639000085],
+ [91.17656568400008, 22.53641941400008],
+ [91.12734345800004, 22.527025948000073],
+ [91.08920058200005, 22.544430256000055],
+ [91.06957967100004, 22.571556869000062],
+ [91.05860436300003, 22.61432526200008],
+ [91.04867597700007, 22.626166083000044],
+ [91.03793379000007, 22.643866278000075],
+ [91.02670332100007, 22.674261786000045],
+ [91.01832116000003, 22.68309153900009],
+ [91.00375410200007, 22.678656317000048],
+ [91.01872806100005, 22.664455471000053],
+ [91.03223717500003, 22.636867580000057],
+ [91.04021243600005, 22.60773346600007],
+ [91.03793379000007, 22.58860911700009],
+ [91.01758873800003, 22.579291083000044],
+ [90.98511803500003, 22.574367580000057],
+ [90.95492597700007, 22.575832424000055],
+ [90.94174238400007, 22.585882880000042],
+ [90.93555748800003, 22.599676825000074],
+ [90.90821373800003, 22.61786530200004],
+ [90.90202884200005, 22.627101955000057],
+ [90.89877363400007, 22.63617584800005],
+ [90.88412519600007, 22.65448639500005],
+ [90.87647545700008, 22.682806708000044],
+ [90.86548912900008, 22.687160549000055],
+ [90.83594811300003, 22.684881903000075],
+ [90.83130944100003, 22.690578518000052],
+ [90.81950931100005, 22.72646719000005],
+ [90.81177819100003, 22.732367255000042],
+ [90.80258222700007, 22.736395575000074],
+ [90.79493248800003, 22.741359768000052],
+ [90.78834069100003, 22.75922272300005],
+ [90.77418053500003, 22.77806224200009],
+ [90.77100670700008, 22.784816799000055],
+ [90.76954186300003, 22.795355536000045],
+ [90.75733483200008, 22.822658596000053],
+ [90.75001061300003, 22.856756903000075],
+ [90.74195397200003, 22.874212958000044],
+ [90.73292076900003, 22.889064846000053],
+ [90.72559655000003, 22.90570709800005],
+ [90.72266686300003, 22.92845286700009],
+ [90.71745853000004, 22.940619208000044],
+ [90.64014733200008, 23.038031317000048],
+ [90.62940514400003, 23.064398505000042],
+ [90.62712649800005, 23.075873114000046],
+ [90.62720787900008, 23.08665599200009],
+ [90.63868248800003, 23.14789459800005],
+ [90.64014733200008, 23.18886953300006],
+ [90.64584394600007, 23.21092357000009],
+ [90.65707441500007, 23.23037344000005],
+ [90.66521243600005, 23.24876536700009],
+ [90.66114342500003, 23.267645575000074],
+ [90.66732832100007, 23.267645575000074],
+ [90.65088951900003, 23.30023834800005],
+ [90.65015709700003, 23.31354401200008],
+ [90.66114342500003, 23.32225169500009],
+ [90.65772545700008, 23.32322825700004],
+ [90.65479576900003, 23.32330963700008],
+ [90.65316816500007, 23.324652411000045],
+ [90.65365644600007, 23.329738674000055],
+ [90.62842858200008, 23.321519273000035],
+ [90.61133873800003, 23.34247467700004],
+ [90.60173587300005, 23.37246328300006],
+ [90.59913170700008, 23.391180731000077],
+ [90.60027103000004, 23.44993724200009],
+ [90.60873457100007, 23.472723700000074],
+ [90.63331139400003, 23.486761786000045],
+ [90.69157962300005, 23.486476955000057],
+ [90.71501712300005, 23.49835846600007],
+ [90.71583092500003, 23.53514232000009],
+ [90.71119225400008, 23.54881419500009],
+ [90.70557701900003, 23.554510809000078],
+ [90.69581139400003, 23.555487372000073],
+ [90.67823326900003, 23.555080471000053],
+ [90.67546634200005, 23.550930080000057],
+ [90.68433678500003, 23.54173411700009],
+ [90.70215905000003, 23.52838776200008],
+ [90.69532311300003, 23.507879950000074],
+ [90.67774498800003, 23.517279364000046],
+ [90.66675866000003, 23.51821523600006],
+ [90.64747155000003, 23.507879950000074],
+ [90.62208092500003, 23.500067450000074],
+ [90.60775800900007, 23.491115627000056],
+ [90.60336347700007, 23.494696356000077],
+ [90.58814537900008, 23.53416575700004],
+ [90.59205162900008, 23.56248607000009],
+ [90.60816491000003, 23.585760809000078],
+ [90.63331139400003, 23.596625067000048],
+ [90.62712649800005, 23.603461005000042],
+ [90.62533613400007, 23.599351304000038],
+ [90.62525475400008, 23.59833405200004],
+ [90.62403405000003, 23.598089911000045],
+ [90.61963951900003, 23.596625067000048],
+ [90.61198978000004, 23.60610586100006],
+ [90.59546959700003, 23.604396877000056],
+ [90.55876712300005, 23.590399481000077],
+ [90.56446373800003, 23.57640208500004],
+ [90.55941816500007, 23.56793854400007],
+ [90.54721113400007, 23.563788153000075],
+ [90.53150475400008, 23.56248607000009],
+ [90.51465905000003, 23.563788153000075],
+ [90.50171959700003, 23.56793854400007],
+ [90.47632897200003, 23.582953192000048],
+ [90.48438561300003, 23.56745026200008],
+ [90.49838300900007, 23.55727773600006],
+ [90.51498457100007, 23.55141836100006],
+ [90.53150475400008, 23.54881419500009],
+ [90.56869550900007, 23.54751211100006],
+ [90.57683353000004, 23.539496161000045],
+ [90.57894941500007, 23.44985586100006],
+ [90.57593834700003, 23.43895091400009],
+ [90.56812584700003, 23.432928778000075],
+ [90.55990644600007, 23.418402411000045],
+ [90.55372155000003, 23.40070221600007],
+ [90.55193118600005, 23.38495514500005],
+ [90.51832116000003, 23.398260809000078],
+ [90.32243899800005, 23.433294989000046],
+ [90.28443444100003, 23.446193752000056],
+ [90.25033613400007, 23.466945705000057],
+ [90.24935957100007, 23.45538971600007],
+ [90.25879967500003, 23.444566148000035],
+ [90.38851972700007, 23.372381903000075],
+ [90.40414472700007, 23.36041901200008],
+ [90.41342207100007, 23.34796784100007],
+ [90.41968834700003, 23.335598049000055],
+ [90.42847741000003, 23.326117255000042],
+ [90.46021569100003, 23.31972890800006],
+ [90.48796634200005, 23.30683014500005],
+ [90.50359134200005, 23.30174388200004],
+ [90.56910241000003, 23.294989325000074],
+ [90.57732181100005, 23.288397528000075],
+ [90.60661868600005, 23.247219143000052],
+ [90.61085045700008, 23.23078034100007],
+ [90.61451256600003, 23.195461330000057],
+ [90.61036217500003, 23.20115794500009],
+ [90.60271243600005, 23.211004950000074],
+ [90.59351647200003, 23.219875393000052],
+ [90.59839928500003, 23.200425523000035],
+ [90.60287519600007, 23.14130280200004],
+ [90.59913170700008, 23.11749909100007],
+ [90.57195071700005, 23.081732489000046],
+ [90.56560306100005, 23.075873114000046],
+ [90.55372155000003, 23.078558661000045],
+ [90.55128014400003, 23.08690013200004],
+ [90.55591881600003, 23.096828518000052],
+ [90.56560306100005, 23.10382721600007],
+ [90.56560306100005, 23.110663153000075],
+ [90.55876712300005, 23.110663153000075],
+ [90.54761803500003, 23.09674713700008],
+ [90.53663170700008, 23.086818752000056],
+ [90.52279707100007, 23.080145575000074],
+ [90.50359134200005, 23.075873114000046],
+ [90.46607506600003, 23.07684967700004],
+ [90.45362389400003, 23.072333075000074],
+ [90.44890384200005, 23.05573151200008],
+ [90.45012454500005, 23.049343166000085],
+ [90.45435631600003, 23.02753327000005],
+ [90.46827233200008, 22.99607982000009],
+ [90.48698978000004, 22.966131903000075],
+ [90.50700931100005, 22.94208405200004],
+ [90.50928795700008, 22.93699778900009],
+ [90.50757897200003, 22.92536041900007],
+ [90.51042728000004, 22.91819896000004],
+ [90.51295006600003, 22.91705963700008],
+ [90.51685631600003, 22.916815497000073],
+ [90.52100670700008, 22.915676174000055],
+ [90.52409915500004, 22.91201406500005],
+ [90.53598066500007, 22.90338776200008],
+ [90.54004967500003, 22.896551825000074],
+ [90.53492272200003, 22.887152411000045],
+ [90.52003014400003, 22.880194403000075],
+ [90.50513756600003, 22.881659247000073],
+ [90.49048912900008, 22.885199286000045],
+ [90.47632897200003, 22.884100653000075],
+ [90.45720462300005, 22.861761786000045],
+ [90.44809004000007, 22.82843659100007],
+ [90.43604576900003, 22.800604559000078],
+ [90.40796959700003, 22.794663804000038],
+ [90.42400149800005, 22.781683661000045],
+ [90.41993248800003, 22.76825592700004],
+ [90.40642337300005, 22.76308828300006],
+ [90.39429772200003, 22.77484772300005],
+ [90.37256920700008, 22.761419989000046],
+ [90.38721764400003, 22.751288153000075],
+ [90.41578209700003, 22.74249909100007],
+ [90.43523196700005, 22.733303127000056],
+ [90.44459069100003, 22.751654364000046],
+ [90.46168053500003, 22.748846747000073],
+ [90.47901451900003, 22.73501211100006],
+ [90.48991946700005, 22.72020091400009],
+ [90.49293053500003, 22.709906317000048],
+ [90.49675540500004, 22.678656317000048],
+ [90.50896243600005, 22.646429755000042],
+ [90.51270592500003, 22.611476955000057],
+ [90.51002037900008, 22.60423411700009],
+ [90.50017337300005, 22.592352606000077],
+ [90.49138431100005, 22.587836005000042],
+ [90.46859785200007, 22.58470286700009],
+ [90.45923912900008, 22.579291083000044],
+ [90.45346113400007, 22.564195054000038],
+ [90.44214928500003, 22.508734442000048],
+ [90.44206790500004, 22.49363841400009],
+ [90.44499759200005, 22.50413646000004],
+ [90.45118248800003, 22.510158596000053],
+ [90.45801842500003, 22.51463450700004],
+ [90.46265709700003, 22.52098216400009],
+ [90.46355228000004, 22.53143952000005],
+ [90.46045983200008, 22.551174221000053],
+ [90.46265709700003, 22.56195709800005],
+ [90.47250410200007, 22.57558828300006],
+ [90.48731530000003, 22.583726304000038],
+ [90.50513756600003, 22.58624909100007],
+ [90.52409915500004, 22.58307526200008],
+ [90.55974368600005, 22.562323309000078],
+ [90.57781009200005, 22.533677476000037],
+ [90.58969160200007, 22.500433661000045],
+ [90.60661868600005, 22.465765692000048],
+ [90.59131920700008, 22.470526434000078],
+ [90.58619225400008, 22.473211981000077],
+ [90.58643639400003, 22.45058828300006],
+ [90.59359785200007, 22.43231842700004],
+ [90.61345462300005, 22.396877346000053],
+ [90.61841881600003, 22.376654364000046],
+ [90.61931399800005, 22.355902411000045],
+ [90.61345462300005, 22.314886786000045],
+ [90.58155358200008, 22.238226630000042],
+ [90.55795332100007, 22.20335521000004],
+ [90.53834069100003, 22.198879299000055],
+ [90.51172936300003, 22.185288804000038],
+ [90.50114993600005, 22.176703192000048],
+ [90.49675540500004, 22.167792059000078],
+ [90.49439537900008, 22.154242255000042],
+ [90.48829186300003, 22.138617255000042],
+ [90.45964603000004, 22.091945705000057],
+ [90.45004316500007, 22.08079661700009],
+ [90.43864993600005, 22.075995184000078],
+ [90.42546634200005, 22.07884349200009],
+ [90.40845787900008, 22.08592357000009],
+ [90.39380944100003, 22.09471263200004],
+ [90.38746178500003, 22.10260651200008],
+ [90.39323978000004, 22.127386786000045],
+ [90.41749108200008, 22.175034898000035],
+ [90.42164147200003, 22.198879299000055],
+ [90.41000410200007, 22.22728099200009],
+ [90.40796959700003, 22.24042389500005],
+ [90.41407311300003, 22.27179596600007],
+ [90.41089928500003, 22.28424713700008],
+ [90.39429772200003, 22.288234768000052],
+ [90.39869225400008, 22.26748281500005],
+ [90.38868248800003, 22.223211981000077],
+ [90.39087975400008, 22.208807684000078],
+ [90.39909915500004, 22.20221588700008],
+ [90.40552819100003, 22.19953034100007],
+ [90.41049238400007, 22.195705471000053],
+ [90.41423587300005, 22.18577708500004],
+ [90.41285241000003, 22.17804596600007],
+ [90.40821373800003, 22.171210028000075],
+ [90.40056399800005, 22.16404857000009],
+ [90.39918053500003, 22.16233958500004],
+ [90.39714603000004, 22.160630601000037],
+ [90.39519290500004, 22.15721263200004],
+ [90.39258873800003, 22.143011786000045],
+ [90.38868248800003, 22.143459377000056],
+ [90.38379967500003, 22.145738023000035],
+ [90.38005618600005, 22.14362213700008],
+ [90.37712649800005, 22.133612372000073],
+ [90.37378991000003, 22.10260651200008],
+ [90.36988366000003, 22.08982982000009],
+ [90.36573326900003, 22.081203518000052],
+ [90.34742272200003, 22.05532461100006],
+ [90.33472741000003, 22.041815497000073],
+ [90.33220462300005, 22.03807200700004],
+ [90.32789147200003, 22.02049388200004],
+ [90.30860436300003, 21.984035549000055],
+ [90.30437259200005, 21.965765692000048],
+ [90.29997806100005, 21.927679755000042],
+ [90.29070071700005, 21.890326239000046],
+ [90.28288821700005, 21.870794989000046],
+ [90.27271569100003, 21.85740794500009],
+ [90.21762129000007, 21.81346263200004],
+ [90.20378665500004, 21.80459219000005],
+ [90.18482506600003, 21.80097077000005],
+ [90.16439863400007, 21.80426666900007],
+ [90.12680097700007, 21.818793036000045],
+ [90.10906009200005, 21.822088934000078],
+ [90.09294681100005, 21.83026764500005],
+ [90.08855228000004, 21.84674713700008],
+ [90.09538821700005, 21.859442450000074],
+ [90.11247806100005, 21.856268622000073],
+ [90.10499108200008, 21.870266018000052],
+ [90.11085045700008, 21.880113023000035],
+ [90.12086022200003, 21.88930898600006],
+ [90.12623131600003, 21.901190497000073],
+ [90.12452233200008, 21.90973541900007],
+ [90.12183678500003, 21.915350653000075],
+ [90.12134850400008, 21.921576239000046],
+ [90.12623131600003, 21.93195221600007],
+ [90.11622155000003, 21.91933828300006],
+ [90.09848066500007, 21.878607489000046],
+ [90.08887780000003, 21.86985911700009],
+ [90.07935631600003, 21.866929429000038],
+ [90.06690514400003, 21.85342031500005],
+ [90.05787194100003, 21.849351304000038],
+ [90.04932701900003, 21.85101959800005],
+ [90.03630618600005, 21.861151434000078],
+ [90.02442467500003, 21.862453518000052],
+ [90.03126061300003, 21.889227606000077],
+ [90.03394616000003, 21.94354889500005],
+ [90.04493248800003, 21.966131903000075],
+ [90.05420983200008, 21.97337474200009],
+ [90.06576582100007, 21.97988515800006],
+ [90.07715905000003, 21.987982489000046],
+ [90.08578535200007, 22.00023021000004],
+ [90.09058678500003, 22.015448309000078],
+ [90.09253991000003, 22.02798086100006],
+ [90.09595787900008, 22.04010651200008],
+ [90.10564212300005, 22.05426666900007],
+ [90.14673912900008, 22.089016018000052],
+ [90.15162194100003, 22.094875393000052],
+ [90.15886478000004, 22.10691966400009],
+ [90.16407311300003, 22.113226630000042],
+ [90.17286217500003, 22.117010809000078],
+ [90.18181399800005, 22.11481354400007],
+ [90.18970787900008, 22.11082591400009],
+ [90.19507897200003, 22.109523830000057],
+ [90.21615644600007, 22.12323639500005],
+ [90.23170006600003, 22.145656643000052],
+ [90.23910566500007, 22.172267971000053],
+ [90.23609459700003, 22.198879299000055],
+ [90.21827233200008, 22.15570709800005],
+ [90.20582116000003, 22.132961330000057],
+ [90.19166100400008, 22.123114325000074],
+ [90.16480553500003, 22.11981842700004],
+ [90.14828535200007, 22.11078522300005],
+ [90.08887780000003, 22.051174221000053],
+ [90.08179772200003, 22.04100169500009],
+ [90.07374108200008, 22.019232489000046],
+ [90.06104576900003, 22.000799872000073],
+ [90.05795332100007, 21.99371979400007],
+ [90.05241946700005, 21.98899974200009],
+ [90.03809655000003, 21.98655833500004],
+ [90.02816816500007, 21.988104559000078],
+ [89.99634850400008, 22.00023021000004],
+ [90.00212649800005, 22.014105536000045],
+ [90.00318444100003, 22.029364325000074],
+ [90.01075280000003, 22.04120514500005],
+ [90.02019290500004, 22.04881419500009],
+ [90.02898196700005, 22.05296458500004],
+ [90.03541100400008, 22.059800523000035],
+ [90.03809655000003, 22.075344143000052],
+ [90.03467858200008, 22.105169989000046],
+ [90.03907311300003, 22.11627838700008],
+ [90.04273522200003, 22.131252346000053],
+ [90.05209394600007, 22.141099351000037],
+ [90.06324303500003, 22.145738023000035],
+ [90.07260175900007, 22.152044989000046],
+ [90.07837975400008, 22.16404857000009],
+ [90.05258222700007, 22.155462958000044],
+ [90.04004967500003, 22.13808828300006],
+ [90.02442467500003, 22.089016018000052],
+ [90.01539147200003, 22.077866929000038],
+ [89.98853600400008, 22.05304596600007],
+ [89.98275800900007, 22.044623114000046],
+ [89.98519941500007, 21.99941640800006],
+ [89.98275800900007, 21.98655833500004],
+ [89.96778405000003, 21.974554755000042],
+ [89.94971764400003, 21.980902411000045],
+ [89.93441816500007, 21.997707424000055],
+ [89.92823326900003, 22.017279364000046],
+ [89.92628014400003, 22.027167059000078],
+ [89.91749108200008, 22.04987213700008],
+ [89.91456139400003, 22.061672268000052],
+ [89.91236412900008, 22.135565497000073],
+ [89.90308678500003, 22.176906643000052],
+ [89.90088951900003, 22.201971747000073],
+ [89.89828535200007, 22.21165599200009],
+ [89.88550866000003, 22.230617580000057],
+ [89.88038170700008, 22.24042389500005],
+ [89.87663821700005, 22.25348541900007],
+ [89.87533613400007, 22.26398346600007],
+ [89.87680097700007, 22.274725653000075],
+ [89.88038170700008, 22.288234768000052],
+ [89.90015709700003, 22.333929755000042],
+ [89.98275800900007, 22.445257880000042],
+ [89.98829186300003, 22.45774974200009],
+ [89.99195397200003, 22.469875393000052],
+ [89.99789472700007, 22.480861721000053],
+ [90.01010175900007, 22.49022044500009],
+ [89.98275800900007, 22.473211981000077],
+ [89.97950280000003, 22.470078843000067],
+ [89.94743899800005, 22.43968333500004],
+ [89.93360436300003, 22.423529364000046],
+ [89.92823326900003, 22.40770091400009],
+ [89.92042076900003, 22.391831773000035],
+ [89.90308678500003, 22.396429755000042],
+ [89.87289472700007, 22.41860586100006],
+ [89.87484785200007, 22.397650458000044],
+ [89.88054446700005, 22.380601304000038],
+ [89.88412519600007, 22.36351146000004],
+ [89.88038170700008, 22.342230536000045],
+ [89.83871504000007, 22.26776764500005],
+ [89.85084069100003, 22.246527411000045],
+ [89.86133873800003, 22.211004950000074],
+ [89.87289472700007, 22.14362213700008],
+ [89.87427819100003, 22.10883209800005],
+ [89.87134850400008, 22.091864325000074],
+ [89.86296634200005, 22.079046942000048],
+ [89.84620201900003, 22.07062409100007],
+ [89.83155358200008, 22.071966864000046],
+ [89.81617272200003, 22.075995184000078],
+ [89.79721113400007, 22.075995184000078],
+ [89.79721113400007, 22.068508205000057],
+ [89.81836998800003, 22.06004466400009],
+ [89.83594811300003, 22.04946523600006],
+ [89.84791100400008, 22.03388092700004],
+ [89.85238691500007, 22.01044342700004],
+ [89.85108483200008, 22.000881252000056],
+ [89.84595787900008, 21.982896226000037],
+ [89.84620201900003, 21.972316799000055],
+ [89.85027103000004, 21.96312083500004],
+ [89.86378014400003, 21.943304755000042],
+ [89.87183678500003, 21.924261786000045],
+ [89.88160241000003, 21.912990627000056],
+ [89.88721764400003, 21.900091864000046],
+ [89.88038170700008, 21.88418203300006],
+ [89.87322024800005, 21.88157786700009],
+ [89.85092207100007, 21.877508856000077],
+ [89.82520592500003, 21.856268622000073],
+ [89.81959069100003, 21.849554755000042],
+ [89.81763756600003, 21.844916083000044],
+ [89.81421959700003, 21.84080638200004],
+ [89.80469811300003, 21.835760809000078],
+ [89.78638756600003, 21.828924872000073],
+ [89.77572675900007, 21.82758209800005],
+ [89.77116946700005, 21.83234284100007],
+ [89.76587975400008, 21.84674713700008],
+ [89.75342858200008, 21.843898830000057],
+ [89.73845462300005, 21.834418036000045],
+ [89.72584069100003, 21.828924872000073],
+ [89.70915774800005, 21.83006419500009],
+ [89.69044030000003, 21.833726304000038],
+ [89.67335045700008, 21.84007396000004],
+ [89.66130618600005, 21.849351304000038],
+ [89.65691165500004, 21.857123114000046],
+ [89.65316816500007, 21.867743231000077],
+ [89.65259850400008, 21.878851630000042],
+ [89.66334069100003, 21.896307684000078],
+ [89.66130618600005, 21.90582916900007],
+ [89.64698326900003, 21.925116278000075],
+ [89.61898847700007, 21.86985911700009],
+ [89.63038170700008, 21.85146719000005],
+ [89.64975019600007, 21.82636139500005],
+ [89.67204837300005, 21.80426666900007],
+ [89.69206790500004, 21.79482656500005],
+ [89.70069420700008, 21.784857489000046],
+ [89.68995201900003, 21.76520416900007],
+ [89.66822350400008, 21.750881252000056],
+ [89.64356530000003, 21.75690338700008],
+ [89.63152103000004, 21.764064846000053],
+ [89.62037194100003, 21.76434967700004],
+ [89.59546959700003, 21.75999583500004],
+ [89.59278405000003, 21.754380601000037],
+ [89.60377037900008, 21.727687893000052],
+ [89.60596764400003, 21.71906159100007],
+ [89.58692467500003, 21.700832424000055],
+ [89.56568444100003, 21.713364976000037],
+ [89.53711998800003, 21.75381094000005],
+ [89.53891035200007, 21.77147044500009],
+ [89.52735436300003, 21.81281159100007],
+ [89.53028405000003, 21.835760809000078],
+ [89.53834069100003, 21.84861888200004],
+ [89.55689537900008, 21.868801174000055],
+ [89.56446373800003, 21.88418203300006],
+ [89.56763756600003, 21.90070221600007],
+ [89.56348717500003, 21.973130601000037],
+ [89.57129967500003, 22.03123607000009],
+ [89.57667076900003, 22.051703192000048],
+ [89.60059655000003, 22.09125397300005],
+ [89.60596764400003, 22.113226630000042],
+ [89.60254967500003, 22.134507554000038],
+ [89.59376061300003, 22.155422268000052],
+ [89.58139082100007, 22.17405833500004],
+ [89.56788170700008, 22.18891022300005],
+ [89.56723066500007, 22.202826239000046],
+ [89.59791100400008, 22.240301825000074],
+ [89.60596764400003, 22.25690338700008],
+ [89.60710696700005, 22.278265692000048],
+ [89.61060631600003, 22.298895575000074],
+ [89.61695397200003, 22.318426825000074],
+ [89.62647545700008, 22.336004950000074],
+ [89.61548912900008, 22.328273830000057],
+ [89.60621178500003, 22.315619208000044],
+ [89.59245853000004, 22.288234768000052],
+ [89.58082116000003, 22.27724844000005],
+ [89.57715905000003, 22.268500067000048],
+ [89.58619225400008, 22.245428778000075],
+ [89.58033287900008, 22.236761786000045],
+ [89.56104576900003, 22.223089911000045],
+ [89.54916425900007, 22.20526764500005],
+ [89.55030358200008, 22.19212474200009],
+ [89.57129967500003, 22.157904364000046],
+ [89.57634524800005, 22.14549388200004],
+ [89.57878665500004, 22.135891018000052],
+ [89.57935631600003, 22.113226630000042],
+ [89.57699629000007, 22.101263739000046],
+ [89.56674238400007, 22.082098700000074],
+ [89.56446373800003, 22.072211005000042],
+ [89.55648847700007, 22.00844961100006],
+ [89.55144290500004, 21.99404531500005],
+ [89.53288821700005, 21.98468659100007],
+ [89.52475019600007, 22.000148830000057],
+ [89.52344811300003, 22.044623114000046],
+ [89.52613366000003, 22.055121161000045],
+ [89.53646894600007, 22.075832424000055],
+ [89.53711998800003, 22.089016018000052],
+ [89.49203535200007, 22.188381252000056],
+ [89.48943118600005, 22.208807684000078],
+ [89.49415123800003, 22.253566799000055],
+ [89.49301191500007, 22.273504950000074],
+ [89.48316491000003, 22.295070705000057],
+ [89.47575931100005, 22.295070705000057],
+ [89.46745853000004, 22.228989976000037],
+ [89.47575931100005, 22.10260651200008],
+ [89.48316491000003, 22.10260651200008],
+ [89.48406009200005, 22.11668528900009],
+ [89.48878014400003, 22.12958405200004],
+ [89.49415123800003, 22.136867580000057],
+ [89.49683678500003, 22.133978583000044],
+ [89.49822024800005, 22.12531159100007],
+ [89.50171959700003, 22.113104559000078],
+ [89.50684655000003, 22.10101959800005],
+ [89.51295006600003, 22.09243398600006],
+ [89.51832116000003, 22.081000067000048],
+ [89.51742597700007, 22.066473700000074],
+ [89.50912519600007, 22.04120514500005],
+ [89.50416100400008, 22.03668854400007],
+ [89.49187259200005, 22.03457265800006],
+ [89.48943118600005, 22.03123607000009],
+ [89.49040774800005, 22.023993231000077],
+ [89.49268639400003, 22.019191799000055],
+ [89.49683678500003, 22.01386139500005],
+ [89.50049889400003, 22.00259023600006],
+ [89.51270592500003, 21.97809479400007],
+ [89.52003014400003, 21.969183661000045],
+ [89.52182050900007, 21.96230703300006],
+ [89.51254316500007, 21.909125067000048],
+ [89.50228925900007, 21.89752838700008],
+ [89.48910566500007, 21.888373114000046],
+ [89.47575931100005, 21.876695054000038],
+ [89.46461022200003, 21.859198309000078],
+ [89.46363366000003, 21.845038153000075],
+ [89.46705162900008, 21.828599351000037],
+ [89.46949303500003, 21.804388739000046],
+ [89.46583092500003, 21.781317450000074],
+ [89.45622806100005, 21.76239655200004],
+ [89.44271894600007, 21.746649481000077],
+ [89.40642337300005, 21.717352606000077],
+ [89.39519290500004, 21.71637604400007],
+ [89.36963951900003, 21.743312893000052],
+ [89.36426842500003, 21.758205471000053],
+ [89.36280358200008, 21.78384023600006],
+ [89.36589603000004, 21.828924872000073],
+ [89.37126712300005, 21.84715403900009],
+ [89.38428795700008, 21.877834377000056],
+ [89.38697350400008, 21.901190497000073],
+ [89.38266035200007, 21.92133209800005],
+ [89.36402428500003, 21.95506419500009],
+ [89.35962975400008, 21.972316799000055],
+ [89.35222415500004, 21.972316799000055],
+ [89.34595787900008, 21.95701732000009],
+ [89.34880618600005, 21.944159247000073],
+ [89.35523522200003, 21.93162669500009],
+ [89.35962975400008, 21.917669989000046],
+ [89.35962975400008, 21.901678778000075],
+ [89.35596764400003, 21.892523505000042],
+ [89.33912194100003, 21.876695054000038],
+ [89.32886803500003, 21.86465078300006],
+ [89.32260175900007, 21.854641018000052],
+ [89.30616295700008, 21.817613023000035],
+ [89.30128014400003, 21.809393622000073],
+ [89.29623457100007, 21.809068101000037],
+ [89.29070071700005, 21.822088934000078],
+ [89.28394616000003, 21.822088934000078],
+ [89.28443444100003, 21.796820380000042],
+ [89.29468834700003, 21.75779857000009],
+ [89.29070071700005, 21.733343817000048],
+ [89.27369225400008, 21.69879791900007],
+ [89.27662194100003, 21.687567450000074],
+ [89.29753665500004, 21.678127346000053],
+ [89.28589928500003, 21.66559479400007],
+ [89.26872806100005, 21.653998114000046],
+ [89.24870853000004, 21.64590078300006],
+ [89.22925866000003, 21.64394765800006],
+ [89.21045983200008, 21.654120184000078],
+ [89.20443769600007, 21.672674872000073],
+ [89.20826256600003, 21.690619208000044],
+ [89.21859785200007, 21.698553778000075],
+ [89.22071373800003, 21.709418036000045],
+ [89.18970787900008, 21.79124583500004],
+ [89.18824303500003, 21.799709377000056],
+ [89.18767337300005, 21.81150950700004],
+ [89.18336022200003, 21.815619208000044],
+ [89.17408287900008, 21.81004466400009],
+ [89.16456139400003, 21.80019765800006],
+ [89.16041100400008, 21.79132721600007],
+ [89.15455162900008, 21.786851304000038],
+ [89.14128665500004, 21.790228583000044],
+ [89.11939537900008, 21.80097077000005],
+ [89.10906009200005, 21.809515692000048],
+ [89.10466556100005, 21.81586334800005],
+ [89.07992597700007, 21.897406317000048],
+ [89.07781009200005, 21.91425202000005],
+ [89.08041425900007, 21.934881903000075],
+ [89.09107506600003, 21.97679271000004],
+ [89.09148196700005, 22.00023021000004],
+ [89.08423912900008, 22.021185614000046],
+ [89.06202233200008, 22.04950592700004],
+ [89.05738366000003, 22.06509023600006],
+ [89.06348717500003, 22.111029364000046],
+ [89.06039472700007, 22.12986888200004],
+ [89.06069258700006, 22.130484925000076],
+ [89.07815922000009, 22.150845439000122],
+ [89.07619551700009, 22.175030009000082],
+ [89.07071781400009, 22.194822083000062],
+ [89.06229455500011, 22.21156524700011],
+ [89.01862797100011, 22.26468861900004],
+ [89.00911950700004, 22.285617575000046],
+ [89.02353723100003, 22.294815979000035],
+ [89.00694909700013, 22.32142934200006],
+ [89.00152307100007, 22.333676656000094],
+ [88.98958581600004, 22.386903382000057],
+ [88.98948246300012, 22.396670227000115],
+ [88.99216963700013, 22.406953837000103],
+ [89.00074792500004, 22.420131328000068],
+ [89.00250492300006, 22.427986145000105],
+ [88.99837080900011, 22.45124053900004],
+ [88.979974, 22.490928039000025],
+ [88.97098230000006, 22.52792836500008],
+ [88.95904504400005, 22.53681671100007],
+ [88.9279875090001, 22.54813385000007],
+ [88.95031172700004, 22.561983134000016],
+ [88.95640954600003, 22.584979146000066],
+ [88.95201704900012, 22.611902568000076],
+ [88.9423535570001, 22.637482402000032],
+ [88.93000288900004, 22.658618063000077],
+ [88.92592045100014, 22.680838928000114],
+ [88.92250980600011, 22.69370636000012],
+ [88.91057255100009, 22.722593486000065],
+ [88.90814375800011, 22.74078359000002],
+ [88.91496504800006, 22.75440033000011],
+ [88.92623051000004, 22.767035218000032],
+ [88.9368758550001, 22.782331441000096],
+ [88.94121667500008, 22.795663961000017],
+ [88.94514408400005, 22.815094300000098],
+ [88.94679773000013, 22.834524638000076],
+ [88.94452396600008, 22.848012187000037],
+ [88.93310347500011, 22.85811492900008],
+ [88.90514652600007, 22.86643483500005],
+ [88.89346765200008, 22.879638164000127],
+ [88.87217696100004, 22.926767070000054],
+ [88.86173832200006, 22.942399190000074],
+ [88.84277307100012, 22.964568380000017],
+ [88.83879398700009, 22.975808004000058],
+ [88.83941410300014, 22.995367534000067],
+ [88.84871586100007, 23.02384124800001],
+ [88.85129968300004, 23.07513010700005],
+ [88.86478723200014, 23.10027069100009],
+ [88.91909916200007, 23.153859152000038],
+ [88.94586755400007, 23.174348857000027],
+ [88.95470422400007, 23.18380564400009],
+ [88.95982019100006, 23.19445098900006],
+ [88.9599752200001, 23.2026933800001],
+ [88.95423913600013, 23.207421773000092],
+ [88.92695398000012, 23.206517436000055],
+ [88.91806563300008, 23.208584493],
+ [88.90964237500003, 23.212434388000062],
+ [88.83962080900011, 23.234810283000044],
+ [88.82267093900009, 23.237962545000087],
+ [88.80954512500011, 23.236050517000066],
+ [88.80096683800008, 23.23075368300003],
+ [88.79419722500006, 23.224965922000067],
+ [88.78618737800008, 23.221529439000037],
+ [88.77569706300011, 23.22163279200005],
+ [88.71001631700005, 23.241218160000088],
+ [88.69658044500011, 23.252354432000104],
+ [88.68660689300003, 23.271603902000024],
+ [88.68593510000005, 23.293308004000025],
+ [88.69503015100008, 23.312609152000064],
+ [88.71926639800006, 23.348291728000063],
+ [88.76789392100011, 23.467276713],
+ [88.77016768400011, 23.48882578600005],
+ [88.7568351650001, 23.49879933700005],
+ [88.74370935100012, 23.489316711000086],
+ [88.73192712400004, 23.472625224000055],
+ [88.71942142800003, 23.468103536000015],
+ [88.70464196800003, 23.495181986000077],
+ [88.69378991700006, 23.499807028000035],
+ [88.66448938000008, 23.518307190000073],
+ [88.64764286400003, 23.535076193000023],
+ [88.62423344000007, 23.573859355000067],
+ [88.6092472740001, 23.588793844000023],
+ [88.60128910400005, 23.59034413700003],
+ [88.58154870600009, 23.58832875600008],
+ [88.57142012600013, 23.592333679000077],
+ [88.56170495600009, 23.602023010000025],
+ [88.5610848390001, 23.608611756000087],
+ [88.56439213100009, 23.61620819100007],
+ [88.56635583500014, 23.628739726000063],
+ [88.56123986800003, 23.632486268],
+ [88.55095625800004, 23.6344241340001],
+ [88.54155114800011, 23.63876495400008],
+ [88.54010420800012, 23.64995290100005],
+ [88.56118819200003, 23.74100677500006],
+ [88.55974125200004, 23.75028269500008],
+ [88.55250655100008, 23.765423890000093],
+ [88.55271325700005, 23.774984029],
+ [88.55767419400007, 23.785681051000026],
+ [88.57235030200007, 23.806894226000068],
+ [88.57751794500007, 23.818521424000025],
+ [88.57762129700012, 23.827616476000102],
+ [88.5754508870001, 23.836556499000025],
+ [88.57436568200012, 23.845625712000086],
+ [88.57762129700012, 23.855160014000077],
+ [88.59358931500003, 23.866916402000086],
+ [88.61317468300007, 23.867846578000027],
+ [88.63394860900007, 23.866141256000063],
+ [88.65312056500011, 23.869784445000064],
+ [88.66650476100006, 23.87949961400001],
+ [88.70443526200006, 23.913709412000102],
+ [88.71415043100006, 23.925155742000115],
+ [88.71714766500003, 23.9431391400001],
+ [88.71435713700004, 23.964403992000072],
+ [88.70836267100003, 23.98355011000008],
+ [88.70159305800007, 23.995280660000063],
+ [88.7138403730001, 24.01468516100003],
+ [88.72546757000009, 24.028896179000085],
+ [88.72500248200004, 24.03837880500008],
+ [88.70092126500009, 24.043649801000086],
+ [88.69782067900007, 24.05625885000002],
+ [88.67901045700006, 24.071219178],
+ [88.67410119700003, 24.082639669000102],
+ [88.67539310700005, 24.09183807400008],
+ [88.68180098500011, 24.112663676000054],
+ [88.68298954300013, 24.12429087300002],
+ [88.67828698800014, 24.144651388000042],
+ [88.67808028100006, 24.154289043000077],
+ [88.68376468900004, 24.166536356000094],
+ [88.69378991700006, 24.17532135100008],
+ [88.71590743000007, 24.182917786000033],
+ [88.73145573500011, 24.1897713150001],
+ [88.73161706600013, 24.18984242800012],
+ [88.73482100400008, 24.19842071500007],
+ [88.74639652500014, 24.21407867500001],
+ [88.74980717000005, 24.223251242000103],
+ [88.74748173000006, 24.226971945000017],
+ [88.74494958500009, 24.24337921200008],
+ [88.74303755700004, 24.24753916500002],
+ [88.73750817900003, 24.28709747300006],
+ [88.71456384300012, 24.315416158000048],
+ [88.68180098500011, 24.333890483000076],
+ [88.66014856000004, 24.338257141000057],
+ [88.64950321500004, 24.31536448200002],
+ [88.63451705000006, 24.294125468000047],
+ [88.61245121300004, 24.292885234000025],
+ [88.56310021900003, 24.308207296000077],
+ [88.49834965000008, 24.31097198500005],
+ [88.47540531400011, 24.315467835000064],
+ [88.40130131100011, 24.36941803000012],
+ [88.13878503400008, 24.495250143000092],
+ [88.10994958500004, 24.50098622700007],
+ [88.10793420400006, 24.50796254500007],
+ [88.0987874760001, 24.5224836230001],
+ [88.09000248300003, 24.532999777000057],
+ [88.08602339700013, 24.536720480000085],
+ [88.08498986800004, 24.541733093000047],
+ [88.08498986800004, 24.593874614000086],
+ [88.08183760600008, 24.599869080000033],
+ [88.06726485200005, 24.613666687000077],
+ [88.05723962400003, 24.63410471600004],
+ [88.04090987200004, 24.640435079000056],
+ [88.02178959200006, 24.64560272200005],
+ [88.02716394100014, 24.675730082000044],
+ [88.0354321690001, 24.69381683400006],
+ [88.04845463100014, 24.71120595300009],
+ [88.05320886200013, 24.754975891000086],
+ [88.06426761900013, 24.759161682000112],
+ [88.07698002200004, 24.761177063000062],
+ [88.0840080160001, 24.770452983000084],
+ [88.08535160400004, 24.78401804600007],
+ [88.08824548300004, 24.796136170000054],
+ [88.09480839000008, 24.803112488000053],
+ [88.10777917500013, 24.801097107000103],
+ [88.11739099100004, 24.81926137300003],
+ [88.13124027500004, 24.831767070000055],
+ [88.14095544500003, 24.844582825000103],
+ [88.13806156400005, 24.863496399000056],
+ [88.12493575100012, 24.89814544700006],
+ [88.12033654800007, 24.906775411000027],
+ [88.11491052200006, 24.912020569000035],
+ [88.11491052200006, 24.916413066000032],
+ [88.16451989700005, 24.941114400000046],
+ [88.1830200610001, 24.946979675000037],
+ [88.20245039900004, 24.945300191000072],
+ [88.21878015100009, 24.93514577200004],
+ [88.23283614100012, 24.918273417000037],
+ [88.24187951700009, 24.898765564000044],
+ [88.24275801600004, 24.880601299000105],
+ [88.25485030100009, 24.87995534300005],
+ [88.29681156400011, 24.86969757100006],
+ [88.31360640500009, 24.868302307000064],
+ [88.32275313400004, 24.8746843470001],
+ [88.34089156100009, 24.904139913],
+ [88.37566980000014, 24.945610251000076],
+ [88.38786543800006, 24.968761292000053],
+ [88.39101770100007, 24.99509043400012],
+ [88.41411706500008, 25.021522929000085],
+ [88.42579593900007, 25.051056010000124],
+ [88.43416752100012, 25.11665924100005],
+ [88.4314803470001, 25.173038229000056],
+ [88.44129886900004, 25.189729716],
+ [88.47540531400011, 25.195104065000052],
+ [88.49183842000008, 25.191124980000083],
+ [88.5231543380001, 25.179807841000112],
+ [88.5500260820001, 25.1731415820001],
+ [88.55467696100004, 25.171126201000035],
+ [88.55937951600004, 25.17076446600005],
+ [88.57069665500012, 25.173244935000028],
+ [88.57772465000005, 25.177482401000063],
+ [88.59012699400012, 25.190143127000013],
+ [88.59911869300004, 25.193140361000033],
+ [88.6342586670001, 25.19226186200008],
+ [88.66459273300012, 25.18688751200004],
+ [88.72453739400004, 25.166475322000068],
+ [88.78422367300004, 25.16094594400009],
+ [88.79233687400006, 25.166578675000025],
+ [88.80251713100012, 25.188127747000053],
+ [88.8091317140001, 25.195259094],
+ [88.81708988500009, 25.19680938700013],
+ [88.82360111500003, 25.194845683],
+ [88.83021569900012, 25.191331686000026],
+ [88.89863529500013, 25.169317526000057],
+ [88.92416345200007, 25.167870585000074],
+ [88.90964237500003, 25.189161275000046],
+ [88.92788415600006, 25.192726949000118],
+ [88.93077803600005, 25.202648825000026],
+ [88.9279875090001, 25.215929667000026],
+ [88.9290727130001, 25.229417216000073],
+ [88.93775435400005, 25.240165914],
+ [88.97532312000004, 25.265228984000103],
+ [88.98235111500009, 25.27489247700005],
+ [88.98493493700005, 25.284969381000067],
+ [88.98271285000004, 25.29447784400007],
+ [88.97532312000004, 25.302642721000083],
+ [88.92648889200007, 25.300472310000075],
+ [88.90287276200007, 25.30341786700008],
+ [88.88612959800014, 25.31907582600006],
+ [88.88018680800008, 25.32346832300003],
+ [88.85925785400013, 25.32470855700008],
+ [88.84902592000003, 25.327189026000056],
+ [88.84199792500004, 25.332821757000076],
+ [88.81833011900011, 25.35964182600007],
+ [88.81404097600006, 25.370390524000086],
+ [88.81326582800011, 25.380054016000102],
+ [88.81037194800012, 25.388425598000097],
+ [88.79962325000014, 25.39560862300003],
+ [88.79931319200006, 25.401706442000105],
+ [88.81631473800007, 25.437208151000036],
+ [88.81491947500007, 25.45860219300006],
+ [88.80582442200011, 25.471676331000097],
+ [88.79311202000014, 25.481959941000085],
+ [88.78096805800004, 25.495189108000105],
+ [88.77233809500012, 25.501958720000047],
+ [88.74195235200006, 25.51275909400006],
+ [88.74257246900004, 25.495189108000105],
+ [88.73265059500011, 25.49100331700005],
+ [88.72314213100003, 25.49141672800006],
+ [88.71415043100006, 25.492811992000057],
+ [88.70619226100013, 25.49167511000003],
+ [88.69565026900005, 25.48361358600006],
+ [88.68707198100003, 25.47389841700003],
+ [88.67808028100006, 25.465888570000047],
+ [88.66634973200013, 25.46289133800012],
+ [88.64542077600004, 25.46733551000004],
+ [88.61317468300007, 25.486404114000024],
+ [88.59358931500003, 25.495085755000062],
+ [88.55095625800004, 25.49648101800004],
+ [88.53028568600013, 25.500201721000067],
+ [88.52046716400008, 25.50929677400002],
+ [88.51276737500007, 25.523714498000047],
+ [88.48558557100012, 25.542628072000085],
+ [88.47540531400011, 25.56257517600001],
+ [88.43778487200012, 25.579835104],
+ [88.42378055900008, 25.592237447000073],
+ [88.41943973800011, 25.653784078000072],
+ [88.39298140400012, 25.680759176000024],
+ [88.32027266500006, 25.725252584000103],
+ [88.25991459200009, 25.789021301000034],
+ [88.22746179300003, 25.80426584900006],
+ [88.18271000200008, 25.792431946000065],
+ [88.16622522000011, 25.78364695300006],
+ [88.14643314600005, 25.77574045800013],
+ [88.12772627800007, 25.77491363500009],
+ [88.11491052200006, 25.787264303000043],
+ [88.1080375570001, 25.806281230000124],
+ [88.10333500200005, 25.814807841000047],
+ [88.08757369000006, 25.830982564000024],
+ [88.08757369000006, 25.839974264000077],
+ [88.08896895400005, 25.84865590400004],
+ [88.08204431200005, 25.86384877600007],
+ [88.07439620000008, 25.90813547800009],
+ [88.07739343300005, 25.91278635700006],
+ [88.08266442900003, 25.9159386190001],
+ [88.08803877800005, 25.923224996],
+ [88.10653894000012, 25.97996571900002],
+ [88.12586592600007, 26.013400371],
+ [88.1510323490001, 26.031332093000074],
+ [88.15790531400006, 26.050452373000056],
+ [88.15640669800007, 26.061407776000053],
+ [88.15098067200006, 26.066988830000057],
+ [88.14477950000008, 26.0705028280001],
+ [88.14116215000013, 26.075463766000055],
+ [88.13992191600005, 26.085333964000043],
+ [88.14136885600004, 26.090501607000036],
+ [88.14446944200012, 26.095875957000104],
+ [88.15563155100006, 26.128483785000057],
+ [88.16379642800007, 26.140472717000122],
+ [88.19692102100004, 26.159644674000035],
+ [88.20565433800004, 26.16641428700008],
+ [88.21195886300006, 26.173752340000064],
+ [88.21888350500012, 26.180160217000022],
+ [88.22978723200009, 26.18403595000005],
+ [88.25030277600007, 26.18801503500005],
+ [88.30869714400012, 26.206101787000065],
+ [88.32626713100012, 26.215920309000026],
+ [88.33453536000013, 26.23080312100008],
+ [88.33293339100004, 26.267235006000064],
+ [88.33660241700011, 26.281807760000035],
+ [88.35169193600012, 26.300979717000033],
+ [88.36678145400003, 26.31343373600002],
+ [88.41380700700006, 26.340202129000076],
+ [88.42119673700012, 26.348728740000112],
+ [88.4260026450001, 26.35792714500009],
+ [88.43168705300013, 26.362216289000074],
+ [88.44202233900006, 26.356118470000112],
+ [88.44863692200005, 26.353431295000078],
+ [88.4579903560001, 26.353017883000078],
+ [88.46791223200006, 26.35405141200006],
+ [88.47540531400011, 26.35580841100004],
+ [88.49762618100004, 26.352707825],
+ [88.49545577000009, 26.378080953000094],
+ [88.47540531400011, 26.432031148000036],
+ [88.46114261900004, 26.453890280000067],
+ [88.43458093200013, 26.465155741000032],
+ [88.37691003500004, 26.475335999000023],
+ [88.35355228700013, 26.484586080000028],
+ [88.34652429200008, 26.484017639000072],
+ [88.34301029400007, 26.477196351000103],
+ [88.34021976700006, 26.454148662000065],
+ [88.33562056500006, 26.44820587200003],
+ [88.32254642700008, 26.451771546000103],
+ [88.31510502100008, 26.465052389],
+ [88.31386478700006, 26.481537170000095],
+ [88.31934248900012, 26.494921367000032],
+ [88.33236495000006, 26.514661764],
+ [88.35282881700005, 26.578688864000085],
+ [88.36027022300004, 26.59310658800011],
+ [88.37251753700008, 26.611606751000025],
+ [88.38528161700003, 26.623544007000064],
+ [88.39437666800012, 26.61801462800007],
+ [88.39592696100004, 26.599566142000057],
+ [88.39499678600009, 26.578378805000014],
+ [88.39789066600008, 26.558690084000048],
+ [88.41101648000011, 26.545099182000072],
+ [88.44646651200009, 26.53553904300007],
+ [88.46238285300007, 26.528821106000052],
+ [88.47540531400011, 26.514971823000067],
+ [88.48791101100011, 26.50577341800009],
+ [88.49865970900004, 26.4948696900001],
+ [88.50682458500006, 26.487634989000057],
+ [88.52682336400011, 26.475387676000125],
+ [88.54976770000013, 26.466654358000042],
+ [88.55798425300009, 26.465724182000102],
+ [88.57917159000004, 26.466034241000088],
+ [88.59116052200005, 26.46122833300008],
+ [88.59787845900007, 26.451461487000117],
+ [88.60356286700005, 26.44019602500005],
+ [88.6115210370001, 26.43084259100003],
+ [88.62237308800007, 26.424538066000096],
+ [88.63301843300013, 26.4200938930001],
+ [88.65627282700007, 26.41513295500006],
+ [88.65193200700008, 26.407071432000052],
+ [88.64986495000005, 26.3983897910001],
+ [88.6522420660001, 26.39151682600003],
+ [88.66107873600009, 26.388881328000124],
+ [88.66852014200009, 26.385729065000064],
+ [88.66743493700011, 26.36815907800009],
+ [88.67337772700012, 26.360717672000064],
+ [88.69627038600004, 26.350279032000046],
+ [88.70970625900009, 26.34061554],
+ [88.71223840300007, 26.328264872000048],
+ [88.70298832200007, 26.309661357],
+ [88.69012089100005, 26.299842835000035],
+ [88.65327559400004, 26.283099671000073],
+ [88.64583418800004, 26.27601999900004],
+ [88.6634041750001, 26.26444447900009],
+ [88.74794681800006, 26.292504782000023],
+ [88.78401696800006, 26.27994740900003],
+ [88.79202681500004, 26.264599508000046],
+ [88.7984863690001, 26.247649638000055],
+ [88.80799483200008, 26.23343861900007],
+ [88.82484134900005, 26.22656565400011],
+ [88.84065433800009, 26.2320433550001],
+ [88.85564050400012, 26.2651162720001],
+ [88.8757943110001, 26.27736358600002],
+ [88.90271773300003, 26.272919414000015],
+ [88.94684940600013, 26.232921855000043],
+ [88.97532312000004, 26.22434356700002],
+ [89.01945479300014, 26.23447214800005],
+ [89.03971195500003, 26.24718455000003],
+ [89.03433760600007, 26.26578806600007],
+ [89.02353723100003, 26.2688369750001],
+ [89.01159997600013, 26.2691987110001],
+ [89.00436527500005, 26.275709941000073],
+ [89.00798262600011, 26.29715566],
+ [88.99862919200007, 26.291522929000067],
+ [88.98968916900009, 26.289404195000074],
+ [88.9817309980001, 26.291832987000063],
+ [88.97532312000004, 26.29994618800005],
+ [88.96602136200005, 26.328471578000105],
+ [88.94121667500008, 26.340098775000072],
+ [88.91243290200009, 26.348935445000066],
+ [88.89186568200006, 26.368779196000062],
+ [88.89124556500013, 26.38578074100006],
+ [88.89946211800003, 26.40448761000006],
+ [88.91196781400004, 26.421230774000023],
+ [88.92457686400007, 26.43213450100008],
+ [88.94100996900005, 26.439420878000064],
+ [88.95015669700012, 26.436940410000076],
+ [88.95930342700012, 26.428568828],
+ [88.97532312000004, 26.417871806000093],
+ [88.98653690600008, 26.4127041630001],
+ [89.00178145400014, 26.397149557000077],
+ [89.01087650500011, 26.390173239000077],
+ [89.02178023300007, 26.38624582900009],
+ [89.04374271700004, 26.381078186000096],
+ [89.05263106300004, 26.374618632000036],
+ [89.05728194200003, 26.362629700000085],
+ [89.05407800300003, 26.353948059000018],
+ [89.05521488500005, 26.347023417000045],
+ [89.07185469600006, 26.34061554],
+ [89.09572920800008, 26.33451772100004],
+ [89.10291223200011, 26.327334696],
+ [89.10353234900009, 26.313692118000077],
+ [89.09479903200014, 26.30950632700005],
+ [89.0803296310001, 26.315604146000013],
+ [89.0688574620001, 26.314260559000033],
+ [89.06942590300014, 26.287388815000057],
+ [89.07588545700008, 26.271059062000106],
+ [89.09588423700012, 26.24103505500004],
+ [89.10337732000005, 26.22517039000003],
+ [89.11169722500011, 26.16450225900006],
+ [89.11919030800004, 26.1466222130001],
+ [89.13159265100012, 26.133754781],
+ [89.19784183700011, 26.107709859000025],
+ [89.21262129800004, 26.098976543000063],
+ [89.22305993600008, 26.086574198000065],
+ [89.22926110800006, 26.067195537000103],
+ [89.23763269000011, 26.058100484000036],
+ [89.27297937100013, 26.043476054000067],
+ [89.29690555800005, 26.0181546030001],
+ [89.31514733900008, 26.006785787000084],
+ [89.33530114700005, 25.998569235000062],
+ [89.35147587100005, 25.996863912000023],
+ [89.3677539470001, 26.005442200000047],
+ [89.37974287900005, 26.015312399000024],
+ [89.39142175300003, 26.015467428000065],
+ [89.40661462500003, 25.995055237000102],
+ [89.4112655030001, 25.993194885000023],
+ [89.41612308700013, 25.992626444000066],
+ [89.42118737800007, 25.993194885000023],
+ [89.42635502100012, 25.994951884000088],
+ [89.42640669700012, 25.995055237000102],
+ [89.48061527500005, 25.999241028000043],
+ [89.4856278900001, 25.998724263000028],
+ [89.49064050300007, 25.997329],
+ [89.49534305900005, 25.995055237000102],
+ [89.50945072500008, 25.97262766500002],
+ [89.51818404200003, 25.96208567400005],
+ [89.52841597500003, 25.957124735000022],
+ [89.54169681900004, 25.959708558],
+ [89.54908654800005, 25.96885528600008],
+ [89.55182539900011, 25.98151601200003],
+ [89.55068851700008, 25.995055237000102],
+ [89.55916345200006, 26.02223704],
+ [89.60288171400009, 26.055258280000075],
+ [89.61135664900007, 26.072208150000066],
+ [89.60386356700013, 26.084662171000062],
+ [89.5907894290001, 26.085023906000046],
+ [89.57694014500004, 26.082646790000112],
+ [89.56701827000012, 26.087090963000023],
+ [89.56691491700008, 26.098976543000063],
+ [89.57787032100009, 26.107244771000083],
+ [89.59254642800005, 26.113962708000102],
+ [89.60422530100004, 26.120732320000073],
+ [89.58577681500003, 26.122902731000053],
+ [89.56939538600005, 26.130085754],
+ [89.56278080300007, 26.142591452000104],
+ [89.57342614800007, 26.16072987900013],
+ [89.57993737800012, 26.166104228000094],
+ [89.58675866700008, 26.169204814000025],
+ [89.59399336800004, 26.16972157800008],
+ [89.6144055580001, 26.164192200000073],
+ [89.61528405800004, 26.169101461000096],
+ [89.60846276900008, 26.180676982000037],
+ [89.60639571100012, 26.2110110470001],
+ [89.61332035300012, 26.219382629000066],
+ [89.63492110200008, 26.22584218300001],
+ [89.65300785400007, 26.222689921000054],
+ [89.65838220200004, 26.207858785000028],
+ [89.6578286080001, 26.18717448300005],
+ [89.65724532100006, 26.165380758000097],
+ [89.65579838100007, 26.161298320000085],
+ [89.65817549700012, 26.159231262000034],
+ [89.6703711340001, 26.15411529600003],
+ [89.67770918800011, 26.153133443000073],
+ [89.69765629100004, 26.154787089000095],
+ [89.70654463700004, 26.154166972000056],
+ [89.7184818930001, 26.14553700800009],
+ [89.72432133000007, 26.130654195000048],
+ [89.72876550300009, 26.114169413000084],
+ [89.73672367300003, 26.100578511],
+ [89.74984948700012, 26.08388702400005],
+ [89.75114139900006, 26.071536357000085],
+ [89.74871260600008, 26.05903066000009],
+ [89.75021122300012, 26.041564026000046],
+ [89.75584395400011, 26.032417297000066],
+ [89.77641117400003, 26.008232727000077],
+ [89.78395593200008, 25.99510691300013],
+ [89.78943363500014, 25.9879755650001],
+ [89.79553145400013, 25.985960185000053],
+ [89.80204268400007, 25.98864736000006],
+ [89.80886397300003, 25.99510691300013],
+ [89.80917403100011, 25.99510691300013],
+ [89.80932906100008, 25.995210266000058],
+ [89.81103438300005, 25.99603708900007],
+ [89.81268802900007, 25.996347148000055],
+ [89.81413496900007, 25.99614044200011],
+ [89.8152718500001, 25.99510691300013],
+ [89.82865604700004, 25.979397278000064],
+ [89.82560713700008, 25.965703024000035],
+ [89.81155114700005, 25.955212708000076],
+ [89.79201745600005, 25.94911488900003],
+ [89.81072432500014, 25.938779603000015],
+ [89.82643396000003, 25.937487691000072],
+ [89.83439213000008, 25.931751608000113],
+ [89.83005131100009, 25.90798044900005],
+ [89.7869531660001, 25.839147441000065],
+ [89.78312911000006, 25.81444610700005],
+ [89.80152592000013, 25.72468414400005],
+ [89.82421187300008, 25.674092916000106],
+ [89.83439213000008, 25.63476715100002],
+ [89.82509037300014, 25.56448720300004],
+ [89.82323002100003, 25.489142965000056],
+ [89.80856794000005, 25.439507112000015],
+ [89.80069909700012, 25.41286855100013],
+ [89.79923403500004, 25.402892809000022],
+ [89.79501469000007, 25.374162903000112],
+ [89.79852868700004, 25.340056458000035],
+ [89.80736535600005, 25.304503073],
+ [89.81904423000009, 25.284969381000067],
+ [89.83459883600011, 25.282437236000092],
+ [89.87020389800011, 25.29556305000007],
+ [89.90813440000011, 25.29690663700002],
+ [90.13008467700013, 25.211588847000044],
+ [90.28692264800003, 25.180066223000082],
+ [90.36464400300014, 25.149990540000104],
+ [90.39978397700008, 25.149008687000034],
+ [90.50137984200012, 25.168800761000014],
+ [90.58333866400005, 25.16203114900007],
+ [90.62343957500008, 25.171436259000032],
+ [90.6375989180001, 25.171074524000048],
+ [90.64896773300012, 25.167818909000047],
+ [90.67056848100009, 25.158775533],
+ [90.70767216000013, 25.15298777300002],
+ [90.71635380000009, 25.153556214000062],
+ [90.72203820800007, 25.15660512300009],
+ [90.73268355400006, 25.16688873300008],
+ [90.73795454900005, 25.16942087900007],
+ [90.75397424300013, 25.167560527000077],
+ [90.76689335100014, 25.16053253200006],
+ [90.77939904800013, 25.151954244000038],
+ [90.7939718020001, 25.14539133700005],
+ [90.82198042800007, 25.142290752000108],
+ [90.93482138600007, 25.156359858000044],
+ [90.9434200450001, 25.15743194600013],
+ [90.97514937400013, 25.167818909000047],
+ [91.13534631400006, 25.191228333000097],
+ [91.19084680200012, 25.189471334000032],
+ [91.20314579300009, 25.191331686000026],
+ [91.22495324700009, 25.201615296000043],
+ [91.23570194500013, 25.201925354000096],
+ [91.28396773300005, 25.178981018000073],
+ [91.43186568300013, 25.137949931000023],
+ [91.47103641800004, 25.133919170000027],
+ [91.4807515870001, 25.135262757000092],
+ [91.50090539600006, 25.14115387],
+ [91.51165409400011, 25.14249745700006],
+ [91.52343632100008, 25.145184632000095],
+ [91.54017948400013, 25.157638652000074],
+ [91.5487577720001, 25.161100973000103],
+ [91.56612105300007, 25.15996409100002],
+ [91.57345910700008, 25.152264302000034],
+ [91.5801770430001, 25.140895488000027],
+ [91.59619673700007, 25.128906555000086],
+ [91.61314660700009, 25.12513417600006],
+ [91.63867476400003, 25.12404897100005],
+ [91.66203251100006, 25.127201233],
+ [91.67226444500005, 25.13650299100003],
+ [91.67743208800005, 25.152626038000037],
+ [91.68890425700005, 25.15298777300002],
+ [91.70182336400006, 25.14714833600003],
+ [91.7107117110001, 25.14466786800007],
+ [91.71773970600009, 25.149835511000063],
+ [91.72373417200004, 25.161927796000057],
+ [91.73014204900005, 25.167457174000063],
+ [91.74533492100011, 25.169369202000055],
+ [91.79370406100003, 25.16533844000007],
+ [91.90057092300009, 25.177585754000106],
+ [91.95627811700012, 25.169782613000066],
+ [91.97508833800003, 25.175363668],
+ [92.00175337700006, 25.18296010400006],
+ [92.03399947100013, 25.181668193000107],
+ [92.06603886000005, 25.174536845000077],
+ [92.09291060400011, 25.164718323],
+ [92.1004553630001, 25.159085592000068],
+ [92.11037723800007, 25.144874573000024],
+ [92.11616499900003, 25.139448548000033],
+ [92.12412316900003, 25.136968079000056],
+ [92.13859257000013, 25.136399638000015],
+ [92.14551721200013, 25.13169708200003],
+ [92.15099491400008, 25.129733379000086],
+ [92.16474084500004, 25.133557434000053],
+ [92.17269901600008, 25.131955465000104],
+ [92.17921024600008, 25.126684469000068],
+ [92.19409305900012, 25.109166159000026],
+ [92.20804569500012, 25.098107401],
+ [92.22013798000012, 25.090381775000097],
+ [92.2336772060001, 25.08495575000005],
+ [92.25155725100012, 25.080795797000107],
+ [92.30354374200004, 25.07428456600003],
+ [92.31212203000007, 25.0686001590001],
+ [92.32814172400003, 25.048007101000096],
+ [92.35625370300005, 25.037000021],
+ [92.38105839100012, 25.02343495700002],
+ [92.38493703500006, 25.004773236000048],
+ [92.38687592400004, 24.9954444560001],
+ [92.38692635100006, 24.99520183],
+ [92.38694950400003, 24.99509043400012],
+ [92.39470096900004, 24.993230082000096],
+ [92.41186000600004, 24.987527227000058],
+ [92.41213950000014, 24.987434336],
+ [92.4122709560001, 24.987390646000037],
+ [92.41246032100014, 24.98436081700008],
+ [92.41247766200007, 24.98408335400002],
+ [92.44444627300004, 24.962427197000082],
+ [92.44451704900007, 24.96237925200002],
+ [92.45376877000012, 24.9582310630001],
+ [92.45402551300003, 24.95811594700008],
+ [92.45782812800007, 24.953557685000035],
+ [92.45805627500005, 24.953284201000045],
+ [92.45002848600006, 24.94663618700004],
+ [92.4497880460001, 24.946437073000098],
+ [92.4742723330001, 24.936715371000062],
+ [92.4743860270001, 24.93667022800004],
+ [92.48379113800013, 24.92822113000004],
+ [92.49126714800008, 24.912424218000055],
+ [92.49133589700006, 24.91227895100012],
+ [92.49453983600006, 24.894863993000072],
+ [92.49154260200004, 24.883727722000046],
+ [92.47769331900008, 24.863909810000067],
+ [92.44203658000009, 24.855409037000058],
+ [92.38074833200005, 24.836702169000077],
+ [92.37092980900007, 24.837916565000015],
+ [92.36359175600006, 24.84101715100006],
+ [92.36350740900014, 24.841120014000026],
+ [92.35935428900012, 24.846184794000052],
+ [92.35932057700006, 24.84642836600004],
+ [92.35832076000014, 24.853652039000096],
+ [92.35814605200005, 24.853748899000024],
+ [92.29041792900011, 24.891298320000104],
+ [92.29024450000003, 24.891351286000045],
+ [92.2521773680001, 24.902977194000087],
+ [92.2230318610001, 24.89137583400013],
+ [92.21765751100003, 24.874580994000084],
+ [92.22175905800003, 24.857046883000052],
+ [92.22179162600014, 24.856907654000068],
+ [92.23492786100007, 24.82499071000008],
+ [92.23502079300005, 24.824764914000028],
+ [92.23688114400005, 24.808590190000032],
+ [92.23646773300004, 24.793035584],
+ [92.23378055900008, 24.777532654000098],
+ [92.18293094900008, 24.647256368000015],
+ [92.1734224860001, 24.60839569200006],
+ [92.16887496000004, 24.574315084000077],
+ [92.16360396300013, 24.55919972800008],
+ [92.1531653240001, 24.54454945900001],
+ [92.14997986200007, 24.54218295400004],
+ [92.13859257000013, 24.533723246000065],
+ [92.12319299300003, 24.525377503000087],
+ [92.11089400300011, 24.514292908000087],
+ [92.10593306500004, 24.495250143000092],
+ [92.11120406100008, 24.43429779100005],
+ [92.10758671100012, 24.40597910600006],
+ [92.08825972500006, 24.38163950700003],
+ [92.06273156800012, 24.37102],
+ [92.03337935400003, 24.368849590000067],
+ [91.9499735920001, 24.37538665800004],
+ [91.94883671100007, 24.363526917000016],
+ [91.97136763500009, 24.329678853000118],
+ [91.97219445900004, 24.316062114000104],
+ [91.95307417800012, 24.322986755],
+ [91.93095666500011, 24.336965231000093],
+ [91.92186161300003, 24.34450999000005],
+ [91.89984745300006, 24.338050435000085],
+ [91.89643680900014, 24.32011871400003],
+ [91.90687544800005, 24.28035369900003],
+ [91.90594527200011, 24.260639140000066],
+ [91.88434452300004, 24.17555389500005],
+ [91.87710982300007, 24.158035584000075],
+ [91.86450077300009, 24.15059417700006],
+ [91.84424361200007, 24.155322571000042],
+ [91.81375451700006, 24.183124492],
+ [91.81137740100013, 24.192038676000024],
+ [91.8097237550001, 24.214543763000037],
+ [91.80703658100003, 24.221132507000036],
+ [91.79659794100013, 24.221597595000063],
+ [91.73293257600011, 24.234284159000097],
+ [91.72301070200012, 24.22097747800008],
+ [91.72580122900007, 24.202063904000042],
+ [91.73200240000006, 24.181677551000107],
+ [91.73262251800003, 24.164314270000077],
+ [91.72115035100012, 24.148992208000024],
+ [91.70368371600006, 24.14294606500009],
+ [91.68415002500006, 24.145478211000082],
+ [91.66616662600006, 24.155916850000025],
+ [91.65717492700003, 24.17136810400011],
+ [91.63950158700004, 24.211701559000076],
+ [91.62906294800007, 24.21531890900006],
+ [91.62451542100007, 24.203459168000037],
+ [91.61376672300014, 24.140103862],
+ [91.60601525900012, 24.11886484800003],
+ [91.59650679500004, 24.104989726000056],
+ [91.58183068900007, 24.096101380000064],
+ [91.55867964700008, 24.089667663000014],
+ [91.51754520700007, 24.085197652000076],
+ [91.48044152900013, 24.088014018000067],
+ [91.40458052600007, 24.103129374000062],
+ [91.36303267500011, 24.099847921000062],
+ [91.35083703600009, 24.074242249000022],
+ [91.34928674300005, 24.036053366000132],
+ [91.3390548100001, 23.995228984000036],
+ [91.32706587800004, 23.987865092000035],
+ [91.31621382700007, 23.989467062000088],
+ [91.30843257700013, 23.992501035000103],
+ [91.30494836400004, 23.993859558000068],
+ [91.29161584500008, 23.994815573000025],
+ [91.27414921100006, 23.988226827000048],
+ [91.26092004400004, 23.97727142400008],
+ [91.25037805200003, 23.96404225700006],
+ [91.21627160700012, 23.90838673900005],
+ [91.21193078600004, 23.89445994100008],
+ [91.2127576090001, 23.880739848000033],
+ [91.22402307100003, 23.857485453000024],
+ [91.22815718600009, 23.844979757000104],
+ [91.2252633060001, 23.82614369800011],
+ [91.20521285000012, 23.77157338500008],
+ [91.19498091600013, 23.755166118000105],
+ [91.17658410700005, 23.746536154000083],
+ [91.15756717900007, 23.744985861000046],
+ [91.14175419100008, 23.73989573200008],
+ [91.13234908000004, 23.720646261000056],
+ [91.13658654800008, 23.698890483000028],
+ [91.15239953700006, 23.691009827000087],
+ [91.16893599500008, 23.685377096000067],
+ [91.1752405200001, 23.67031341600007],
+ [91.1664555260001, 23.654087016000048],
+ [91.15229618400014, 23.655094707000032],
+ [91.13968713400004, 23.65357025100012],
+ [91.13627648900012, 23.629514872000087],
+ [91.14082401500013, 23.61209991500006],
+ [91.16986617000003, 23.561973776000045],
+ [91.17751428300011, 23.544274597000125],
+ [91.1858858650001, 23.511563416000044],
+ [91.19508426900006, 23.495181986000077],
+ [91.20335249900012, 23.487921448000108],
+ [91.22081913300008, 23.47789622000009],
+ [91.22733036300014, 23.4687753300001],
+ [91.22970747900007, 23.461178894000042],
+ [91.23446171100005, 23.436270854000085],
+ [91.24789758300005, 23.393766989000127],
+ [91.2581295170001, 23.37363901800005],
+ [91.27094527200006, 23.3645956430001],
+ [91.28396773300005, 23.36144338000004],
+ [91.28727502500004, 23.35555226700005],
+ [91.28293420400007, 23.34764577300008],
+ [91.27290897700004, 23.338499044000017],
+ [91.26577762900007, 23.329352315000037],
+ [91.26753462700009, 23.321549174],
+ [91.27290897700004, 23.313487651000017],
+ [91.27724979600009, 23.303255717000027],
+ [91.30050419200012, 23.14230946900001],
+ [91.31352665200006, 23.101045838000076],
+ [91.33740116400003, 23.071073507000037],
+ [91.37088749200007, 23.06277944],
+ [91.37460819500006, 23.095723165000052],
+ [91.35590132700008, 23.17964569100006],
+ [91.35569462100011, 23.224139099000027],
+ [91.36096561700003, 23.247522685],
+ [91.37212772600009, 23.261888733000077],
+ [91.39434859200003, 23.2626638790001],
+ [91.41357222500005, 23.248633728000087],
+ [91.42814498000013, 23.229513449000095],
+ [91.43651656100008, 23.214863180000023],
+ [91.43620650200012, 23.215715841000062],
+ [91.43961714700004, 23.22264048200013],
+ [91.43992720500012, 23.223518983000062],
+ [91.44643843600005, 23.215534973],
+ [91.44674849500007, 23.20879119900006],
+ [91.44540490800011, 23.203029277],
+ [91.44643843600005, 23.1978874710001],
+ [91.46121789600011, 23.184425761000043],
+ [91.46359501200004, 23.184115702000057],
+ [91.47041630100011, 23.153290711000082],
+ [91.47506717900006, 23.14308461500012],
+ [91.49811486900012, 23.069962464000056],
+ [91.50328251200011, 23.0444084680001],
+ [91.50607303900006, 23.041178691000127],
+ [91.51558150200009, 23.03880157500008],
+ [91.51816532400005, 23.03508087200008],
+ [91.51940555800007, 23.005625305000066],
+ [91.52364302600006, 22.995212504000037],
+ [91.53656213400006, 22.981854146],
+ [91.54979130000004, 22.977229106000053],
+ [91.5631238200001, 22.974981181000132],
+ [91.57676639900006, 22.96880584800006],
+ [91.5830709230001, 22.957798767000057],
+ [91.58296757000005, 22.94790273100007],
+ [91.58606815600012, 22.94446624800004],
+ [91.60239790900005, 22.95296702100005],
+ [91.60828902200006, 22.96033091300005],
+ [91.61200972500006, 22.969839376000053],
+ [91.61666060400012, 22.978055929000064],
+ [91.62575565600008, 22.98154408800012],
+ [91.63278365100012, 22.98030385300008],
+ [91.63991499800005, 22.978004253000066],
+ [91.64694299300004, 22.97658315000008],
+ [91.65407434100007, 22.978055929000064],
+ [91.66761356600006, 22.982629293000016],
+ [91.69469201700014, 22.98813283300011],
+ [91.70699100800005, 22.995367534000067],
+ [91.7144324140001, 23.00311899800009],
+ [91.73127893100008, 23.017330018000038],
+ [91.73830692600006, 23.02466807100005],
+ [91.75505009000011, 23.048232524000056],
+ [91.75629032400008, 23.052159933000027],
+ [91.75556685400005, 23.05683665000008],
+ [91.75598026500006, 23.061539206000063],
+ [91.76094120300013, 23.065492453000033],
+ [91.76424849400013, 23.065647481000084],
+ [91.77375695800004, 23.06489817300006],
+ [91.77623742700007, 23.065259909000062],
+ [91.7913269450001, 23.080375265000086],
+ [91.79556441200003, 23.08949615500005],
+ [91.79194706200013, 23.101149190000015],
+ [91.77902795400013, 23.131767476000036],
+ [91.76393843600005, 23.200626323000037],
+ [91.74915897700004, 23.232407329000083],
+ [91.74368127400004, 23.27232737300004],
+ [91.7625948490001, 23.321549174],
+ [91.79163700400005, 23.368342183000024],
+ [91.81768192600003, 23.40092417400008],
+ [91.83380497300004, 23.413894959000103],
+ [91.88909875500013, 23.43593495800009],
+ [91.9051184490001, 23.446631979000088],
+ [91.91814091000003, 23.459938660000105],
+ [91.94077518800009, 23.495181986000077],
+ [91.94232548000008, 23.534430237000052],
+ [91.91597050000007, 23.650159607000077],
+ [91.91442020700003, 23.68832265300007],
+ [91.91648726400007, 23.7098717250001],
+ [91.9226884360001, 23.72297170000006],
+ [91.93664107300009, 23.723540141000043],
+ [91.94914677000008, 23.709768372000084],
+ [91.96165246600009, 23.691139018000015],
+ [92.00351037700005, 23.647420757000035],
+ [92.01901330600003, 23.640056865000034],
+ [92.04237105300007, 23.64556040500004],
+ [92.05963098100005, 23.659487203000126],
+ [92.09218713400003, 23.701345114],
+ [92.10841353400014, 23.718243307000094],
+ [92.15078820800005, 23.731653341000126],
+ [92.17063195800006, 23.70364471400002],
+ [92.18076053900012, 23.665378317000105],
+ [92.19429976400005, 23.648144226000042],
+ [92.20938928200007, 23.661605937],
+ [92.22210168500004, 23.70777882900005],
+ [92.23874149600005, 23.7168480430001],
+ [92.25930871600013, 23.706486918000095],
+ [92.25973660500011, 23.702640572000078],
+ [92.26168583200007, 23.68511871300008],
+ [92.25000695800003, 23.642614848000036],
+ [92.25279748500009, 23.609309388],
+ [92.29103804500005, 23.49528534000011],
+ [92.29682580600013, 23.446580302000072],
+ [92.30147668500007, 23.431800842000072],
+ [92.30674768100005, 23.423868510000105],
+ [92.31977014200004, 23.412163798000037],
+ [92.32535119700009, 23.403507995000083],
+ [92.32690149000013, 23.39601491300003],
+ [92.32535119700009, 23.382165629000085],
+ [92.32669478400004, 23.375266825],
+ [92.33165572100012, 23.368652243],
+ [92.34488488800008, 23.359117940000104],
+ [92.34860559100008, 23.354105326000038],
+ [92.34953576700013, 23.344958598000076],
+ [92.34674523900009, 23.325295715000024],
+ [92.3470552980001, 23.315425517000037],
+ [92.3522229410001, 23.29883738200003],
+ [92.35687382000003, 23.289122213],
+ [92.35749393700013, 23.278941956000025],
+ [92.35067264900005, 23.26098439500005],
+ [92.3326892500001, 23.226257833000105],
+ [92.32855513500004, 23.211194153000022],
+ [92.3276249590001, 23.171429138000022],
+ [92.3530497650001, 23.02991322800007],
+ [92.3522229410001, 22.96033091300005],
+ [92.35987105300006, 22.92661204000008],
+ [92.37868127500008, 22.900437928000073],
+ [92.4118575440001, 22.887932231],
+ [92.42632694500003, 22.871059876000103],
+ [92.4350085860001, 22.793286846000072],
+ [92.44203658000009, 22.762926941000032],
+ [92.45371545400008, 22.74796661400005],
+ [92.48069055200011, 22.726159159000034],
+ [92.49154260200004, 22.711069641000037],
+ [92.49588342300012, 22.695618388000028],
+ [92.50291141800011, 22.618620504000106],
+ [92.50084436000009, 22.560536194000022],
+ [92.50456506400008, 22.54379303000009],
+ [92.51738081900004, 22.512580465],
+ [92.51893111200008, 22.49537221300004],
+ [92.57701542200004, 22.168673808000065],
+ [92.57556848200005, 22.143300680000053],
+ [92.56419966700008, 22.1383397420001],
+ [92.54931685400004, 22.138494772000072],
+ [92.5373279210001, 22.128624573000067],
+ [92.55996219900004, 22.061341859],
+ [92.57308801300007, 21.995402731000084],
+ [92.57515507000005, 21.98656606100009],
+ [92.57587854000013, 21.977574362000027]
+ ]
+ ]
+ }
+}
diff --git a/remotion-best-practices/remotion-maps/techniques/maptiler/assets/sample-data/yarlung-flow.json b/remotion-best-practices/remotion-maps/techniques/maptiler/assets/sample-data/yarlung-flow.json
new file mode 100644
index 0000000..e5923b9
--- /dev/null
+++ b/remotion-best-practices/remotion-maps/techniques/maptiler/assets/sample-data/yarlung-flow.json
@@ -0,0 +1,605 @@
+[
+ [84.144, 29.565],
+ [84.171, 29.577],
+ [84.22500000000001, 29.559],
+ [84.246, 29.541],
+ [84.297, 29.544],
+ [84.321, 29.532],
+ [84.411, 29.544],
+ [84.426, 29.529],
+ [84.45, 29.535],
+ [84.468, 29.523],
+ [84.492, 29.523],
+ [84.531, 29.490000000000002],
+ [84.507, 29.466],
+ [84.501, 29.445],
+ [84.513, 29.385],
+ [84.495, 29.379],
+ [84.483, 29.361],
+ [84.486, 29.34],
+ [84.519, 29.316],
+ [84.51, 29.292],
+ [84.522, 29.286],
+ [84.525, 29.265],
+ [84.57600000000001, 29.253],
+ [84.58800000000001, 29.259],
+ [84.60300000000001, 29.247],
+ [84.615, 29.265],
+ [84.63, 29.268],
+ [84.624, 29.283],
+ [84.651, 29.286],
+ [84.669, 29.259],
+ [84.732, 29.25],
+ [84.741, 29.235],
+ [84.771, 29.25],
+ [84.777, 29.241],
+ [84.843, 29.223],
+ [84.864, 29.232],
+ [84.879, 29.202],
+ [84.9, 29.199],
+ [84.909, 29.181],
+ [84.933, 29.184],
+ [84.96900000000001, 29.163],
+ [85.023, 29.187],
+ [85.071, 29.259],
+ [85.122, 29.274],
+ [85.167, 29.322],
+ [85.185, 29.310000000000002],
+ [85.26, 29.319],
+ [85.284, 29.301000000000002],
+ [85.34400000000001, 29.289],
+ [85.35600000000001, 29.265],
+ [85.413, 29.262],
+ [85.431, 29.271],
+ [85.449, 29.247],
+ [85.464, 29.244],
+ [85.521, 29.25],
+ [85.551, 29.265],
+ [85.611, 29.235],
+ [85.617, 29.193],
+ [85.662, 29.172],
+ [85.686, 29.172],
+ [85.69500000000001, 29.184],
+ [85.71600000000001, 29.172],
+ [85.72800000000001, 29.187],
+ [85.764, 29.181],
+ [85.761, 29.193],
+ [85.776, 29.202],
+ [85.788, 29.196],
+ [85.797, 29.22],
+ [85.809, 29.211000000000002],
+ [85.848, 29.211000000000002],
+ [85.863, 29.193],
+ [85.881, 29.193],
+ [85.917, 29.172],
+ [85.968, 29.175],
+ [86.004, 29.163],
+ [86.09400000000001, 29.175],
+ [86.10000000000001, 29.166],
+ [86.133, 29.172],
+ [86.148, 29.166],
+ [86.193, 29.178],
+ [86.223, 29.202],
+ [86.268, 29.193],
+ [86.295, 29.208000000000002],
+ [86.34, 29.205000000000002],
+ [86.412, 29.217000000000002],
+ [86.427, 29.211000000000002],
+ [86.43, 29.199],
+ [86.47800000000001, 29.196],
+ [86.496, 29.22],
+ [86.514, 29.211000000000002],
+ [86.52, 29.235],
+ [86.529, 29.238],
+ [86.535, 29.217000000000002],
+ [86.559, 29.196],
+ [86.607, 29.202],
+ [86.616, 29.184],
+ [86.658, 29.193],
+ [86.67, 29.205000000000002],
+ [86.682, 29.199],
+ [86.7, 29.208000000000002],
+ [86.736, 29.205000000000002],
+ [86.778, 29.187],
+ [86.805, 29.196],
+ [86.82300000000001, 29.184],
+ [86.84100000000001, 29.19],
+ [86.901, 29.181],
+ [86.949, 29.163],
+ [87.027, 29.172],
+ [87.039, 29.148],
+ [87.063, 29.136],
+ [87.084, 29.142],
+ [87.12, 29.175],
+ [87.162, 29.142],
+ [87.21000000000001, 29.142],
+ [87.237, 29.157],
+ [87.249, 29.136],
+ [87.297, 29.127],
+ [87.303, 29.115000000000002],
+ [87.366, 29.121000000000002],
+ [87.459, 29.097],
+ [87.486, 29.115000000000002],
+ [87.546, 29.109],
+ [87.56700000000001, 29.121000000000002],
+ [87.59400000000001, 29.121000000000002],
+ [87.60600000000001, 29.133],
+ [87.654, 29.139],
+ [87.666, 29.13],
+ [87.684, 29.133],
+ [87.687, 29.157],
+ [87.669, 29.181],
+ [87.675, 29.205000000000002],
+ [87.705, 29.217000000000002],
+ [87.714, 29.235],
+ [87.732, 29.238],
+ [87.732, 29.253],
+ [87.756, 29.283],
+ [87.753, 29.301000000000002],
+ [87.789, 29.304000000000002],
+ [87.795, 29.328],
+ [87.81, 29.337],
+ [87.849, 29.331],
+ [87.87, 29.349],
+ [87.906, 29.343],
+ [87.924, 29.349],
+ [87.97800000000001, 29.388],
+ [87.996, 29.376],
+ [88.014, 29.379],
+ [88.017, 29.37],
+ [88.125, 29.367],
+ [88.137, 29.337],
+ [88.161, 29.331],
+ [88.176, 29.337],
+ [88.188, 29.325],
+ [88.2, 29.328],
+ [88.221, 29.367],
+ [88.245, 29.367],
+ [88.287, 29.349],
+ [88.299, 29.358],
+ [88.365, 29.316],
+ [88.41, 29.322],
+ [88.422, 29.316],
+ [88.443, 29.325],
+ [88.458, 29.349],
+ [88.503, 29.361],
+ [88.536, 29.334],
+ [88.563, 29.328],
+ [88.596, 29.349],
+ [88.629, 29.346],
+ [88.641, 29.334],
+ [88.671, 29.34],
+ [88.71000000000001, 29.331],
+ [88.72800000000001, 29.343],
+ [88.791, 29.337],
+ [88.818, 29.352],
+ [88.86, 29.319],
+ [88.884, 29.334],
+ [88.908, 29.316],
+ [88.923, 29.331],
+ [88.962, 29.328],
+ [88.971, 29.349],
+ [89.007, 29.361],
+ [89.019, 29.352],
+ [89.034, 29.358],
+ [89.08500000000001, 29.322],
+ [89.136, 29.316],
+ [89.16, 29.343],
+ [89.181, 29.337],
+ [89.211, 29.349],
+ [89.235, 29.379],
+ [89.253, 29.373],
+ [89.265, 29.385],
+ [89.289, 29.385],
+ [89.307, 29.376],
+ [89.349, 29.379],
+ [89.397, 29.358],
+ [89.45100000000001, 29.355],
+ [89.46000000000001, 29.334],
+ [89.58, 29.358],
+ [89.595, 29.346],
+ [89.61, 29.355],
+ [89.631, 29.346],
+ [89.661, 29.349],
+ [89.679, 29.364],
+ [89.757, 29.295],
+ [89.787, 29.292],
+ [89.808, 29.310000000000002],
+ [89.85300000000001, 29.322],
+ [89.931, 29.319],
+ [89.985, 29.343],
+ [90.015, 29.337],
+ [90.072, 29.352],
+ [90.156, 29.355],
+ [90.168, 29.346],
+ [90.20100000000001, 29.349],
+ [90.22500000000001, 29.331],
+ [90.273, 29.337],
+ [90.276, 29.328],
+ [90.342, 29.313],
+ [90.378, 29.295],
+ [90.435, 29.241],
+ [90.477, 29.256],
+ [90.492, 29.25],
+ [90.51, 29.256],
+ [90.522, 29.247],
+ [90.54, 29.262],
+ [90.621, 29.277],
+ [90.642, 29.301000000000002],
+ [90.663, 29.298000000000002],
+ [90.681, 29.313],
+ [90.684, 29.328],
+ [90.705, 29.34],
+ [90.729, 29.328],
+ [90.747, 29.337],
+ [90.765, 29.328],
+ [90.768, 29.310000000000002],
+ [90.756, 29.295],
+ [90.771, 29.277],
+ [90.855, 29.283],
+ [90.897, 29.319],
+ [90.933, 29.310000000000002],
+ [90.95100000000001, 29.295],
+ [90.993, 29.322],
+ [91.035, 29.295],
+ [91.065, 29.316],
+ [91.116, 29.325],
+ [91.131, 29.313],
+ [91.173, 29.325],
+ [91.194, 29.286],
+ [91.233, 29.274],
+ [91.296, 29.289],
+ [91.308, 29.277],
+ [91.34700000000001, 29.28],
+ [91.374, 29.292],
+ [91.395, 29.28],
+ [91.449, 29.286],
+ [91.479, 29.268],
+ [91.512, 29.28],
+ [91.533, 29.271],
+ [91.554, 29.289],
+ [91.587, 29.292],
+ [91.602, 29.271],
+ [91.62, 29.265],
+ [91.659, 29.271],
+ [91.674, 29.259],
+ [91.71000000000001, 29.268],
+ [91.74, 29.259],
+ [91.782, 29.274],
+ [91.839, 29.268],
+ [91.869, 29.283],
+ [91.98, 29.262],
+ [92.007, 29.232],
+ [92.07000000000001, 29.289],
+ [92.115, 29.283],
+ [92.154, 29.289],
+ [92.196, 29.244],
+ [92.22, 29.253],
+ [92.235, 29.244],
+ [92.277, 29.244],
+ [92.295, 29.229],
+ [92.319, 29.226],
+ [92.376, 29.226],
+ [92.397, 29.241],
+ [92.406, 29.262],
+ [92.433, 29.25],
+ [92.46600000000001, 29.253],
+ [92.529, 29.172],
+ [92.529, 29.133],
+ [92.553, 29.148],
+ [92.598, 29.145],
+ [92.589, 29.121000000000002],
+ [92.61, 29.097],
+ [92.619, 29.115000000000002],
+ [92.658, 29.121000000000002],
+ [92.685, 29.139],
+ [92.697, 29.127],
+ [92.676, 29.112000000000002],
+ [92.679, 29.103],
+ [92.709, 29.109],
+ [92.739, 29.067],
+ [92.772, 29.091],
+ [92.775, 29.073],
+ [92.796, 29.082],
+ [92.808, 29.061],
+ [92.82000000000001, 29.067],
+ [92.82300000000001, 29.082],
+ [92.82900000000001, 29.076],
+ [92.85300000000001, 29.082],
+ [92.85600000000001, 29.073],
+ [92.88, 29.073],
+ [92.904, 29.058],
+ [92.934, 29.067],
+ [92.952, 29.049],
+ [92.973, 29.061],
+ [92.988, 29.043],
+ [92.997, 29.049],
+ [93.066, 29.043],
+ [93.081, 29.094],
+ [93.117, 29.115000000000002],
+ [93.123, 29.136],
+ [93.138, 29.139],
+ [93.15, 29.127],
+ [93.147, 29.094],
+ [93.165, 29.064],
+ [93.165, 29.043],
+ [93.153, 29.037],
+ [93.153, 29.025000000000002],
+ [93.162, 29.016000000000002],
+ [93.21300000000001, 29.025000000000002],
+ [93.22800000000001, 29.019000000000002],
+ [93.23100000000001, 29.001],
+ [93.261, 28.992],
+ [93.285, 29.001],
+ [93.312, 28.998],
+ [93.315, 29.016000000000002],
+ [93.348, 29.046],
+ [93.375, 29.052],
+ [93.393, 29.094],
+ [93.429, 29.109],
+ [93.447, 29.106],
+ [93.438, 29.13],
+ [93.48, 29.175],
+ [93.492, 29.163],
+ [93.54, 29.178],
+ [93.57000000000001, 29.166],
+ [93.627, 29.172],
+ [93.63, 29.151],
+ [93.645, 29.145],
+ [93.675, 29.151],
+ [93.681, 29.163],
+ [93.699, 29.16],
+ [93.702, 29.142],
+ [93.735, 29.127],
+ [93.75, 29.136],
+ [93.75, 29.148],
+ [93.78, 29.154],
+ [93.789, 29.124000000000002],
+ [93.825, 29.118000000000002],
+ [93.834, 29.124000000000002],
+ [93.831, 29.142],
+ [93.894, 29.13],
+ [93.912, 29.145],
+ [93.903, 29.166],
+ [93.909, 29.178],
+ [93.94500000000001, 29.184],
+ [93.95400000000001, 29.196],
+ [94.017, 29.193],
+ [94.035, 29.205000000000002],
+ [94.176, 29.196],
+ [94.251, 29.262],
+ [94.305, 29.271],
+ [94.302, 29.292],
+ [94.33200000000001, 29.316],
+ [94.35000000000001, 29.316],
+ [94.389, 29.337],
+ [94.401, 29.361],
+ [94.419, 29.37],
+ [94.434, 29.406000000000002],
+ [94.542, 29.448],
+ [94.581, 29.481],
+ [94.656, 29.490000000000002],
+ [94.70700000000001, 29.463],
+ [94.818, 29.493000000000002],
+ [94.875, 29.541],
+ [94.923, 29.61],
+ [94.926, 29.622],
+ [94.887, 29.634],
+ [94.917, 29.67],
+ [94.893, 29.697],
+ [94.905, 29.715],
+ [94.956, 29.757],
+ [95.124, 29.763],
+ [95.124, 29.781000000000002],
+ [95.09100000000001, 29.814],
+ [95.11200000000001, 29.868000000000002],
+ [95.13, 29.88],
+ [95.175, 29.895],
+ [95.196, 29.892],
+ [95.223, 29.868000000000002],
+ [95.286, 29.868000000000002],
+ [95.304, 29.856],
+ [95.307, 29.838],
+ [95.283, 29.82],
+ [95.289, 29.811],
+ [95.385, 29.772000000000002],
+ [95.379, 29.718],
+ [95.397, 29.688000000000002],
+ [95.388, 29.595],
+ [95.403, 29.562],
+ [95.427, 29.538],
+ [95.43900000000001, 29.478],
+ [95.43, 29.451],
+ [95.313, 29.331],
+ [95.256, 29.289],
+ [95.202, 29.28],
+ [95.04, 29.175],
+ [95.001, 29.169],
+ [95.004, 29.139],
+ [94.908, 29.052],
+ [94.902, 29.016000000000002],
+ [94.869, 28.998],
+ [94.839, 28.956],
+ [94.788, 28.935000000000002],
+ [94.773, 28.854],
+ [94.794, 28.824],
+ [94.914, 28.821],
+ [94.923, 28.812],
+ [94.911, 28.794],
+ [94.92, 28.752],
+ [94.977, 28.713],
+ [94.983, 28.674],
+ [94.998, 28.683],
+ [95.031, 28.617],
+ [95.09700000000001, 28.539],
+ [95.10300000000001, 28.506],
+ [95.09100000000001, 28.455000000000002],
+ [95.09700000000001, 28.419],
+ [95.013, 28.326],
+ [94.992, 28.287],
+ [94.992, 28.242],
+ [95.019, 28.215],
+ [95.031, 28.173000000000002],
+ [95.06700000000001, 28.155],
+ [95.145, 28.149],
+ [95.211, 28.179000000000002],
+ [95.277, 28.155],
+ [95.292, 28.116],
+ [95.316, 28.089000000000002],
+ [95.355, 28.071],
+ [95.379, 28.071],
+ [95.385, 28.059],
+ [95.382, 27.951],
+ [95.4, 27.936],
+ [95.412, 27.882],
+ [95.379, 27.843],
+ [95.349, 27.837],
+ [95.325, 27.810000000000002],
+ [95.325, 27.78],
+ [95.298, 27.762],
+ [95.289, 27.717000000000002],
+ [95.253, 27.657],
+ [95.211, 27.666],
+ [95.151, 27.624000000000002],
+ [95.139, 27.63],
+ [95.10300000000001, 27.609],
+ [94.992, 27.6],
+ [94.944, 27.57],
+ [94.917, 27.573],
+ [94.869, 27.504],
+ [94.803, 27.495],
+ [94.803, 27.48],
+ [94.785, 27.471],
+ [94.794, 27.456],
+ [94.767, 27.435000000000002],
+ [94.767, 27.414],
+ [94.73100000000001, 27.402],
+ [94.71900000000001, 27.372],
+ [94.69800000000001, 27.36],
+ [94.69800000000001, 27.333000000000002],
+ [94.683, 27.324],
+ [94.677, 27.294],
+ [94.635, 27.291],
+ [94.629, 27.273],
+ [94.602, 27.255],
+ [94.596, 27.231],
+ [94.584, 27.228],
+ [94.587, 27.177],
+ [94.596, 27.162],
+ [94.584, 27.147000000000002],
+ [94.566, 27.150000000000002],
+ [94.554, 27.102],
+ [94.518, 27.105],
+ [94.449, 27.060000000000002],
+ [94.44, 27.018],
+ [94.407, 26.985],
+ [94.35900000000001, 26.97],
+ [94.287, 26.919],
+ [94.197, 26.925],
+ [94.164, 26.898],
+ [94.146, 26.865000000000002],
+ [94.125, 26.856],
+ [94.113, 26.868000000000002],
+ [94.134, 26.907],
+ [94.113, 26.913],
+ [94.077, 26.886],
+ [93.927, 26.832],
+ [93.864, 26.766000000000002],
+ [93.753, 26.733],
+ [93.657, 26.715],
+ [93.618, 26.724],
+ [93.56700000000001, 26.751],
+ [93.441, 26.769000000000002],
+ [93.411, 26.76],
+ [93.369, 26.718],
+ [93.288, 26.742],
+ [93.249, 26.724],
+ [93.183, 26.673000000000002],
+ [93.12, 26.646],
+ [93.087, 26.655],
+ [93.018, 26.646],
+ [92.898, 26.655],
+ [92.883, 26.652],
+ [92.874, 26.625],
+ [92.83500000000001, 26.607],
+ [92.733, 26.613],
+ [92.676, 26.601],
+ [92.658, 26.592000000000002],
+ [92.616, 26.523],
+ [92.595, 26.517],
+ [92.508, 26.517],
+ [92.43, 26.535],
+ [92.391, 26.532],
+ [92.244, 26.472],
+ [92.229, 26.442],
+ [92.202, 26.454],
+ [92.172, 26.442],
+ [92.124, 26.403000000000002],
+ [92.06700000000001, 26.373],
+ [92.07000000000001, 26.325],
+ [92.058, 26.304000000000002],
+ [91.971, 26.271],
+ [91.932, 26.271],
+ [91.899, 26.241],
+ [91.878, 26.235],
+ [91.854, 26.241],
+ [91.665, 26.166],
+ [91.608, 26.172],
+ [91.542, 26.145],
+ [91.497, 26.139],
+ [91.377, 26.172],
+ [91.287, 26.166],
+ [91.197, 26.202],
+ [91.134, 26.214000000000002],
+ [91.062, 26.187],
+ [90.96300000000001, 26.175],
+ [90.888, 26.136],
+ [90.849, 26.13],
+ [90.807, 26.154],
+ [90.741, 26.163],
+ [90.681, 26.19],
+ [90.58200000000001, 26.205000000000002],
+ [90.507, 26.229],
+ [90.474, 26.226],
+ [90.435, 26.178],
+ [90.402, 26.16],
+ [90.345, 26.148],
+ [90.309, 26.124],
+ [90.22500000000001, 26.106],
+ [90.177, 26.076],
+ [89.955, 26.01],
+ [89.904, 25.941],
+ [89.84700000000001, 25.89],
+ [89.81400000000001, 25.815],
+ [89.736, 25.692],
+ [89.724, 25.632],
+ [89.697, 25.572],
+ [89.709, 25.482],
+ [89.697, 25.398],
+ [89.67, 25.323],
+ [89.7, 25.266000000000002],
+ [89.703, 25.242],
+ [89.685, 25.2],
+ [89.661, 25.173000000000002],
+ [89.625, 25.074],
+ [89.613, 24.96],
+ [89.613, 24.936],
+ [89.658, 24.87],
+ [89.673, 24.792],
+ [89.706, 24.75],
+ [89.769, 24.549],
+ [89.748, 24.372],
+ [89.754, 24.282],
+ [89.733, 24.225],
+ [89.742, 24.201],
+ [89.739, 24.123],
+ [89.697, 24.015],
+ [89.7, 23.958000000000002],
+ [89.727, 23.883],
+ [89.787, 23.796],
+ [89.85600000000001, 23.748],
+ [89.919, 23.664],
+ [89.985, 23.643],
+ [90.144, 23.544],
+ [90.249, 23.463]
+]
diff --git a/remotion-best-practices/remotion-maps/techniques/maptiler/assets/tokens.ts b/remotion-best-practices/remotion-maps/techniques/maptiler/assets/tokens.ts
new file mode 100644
index 0000000..31505e3
--- /dev/null
+++ b/remotion-best-practices/remotion-maps/techniques/maptiler/assets/tokens.ts
@@ -0,0 +1,34 @@
+// Example tokens only. Replace every visual value with production-local tokens.
+export const COLORS = {
+ bg: '#101315',
+ // Electric water — a near-white icy core with a blue glow and a white-hot draw-head (the "electricity"
+ // travels along the river as it draws on). No dark casing.
+ river: '#E8F7FF', // bright icy core
+ riverGlow: 'rgba(73,198,255,0.5)', // electric-blue glow
+ riverHead: '#FFFFFF', // white-hot leading head
+ riverHeadGlow: 'rgba(120,225,255,0.95)',
+ border: '#f5f2ed', // neutral cream country borders/labels over the colored fills
+ cream: '#f5f0eb',
+} as const;
+
+// Example progressive fill tokens. Rename these keys and replace values for each production.
+export const COUNTRY = {
+ china: '#D4A853',
+ india: '#5B8A8A',
+ bangladesh: '#C07B57',
+} as const;
+// Darker shade of each country colour — the settled border line (the bright COUNTRY colour is the
+// glowing draw-head that leads the animation).
+export const COUNTRY_DARK = {
+ china: '#9A7530',
+ india: '#3C5C5C',
+ bangladesh: '#855239',
+} as const;
+export const FILL_OPACITY = 0.5;
+
+export const VIDEO = {width: 1920, height: 1080, fps: 30} as const;
+
+// Beat durations (seconds → frames at VIDEO.fps)
+export const DUR = {
+ mapExplainer: 12 * VIDEO.fps,
+} as const;
diff --git a/remotion-best-practices/remotion-maps/techniques/maptiler/references/map-data-sources.md b/remotion-best-practices/remotion-maps/techniques/maptiler/references/map-data-sources.md
new file mode 100644
index 0000000..d93a8c2
--- /dev/null
+++ b/remotion-best-practices/remotion-maps/techniques/maptiler/references/map-data-sources.md
@@ -0,0 +1,91 @@
+# Map element data sources
+
+Choose the source independently for every story element. A single map can—and often should—mix
+provider vectors with custom geodata.
+
+## Decision rule
+
+Use a MapTiler Planet vector layer when the feature already exists there, its attributes support an
+editorially precise filter, and provider geometry is acceptable for the claim. Use custom GeoJSON when
+the feature is absent, proposed, historical, disputed, corrected, privately sourced, or needs ordered
+geometry for a deterministic draw.
+
+| Requirement | MapTiler vector layer | Custom GeoJSON |
+| --------------------------------------------------------------------------- | --------------------- | ------------------------------------------- |
+| Roads, waterways, water, boundaries, land cover, or other standard context | Prefer | Use only when provider data is insufficient |
+| Basemap-consistent geometry without a duplicate local dataset | Prefer | No |
+| Proposed, historical, classified, corrected, or production-specific element | No | Prefer |
+| Fade, colour, width, radius, blur, or fill-opacity animation | Yes | Yes |
+| Feature-state highlight when a stable feature ID exists | Yes | Yes |
+| Deterministic source-to-end line draw or perimeter draw | Bake first | Prefer |
+| Geometry editing, morphing, clipping, or exact sequencing | No | Prefer |
+
+Provider alignment is not proof of correctness. Inspect the attributes and geometry against the
+editorial source before presenting a provider feature as evidence.
+
+## MapTiler vector mode
+
+MapTiler Planet is a vector tile source. Add it once, then build story layers with a
+`source-layer` and an exact attribute filter. Read the current MapTiler Planet schema before choosing
+layer names or fields.
+
+Common layer categories include `waterway`, `water`, `transportation`, `boundary`, `landcover`, and
+`poi`; availability, fields, and zoom ranges vary by schema version.
+
+```ts
+import {addMapTilerVectorElement, setVectorElementPaint} from "./MapTilerVectorElement";
+
+addMapTilerVectorElement(map, process.env.REMOTION_MAPTILER_KEY!, {
+ id: "story-river",
+ sourceLayer: "waterway",
+ type: "line",
+ filter: [
+ "all",
+ ["==", ["get", "class"], "river"],
+ ["==", ["coalesce", ["get", "name_en"], ["get", "name"]], "Yarlung Tsangpo"],
+ ],
+ layout: {"line-cap": "round", "line-join": "round"},
+ paint: {
+ "line-color": "#E8F7FF",
+ "line-width": 3,
+ "line-opacity": 0,
+ },
+});
+
+setVectorElementPaint(map, "story-river", {
+ "line-opacity": reveal,
+ "line-width": 2 + reveal * 2,
+});
+```
+
+Animate provider features by changing paint properties from the Remotion frame: opacity, colour,
+width, blur, fill opacity, circle radius, or symbol opacity. Use feature state only when the source
+provides stable IDs and the selection remains deterministic across tiles.
+
+Do not treat a tiled line as one ordered path. Vector tiles split features at tile boundaries, so a
+source-to-mouth or start-to-end draw has no reliable global order. If that motion carries meaning,
+extract and verify the complete feature, order it once, save it as GeoJSON, and use the custom mode.
+
+## Custom geodata mode
+
+Use the bundled `../assets/RiverReveal.tsx` and `../scripts/prep-geo.mjs` pattern for custom GeoJSON. This mode owns
+the exact geometry and can slice it by distance, calculate entry triggers, draw complete borders, and
+produce deterministic sequences.
+
+Custom mode is mandatory when:
+
+- the feature is not in the provider dataset;
+- the story uses a proposed route, planned tunnel, historical boundary, disputed interpretation, or
+ non-public dataset;
+- provider geometry was editorially corrected;
+- motion must travel through the geometry in a verified order;
+- a complete off-screen boundary matters and a viewport query would silently crop it.
+
+## Hybrid mode
+
+Use provider vectors for ordinary contextual features and custom GeoJSON for the specific claim. For
+example: MapTiler waterways and roads as aligned context; a custom proposed tunnel, dam site, disputed
+boundary, or verified evacuation area as the highlighted evidence.
+
+Keep provider and custom layers visually distinct when they carry different evidentiary weight. Record
+the source and effective date of every custom layer in the production notes.
diff --git a/remotion-best-practices/remotion-maps/techniques/maptiler/references/map-explainer-architecture.md b/remotion-best-practices/remotion-maps/techniques/maptiler/references/map-explainer-architecture.md
new file mode 100644
index 0000000..77e98aa
--- /dev/null
+++ b/remotion-best-practices/remotion-maps/techniques/maptiler/references/map-explainer-architecture.md
@@ -0,0 +1,129 @@
+# Map Explainer — architecture reference
+
+Deep detail behind `TECHNIQUE.md`: the timing model, the river reveal + electric head, the per-country
+sequence, and label projection. The supplied values are examples, not a production style system.
+The custom-geometry example is `../assets/RiverReveal.tsx` +
+`../assets/CountryLabel.tsx` +
+`../assets/tokens.ts`. Provider-vector setup is in
+`../assets/MapTilerVectorElement.ts`; choose between
+the two modes with `data-sources.md`.
+
+## 1. The render harness (per frame)
+
+Init the MapTiler map once (ref guard). On `load`: strip clutter (see `geo-prep.md`), add sources/layers,
+wait for `once('idle') → continueRender`. Per frame:
+
+```
+delayRender → setData/setPaintProperty → map.once('idle', continueRender) → triggerRepaint
+```
+
+`preserveDrawingBuffer:true` so Remotion's screenshot captures the canvas. Render `--gl=angle`.
+For an animated camera, read `render-stability.md`: the MapTiler renderer remains static and a CSS plate
+transform supplies the camera choreography.
+
+## 2. Timing model — time-based; beat length derived from the sequences
+
+Everything keys off **seconds** (`t = frame / fps`), not reveal-units. The river draws over a window;
+each country **triggers when the river reaches it** and runs a fixed sequence. The beat is exactly as
+long as the sequences need.
+
+```ts
+const RIVER_START = 0.3, RIVER_END = 8.0; // river draws over this window
+const BORDER_S = 2.5, FILL_S = 1.0, LABEL_S = 0.7; // per-country sequence (constant durations)
+const trigger = (c) => RIVER_START + META[c].stop * (RIVER_END - RIVER_START); // river-arrival time
+// beat length = max over c of (trigger(c) + BORDER_S + FILL_S + LABEL_S) + tail
+const reveal = interpolate(t, [RIVER_START, RIVER_END], [0,1], { ...clamp, easing: Easing.bezier(0.645, 0.045, 0.355, 1) });
+```
+
+**Constant durations matter:** drive the border draw by _time since trigger_, not a slice of the reveal —
+otherwise complex or long borders flash by in a fraction of a second.
+
+## 3. Provider-vector animation
+
+MapTiler Planet elements can be animated directly in place. Filter an exact `source-layer` feature,
+initialize its paint in the hidden or neutral state, then update paint properties from the Remotion frame.
+This works for line, fill, circle, and symbol layers without copying provider geometry into the project.
+
+Do not assume tiled geometry has a global order. Provider features are split at tile boundaries: opacity,
+colour, width, blur, radius, fill, and feature-state changes are reliable; semantic start-to-end line
+draws are not. Bake ordered GeoJSON when the direction of the draw carries meaning.
+
+## 4. Custom line animation — reveal + electric draw-head
+
+The "electricity" is a **white-hot head** leading the draw — the last few % of the drawn line in its own
+bright + glow layers, faded out once the river completes.
+
+```ts
+const riverDrawnKm = lineKm * reveal;
+map.getSource("river").setData(turf.lineSliceAlong(line, 0, Math.max(0.001, riverDrawnKm)));
+const headKm = lineKm * 0.03;
+map.getSource("river-head").setData(turf.lineSliceAlong(line, Math.max(0, riverDrawnKm - headKm), Math.max(0.001, riverDrawnKm)));
+let headFade = 0;
+if (reveal > 0.002 && reveal < 0.999) headFade = 1;
+else if (reveal >= 0.999) headFade = 1 - clamp01((t - RIVER_END) / 0.5); // fade out at the mouth
+map.setPaintProperty("river-headglow", "line-opacity", 0.85 * headFade);
+map.setPaintProperty("river-head", "line-opacity", headFade);
+```
+
+Layers, bottom→top: `river-glow` (electric blue `#49C6FF`, w11, op0.32, blur6) → `river-line`
+(icy core `#E8F7FF`, w3) → `river-headglow` (`rgba(120,225,255,.95)`, w16, blur9) → `river-head`
+(white `#FFFFFF`, w4.5). **No dark casing** — the bright icy core reads over every fill on its own.
+
+## 5. Country animation — border draws → fill blooms → label rises
+
+Triggered by river arrival, each country runs three sequential phases. The border is a **darker shade**
+of the country colour (the electricity is on the river, not here).
+
+```ts
+const lt = t - trigger(c); // local seconds since trigger
+// 1) complete source border draws on over a constant BORDER_S, multi-segment-safe
+const bp = interpolate(clamp01(lt / BORDER_S), [0,1], [0,1], { easing: Easing.bezier(0.645, 0.045, 0.355, 1) });
+map.getSource(`trail-${c}`).setData(sliceBorder(DRAW[c], 0, DRAW[c].total * bp)); // COUNTRY_DARK line
+// 2) fill blooms in (opacity overshoots, then settles) after the border completes
+const fp = clamp01((lt - BORDER_S) / FILL_S);
+const fo = interpolate(fp, [0, 0.6, 1], [0, FILL_OPACITY * 1.25, FILL_OPACITY], { ...clamp, easing: Easing.bezier(0.3333333333333333, 1, 0.6666666666666666, 1) });
+map.setPaintProperty(`fill-${c}`, "fill-opacity", fp <= 0 ? 0 : fo);
+// 3) label rises in after the fill
+const lp = clamp01((lt - BORDER_S - FILL_S) / LABEL_S);
+```
+
+`sliceBorder(d, fromKm, toKm)` reveals a portion of a complete (possibly multi-segment) border as a
+MultiLineString, slicing each segment by cumulative length — no joins across gaps and no viewport crop:
+
+```ts
+const sliceBorder = (d, fromKm, toKm) => {
+ const out = [];
+ for (let i = 0; i < d.segLines.length; i++) {
+ const start = d.cum[i], end = start + d.segLen[i];
+ const a = Math.max(fromKm, start), b = Math.min(toKm, end);
+ if (b - a <= 0.0008) continue;
+ out.push(turf.lineSliceAlong(d.segLines[i], a - start, b - start).geometry.coordinates);
+ }
+ return { type:"Feature", properties:{}, geometry:{ type:"MultiLineString", coordinates: out } };
+};
+```
+
+Choose fill, border, and river colours in the production's local token file. The bundled token values are
+examples only; do not carry a source project's palette into another production.
+
+## 6. Labels — HTML overlay, projected each frame
+
+Labels are React, not map symbols (full typography control). `CountryLabel` is an example accent-rule,
+rise-and-fade treatment; select the typeface and final values in the production.
+Positioned by projecting the anchor to screen pixels **every frame**, stored in state:
+
+```ts
+const p = map.project(META[c].anchor); // lngLat → screen px (respects the live camera)
+pos[c] = { x: p.x, y: p.y, reveal: lp };
+setLabels(pos); // re-render the overlay; effect deps exclude `labels`
+```
+
+`CountryLabel` shows the mechanics: uppercase region name, short accent divider, rise/fade entrance,
+and `pointerEvents:none`. Select font, weight, size, spacing, contrast, and colour from the production's
+own type and palette system.
+
+## 7. Camera — fixed map plate for any movement
+
+Read `render-stability.md`. Do not use per-frame `map.jumpTo()` for a moving 2D shot; it can shimmer in
+headless renders even on satellite imagery. Interpolate the intended camera for the CSS plate transform,
+while keeping the MapTiler renderer static.
diff --git a/remotion-best-practices/remotion-maps/techniques/maptiler/references/map-geo-prep.md b/remotion-best-practices/remotion-maps/techniques/maptiler/references/map-geo-prep.md
new file mode 100644
index 0000000..0e79a2b
--- /dev/null
+++ b/remotion-best-practices/remotion-maps/techniques/maptiler/references/map-geo-prep.md
@@ -0,0 +1,85 @@
+# Map Explainer — basemap & geo prep
+
+How the basemap is cleaned and how `../scripts/prep-geo.mjs` bakes the per-country data the component reads.
+
+## Basemap styling — strip the clutter
+
+On `load`, remove the basemap's labels and inner admin borders so only your geography reads:
+
+```ts
+for (const l of m.getStyle().layers as any[])
+ if (l.type === "symbol" || /other border/i.test(l.id)) m.removeLayer(l.id);
+```
+
+- `type === "symbol"` → every place/water/road **label** (the "MapTiler labels"). Gone.
+- Inner admin-border layer IDs vary by style. Inspect the loaded style, remove state/province/district
+ layers as needed, and retain only the context borders the production requires.
+- Logo/attribution: `maptilerLogo:false` + `attributionControl:false` aren't always enough — also hide
+ via CSS in the component:
+ ```tsx
+
+ ```
+
+## `../scripts/prep-geo.mjs` → outputs
+
+Reads a routed river GeoJSON + country polygon GeoJSONs; writes:
+
+- **River line** — simplified for a smooth draw. For a braided river, route one source→mouth path through
+ the network first: greedy endpoint-chaining bounces between parallel channels. → `src/geo/river-flow.json`.
+- **`public/geo/borders.geojson`** — each country's polygon tagged `{country: name}` (one source,
+ filtered per country for the fills).
+- **`src/geo/country-meta.json`** — per country `{ stop, anchor, border }`.
+
+### `stop` — when a country lights up
+
+Walk the river points; first point inside a country (`turf.booleanPointInPolygon`) = the arc-length
+fraction where the river **enters** it. Drives the trigger time. The headwaters country = 0.
+
+### `anchor` — label centre via pole of inaccessibility
+
+The most-interior point of the country (clipped to a per-country **story bbox** so a big country
+centres in the relevant region, not its far bulge), then a small operator **nudge**. Pole = grid-sample
+inside the polygon, keep the point with max distance to the boundary. **Centroids get pulled to edges —
+don't use them.**
+
+```js
+const pole = (poly) => {
+ const bb = turf.bbox(poly), edge = turf.polygonToLine(poly), N = 46;
+ let best = null, bestD = -1;
+ for (let i = 0; i <= N; i++) for (let j = 0; j <= N; j++) {
+ const p = turf.point([bb[0]+(bb[2]-bb[0])*i/N, bb[1]+(bb[3]-bb[1])*j/N]);
+ if (!turf.booleanPointInPolygon(p, poly)) continue;
+ const d = turf.pointToLineDistance(p, edge);
+ if (d > bestD) { bestD = d; best = p.geometry.coordinates; }
+ }
+ return best;
+};
+const ANCHOR_BBOX = { china:[82,27,96,32], india:[76,14,99,31], bangladesh:[86,20,93,27] }; // story regions
+const NUDGE = { china:[0,0.6], india:[-1.0,0], bangladesh:[0,-0.6] }; // operator-directed
+```
+
+### `border` — complete source geometry
+
+Preserve every exterior ring from the named country source. Never clip a country or bilateral border to
+the framed bbox and never discard an off-screen segment: the geometry may leave the frame naturally.
+The renderer handles a MultiLineString by cumulative length, so it remains one timed reveal without
+inventing joins across gaps.
+
+## Tuning the geo prep for a new scenario
+
+| Want | Knob |
+| --------------------------------- | -------------------------------------------------------------------- |
+| Which countries | the country list in `prep-geo.mjs` (+ supply their polygon GeoJSONs) |
+| Label centred in the right region | `ANCHOR_BBOX[country]` (the story bbox) |
+| Nudge a label | `NUDGE[country]` (lng, lat offset) |
+| What border is drawn | the complete named source geometry; never the visible extent |
+| When each lights up | derived from `stop` — depends on the river geometry |
diff --git a/remotion-best-practices/remotion-maps/techniques/maptiler/references/render-stability.md b/remotion-best-practices/remotion-maps/techniques/maptiler/references/render-stability.md
new file mode 100644
index 0000000..fc40033
--- /dev/null
+++ b/remotion-best-practices/remotion-maps/techniques/maptiler/references/render-stability.md
@@ -0,0 +1,64 @@
+# Moving Map Render Stability
+
+Read this reference before building a moving 2D MapTiler scene or diagnosing a wavering Remotion render.
+
+## Symptom and cause
+
+If basemap detail shimmers or jitters during a pan/zoom, the likely cause is per-frame `map.jumpTo()`.
+Headless MapTiler capture can resample both vector hillshade and satellite imagery differently frame to
+frame. Tile retries, easing changes, and label changes do not solve that renderer effect.
+
+## Required pattern: fixed map plate
+
+For any 2D pan/zoom:
+
+1. Render the MapTiler canvas once at the largest required zoom in an oversized container. Size it from the camera route and keep each dimension below the browser's reliable WebGL render-buffer limit (commonly 4096 px). Do **not** blindly use 3×: a 1920×1080 composition becomes 5760 px wide and Chromium may silently downsample it, causing visible pixelation during the CSS zoom.
+2. Keep the map's camera static.
+3. For each frame, calculate the approved target centre/zoom, then move the canvas with CSS `translate` + `scale`.
+4. Apply the same transform to every projected HTML overlay.
+5. Continue to animate GeoJSON data and paint properties imperatively; only the renderer camera is frozen.
+
+Keep pitch and bearing constant. Use a 3D engine such as Cesium for genuine changing pitch/bearing or a terrain flythrough.
+
+```ts
+const baseZoom = Math.max(start.zoom, end.zoom);
+const map = new maptilersdk.Map({
+ container,
+ style,
+ center: end.center,
+ zoom: baseZoom,
+ pitch: end.pitch ?? 0,
+ bearing: end.bearing ?? 0,
+ interactive: false,
+ fadeDuration: 0,
+ canvasContextAttributes: {preserveDrawingBuffer: true},
+});
+
+// Per Remotion frame. `camera` is the approved centre/zoom interpolation.
+const projected = map.project(camera.center);
+const scale = 2 ** (camera.zoom - baseZoom);
+const plate = {
+ transform: `translate(${width / 2 - projected.x * scale}px, ${height / 2 - projected.y * scale}px) scale(${scale})`,
+ transformOrigin: "0 0",
+};
+
+// Convert label projection with exactly the same plate transform.
+const labelX = labelPoint.x * scale + width / 2 - projected.x * scale;
+const labelY = labelPoint.y * scale + height / 2 - projected.y * scale;
+```
+
+### Plate sizing and sharpness
+
+- Render at the maximum zoom reached by **any** camera waypoint, including intermediate or hold cameras. The CSS scale should never exceed `1`; otherwise the plate is being enlarged.
+- Centre the frozen map on the midpoint of the camera route's geographic extent, not automatically on the final camera. This minimizes required overscan.
+- Keep the largest canvas dimension at or below 4096 px unless the actual render environment has been tested with a larger `MAX_RENDERBUFFER_SIZE`.
+- For 1920×1080, a 3840×2160 plate is a safe default. For 1080×1920, use approximately 2700×3840 when the route needs extra horizontal pan room.
+- If the route cannot fit within that plate at the required zoom, split the shot into two fixed plates with a deliberate editorial transition. Do not trade sharpness for one enormous canvas.
+- Distinguish failure modes: repeating shimmer means the live renderer is moving; steadily soft tiles during a CSS push means the fixed plate is underspecified, internally downsampled, or being scaled above `1`.
+
+## Verification
+
+- Render a short MP4, not only a Studio preview.
+- Inspect static terrain texture and satellite detail while the camera moves.
+- If any underlying map detail wavers, use the fixed map plate. Do not approve it as a minor preview artefact.
+- Render WebGL with `--gl=angle`, `preserveDrawingBuffer:true`, and conservative concurrency (`1`) while validating.
diff --git a/remotion-best-practices/remotion-maps/techniques/maptiler/scripts/prep-geo.mjs b/remotion-best-practices/remotion-maps/techniques/maptiler/scripts/prep-geo.mjs
new file mode 100644
index 0000000..af8e19e
--- /dev/null
+++ b/remotion-best-practices/remotion-maps/techniques/maptiler/scripts/prep-geo.mjs
@@ -0,0 +1,202 @@
+// Geo prep for the map-explainer. Bakes the data the component reads:
+// out/river-flow.json -> the river draw-on line (→ copy to your Remotion project's src/geo/)
+// out/country-meta.json -> per-country { stop, anchor, border } (→ src/geo/)
+// out/borders.geojson -> country polygons, each tagged {country} (→ public/geo/ — loaded via staticFile)
+//
+// RUN: node prep-geo.mjs (needs YOUR geodata — see CONFIG; the source polygons are too large to ship,
+// so the skill ships the OUTPUTS in assets/sample-data/ instead.)
+//
+// RIVER INPUT MUST BE ONE CLEAN LINESTRING, source → mouth (features[0].geometry is a LineString). If your
+// OSM river comes as many ways / braided channels, ROUTE it into a single line FIRST — a graph
+// shortest-path from source node to mouth node. Do NOT greedily chain by nearest endpoint: it bounces
+// between parallel channels. (That routing step is a prerequisite, not part of this script.)
+
+import {readFileSync, writeFileSync, mkdirSync} from 'fs';
+import {dirname, resolve} from 'path';
+import {fileURLToPath} from 'url';
+
+if (process.argv.includes('--help')) {
+ console.log(
+ 'Configure COUNTRIES, RIVER, BORDER, label bounds, and output paths in this script, then run: bun scripts/prep-geo.mjs',
+ );
+ process.exit(0);
+}
+
+const turf = await import('@turf/turf');
+
+const __dir = dirname(fileURLToPath(import.meta.url));
+const root = resolve(__dir, '..');
+const geo = resolve(root, '../geodata'); // ADAPT: where your input GeoJSON lives
+const read = (p) => JSON.parse(readFileSync(p, 'utf8'));
+
+// ===== CONFIG — edit for your river + countries =====
+const COUNTRIES = ['china', 'india', 'bangladesh']; // ORDERED headwaters → mouth; first = source (stop 0)
+const RIVER = resolve(geo, 'focus-rivers/yarlung-brahmaputra-full-osm.geojson'); // a single clean source→mouth LineString
+const BORDER = (name) => resolve(geo, `project-borders/${name}.geojson`); // one polygon file per country, named .geojson
+const FRAME_BBOX = [76, 14, 104, 33.5]; // [W,S,E,N] visible extent — fallback for label anchoring only
+const ANCHOR_BBOX = {
+ china: [82, 27, 96, 32],
+ india: [76, 14, 99, 31],
+ bangladesh: [86, 20, 93, 27],
+}; // [W,S,E,N] per-country label "story region"
+const NUDGE = {china: [0, 0.6], india: [-1.0, 0], bangladesh: [0, -0.6]}; // [lng,lat] label nudge
+const RIVER_SIMPLIFY_TOL = 0.006; // degrees — smooths the draw-on (bigger = simpler)
+const OUT_RIVER = resolve(root, 'out/river-flow.json');
+const OUT_META = resolve(root, 'out/country-meta.json');
+const OUT_BORDERS = resolve(root, 'out/borders.geojson');
+// =====================================================
+
+const havKm = (a, b) => {
+ const R = 6371,
+ r = Math.PI / 180;
+ const dLat = (b[1] - a[1]) * r,
+ dLng = (b[0] - a[0]) * r;
+ const h =
+ Math.sin(dLat / 2) ** 2 +
+ Math.cos(a[1] * r) * Math.cos(b[1] * r) * Math.sin(dLng / 2) ** 2;
+ return 2 * R * Math.asin(Math.sqrt(h));
+};
+
+// --- River draw-on line: take the clean routed LineString, strip a dangling final hop, simplify so the
+// wide-zoom draw-on reads as one smooth thread (no bezier — meander overshoot on a long river). ---
+const routed = read(RIVER).features[0].geometry.coordinates;
+let end = routed.length;
+while (end > 2 && havKm(routed[end - 2], routed[end - 1]) > 15) end--; // drop a final cross-braid jump if present
+const flow = turf.simplify(turf.lineString(routed.slice(0, end)), {
+ tolerance: RIVER_SIMPLIFY_TOL,
+ highQuality: true,
+}).geometry.coordinates;
+
+// --- Borders + country fills (one source, filtered per country in the component) ---
+const borders = {type: 'FeatureCollection', features: []};
+const polys = {};
+for (const name of COUNTRIES) {
+ const fc = read(BORDER(name));
+ polys[name] = fc;
+ for (const f of fc.features) {
+ f.properties = {...(f.properties || {}), country: name};
+ borders.features.push(f);
+ }
+}
+
+// --- Reveal stops: arc-length fraction of `flow` where the river first ENTERS each country. The first
+// country (headwaters) is the source, so its stop is 0; the rest are computed. ---
+const flowKm = turf.length(turf.lineString(flow));
+const insideCountry = (pt, name) =>
+ polys[name].features.some((f) => turf.booleanPointInPolygon(pt, f));
+const stops = {};
+COUNTRIES.forEach((c, i) => {
+ stops[c] = i === 0 ? 0 : 1;
+}); // 0 = headwaters; 1 = sentinel until entered
+let acc = 0;
+for (let i = 0; i < flow.length; i++) {
+ if (i > 0) acc += havKm(flow[i - 1], flow[i]);
+ const frac = acc / (flowKm || 1);
+ const pt = turf.point(flow[i]);
+ for (const c of COUNTRIES)
+ if (stops[c] === 1 && insideCountry(pt, c)) stops[c] = frac;
+}
+
+// --- Per-country meta: anchor = pole of inaccessibility of the visible landmass (centred, away from
+// borders/edges) within the country's story region + a NUDGE; border = every exterior ring from the
+// complete named source. Never crop a country or bilateral boundary to the viewport. ---
+const biggestPoly = (geom) => {
+ const rings =
+ geom.type === 'MultiPolygon' ? geom.coordinates : [geom.coordinates];
+ let best = null,
+ bestA = -1;
+ for (const c of rings) {
+ const p = turf.polygon(c);
+ const a = turf.area(p);
+ if (a > bestA) {
+ bestA = a;
+ best = p;
+ }
+ }
+ return best;
+};
+const largestPolygon = (fc) => {
+ let best = null,
+ bestA = -1;
+ for (const f of fc.features) {
+ const p = biggestPoly(f.geometry),
+ a = turf.area(p);
+ if (a > bestA) {
+ bestA = a;
+ best = p;
+ }
+ }
+ return best;
+};
+const completeExteriorSegments = (fc) => {
+ const segments = [];
+ for (const feature of fc.features) {
+ const polygons =
+ feature.geometry.type === 'MultiPolygon'
+ ? feature.geometry.coordinates
+ : [feature.geometry.coordinates];
+ for (const polygon of polygons)
+ if (polygon[0]?.length > 1) segments.push(polygon[0]);
+ }
+ return segments;
+};
+const poleOfInaccessibility = (poly) => {
+ const bb = turf.bbox(poly),
+ boundary = turf.polygonToLine(poly),
+ N = 46;
+ let best = null,
+ bestD = -1;
+ for (let i = 0; i <= N; i++)
+ for (let j = 0; j <= N; j++) {
+ const lng = bb[0] + ((bb[2] - bb[0]) * i) / N,
+ lat = bb[1] + ((bb[3] - bb[1]) * j) / N;
+ const pt = turf.point([lng, lat]);
+ if (!turf.booleanPointInPolygon(pt, poly)) continue;
+ const d = turf.pointToLineDistance(pt, boundary);
+ if (d > bestD) {
+ bestD = d;
+ best = [lng, lat];
+ }
+ }
+ return best;
+};
+const countryMeta = {};
+for (const name of COUNTRIES) {
+ const poly = largestPolygon(polys[name]);
+ const storyRegion = biggestPoly(
+ turf.bboxClip(poly, ANCHOR_BBOX[name] || FRAME_BBOX).geometry,
+ );
+ const pole = poleOfInaccessibility(storyRegion);
+ const segs = completeExteriorSegments(polys[name]);
+ const nudge = NUDGE[name] || [0, 0];
+ countryMeta[name] = {
+ stop: stops[name],
+ anchor: [pole[0] + nudge[0], pole[1] + nudge[1]],
+ border: segs,
+ };
+}
+
+mkdirSync(dirname(OUT_RIVER), {recursive: true});
+writeFileSync(OUT_RIVER, JSON.stringify(flow));
+writeFileSync(OUT_META, JSON.stringify(countryMeta));
+writeFileSync(OUT_BORDERS, JSON.stringify(borders));
+console.log(
+ 'river:',
+ flow.length,
+ 'pts ·',
+ flowKm.toFixed(0),
+ 'km · entry stops',
+ JSON.stringify(stops),
+);
+for (const n of COUNTRIES) {
+ const km = countryMeta[n].border.reduce(
+ (s, seg) => s + turf.length(turf.lineString(seg)),
+ 0,
+ );
+ console.log(
+ ` ${n}: anchor ${countryMeta[n].anchor.map((v) => v.toFixed(2)).join(',')} · border ${km.toFixed(0)} km`,
+ );
+}
+console.log(
+ "\nNext: copy out/river-flow.json + out/country-meta.json → your project's src/geo/ ; out/borders.geojson → public/geo/",
+);
diff --git a/remotion-best-practices/remotion-maps/techniques/static-map/TECHNIQUE.md b/remotion-best-practices/remotion-maps/techniques/static-map/TECHNIQUE.md
new file mode 100644
index 0000000..808ec93
--- /dev/null
+++ b/remotion-best-practices/remotion-maps/techniques/static-map/TECHNIQUE.md
@@ -0,0 +1,37 @@
+---
+name: remotion-maps-static
+description: Create a deterministic static locator map in Remotion when neither the camera nor geographic data animates.
+---
+
+# Static map
+
+Use a static image when the map only provides location context. This is the smallest, fastest, and
+most deterministic map technique.
+
+## Build
+
+1. Export or request a map image at the composition's final aspect ratio and at least its rendered
+ pixel dimensions.
+2. Store the image in the Remotion project's `public/` directory.
+3. Render it with `CanvasImage` and `staticFile()`.
+4. Add labels or markers as ordinary Remotion elements if they remain fixed.
+
+```tsx
+import React from 'react';
+import {AbsoluteFill, CanvasImage, staticFile} from 'remotion';
+
+export const StaticMap: React.FC = () => {
+ return (
+ <>
+
+ >
+ );
+};
+```
+
+## Overlays and Interactivity
+
+Follow [Remotion Interactivity](../../../remotion-interactivity/REFERENCE.md) best practices and [Remotion Markup Best practices](../../../remotion-markup/REFERENCE.md) for elements.
diff --git a/remotion-best-practices/remotion-markup/3d.md b/remotion-best-practices/remotion-markup/3d.md
new file mode 100644
index 0000000..c9d254f
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/3d.md
@@ -0,0 +1,86 @@
+---
+name: 3d
+description: 3D content in Remotion using Three.js and React Three Fiber.
+metadata:
+ tags: 3d, three, threejs
+---
+
+# Using Three.js and React Three Fiber in Remotion
+
+Follow React Three Fiber and Three.js best practices.
+Only the following Remotion-specific rules need to be followed:
+
+## Prerequisites
+
+First, the `@remotion/three` package needs to be installed.
+If it is not, use the following command:
+
+```bash
+npx remotion add @remotion/three # If project uses npm
+bunx remotion add @remotion/three # If project uses bun
+yarn remotion add @remotion/three # If project uses yarn
+pnpm exec remotion add @remotion/three # If project uses pnpm
+```
+
+## Using ThreeCanvas
+
+You MUST wrap 3D content in `` and include proper lighting.
+`` MUST have a `width` and `height` prop.
+
+```tsx
+import { ThreeCanvas } from "@remotion/three";
+import { useVideoConfig } from "remotion";
+
+const { width, height } = useVideoConfig();
+
+
+
+
+
+
+
+
+ ;
+```
+
+## No animations not driven by `useCurrentFrame()`
+
+Shaders, models etc MUST NOT animate by themselves.
+No animations are allowed unless they are driven by `useCurrentFrame()`.
+Otherwise, it will cause flickering during rendering.
+
+Using `useFrame()` from `@react-three/fiber` is forbidden.
+
+## Animate using `useCurrentFrame()`
+
+Use `useCurrentFrame()` to perform animations.
+
+```tsx
+const frame = useCurrentFrame();
+const rotationY = frame * 0.02;
+
+
+
+
+ ;
+```
+
+## Using `` inside ``
+
+The `layout` prop of any `` inside a `` must be set to `none`.
+
+```tsx
+import { Sequence } from "remotion";
+import { ThreeCanvas } from "@remotion/three";
+
+const { width, height } = useVideoConfig();
+
+
+
+
+
+
+
+
+ ;
+```
diff --git a/remotion-best-practices/remotion-markup/REFERENCE.md b/remotion-best-practices/remotion-markup/REFERENCE.md
new file mode 100644
index 0000000..c05f131
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/REFERENCE.md
@@ -0,0 +1,365 @@
+---
+name: remotion-markup
+description: Content, animation and effects best practices
+version: 4.0.526
+---
+
+This is guidance for writing Remotion React Markup.
+If this is not relevant, load [Remotion Best Practices](../SKILL.md) instead.
+
+## Preserve user changes
+
+Users may make edits in the code outside of the conversation.
+
+If you detect a surprising change made in the meanwhile, don't overwrite it, assume it was intentional or ask for confirmation.
+
+## General rules
+
+Drive animations using `useCurrentFrame()` and `interpolate()`.
+CSS `transition` or `animation` will not render correctly, they need to refactored.
+Tailwind animation class will not render correctly, they need to be refactored.
+
+Use `Easing.bezier()` and `Easing.spring()` to customize timing.
+
+Structure your markup according to [Remotion Interactivity Best Practices](../remotion-interactivity/REFERENCE.md)
+
+```tsx
+import { useCurrentFrame, Easing, interpolate, Interactive } from "remotion";
+
+export const FadeIn = () => {
+ const frame = useCurrentFrame();
+
+ return (
+
+ Hello World!
+
+ );
+};
+```
+
+Keep the `interpolate()` call inline in the `style` prop.
+Use `scale`, `translate`, `rotate` CSS properties over `transform`.
+
+```tsx
+// 👍 Inline editable keyframes and transform shorthands
+style={{
+ scale: interpolate(frame, [0, 100], [0, 1], {
+ extrapolateLeft: 'clamp',
+ extrapolateRight: 'clamp',
+ easing: Easing.spring({damping: 200}),
+ output: 'perceptual-scale' // For `scale` animations, use "output: 'perceptual-scale'"
+ }),
+ translate: interpolate(frame, [0, 100], ["0px 0px", "100px 100px"], {
+ extrapolateLeft: 'clamp',
+ extrapolateRight: 'clamp',
+ easing: Easing.spring({damping: 200}),
+ }),
+ rotate: interpolate(frame, [0, 100], ["20deg", "90deg"], {
+ extrapolateLeft: 'clamp',
+ extrapolateRight: 'clamp',
+ easing: Easing.spring({damping: 200}),
+ }),
+}}
+
+// 👎 Non-inline values and transform strings become harder to edit in Studio
+const scale = interpolate(frame, [0, 100], [0, 1]);
+
+style={{
+ transform: `scale(${scale})`,
+}}
+```
+
+## Assets
+
+Place assets in the `public/` folder at your project root.
+Use `staticFile()` to reference files from the `public/` folder.
+
+## Media components
+
+Add video and audio using `` and `` from `@remotion/media`.
+Add images using the `` component.
+Add animated GIFs, APNG, WebP or AVIF images using ``, use `@remotion/gif` if not using Chrome.
+Use `staticFile()` for files in `public/` or pass a remote URL directly:
+
+```tsx
+import { Audio, Video } from "@remotion/media";
+import { staticFile, CanvasImage, AnimatedImage } from "remotion";
+
+export const MyComposition = () => {
+ return (
+ <>
+
+
+
+
+
+ >
+ );
+};
+```
+
+## Example scene
+
+```tsx
+import {
+ AbsoluteFill,
+ Easing,
+ Interactive,
+ interpolate,
+ useCurrentFrame,
+ useVideoConfig
+} from "remotion";
+
+export const Empty = () => {
+ const {fps} = useVideoConfig();
+ const frame = useCurrentFrame();
+
+ return (
+
+
+ Title
+
+
+ Subtitle
+
+
+ );
+}
+```
+
+## Delaying, trimming
+
+Most components (``, `` ` `, ``, ``, ``, ``, `` from `remotion`, `` and `` from `@remotion/media`, ``, and more) support the following props:
+
+### from
+
+```tsx
+
+
+
+```
+
+When the element starts appearing in the timelien.
+
+### durationInFrames
+
+```tsx
+
+
+```
+
+For how long the layer plays in the timeline.
+For media, pass the natural duration of the media: ` `
+
+### `trimBefore`
+
+Useful for components whose internal clock should start later:
+
+```tsx
+// Trim away first 2 seconds of footage
+
+
+// `useCurrenFrame()` for children starts at `10 * fps`
+
+```
+
+### Fallback
+
+If a component does not support these props, wrap it in`` from `remotion`, which has them.
+
+- `layout="absolute-fill"` makes the Sequence behave like AbsoluteFill
+- `layout="none"` is "headless" mode, no wrapper element is used.
+
+## Maps
+
+See [Remotion Maps](./remotion-maps/REFERENCE.md) if wanting to include maps in the video.
+
+## Text highlights and annotations
+
+See [text-highlights.md](text-highlights.md) for text highlights (highlight markers), circles, underlines, strike-throughs, crossed-off text, boxes.
+
+## Multi-scene videos
+
+See [multi-scene-video.md](multi-scene-video.md) if planning to make a video with multiple subsequent scenes.
+
+## Voiceover
+
+See [voiceover.md](voiceover.md) for adding an AI-generated voiceover to Remotion compositions using ElevenLabs TTS.
+
+## Embedding Videos
+
+See [embedding-videos.md](embedding-videos.md) for advanced knowledge about embedding videos - trimming, volume, speed, looping, pitch.
+
+## Embedding Audio
+
+See [audio.md](audio.md) for advanced audio features like trimming, volume, speed, pitch.
+
+## Video editing
+
+See [video-editing.md](video-editing.md) for structuring editable video timelines in Remotion Studio.
+
+## Cropping
+
+See [cropping.md](cropping.md) if needing to crop the visible rectangle of a component.
+
+## Transitions
+
+See [transitions.md](transitions.md) for scene transition patterns.
+
+## Visual and pixel effects
+
+When creating a visual effect, consider whether it is feasible using CSS and HTML, or whether a shader is needed.
+Order or preference:
+
+1. Regular HTML + CSS or other web techniques
+2. An effect applied to the element directly (``, ` `), or by wrapping the content in [``](html-in-canvas.md), which also accepts `effects`:
+
+- A listed effect via [effects.md](effects.md)
+- A custom `createEffect()` via [effects.md](effects.md) when no preset is available.
+
+## 3D content
+
+See [./3d.md](./3d.md) for 3D content in Remotion using Three.js and React Three Fiber.
+
+## Sound effects
+
+When needing to use sound effects, load the [./sfx.md](./sfx.md) file for more information.
+
+## Audio visualization
+
+When needing to visualize audio (spectrum bars, waveforms, bass-reactive effects), load the [./audio-visualization.md](./audio-visualization.md) file for more information.
+
+## Maps
+
+For static maps, animated routes and markers, geographic explainers, Mapbox, MapLibre, MapTiler, GeoJSON, or 3D geographic flyovers, load [Remotion Maps](./remotion-maps/REFERENCE.md).
+
+## Captions
+
+When dealing with captions or subtitles, load the [Remotion Captions](../remotion-captions/REFERENCE.md) skill for more information.
+
+## Google Fonts
+
+Is the recommended way to load fonts in Remotion. See [google-fonts.md](google-fonts.md) for how to load Google Fonts.
+
+## Local fonts
+
+See [local-fonts.md](local-fonts.md) for how to load local fonts.
+
+## GIFs
+
+See [gifs.md](gifs.md) for how to display GIFs synchronized with Remotion's timeline.
+
+## Advanced Images
+
+See [images.md](images.md) for sizing and positioning images, dynamic image paths, and getting image dimensions.
+
+## Lottie animations
+
+See [lottie.md](lottie.md) for embedding Lottie animations in Remotion.
+
+## Timing
+
+See [timing.md](timing.md) for more timing techniques for `interpolate()`.
+
+## Parameterized videos
+
+See [parameters.md](parameters.md) for making a composition parametrizable by adding a Zod schema.
+
+## Measuring DOM nodes
+
+See [measuring-dom-nodes.md](measuring-dom-nodes.md) for measuring DOM element dimensions in Remotion.
+
+## Measuring text
+
+See [measuring-text.md](measuring-text.md) for measuring text dimensions, fitting text to containers, and checking overflow.
+
+## Using FFmpeg
+
+For some video operations, such as trimming videos or detecting silence, FFmpeg should be used. Load the [./ffmpeg.md](./ffmpeg.md) file for more information.
+
+## Silence detection
+
+When needing to detect and trim silent segments from video or audio files, load the [./silence-detection.md](./silence-detection.md) file.
+
+## Dynamic duration, dimensions and data
+
+See [calculate-metadata.md](calculate-metadata.md) for dynamically set composition duration, dimensions, and props.
+
+## Advanced compositions
+
+See [compositions.md](compositions.md) for how to define stills, folders, default props and for how to nest compositions.
+
+## Advanced sequencing
+
+See [sequencing.md](sequencing.md) for more sequencing patterns - delay, trim, limit duration of items.
+
+## Install modules
+
+Use `npx remotion add` to add new packages with the right version:
+
+```
+npx remotion add @remotion/media
+```
+
+This goes for `@remotion/*` packages, `mediabunny`, `@mediabunny/*`, `zod`, and `@huggingface/transformers`.
+
+## Previewing markup
+
+```
+npx remotion studio --no-open
+```
+
+This will start a long-running process and print the server URL for the preview.
+If server is already started, it will print the URL.
+You can visit a specific composition by navigating to `/[composition-id]`, for example `http://localhost:3000/MapAnimation`.
+
+## Optional: one-frame render check
+
+You can render a single frame with the CLI to sanity-check layout, colors, or timing.
+Skip it for trivial edits, pure refactors, or when you already have enough confidence from Studio or prior renders.
+
+```bash
+npx remotion still [composition-id] --scale=0.25 --frame=30
+```
+
+At 30 fps, `--frame=30` is the one-second mark (`--frame` is zero-based).
diff --git a/remotion-best-practices/remotion-markup/agents/openai.yaml b/remotion-best-practices/remotion-markup/agents/openai.yaml
new file mode 100644
index 0000000..3174fbd
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/agents/openai.yaml
@@ -0,0 +1,7 @@
+interface:
+ display_name: '/remotion-markup'
+ short_description: 'Apply Remotion animation and effects practices'
+ icon_small: './assets/remotion-icon.svg'
+ icon_large: './assets/remotion-icon.svg'
+ brand_color: '#0B84F3'
+ default_prompt: '$remotion-markup: Apply best Remotion Practices to MyComp.tsx.'
diff --git a/remotion-best-practices/remotion-markup/assets/remotion-icon.svg b/remotion-best-practices/remotion-markup/assets/remotion-icon.svg
new file mode 100644
index 0000000..420dbc7
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/assets/remotion-icon.svg
@@ -0,0 +1,4 @@
+
+Remotion
+
+
diff --git a/remotion-best-practices/remotion-markup/audio-visualization.md b/remotion-best-practices/remotion-markup/audio-visualization.md
new file mode 100644
index 0000000..733b0d3
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/audio-visualization.md
@@ -0,0 +1,198 @@
+---
+name: audio-visualization
+description: Audio visualization patterns - spectrum bars, waveforms, bass-reactive effects
+metadata:
+ tags: audio, visualization, spectrum, waveform, bass, music, audiogram, frequency
+---
+
+# Audio Visualization in Remotion
+
+## Prerequisites
+
+```bash
+npx remotion add @remotion/media-utils
+```
+
+## Loading Audio Data
+
+Use `useWindowedAudioData()` (https://www.remotion.dev/docs/use-windowed-audio-data) to load audio data:
+
+```tsx
+import { useWindowedAudioData } from "@remotion/media-utils";
+import { staticFile, useCurrentFrame, useVideoConfig } from "remotion";
+
+const frame = useCurrentFrame();
+const { fps } = useVideoConfig();
+
+const { audioData, dataOffsetInSeconds } = useWindowedAudioData({
+ src: staticFile("podcast.wav"),
+ frame,
+ fps,
+ windowInSeconds: 30,
+});
+```
+
+## Spectrum Bar Visualization
+
+Use `visualizeAudio()` (https://www.remotion.dev/docs/visualize-audio) to get frequency data for bar charts:
+
+```tsx
+import { useWindowedAudioData, visualizeAudio } from "@remotion/media-utils";
+import { staticFile, useCurrentFrame, useVideoConfig } from "remotion";
+
+const frame = useCurrentFrame();
+const { fps } = useVideoConfig();
+
+const { audioData, dataOffsetInSeconds } = useWindowedAudioData({
+ src: staticFile("music.mp3"),
+ frame,
+ fps,
+ windowInSeconds: 30,
+});
+
+if (!audioData) {
+ return null;
+}
+
+const frequencies = visualizeAudio({
+ fps,
+ frame,
+ audioData,
+ numberOfSamples: 256,
+ optimizeFor: "speed",
+ dataOffsetInSeconds,
+});
+
+return (
+
+ {frequencies.map((v, i) => (
+
+ ))}
+
+);
+```
+
+- `numberOfSamples` must be power of 2 (32, 64, 128, 256, 512, 1024)
+- Values range 0-1; left of array = bass, right = highs
+- Use `optimizeFor: "speed"` for Lambda or high sample counts
+
+**Important:** When passing `audioData` to child components, also pass the `frame` from the parent. Do not call `useCurrentFrame()` in each child - this causes discontinuous visualization when children are inside `` with offsets.
+
+## Waveform Visualization
+
+Use `visualizeAudioWaveform()` (https://www.remotion.dev/docs/media-utils/visualize-audio-waveform) with `createSmoothSvgPath()` (https://www.remotion.dev/docs/media-utils/create-smooth-svg-path) for oscilloscope-style displays:
+
+```tsx
+import {
+ createSmoothSvgPath,
+ useWindowedAudioData,
+ visualizeAudioWaveform,
+} from "@remotion/media-utils";
+import { staticFile, useCurrentFrame, useVideoConfig } from "remotion";
+
+const frame = useCurrentFrame();
+const { width, fps } = useVideoConfig();
+const HEIGHT = 200;
+
+const { audioData, dataOffsetInSeconds } = useWindowedAudioData({
+ src: staticFile("voice.wav"),
+ frame,
+ fps,
+ windowInSeconds: 30,
+});
+
+if (!audioData) {
+ return null;
+}
+
+const waveform = visualizeAudioWaveform({
+ fps,
+ frame,
+ audioData,
+ numberOfSamples: 256,
+ windowInSeconds: 0.5,
+ dataOffsetInSeconds,
+});
+
+const path = createSmoothSvgPath({
+ points: waveform.map((y, i) => ({
+ x: (i / (waveform.length - 1)) * width,
+ y: HEIGHT / 2 + (y * HEIGHT) / 2,
+ })),
+});
+
+return (
+
+
+
+);
+```
+
+## Bass-Reactive Effects
+
+Extract low frequencies for beat-reactive animations:
+
+```tsx
+const frequencies = visualizeAudio({
+ fps,
+ frame,
+ audioData,
+ numberOfSamples: 128,
+ optimizeFor: "speed",
+ dataOffsetInSeconds,
+});
+
+const lowFrequencies = frequencies.slice(0, 32);
+const bassIntensity =
+ lowFrequencies.reduce((sum, v) => sum + v, 0) / lowFrequencies.length;
+
+const scale = 1 + bassIntensity * 0.5;
+const opacity = Math.min(0.6, bassIntensity * 0.8);
+```
+
+## Volume-Based Waveform
+
+Use `getWaveformPortion()` (https://www.remotion.dev/docs/get-waveform-portion) when you need simplified volume data instead of frequency spectrum:
+
+```tsx
+import { getWaveformPortion } from "@remotion/media-utils";
+import { useCurrentFrame, useVideoConfig } from "remotion";
+
+const frame = useCurrentFrame();
+const { fps } = useVideoConfig();
+const currentTimeInSeconds = frame / fps;
+
+const waveform = getWaveformPortion({
+ audioData,
+ startTimeInSeconds: currentTimeInSeconds,
+ durationInSeconds: 5,
+ numberOfSamples: 50,
+});
+
+// Returns array of { index, amplitude } objects (amplitude: 0-1)
+waveform.map((bar) => (
+
+));
+```
+
+## Postprocessing
+
+Low frequencies naturally dominate. Apply logarithmic scaling for visual balance:
+
+```tsx
+const minDb = -100;
+const maxDb = -30;
+
+const scaled = frequencies.map((value) => {
+ const db = 20 * Math.log10(value);
+ return (db - minDb) / (maxDb - minDb);
+});
+```
diff --git a/remotion-best-practices/remotion-markup/audio.md b/remotion-best-practices/remotion-markup/audio.md
new file mode 100644
index 0000000..ad917a4
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/audio.md
@@ -0,0 +1,171 @@
+---
+name: audio
+description: Using audio and sound in Remotion - importing, trimming, volume, speed, pitch
+metadata:
+ tags: audio, media, trim, volume, speed, loop, pitch, mute, sound, sfx
+---
+
+# Using audio in Remotion
+
+## Prerequisites
+
+First, the @remotion/media package needs to be installed.
+If it is not installed, use the following command:
+
+```bash
+npx remotion add @remotion/media
+```
+
+## Importing Audio
+
+Use `` from `@remotion/media` to add audio to your composition.
+
+```tsx
+import { Audio } from "@remotion/media";
+import { staticFile } from "remotion";
+
+export const MyComposition = () => {
+ return ;
+};
+```
+
+Remote URLs are also supported:
+
+```tsx
+
+```
+
+By default, audio plays from the start, at full volume and full length.
+Multiple audio tracks can be layered by adding multiple `` components.
+
+## Trimming
+
+Use `trimBefore` and `trimAfter` to remove portions of the audio. Values are in frames.
+
+```tsx
+const { fps } = useVideoConfig();
+
+return (
+
+);
+```
+
+The audio still starts playing at the beginning of the composition - only the specified portion is played.
+
+## Delaying
+
+Wrap the audio in a `` to delay when it starts:
+
+```tsx
+import { Sequence, staticFile } from "remotion";
+import { Audio } from "@remotion/media";
+
+const { fps } = useVideoConfig();
+
+return (
+
+
+
+);
+```
+
+The audio will start playing after 1 second.
+
+## Volume
+
+Set a static volume (0 to 1):
+
+```tsx
+
+```
+
+Or use a callback for dynamic volume based on the current frame:
+
+```tsx
+import { interpolate } from "remotion";
+
+const { fps } = useVideoConfig();
+
+return (
+
+ interpolate(f, [0, 1 * fps], [0, 1], { extrapolateRight: "clamp" })
+ }
+ />
+);
+```
+
+The value of `f` starts at 0 when the audio begins to play, not the composition frame.
+
+## Muting
+
+Use `muted` to silence the audio. It can be set dynamically:
+
+```tsx
+const frame = useCurrentFrame();
+const { fps } = useVideoConfig();
+
+return (
+ = 2 * fps && frame <= 4 * fps} // Mute between 2s and 4s
+ />
+);
+```
+
+## Speed
+
+Use `playbackRate` to change the playback speed:
+
+```tsx
+// 2x speed
+
+// Half speed
+
+```
+
+Reverse playback is not supported.
+
+## Looping
+
+Use `loop` to loop the audio indefinitely:
+
+```tsx
+
+```
+
+Use `loopVolumeCurveBehavior` to control how the frame count behaves when looping:
+
+- `"repeat"`: Frame count resets to 0 each loop (default)
+- `"extend"`: Frame count continues incrementing
+
+```tsx
+ interpolate(f, [0, 300], [1, 0])} // Fade out over multiple loops
+/>
+```
+
+## Pitch
+
+Use `toneFrequency` to adjust the pitch without affecting speed. Values range from 0.01 to 2:
+
+```tsx
+
+
+```
+
+Pitch shifting only works during server-side rendering, not in the Remotion Studio preview or in the ` `.
diff --git a/remotion-best-practices/remotion-markup/calculate-metadata.md b/remotion-best-practices/remotion-markup/calculate-metadata.md
new file mode 100644
index 0000000..b66aedb
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/calculate-metadata.md
@@ -0,0 +1,136 @@
+---
+name: calculate-metadata
+description: Dynamically set composition duration, dimensions, and props
+metadata:
+ tags: calculateMetadata, duration, dimensions, props, dynamic
+---
+
+# Using calculateMetadata
+
+Use `calculateMetadata` on a `` to dynamically set duration, dimensions, and transform props before rendering.
+Use it when metadata depends on input props, fetched data, or asset metadata.
+For static dimensions, duration, FPS, and initial props, inline the values on `` instead.
+
+```tsx
+
+```
+
+## Setting duration based on a video
+
+Use the [`getVideoDuration`](../remotion-multimedia/get-video-duration.md) and [`getVideoDimensions`](../remotion-multimedia/get-video-dimensions.md) skills to get the video duration and dimensions:
+
+```tsx
+import { CalculateMetadataFunction } from "remotion";
+import { getVideoDuration } from "./get-video-duration";
+
+const calculateMetadata: CalculateMetadataFunction = async ({
+ props,
+}) => {
+ const durationInSeconds = await getVideoDuration(props.videoSrc);
+
+ return {
+ durationInFrames: Math.ceil(durationInSeconds * 30),
+ };
+};
+```
+
+## Matching dimensions of a video
+
+Use the [`getVideoDimensions`](../remotion-multimedia/get-video-dimensions.md) skill to get the video dimensions:
+
+```tsx
+import { CalculateMetadataFunction } from "remotion";
+import { getVideoDuration } from "./get-video-duration";
+import { getVideoDimensions } from "./get-video-dimensions";
+
+const calculateMetadata: CalculateMetadataFunction = async ({
+ props,
+}) => {
+ const dimensions = await getVideoDimensions(props.videoSrc);
+
+ return {
+ width: dimensions.width,
+ height: dimensions.height,
+ };
+};
+```
+
+## Setting duration based on multiple videos
+
+```tsx
+const calculateMetadata: CalculateMetadataFunction = async ({
+ props,
+}) => {
+ const metadataPromises = props.videos.map((video) =>
+ getVideoDuration(video.src),
+ );
+ const allMetadata = await Promise.all(metadataPromises);
+
+ const totalDuration = allMetadata.reduce(
+ (sum, durationInSeconds) => sum + durationInSeconds,
+ 0,
+ );
+
+ return {
+ durationInFrames: Math.ceil(totalDuration * 30),
+ };
+};
+```
+
+## Setting a default outName
+
+Set the default output filename based on props:
+
+```tsx
+const calculateMetadata: CalculateMetadataFunction = async ({
+ props,
+}) => {
+ return {
+ defaultOutName: `video-${props.id}`, // .mp4 is added automatically
+ };
+};
+```
+
+## Transforming props
+
+Fetch data or transform props before rendering:
+
+```tsx
+const calculateMetadata: CalculateMetadataFunction = async ({
+ props,
+ abortSignal,
+}) => {
+ const response = await fetch(props.dataUrl, { signal: abortSignal });
+ const data = await response.json();
+
+ return {
+ props: {
+ ...props,
+ fetchedData: data,
+ },
+ };
+};
+```
+
+The `abortSignal` cancels stale requests when props change in the Studio.
+
+## Return value
+
+All fields are optional. Returned values override the `` props:
+
+- `durationInFrames`: Number of frames
+- `width`: Composition width in pixels
+- `height`: Composition height in pixels
+- `fps`: Frames per second
+- `props`: Transformed props passed to the component
+- `defaultOutName`: Default output filename
+- `defaultCodec`: Default codec for rendering
diff --git a/remotion-best-practices/remotion-markup/compositions.md b/remotion-best-practices/remotion-markup/compositions.md
new file mode 100644
index 0000000..0d1a4ba
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/compositions.md
@@ -0,0 +1,117 @@
+---
+name: compositions
+description: Defining compositions, stills, folders, default props and dynamic metadata
+metadata:
+ tags: composition, still, folder, props, metadata
+---
+
+A `` defines the component, width, height, fps and duration of a renderable video.
+
+## Default Props and scaffold metadata
+
+Pass `defaultProps` to provide initial values for your component.
+Values must be JSON-serializable (`Date`, `Map`, `Set`, and `staticFile()` are supported).
+Use `defaultProps` for composition-wide values that should be visible and editable before the video renders.
+
+For Studio editing, keep `defaultProps` as an inline object literal on `` or ``.
+Do not store it in a variable, import it, spread it, create it with a helper, or wrap it in `satisfies`.
+When scaffolding, keep the component and `` registration in the same file so `width`, `height`, `fps`, `durationInFrames`, and `defaultProps` are visible next to the code that uses them.
+Use `type` declarations for props rather than `interface` to ensure `defaultProps` type safety.
+
+```tsx
+type Props = {
+ readonly title: string;
+};
+
+export const MyComposition = ({ title }: Props) => (
+
+ {title}
+
+);
+
+const defaultProps = { title: "Hello World" };
+
+// 👍 Inline metadata and defaults
+ ;
+
+// 👎 Hidden defaults cannot be saved back by Studio
+ ;
+```
+
+## Folders
+
+Use `` to organize compositions in the sidebar.
+Folder names can only contain letters, numbers, and hyphens.
+
+```tsx
+import { Composition, Folder } from "remotion";
+
+export const RemotionRoot = () => {
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+};
+```
+
+## Stills
+
+Use `` for single-frame images. It does not require `durationInFrames` or `fps`.
+
+```tsx
+import { Still } from "remotion";
+import { Thumbnail } from "./Thumbnail";
+
+export const RemotionRoot = () => {
+ return (
+
+ );
+};
+```
+
+## Dynamic duration, width, and height
+
+Use [`calculateMetadata`](./calculate-metadata.md) to make dimensions, duration, or props dynamic based on input props, fetched data, or asset metadata.
+
+## Nesting compositions within another
+
+To add a composition within another composition, you can use the `` component with a `width` and `height` prop to specify the size of the composition.
+
+```tsx
+
+
+
+
+
+```
diff --git a/remotion-best-practices/remotion-markup/cropping.md b/remotion-best-practices/remotion-markup/cropping.md
new file mode 100644
index 0000000..d445a0a
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/cropping.md
@@ -0,0 +1,34 @@
+# Cropping
+
+Preferably, the `cropLeft`, `cropRight`, `cropTop` and `cropBottom` props are used to crop content.
+It allows for interactively dragging the components and adapting the outlines in the canvas to the crop.
+
+The following components support `crop*` props:
+
+- `` from `remotion`, when `layout="absolute-fill"`
+- `` from `remotion`
+- ` ` from `remotion`
+- `` from `remotion`
+- `` from `remotion`
+- `` from `remotion`
+- `` from `@remotion/media`
+- `` from `@remotion/gif`
+- `` from `@remotion/rive`
+
+Crop values are ratios between `0` and `1`.
+A value of `0` applies no crop on that edge.
+A value of `1` is a full crop.
+Keep [Interactivity Best Practices](../remotion-interactivity/REFERENCE.md) also for cropping, to keep it editable and keyframable.
+
+```tsx
+
+```
+
+Do not use `clipPath` together with crop props.
diff --git a/remotion-best-practices/remotion-markup/effects.md b/remotion-best-practices/remotion-markup/effects.md
new file mode 100644
index 0000000..9b41109
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/effects.md
@@ -0,0 +1,251 @@
+---
+name: effects
+description: Canvas/WebGL visual effects for Remotion using effects arrays and createEffect().
+metadata:
+ tags: effects, visual-effects, webgl, canvas, video, create-effect
+---
+
+Use this rule only when the top-level skill lists an effect that matches the requested look, or when the user asks to create a reusable custom effect.
+
+Docs: https://www.remotion.dev/docs/effects
+Custom effect docs: https://www.remotion.dev/docs/create-effect
+
+## Usage
+
+Install the package that provides the chosen effect:
+
+```bash
+npx remotion add @remotion/effects
+```
+
+Effects are functions passed to the `effects` prop of canvas-based components such as `` from `@remotion/media`, ``, ``, and ``.
+
+```tsx
+import {Video} from '@remotion/media';
+import {blur} from '@remotion/effects/blur';
+
+ ;
+```
+
+Use the effect docs for exact props and imports. Most `@remotion/effects` imports use `@remotion/effects/`; `uvTranslate()` and `xyTranslate()` use `@remotion/effects/translate`.
+
+These effects use WebGL2. During renders, enable WebGL with:
+
+```ts
+import {Config} from '@remotion/cli/config';
+
+Config.setChromiumOpenGlRenderer('angle');
+```
+
+## Available effects
+
+`brightness()`, `contrast()`, `colorKey()`, `duotone()`, `grayscale()`, `hue()`, `invert()`, `saturation()`, `tint()`, `linearGradient()`, `linearGradientTint()`, `thermalVision()`, `blur()`, `linearProgressiveBlur()`, `radialProgressiveBlur()`, `zoomBlur()`, `dropShadow()`, `glow()`, `lightTrail()`, `evolve()`, `venetianBlinds()`, `mirror()`, `scale()`, `uvTranslate()`, `xyTranslate()`, `barrelDistortion()`, `chromaticAberration()`, `fisheye()`, `cornerPin()`, `wave()`, `burlap()`, `emboss()`, `dotGrid()`, `halftone()`, `noise()`, `noiseDisplacement()`, `paper()`, `roughenEdges()`, `pattern()`, `pixelate()`, `pixelDissolve()`, `scanlines()`, `speckle()`, `shine()`, `shrinkwrap()`, `vignette()`, `contourLines()`, `checkerboard()`, `halftoneLinearGradient()`, `gridlines()`, `whiteNoise()`, `tvSignalOff()`, `lines()`, `rings()`, `waves()`, `zigzag()`, `lightLeak()`, `starburst()`.
+
+Example:
+
+```tsx
+import {brightness} from "@remotion/effects";
+
+ ;
+```
+
+## Custom effects
+
+Use `createEffect()` from `remotion` when the user wants a reusable effect factory that works in the same `effects` array as `@remotion/effects`.
+
+Prefer a custom effect over `` when the transformation should be reusable, parameterized, editable in Studio, or stackable with other effects.
+
+For quick project-specific effects, keep the effect next to the composition, for example `src/effects/palette-map.ts`. For library effects intended for `@remotion/effects`, follow the repository's `add-effect` skill instead.
+
+`createEffect()` expects:
+
+- `type`: stable reverse-DNS identifier, for example `com.example.paletteMap`.
+- `label`: Studio label, commonly `paletteMap()`.
+- `documentationLink`: URL or `null`.
+- `backend`: `"2d"`, `"webgl2"` or `"webgpu"`.
+- `calculateKey(params)`: stable string containing every resolved parameter that changes output.
+- `setup(target)`: create reusable backend state, or return `null`.
+- `apply({source, target, width, height, params, state, flipSourceY})`: draw the transformed result into `target`.
+- `cleanup(state)`: free resources created by `setup()`.
+- `schema`: an `InteractivitySchema` for Studio controls. `disabled` is added automatically.
+- `validateParams(params)`: throw on missing or invalid values.
+
+Use `backend: "2d"` for simple pixel, filter, drawImage, or image-data effects. Use WebGL2 only when shader math or GPU performance is needed; during renders, enable WebGL as shown above.
+
+```ts
+import {createEffect, type InteractivitySchema} from 'remotion';
+
+type MyEffectParams = {
+ readonly amount?: number;
+};
+
+const myEffectSchema = {
+ amount: {
+ type: 'number',
+ min: 0,
+ max: 1,
+ step: 0.01,
+ default: 1,
+ description: 'Amount',
+ },
+} as const satisfies InteractivitySchema;
+
+const resolve = (params: MyEffectParams) => ({
+ amount: params.amount ?? 1,
+});
+
+export const myEffect = createEffect({
+ type: 'com.example.myEffect',
+ label: 'myEffect()',
+ documentationLink: null,
+ backend: '2d',
+ calculateKey: (params) => {
+ const {amount} = resolve(params);
+ return `my-effect-${amount}`;
+ },
+ setup: () => null,
+ apply: ({source, target, width, height, params}) => {
+ const ctx = target.getContext('2d');
+ if (!ctx) {
+ throw new Error('Could not get a 2D context for myEffect().');
+ }
+
+ const {amount} = resolve(params);
+
+ ctx.clearRect(0, 0, width, height);
+ ctx.filter = `opacity(${amount * 100}%)`;
+ ctx.drawImage(source, 0, 0, width, height);
+ ctx.filter = 'none';
+ },
+ cleanup: () => undefined,
+ schema: myEffectSchema,
+ validateParams: ({amount = 1}) => {
+ if (typeof amount !== 'number' || !Number.isFinite(amount) || amount < 0 || amount > 1) {
+ throw new TypeError('amount must be a number between 0 and 1');
+ }
+ },
+});
+```
+
+For a WebGL2 effect, compile/link shaders in `setup()`, keep the program, fullscreen quad, texture, and uniform locations in state, upload `source` in `apply()`, and free GPU resources in `cleanup()`. Minimal shape:
+
+```ts
+import {createEffect, type InteractivitySchema} from 'remotion';
+
+type RgbShiftParams = {
+ readonly amount?: number;
+};
+
+type RgbShiftState = {
+ readonly gl: WebGL2RenderingContext;
+ readonly program: WebGLProgram;
+ readonly vao: WebGLVertexArrayObject;
+ readonly vbo: WebGLBuffer;
+ readonly texture: WebGLTexture;
+ readonly uSource: WebGLUniformLocation | null;
+ readonly uOffset: WebGLUniformLocation | null;
+};
+
+const rgbShiftSchema = {
+ amount: {
+ type: 'number',
+ min: 0,
+ max: 80,
+ step: 1,
+ default: 12,
+ description: 'Amount',
+ },
+} as const satisfies InteractivitySchema;
+
+export const rgbShift = createEffect({
+ type: 'com.example.rgbShift',
+ label: 'rgbShift()',
+ documentationLink: null,
+ backend: 'webgl2',
+ calculateKey: ({amount = 12}) => `rgb-shift-${amount}`,
+ setup: (target) => {
+ const gl = target.getContext('webgl2', {
+ premultipliedAlpha: true,
+ alpha: true,
+ preserveDrawingBuffer: true,
+ });
+ if (!gl) {
+ throw new Error('Could not get a WebGL2 context for rgbShift().');
+ }
+
+ gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
+
+ // Compile/link shaders, create a fullscreen quad VAO/VBO, create a
+ // CLAMP_TO_EDGE RGBA texture, and get uSource/uOffset uniform locations.
+ return createRgbShiftState(gl);
+ },
+ apply: ({source, width, height, params, state, flipSourceY}) => {
+ const amount = params.amount ?? 12;
+ const {gl} = state;
+
+ gl.viewport(0, 0, width, height);
+ gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flipSourceY);
+ gl.activeTexture(gl.TEXTURE0);
+ gl.bindTexture(gl.TEXTURE_2D, state.texture);
+ gl.texImage2D(
+ gl.TEXTURE_2D,
+ 0,
+ gl.RGBA,
+ gl.RGBA,
+ gl.UNSIGNED_BYTE,
+ source as TexImageSource,
+ );
+
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
+ gl.useProgram(state.program);
+ if (state.uSource) gl.uniform1i(state.uSource, 0);
+ if (state.uOffset) gl.uniform2f(state.uOffset, amount / width, 0);
+ gl.bindVertexArray(state.vao);
+ gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
+ },
+ cleanup: ({gl, program, vao, vbo, texture}) => {
+ gl.deleteTexture(texture);
+ gl.deleteBuffer(vbo);
+ gl.deleteProgram(program);
+ gl.deleteVertexArray(vao);
+ },
+ schema: rgbShiftSchema,
+ validateParams: ({amount = 12}) => {
+ if (typeof amount !== 'number' || !Number.isFinite(amount) || amount < 0 || amount > 80) {
+ throw new TypeError('amount must be a number between 0 and 80');
+ }
+ },
+});
+```
+
+For a complete 2D and WebGL2 pair, see `packages/example/src/EffectsTestbed/sample-posterize-2d.ts` and `packages/example/src/EffectsTestbed/sample-rgb-shift-webgl.ts`.
+
+Use the returned factory in an `effects` array:
+
+```tsx
+import {CanvasImage, staticFile} from 'remotion';
+import {myEffect} from './effects/my-effect';
+
+export const MyComp: React.FC = () => {
+ return (
+
+ );
+};
+```
+
+When generating a custom effect, also:
+
+- Include `disabled?: boolean` only through the returned factory; do not add it to the custom params type or schema.
+- Validate required parameters at factory-call time with `validateParams`.
+- Include all defaults in both `schema` and the `resolve()` helper.
+- Reset mutable 2D context state such as `filter`, `globalAlpha`, transforms, and compositing after drawing.
+- Preserve alpha unless the requested effect intentionally changes transparency.
diff --git a/remotion-best-practices/remotion-markup/embedding-videos.md b/remotion-best-practices/remotion-markup/embedding-videos.md
new file mode 100644
index 0000000..51d73a8
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/embedding-videos.md
@@ -0,0 +1,173 @@
+---
+name: embedding-videos
+description: Embedding videos in Remotion - trimming, volume, speed, looping, pitch
+metadata:
+ tags: video, media, trim, volume, speed, loop, pitch
+---
+
+# Using videos in Remotion
+
+## Prerequisites
+
+First, the @remotion/media package needs to be installed.
+If it is not, use the following command:
+
+```bash
+npx remotion add @remotion/media # If project uses npm
+bunx remotion add @remotion/media # If project uses bun
+yarn remotion add @remotion/media # If project uses yarn
+pnpm exec remotion add @remotion/media # If project uses pnpm
+```
+
+Use `` from `@remotion/media` to embed videos into your composition.
+
+```tsx
+import { Video } from "@remotion/media";
+import { staticFile } from "remotion";
+
+export const MyComposition = () => {
+ return ;
+};
+```
+
+Remote URLs are also supported:
+
+```tsx
+
+```
+
+## Trimming
+
+Use `trimBefore` and `trimAfter` to remove portions of the video. Values are in seconds.
+
+```tsx
+const { fps } = useVideoConfig();
+
+return (
+
+);
+```
+
+## Delaying
+
+Wrap the video in a `` to delay when it appears:
+
+```tsx
+import { Sequence, staticFile } from "remotion";
+import { Video } from "@remotion/media";
+
+const { fps } = useVideoConfig();
+
+return (
+
+
+
+);
+```
+
+The video will appear after 1 second.
+
+## Sizing and Position
+
+Use the `style` prop to control size and position:
+
+```tsx
+
+```
+
+## Volume
+
+Set a static volume (0 to 1):
+
+```tsx
+
+```
+
+Or use a callback for dynamic volume based on the current frame:
+
+```tsx
+import { interpolate } from "remotion";
+
+const { fps } = useVideoConfig();
+
+return (
+
+ interpolate(f, [0, 1 * fps], [0, 1], { extrapolateRight: "clamp" })
+ }
+ />
+);
+```
+
+Use `muted` to silence the video entirely:
+
+```tsx
+
+```
+
+## Speed
+
+Use `playbackRate` to change the playback speed:
+
+```tsx
+// 2x speed
+
+// Half speed
+
+```
+
+Reverse playback is not supported.
+
+## Looping
+
+Use `loop` to loop the video indefinitely:
+
+```tsx
+
+```
+
+Use `loopVolumeCurveBehavior` to control how the frame count behaves when looping:
+
+- `"repeat"`: Frame count resets to 0 each loop (for `volume` callback)
+- `"extend"`: Frame count continues incrementing
+
+```tsx
+ interpolate(f, [0, 300], [1, 0])} // Fade out over multiple loops
+/>
+```
+
+## Pitch
+
+Use `toneFrequency` to adjust the pitch without affecting speed. Values range from 0.01 to 2:
+
+```tsx
+
+
+```
+
+Pitch shifting only works during server-side rendering, not in the Remotion Studio preview or in the ` `.
diff --git a/remotion-best-practices/remotion-markup/ffmpeg.md b/remotion-best-practices/remotion-markup/ffmpeg.md
new file mode 100644
index 0000000..4be15bc
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/ffmpeg.md
@@ -0,0 +1,38 @@
+---
+name: ffmpeg
+description: Using FFmpeg and FFprobe in Remotion
+metadata:
+ tags: ffmpeg, ffprobe, video, trimming
+---
+
+## FFmpeg in Remotion
+
+`ffmpeg` and `ffprobe` do not need to be installed. They are available via the `npx remotion ffmpeg` and `npx remotion ffprobe`:
+
+```bash
+npx remotion ffmpeg -i input.mp4 output.mp3
+npx remotion ffprobe input.mp4
+```
+
+### Trimming videos
+
+You have 2 options for trimming videos:
+
+1. **Preferred**: Use the `trimBefore` and `trimAfter` props of the `` component. This is non-destructive, requires no re-encoding, and you can change the trim at any time.
+
+```tsx
+import {Video} from '@remotion/media';
+
+ ;
+```
+
+2. Use the FFmpeg command line. You MUST re-encode the video to avoid frozen frames at the start of the video. Only use this if you need a standalone trimmed file (e.g. for upload or external use).
+
+```bash
+# Re-encodes from the exact frame
+npx remotion ffmpeg -ss 00:00:05 -i public/input.mp4 -to 00:00:10 -c:v libx264 -c:a aac public/output.mp4
+```
diff --git a/remotion-best-practices/remotion-markup/gifs.md b/remotion-best-practices/remotion-markup/gifs.md
new file mode 100644
index 0000000..d9ac8b7
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/gifs.md
@@ -0,0 +1,187 @@
+---
+name: gif
+description: Displaying GIFs, APNG, AVIF and WebP in Remotion
+metadata:
+ tags: gif, animation, images, animated, apng, avif, webp
+---
+
+# Using Animated images in Remotion
+
+## Basic usage
+
+Use `` to display a GIF, APNG, AVIF or WebP image synchronized with Remotion's timeline:
+
+```tsx
+import { AnimatedImage, staticFile } from "remotion";
+
+export const MyComposition = () => {
+ return (
+
+ );
+};
+```
+
+Remote URLs are also supported (must have CORS enabled):
+
+```tsx
+
+```
+
+## Sizing and fit
+
+Control how the image fills its container with the `fit` prop:
+
+```tsx
+// Stretch to fill (default)
+
+
+// Maintain aspect ratio, fit inside container
+
+
+// Fill container, crop if needed
+
+```
+
+## Playback speed
+
+Use `playbackRate` to control the animation speed:
+
+```tsx
+// 2x speed
+
+// Half speed
+
+```
+
+## Looping behavior
+
+Control what happens when the animation finishes:
+
+```tsx
+// Loop indefinitely (default)
+
+
+// Play once, show final frame
+
+
+// Play once, then clear canvas
+
+```
+
+## Styling
+
+Use the `style` prop for additional CSS (use `width` and `height` props for sizing):
+
+```tsx
+
+```
+
+## Getting GIF duration
+
+Use `getGifDurationInSeconds()` from `@remotion/gif` to get the duration of a GIF.
+
+```bash
+npx remotion add @remotion/gif
+```
+
+```tsx
+import { getGifDurationInSeconds } from "@remotion/gif";
+import { staticFile } from "remotion";
+
+const duration = await getGifDurationInSeconds(staticFile("animation.gif"));
+console.log(duration); // e.g. 2.5
+```
+
+This is useful for setting the composition duration to match the GIF:
+
+```tsx
+import { getGifDurationInSeconds } from "@remotion/gif";
+import { staticFile, CalculateMetadataFunction } from "remotion";
+
+const calculateMetadata: CalculateMetadataFunction = async () => {
+ const duration = await getGifDurationInSeconds(staticFile("animation.gif"));
+ return {
+ durationInFrames: Math.ceil(duration * 30),
+ };
+};
+```
+
+## Alternative
+
+If `` does not work (only supported in Chrome and Firefox), you can use `` from `@remotion/gif` instead.
+
+```bash
+npx remotion add @remotion/gif # If project uses npm
+bunx remotion add @remotion/gif # If project uses bun
+yarn remotion add @remotion/gif # If project uses yarn
+pnpm exec remotion add @remotion/gif # If project uses pnpm
+```
+
+```tsx
+import { Gif } from "@remotion/gif";
+import { staticFile } from "remotion";
+
+export const MyComposition = () => {
+ return ;
+};
+```
+
+The `` component has the same props as `` but only supports GIF files.
diff --git a/remotion-best-practices/remotion-markup/google-fonts.md b/remotion-best-practices/remotion-markup/google-fonts.md
new file mode 100644
index 0000000..9fd4d32
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/google-fonts.md
@@ -0,0 +1,76 @@
+---
+name: fonts
+description: Loading Google Fonts and local fonts in Remotion
+metadata:
+ tags: fonts, google-fonts, typography, text
+---
+
+# Using fonts in Remotion
+
+## Google Fonts with @remotion/google-fonts
+
+The recommended way to use Google Fonts. It's type-safe and automatically blocks rendering until the font is ready.
+
+### Prerequisites
+
+First, the @remotion/google-fonts package needs to be installed.
+If it is not installed, use the following command:
+
+```bash
+npx remotion add @remotion/google-fonts # If project uses npm
+bunx remotion add @remotion/google-fonts # If project uses bun
+yarn remotion add @remotion/google-fonts # If project uses yarn
+pnpm exec remotion add @remotion/google-fonts # If project uses pnpm
+```
+
+```tsx
+import { loadFont } from "@remotion/google-fonts/Lobster";
+
+const { fontFamily } = loadFont();
+
+export const MyComposition = () => {
+ return (
+
+ Hello World
+
+ );
+};
+```
+
+Preferrably, specify only needed weights and subsets to reduce file size:
+
+```tsx
+import { loadFont } from "@remotion/google-fonts/Roboto";
+
+const { fontFamily } = loadFont("normal", {
+ weights: ["400", "700"],
+ subsets: ["latin"],
+});
+```
+
+## Using in components
+
+Call `loadFont()` at the top level of your component or in a separate file that's imported early:
+
+```tsx
+import { loadFont } from "@remotion/google-fonts/Montserrat";
+
+const { fontFamily } = loadFont("normal", {
+ weights: ["400", "700"],
+ subsets: ["latin"],
+});
+
+export const Title: React.FC<{ text: string }> = ({ text }) => {
+ return (
+
+ {text}
+
+ );
+};
+```
diff --git a/remotion-best-practices/remotion-markup/html-in-canvas.md b/remotion-best-practices/remotion-markup/html-in-canvas.md
new file mode 100644
index 0000000..d263801
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/html-in-canvas.md
@@ -0,0 +1,128 @@
+# Using `` in Remotion
+
+Renders children into a `` so you can post-process them with the Canvas 2D API or WebGL.
+
+Only works in Chrome 149+ with the `chrome://flags/#canvas-draw-element` flag enabled.
+Give the user a notice.
+
+## Nesting
+
+Do not nest `` components. Remotion rejects nesting because Chrome does not reliably render nested HTML-in-canvas subtrees.
+
+## Enabling WebGL during renders
+
+If you make use of WebGL during renders, you need to enable it:
+
+From the CLI:
+
+```bash
+npx remotion render --gl=angle
+```
+
+Set it as the default for Studio and CLI (advised):
+
+```ts
+import { Config } from "@remotion/cli/config";
+
+Config.setChromiumOpenGlRenderer("angle");
+```
+
+## Basic usage
+
+By default, draws to canvas with no effect applied:
+
+```tsx
+import { HtmlInCanvas } from "remotion";
+
+export const MyComp = () => {
+ return (
+
+
+ Hello
+
+
+ );
+};
+```
+
+## 2D effect with `onPaint`
+
+`onPaint` runs whenever the content updates. Call `ctx.drawElementImage(elementImage, 0, 0)` to draw the captured DOM, and assign the returned transform to `element.style.transform` so DOM selection still aligns with the painted output.
+
+```tsx
+import {
+ AbsoluteFill,
+ HtmlInCanvas,
+ type HtmlInCanvasOnPaint,
+ useCurrentFrame,
+ useVideoConfig,
+} from "remotion";
+import { useCallback } from "react";
+
+export const Blur = () => {
+ const frame = useCurrentFrame();
+ const { width, height, fps } = useVideoConfig();
+
+ const onPaint: HtmlInCanvasOnPaint = useCallback(
+ ({ canvas, element, elementImage }) => {
+ const ctx = canvas.getContext("2d");
+ if (!ctx) throw new Error("Failed to acquire 2D context");
+
+ const blurPx = 4 + 18 * (0.5 + 0.5 * Math.sin((frame / fps) * Math.PI));
+
+ ctx.reset();
+ ctx.filter = `blur(${blurPx}px)`;
+ const transform = ctx.drawElementImage(elementImage, 0, 0);
+ element.style.transform = transform.toString();
+ },
+ [frame, fps],
+ );
+
+ return (
+
+
+
+ Hello
+
+
+
+ );
+};
+```
+
+## WebGL effects
+
+For WebGL, set up the context, program, and texture in `onInit` and return a cleanup function. Inside `onPaint`, upload the captured DOM with `gl.texElementImage2D(...)` and draw.
+
+```tsx
+const onInit: HtmlInCanvasOnInit = useCallback(({ canvas }) => {
+ const gl = canvas.getContext("webgl2", { alpha: true, premultipliedAlpha: true });
+ if (!gl) {
+ throw new Error(
+ "WebGL2 unavailable. Try rendering with the --gl=angle option. See https://remotion.dev/docs/gl-options.",
+ );
+ }
+ gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);
+ // compile program, create texture, set up VAO...
+ return () => {
+ // delete program, texture, buffers...
+ };
+}, []);
+
+const onPaint: HtmlInCanvasOnPaint = useCallback(({ elementImage }) => {
+ gl.texElementImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, elementImage);
+ gl.drawArrays(gl.TRIANGLES, 0, 6);
+}, []);
+```
+
+For a fully working minimal example, see https://github.com/remotion-dev/remotion/blob/main/packages/docs/components/demos/HtmlInCanvasDocsDemoWebGL.tsx.
+
+## Async `onPaint`
+
+`onPaint` may be `async`. Remotion holds the frame open via `delayRender()` until the promise resolves. Useful for multi-pass effects with `createImageBitmap`.
diff --git a/remotion-best-practices/remotion-markup/images.md b/remotion-best-practices/remotion-markup/images.md
new file mode 100644
index 0000000..b86985f
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/images.md
@@ -0,0 +1,73 @@
+## Sizing and positioning
+
+Use the `style` prop to control size and position:
+
+```tsx
+
+```
+
+## Dynamic image paths
+
+Use template literals for dynamic file references:
+
+```tsx
+import { Img, staticFile, useCurrentFrame } from "remotion";
+
+const frame = useCurrentFrame();
+
+// Image sequence
+
+
+// Selecting based on props
+
+
+// Conditional images
+
+```
+
+This pattern is useful for:
+
+- Image sequences (frame-by-frame animations)
+- User-specific avatars or profile images
+- Theme-based icons
+- State-dependent graphics
+
+## Getting image dimensions
+
+Use `getImageDimensions()` to get the dimensions of an image:
+
+```tsx
+import { getImageDimensions, staticFile } from "remotion";
+
+const { width, height } = await getImageDimensions(staticFile("photo.png"));
+```
+
+This is useful for calculating aspect ratios or sizing compositions:
+
+```tsx
+import {
+ getImageDimensions,
+ staticFile,
+ CalculateMetadataFunction,
+} from "remotion";
+
+const calculateMetadata: CalculateMetadataFunction = async () => {
+ const { width, height } = await getImageDimensions(staticFile("photo.png"));
+ return {
+ width,
+ height,
+ };
+};
+```
diff --git a/remotion-best-practices/remotion-markup/light-leaks.md b/remotion-best-practices/remotion-markup/light-leaks.md
new file mode 100644
index 0000000..4ef8c0b
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/light-leaks.md
@@ -0,0 +1,106 @@
+---
+name: light-leaks
+description: Light leak overlay effects for Remotion using lightLeak() from @remotion/effects.
+metadata:
+ tags: light-leaks, overlays, effects, transitions
+---
+
+## Light Leaks
+
+This only works from Remotion 4.0.500 and up. Use `npx remotion versions` to check your Remotion version and `npx remotion upgrade` to upgrade your Remotion version.
+
+Apply `lightLeak()` from `@remotion/effects/light-leak` to a canvas-based component such as ``. Animate `progress` from `0` to `1`; the light leak reveals during the first half and retracts during the second half.
+
+Typically use it inside a `` to play over the cut point between two scenes. See the **transitions** rule for `` and overlay usage.
+
+## Prerequisites
+
+```bash
+npx remotion add @remotion/effects
+```
+
+## Light leak overlay component
+
+Keep the `progress` calculation inline so it is editable in Remotion Studio:
+
+```tsx
+import {lightLeak} from '@remotion/effects/light-leak';
+import {interpolate, Solid, useCurrentFrame, useVideoConfig} from 'remotion';
+
+const LightLeakOverlay: React.FC<{
+ seed?: number;
+ hueShift?: number;
+}> = ({seed = 0, hueShift = 0}) => {
+ const frame = useCurrentFrame();
+ const {durationInFrames, height, width} = useVideoConfig();
+
+ return (
+
+ );
+};
+```
+
+## Basic usage with TransitionSeries
+
+```tsx
+import {TransitionSeries} from '@remotion/transitions';
+
+
+
+
+
+
+
+
+
+
+
+ ;
+```
+
+## Options
+
+- `progress?` — controls the evolve/retract phase from `0` to `1`. Effects do not animate on their own, so drive it with `useCurrentFrame()` and `interpolate()`. Default: `0.5`.
+- `seed?` — determines the shape of the light leak pattern. Different seeds produce different patterns. Default: `0`.
+- `hueShift?` — rotates the hue in degrees (`0`–`360`). Default: `0` (yellow-to-orange). `120` = green, `240` = blue.
+- `disabled?` — skips the effect when `true`. Default: `false`.
+
+## Customizing the look
+
+```tsx
+// Blue-tinted light leak with a different pattern
+ ;
+
+// Green-tinted light leak
+ ;
+```
+
+## Standalone usage
+
+The overlay component can also be used outside of `` as a decorative layer in any composition:
+
+```tsx
+import {AbsoluteFill} from 'remotion';
+
+const MyComp: React.FC = () => (
+
+
+
+
+);
+```
+
+`lightLeak()` uses WebGL2. Enable WebGL during rendering with `Config.setChromiumOpenGlRenderer("angle")`.
diff --git a/remotion-best-practices/remotion-markup/local-fonts.md b/remotion-best-practices/remotion-markup/local-fonts.md
new file mode 100644
index 0000000..94ab7e5
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/local-fonts.md
@@ -0,0 +1,69 @@
+For local font files, use the `@remotion/fonts` package.
+
+### Prerequisites
+
+First, install @remotion/fonts:
+
+```bash
+npx remotion add @remotion/fonts # If project uses npm
+bunx remotion add @remotion/fonts # If project uses bun
+yarn remotion add @remotion/fonts # If project uses yarn
+pnpm exec remotion add @remotion/fonts # If project uses pnpm
+```
+
+### Loading a local font
+
+Place your font file in the `public/` folder and use `loadFont()`:
+
+```tsx
+import { loadFont } from "@remotion/fonts";
+import { staticFile } from "remotion";
+
+await loadFont({
+ family: "MyFont",
+ url: staticFile("MyFont-Regular.woff2"),
+});
+
+export const MyComposition = () => {
+ return (
+
+ Hello World
+
+ );
+};
+```
+
+### Loading multiple weights
+
+Load each weight separately with the same family name:
+
+```tsx
+import { loadFont } from "@remotion/fonts";
+import { staticFile } from "remotion";
+
+await Promise.all([
+ loadFont({
+ family: "Inter",
+ url: staticFile("Inter-Regular.woff2"),
+ weight: "400",
+ }),
+ loadFont({
+ family: "Inter",
+ url: staticFile("Inter-Bold.woff2"),
+ weight: "700",
+ }),
+]);
+```
+
+### Available options
+
+```tsx
+loadFont({
+ family: "MyFont", // Required: name to use in CSS
+ url: staticFile("font.woff2"), // Required: font file URL
+ format: "woff2", // Optional: auto-detected from extension
+ weight: "400", // Optional: font weight
+ style: "normal", // Optional: normal or italic
+ display: "block", // Optional: font-display behavior
+});
+```
diff --git a/remotion-best-practices/remotion-markup/lottie.md b/remotion-best-practices/remotion-markup/lottie.md
new file mode 100644
index 0000000..f146cfe
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/lottie.md
@@ -0,0 +1,73 @@
+---
+name: lottie
+description: Embedding Lottie animations in Remotion.
+metadata:
+ category: Animation
+---
+
+# Using Lottie Animations in Remotion
+
+## Prerequisites
+
+First, the @remotion/lottie package needs to be installed.
+If it is not, use the following command:
+
+```bash
+npx remotion add @remotion/lottie # If project uses npm
+bunx remotion add @remotion/lottie # If project uses bun
+yarn remotion add @remotion/lottie # If project uses yarn
+pnpm exec remotion add @remotion/lottie # If project uses pnpm
+```
+
+## Displaying a Lottie file
+
+To import a Lottie animation:
+
+- Fetch the Lottie asset
+- Wrap the loading process in `delayRender()` and `continueRender()`
+- Save the animation data in a state
+- Render the Lottie animation using the `Lottie` component from the `@remotion/lottie` package
+
+```tsx
+import { Lottie, LottieAnimationData } from "@remotion/lottie";
+import { useEffect, useState } from "react";
+import { cancelRender, continueRender, delayRender } from "remotion";
+
+export const MyAnimation = () => {
+ const [handle] = useState(() => delayRender("Loading Lottie animation"));
+
+ const [animationData, setAnimationData] =
+ useState(null);
+
+ useEffect(() => {
+ fetch("https://assets4.lottiefiles.com/packages/lf20_zyquagfl.json")
+ .then((data) => data.json())
+ .then((json) => {
+ setAnimationData(json);
+ continueRender(handle);
+ })
+ .catch((err) => {
+ cancelRender(err);
+ });
+ }, [handle]);
+
+ if (!animationData) {
+ return null;
+ }
+
+ return ;
+};
+```
+
+## Styling and animating
+
+Lottie supports the `style` prop to allow styles and animations:
+
+```tsx
+return (
+
+);
+```
diff --git a/remotion-best-practices/remotion-markup/measuring-dom-nodes.md b/remotion-best-practices/remotion-markup/measuring-dom-nodes.md
new file mode 100644
index 0000000..d522b16
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/measuring-dom-nodes.md
@@ -0,0 +1,38 @@
+---
+name: measuring-dom-nodes
+description: Measuring DOM element dimensions in Remotion
+metadata:
+ tags: measure, layout, dimensions, getBoundingClientRect, scale
+---
+
+# Measuring DOM nodes in Remotion
+
+Remotion applies a `scale()` transform to the video container, which affects values from `getBoundingClientRect()`. Use `useCurrentScale()` to get correct measurements.
+
+## Measuring element dimensions
+
+```tsx
+import { useCurrentScale } from "remotion";
+import { useRef, useEffect, useState } from "react";
+
+export const MyComponent = () => {
+ const ref = useRef(null);
+ const scale = useCurrentScale();
+ const [dimensions, setDimensions] = useState({ width: 0, height: 0 });
+
+ useEffect(() => {
+ if (!ref.current) return;
+ const rect = ref.current.getBoundingClientRect();
+ setDimensions({
+ width: rect.width / scale,
+ height: rect.height / scale,
+ });
+ }, [scale]);
+
+ return (
+
+ Content to measure
+
+ );
+};
+```
diff --git a/remotion-best-practices/remotion-markup/measuring-text.md b/remotion-best-practices/remotion-markup/measuring-text.md
new file mode 100644
index 0000000..8faca93
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/measuring-text.md
@@ -0,0 +1,146 @@
+---
+name: measuring-text
+description: Measuring text dimensions, fitting text to containers, and checking overflow
+metadata:
+ tags: measure, text, layout, dimensions, fitText, fillTextBox
+---
+
+# Measuring text in Remotion
+
+## Prerequisites
+
+Install @remotion/layout-utils if it is not already installed:
+
+```bash
+npx remotion add @remotion/layout-utils
+```
+
+## Measuring text dimensions
+
+Use `measureText()` to calculate the width and height of text:
+
+```tsx
+import { measureText } from "@remotion/layout-utils";
+
+const { width, height } = measureText({
+ text: "Hello World",
+ fontFamily: "Arial",
+ fontSize: 32,
+ fontWeight: "bold",
+});
+```
+
+Results are cached - duplicate calls return the cached result.
+
+## Fitting text to a width
+
+Use `fitText()` to find the optimal font size for a container:
+
+```tsx
+import { fitText } from "@remotion/layout-utils";
+
+const { fontSize } = fitText({
+ text: "Hello World",
+ withinWidth: 600,
+ fontFamily: "Inter",
+ fontWeight: "bold",
+});
+
+return (
+
+ Hello World
+
+);
+```
+
+## Checking text overflow
+
+Use `fillTextBox()` to check if text exceeds a box:
+
+```tsx
+import { fillTextBox } from "@remotion/layout-utils";
+
+const box = fillTextBox({ maxBoxWidth: 400, maxLines: 3 });
+
+const words = ["Hello", "World", "This", "is", "a", "test"];
+for (const word of words) {
+ const { exceedsBox } = box.add({
+ text: word + " ",
+ fontFamily: "Arial",
+ fontSize: 24,
+ });
+ if (exceedsBox) {
+ // Text would overflow, handle accordingly
+ break;
+ }
+}
+```
+
+## Best practices
+
+**Load fonts first:** Only call measurement functions after fonts are loaded.
+
+```tsx
+import { loadFont } from "@remotion/google-fonts/Inter";
+
+const { fontFamily, waitUntilDone } = loadFont("normal", {
+ weights: ["400"],
+ subsets: ["latin"],
+});
+
+waitUntilDone().then(() => {
+ // Now safe to measure
+ const { width } = measureText({
+ text: "Hello",
+ fontFamily,
+ fontSize: 32,
+ });
+});
+```
+
+**Use validateFontIsLoaded:** Catch font loading issues early:
+
+```tsx
+measureText({
+ text: "Hello",
+ fontFamily: "MyCustomFont",
+ fontSize: 32,
+ validateFontIsLoaded: true, // Throws if font not loaded
+});
+```
+
+**Match font properties:** Use the same properties for measurement and rendering:
+
+```tsx
+const fontStyle = {
+ fontFamily: "Inter",
+ fontSize: 32,
+ fontWeight: "bold" as const,
+ letterSpacing: "0.5px",
+};
+
+const { width } = measureText({
+ text: "Hello",
+ ...fontStyle,
+});
+
+return (
+
+ Hello
+
+);
+```
+
+**Avoid padding and border:** Use `outline` instead of `border` to prevent layout differences:
+
+```tsx
+
+ Text
+
+```
diff --git a/remotion-best-practices/remotion-markup/multi-scene-video.md b/remotion-best-practices/remotion-markup/multi-scene-video.md
new file mode 100644
index 0000000..bdfcb5d
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/multi-scene-video.md
@@ -0,0 +1,81 @@
+If the video being created is a multi-scene video, it should be structured in a special way.
+Create a new folder and put each scene in a separate file.
+
+```tsx
+// SceneA.tsx
+export const SceneA: React.FC = () => {
+ return // ...
+}
+```
+
+```tsx
+// SceneB.tsx
+export const SceneB: React.FC = () => {
+ return // ...
+}
+```
+
+Install `@remotion/transitions` if not yet available:
+
+```
+npx remotion add @remotion/transitions
+```
+
+// MyVideo.tsx
+```tsx
+import {TransitionSeries} from '@remotion/transitions';
+
+const MyVideo: React.FC = () => {
+ return (
+
+
+
+
+
+
+
+
+ )
+}
+```
+
+It could also make sense to register each scene individually in the root file so it can be edited there.
+If a composition with the same component is registered, one can double click the sequence in the main composition and jump to that composition.
+
+```tsx
+export const Root: React.FC = () => {
+ return (
+ <>
+
+
+
+
+
+ >
+ )
+}
+```
+
+This allows the user to trim the start and end of the durations visually and add [transitions](./transitions.md) later.
+Prefer inlining the `durationInFrames` values, because only then they are editable. It's okay if the value is redundant.
diff --git a/remotion-best-practices/remotion-markup/parameters.md b/remotion-best-practices/remotion-markup/parameters.md
new file mode 100644
index 0000000..8ab51df
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/parameters.md
@@ -0,0 +1,111 @@
+---
+name: parameters
+description: Make a video parametrizable by adding a Zod schema
+metadata:
+ tags: parameters, zod, schema
+---
+
+To make a video parametrizable, a Zod schema can be added to a composition.
+
+First, `zod` must be installed .
+
+Search the project for lockfiles and run the correct command depending on the package manager:
+
+If `package-lock.json` is found, use the following command:
+
+```bash
+npm i zod
+```
+
+If `bun.lockb` is found, use the following command:
+
+```bash
+bun i zod
+```
+
+If `yarn.lock` is found, use the following command:
+
+```bash
+yarn add zod
+```
+
+If `pnpm-lock.yaml` is found, use the following command:
+
+```bash
+pnpm i zod
+```
+
+Then, a Zod schema can be defined alongside the component:
+
+```tsx title="src/MyComposition.tsx"
+import { z } from "zod";
+
+export const MyCompositionSchema = z.object({
+ title: z.string(),
+});
+
+const MyComponent: React.FC> = () => {
+ return (
+
+
+ {props.title}
+
+
+ );
+};
+```
+
+In the root file, the schema can be passed to the composition:
+
+```tsx title="src/Root.tsx"
+import { Composition } from "remotion";
+import { MycComponent, MyCompositionSchema } from "./MyComposition";
+
+export const RemotionRoot = () => {
+ return (
+
+ );
+};
+```
+
+Now, the user can edit the parameter visually in the sidebar.
+
+All schemas that are supported by Zod are supported by Remotion.
+
+Remotion requires that the top-level type is a z.object(), because the collection of props of a React component is always an object.
+
+## Color picker
+
+For adding a color picker, use `zColor()` from `@remotion/zod-types`.
+
+If it is not installed, use the following command:
+
+```bash
+npx remotion add @remotion/zod-types # If project uses npm
+bunx remotion add @remotion/zod-types # If project uses bun
+yarn remotion add @remotion/zod-types # If project uses yarn
+pnpm exec remotion add @remotion/zod-types # If project uses pnpm
+```
+
+Then import `zColor` from `@remotion/zod-types`:
+
+```tsx
+import { zColor } from "@remotion/zod-types";
+```
+
+Then use it in the schema:
+
+```tsx
+export const MyCompositionSchema = z.object({
+ color: zColor(),
+});
+```
diff --git a/remotion-best-practices/remotion-markup/remotion-maps/REFERENCE.md b/remotion-best-practices/remotion-markup/remotion-maps/REFERENCE.md
new file mode 100644
index 0000000..6ce8b2c
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/remotion-maps/REFERENCE.md
@@ -0,0 +1,36 @@
+---
+name: remotion-maps
+description: Remotion Map animation knowledge
+version: 4.0.526
+---
+
+# Remotion Maps
+
+Choose exactly one technique from the intended shot, then load only that technique's `TECHNIQUE.md`.
+Every technique directory is self-contained and may be removed without breaking the others.
+
+## [Static map](techniques/static-map/TECHNIQUE.md)
+
+- Requires you grab a satellite image and mount it in a ` ` tag, and animate on top
+
+## [Mapbox](techniques/mapbox/TECHNIQUE.md)
+
+- Requires a Mapbox key
+- Nicer styles by default
+- Map can display a round globe when zoomed out
+- Includes nice 3D buildings such as the Eiffel tower
+
+## [MapLibre](techniques/maplibre/TECHNIQUE.md)
+
+- Requires no API key, fully free
+- Does not include 3D building
+
+## [MapTiler](techniques/maptiler/TECHNIQUE.md)
+
+- Uses MapTiler
+- Annotations can be drawn on top of geographic features: borders, rivers, labels
+
+## [CesiumJS](techniques/cesium/TECHNIQUE.md)
+
+- Flythroughs through terrain and mountains
+- "Flight simulator" perspective
diff --git a/remotion-best-practices/remotion-markup/remotion-maps/agents/openai.yaml b/remotion-best-practices/remotion-markup/remotion-maps/agents/openai.yaml
new file mode 100644
index 0000000..c60b3a1
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/remotion-maps/agents/openai.yaml
@@ -0,0 +1,7 @@
+interface:
+ display_name: '/remotion-maps'
+ short_description: 'Create animated maps in Remotion videos'
+ icon_small: './assets/remotion-icon.svg'
+ icon_large: './assets/remotion-icon.svg'
+ brand_color: '#0B84F3'
+ default_prompt: '$remotion-maps: Animate a dot from Zurich to New York.'
diff --git a/remotion-best-practices/remotion-markup/remotion-maps/assets/remotion-icon.svg b/remotion-best-practices/remotion-markup/remotion-maps/assets/remotion-icon.svg
new file mode 100644
index 0000000..420dbc7
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/remotion-maps/assets/remotion-icon.svg
@@ -0,0 +1,4 @@
+
+Remotion
+
+
diff --git a/remotion-best-practices/remotion-markup/remotion-maps/techniques/cesium/TECHNIQUE.md b/remotion-best-practices/remotion-markup/remotion-maps/techniques/cesium/TECHNIQUE.md
new file mode 100644
index 0000000..b58e4a4
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/remotion-maps/techniques/cesium/TECHNIQUE.md
@@ -0,0 +1,89 @@
+# CesiumJS — 3D flyovers in Remotion
+
+Instructions for achieving map animations with "flight-simulator" perspective in Remotion.
+
+## Modes
+
+| Mode | Data | Use for |
+| ----------- | ----------------------------------------------------- | ------------------------------------------------------ |
+| `landscape` | MapTiler `terrain-quantized-mesh-v2` + `satellite-v2` | Mountains, gorges, rivers, coastlines and rural routes |
+| `city` | Google Photorealistic 3D Tiles | Cities, architecture and recognizable landmarks |
+
+Do not use footprint extrusions for city flyovers. They produce crude building blocks rather than
+textured architecture.
+
+## Credentials
+
+For `landscape`, set:
+
+```text
+REMOTION_MAPTILER_KEY=...
+```
+
+Create a MapTiler key at https://cloud.maptiler.com/account/keys/.
+
+For `city`, set:
+
+```text
+REMOTION_GOOGLE_MAPS_API_KEY=...
+```
+
+Create a billing-enabled Google Map Tiles API key by following
+https://developers.google.com/maps/documentation/tile/get-api-key. Enable the **Map Tiles API** and
+restrict the key to that API. Ensure its application restriction permits local headless Remotion
+requests.
+
+## Build the flight
+
+1. Copy `assets/CesiumFlythrough.tsx`, a path JSON and `assets/example-Root.tsx` into the Remotion
+ project, or import the component directly.
+2. Supply the camera route as `[longitude, latitude][]`. Use only meaningful control points; do not hand-author dozens of tiny corrections.
+3. Leave `pathSmoothingPasses={3}` initially. The component applies repeated Chaikin corner cutting, turning straight-then-corner input into a continuous swerve. Increase to `4` for a softer route or reduce to `2` when the camera must follow a tight corridor.
+4. Set absolute camera altitudes for the location. City cameras normally fly lower than landscape
+ cameras.
+5. Render a middle-frame still before rendering the full video.
+
+```tsx
+
+```
+
+## Camera behavior
+
+Walk the smoothed curve by arc length for constant ground speed. Aim at a real point farther along
+the curve rather than its next vertex. Derive roll from the change in look-ahead bearing so the
+camera banks into a turn instead of twitching left and right.
+
+For landscape routes, `scripts/prep-cesium-path.mjs` also clips, resamples, smooths and dampens a
+GeoJSON centerline before the component applies its final curve smoothing.
+
+
+## Mechanics
+
+- Set `viewer.useDefaultRenderLoop = false`.
+- Call `viewer.render()`, never `scene.render()`, while settling.
+- Use `preserveDrawingBuffer: true`.
+- Gate initialization and every frame with `delayRender`.
+- Drive camera animation from `useCurrentFrame()`; do not use CSS transitions or browser-timed animation.
+- Settle landscapes on `globe.tilesLoaded` and cities on `tileset.tilesLoaded`.
+- Keep all provider attribution visible.
+- Record the source and effective date of custom or disputed geography.
+- Inspect rendered pixels, not only Studio playback, at every required aspect ratio.
+- Read `references/3d-flyover-architecture.md` for camera math, `references/3d-data-sources.md` for provider details, and `references/3d-troubleshooting.md` for blank, coarse, unauthorized or timed-out renders.
+
+## Files
+
+- `assets/CesiumFlythrough.tsx` — reusable two-mode component.
+- `assets/flight-path.ts` — dependency-free Chaikin route smoothing.
+- `assets/example-Root.tsx` — landscape and city compositions.
+- `assets/cesium-path.json` — sample landscape route.
+- `assets/city-path.json` — sample city route.
+- `assets/sample-river.geojson` — sample path-preparation input.
+- `scripts/prep-cesium-path.mjs` — dependency-free landscape route preparation.
diff --git a/remotion-best-practices/remotion-markup/remotion-maps/techniques/cesium/assets/CesiumFlythrough.tsx b/remotion-best-practices/remotion-markup/remotion-maps/techniques/cesium/assets/CesiumFlythrough.tsx
new file mode 100644
index 0000000..02465d0
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/remotion-maps/techniques/cesium/assets/CesiumFlythrough.tsx
@@ -0,0 +1,284 @@
+import React, {useEffect, useMemo, useRef, useState} from 'react';
+import {
+ AbsoluteFill,
+ cancelRender,
+ continueRender,
+ delayRender,
+ useCurrentFrame,
+ useVideoConfig,
+} from 'remotion';
+import terrainPath from './cesium-path.json';
+import {smoothFlightPath, type LngLat} from './flight-path';
+
+export type FlyoverMode = 'landscape' | 'city';
+export type {LngLat} from './flight-path';
+
+export type CesiumFlythroughProps = {
+ mode?: FlyoverMode;
+ path?: LngLat[];
+ pathSmoothingPasses?: number;
+ altitudeStart?: number;
+ altitudeEnd?: number;
+ lookAheadKm?: number;
+ travelKm?: number;
+ pitchFromNadir?: number;
+ verticalExaggeration?: number;
+ maximumScreenSpaceError?: number;
+};
+
+const MAPTILER_KEY = process.env.REMOTION_MAPTILER_KEY;
+const GOOGLE_MAPS_API_KEY = process.env.REMOTION_GOOGLE_MAPS_API_KEY;
+const CESIUM_VER = '1.143';
+const CDN = `https://cesium.com/downloads/cesiumjs/releases/${CESIUM_VER}/Build/Cesium/`;
+const R = 6371;
+const MAX_BANK = 0.13;
+const BANK_GAIN = 0.6;
+
+const havKm = (a: number[], b: number[]) => {
+ const r = Math.PI / 180;
+ const dLat = (b[1] - a[1]) * r;
+ const dLng = (b[0] - a[0]) * r;
+ const h =
+ Math.sin(dLat / 2) ** 2 +
+ Math.cos(a[1] * r) * Math.cos(b[1] * r) * Math.sin(dLng / 2) ** 2;
+ return 2 * R * Math.asin(Math.sqrt(h));
+};
+
+const makePathWalker = (path: LngLat[]) => {
+ if (path.length < 2)
+ throw new Error('Flyover path needs at least two points');
+ const cumulative = [0];
+ for (let i = 1; i < path.length; i++) {
+ cumulative.push(cumulative[i - 1] + havKm(path[i - 1], path[i]));
+ }
+ const lengthKm = cumulative[cumulative.length - 1];
+ const along = (km: number): LngLat => {
+ const d = Math.max(0, Math.min(lengthKm, km));
+ let i = 1;
+ while (i < cumulative.length && cumulative[i] < d) i++;
+ if (i >= cumulative.length) return path[path.length - 1];
+ const segmentLength = cumulative[i] - cumulative[i - 1] || 1;
+ const t = (d - cumulative[i - 1]) / segmentLength;
+ return [
+ path[i - 1][0] + (path[i][0] - path[i - 1][0]) * t,
+ path[i - 1][1] + (path[i][1] - path[i - 1][1]) * t,
+ ];
+ };
+ return {along, lengthKm};
+};
+
+const bearing = (a: number[], b: number[]) => {
+ const r = Math.PI / 180;
+ const y = Math.sin((b[0] - a[0]) * r) * Math.cos(b[1] * r);
+ const x =
+ Math.cos(a[1] * r) * Math.sin(b[1] * r) -
+ Math.sin(a[1] * r) * Math.cos(b[1] * r) * Math.cos((b[0] - a[0]) * r);
+ return Math.atan2(y, x);
+};
+
+const lerp = (a: number, b: number, t: number) => a + (b - a) * t;
+const clamp = (v: number, lo: number, hi: number) =>
+ Math.max(lo, Math.min(hi, v));
+
+const loadCesium = () =>
+ new Promise((resolve, reject) => {
+ if ((window as any).Cesium) return resolve((window as any).Cesium);
+ (window as any).CESIUM_BASE_URL = CDN;
+ const css = document.createElement('link');
+ css.rel = 'stylesheet';
+ css.href = `${CDN}Widgets/widgets.css`;
+ document.head.appendChild(css);
+ const script = document.createElement('script');
+ script.src = `${CDN}Cesium.js`;
+ script.onload = () => resolve((window as any).Cesium);
+ script.onerror = () =>
+ reject(new Error(`Failed to load CesiumJS ${CESIUM_VER}`));
+ document.head.appendChild(script);
+ });
+
+export const CesiumFlythrough: React.FC = ({
+ mode = 'landscape',
+ path = terrainPath as LngLat[],
+ pathSmoothingPasses = 3,
+ altitudeStart = 4600,
+ altitudeEnd = 4300,
+ lookAheadKm = 1.5,
+ travelKm = 13,
+ pitchFromNadir = 76,
+ verticalExaggeration = 1.1,
+ maximumScreenSpaceError = 8,
+}) => {
+ const containerRef = useRef(null);
+ const started = useRef(false);
+ const viewerRef = useRef(null);
+ const tilesetRef = useRef(null);
+ const frame = useCurrentFrame();
+ const {durationInFrames, fps, width, height} = useVideoConfig();
+ const [ready, setReady] = useState(false);
+ const [handle] = useState(() =>
+ delayRender(`cesium init: ${mode}`, {timeoutInMilliseconds: 120000}),
+ );
+ const walker = useMemo(
+ () => makePathWalker(smoothFlightPath(path, pathSmoothingPasses)),
+ [path, pathSmoothingPasses],
+ );
+
+ const setCamera = (C: any, viewer: any, progress: number) => {
+ const maxTravel = Math.max(0, walker.lengthKm - lookAheadKm * 2);
+ const cameraDistance = Math.min(travelKm, maxTravel) * progress;
+ const camera = walker.along(cameraDistance);
+ const aim = walker.along(cameraDistance + lookAheadKm);
+ const aim2 = walker.along(cameraDistance + lookAheadKm * 2);
+ const heading = bearing(camera, aim);
+ let headingDelta = bearing(aim, aim2) - heading;
+ while (headingDelta > Math.PI) headingDelta -= 2 * Math.PI;
+ while (headingDelta < -Math.PI) headingDelta += 2 * Math.PI;
+ viewer.camera.setView({
+ destination: C.Cartesian3.fromDegrees(
+ camera[0],
+ camera[1],
+ lerp(altitudeStart, altitudeEnd, progress),
+ ),
+ orientation: {
+ heading,
+ pitch: C.Math.toRadians(-(90 - pitchFromNadir)),
+ roll: clamp(headingDelta * BANK_GAIN, -MAX_BANK, MAX_BANK),
+ },
+ });
+ };
+
+ const tilesAreLoaded = (viewer: any) => {
+ if (mode === 'landscape') return viewer.scene.globe.tilesLoaded;
+ return Boolean(tilesetRef.current?.tilesLoaded);
+ };
+
+ const settle = (viewer: any) =>
+ new Promise((resolve) => {
+ let stable = 0;
+ let ticks = 0;
+ const tick = () => {
+ viewer.render();
+ ticks++;
+ stable = tilesAreLoaded(viewer) ? stable + 1 : 0;
+ if (stable > 8 || ticks > 600) {
+ viewer.render();
+ resolve();
+ } else {
+ setTimeout(tick, 8);
+ }
+ };
+ tick();
+ });
+
+ useEffect(() => {
+ if (started.current) return;
+ started.current = true;
+ (async () => {
+ if (mode === 'landscape' && !MAPTILER_KEY) {
+ throw new Error(
+ 'Set REMOTION_MAPTILER_KEY. Create a key at https://cloud.maptiler.com/account/keys/',
+ );
+ }
+ if (mode === 'city' && !GOOGLE_MAPS_API_KEY) {
+ throw new Error(
+ 'Set REMOTION_GOOGLE_MAPS_API_KEY. Create a Map Tiles API key at https://developers.google.com/maps/documentation/tile/get-api-key',
+ );
+ }
+ if (mode === 'city' && durationInFrames / fps > 30) {
+ throw new Error(
+ 'Google Photorealistic 3D Tiles compositions must not exceed 30 seconds',
+ );
+ }
+
+ const C = await loadCesium();
+ const viewer = new C.Viewer(containerRef.current, {
+ baseLayer: false,
+ baseLayerPicker: false,
+ geocoder: false,
+ homeButton: false,
+ sceneModePicker: false,
+ navigationHelpButton: false,
+ animation: false,
+ timeline: false,
+ fullscreenButton: false,
+ infoBox: false,
+ selectionIndicator: false,
+ contextOptions: {webgl: {preserveDrawingBuffer: true}},
+ });
+ if (mode === 'landscape') {
+ viewer.imageryLayers.addImageryProvider(
+ new C.UrlTemplateImageryProvider({
+ url: `https://api.maptiler.com/tiles/satellite-v2/{z}/{x}/{y}.jpg?key=${MAPTILER_KEY}`,
+ maximumLevel: 20,
+ }),
+ );
+ viewer.terrainProvider = await C.CesiumTerrainProvider.fromUrl(
+ `https://api.maptiler.com/tiles/terrain-quantized-mesh-v2/?key=${MAPTILER_KEY}`,
+ {requestVertexNormals: true},
+ );
+ viewer.creditDisplay.addStaticCredit(
+ new C.Credit(
+ '© MapTiler ',
+ true,
+ ),
+ );
+ }
+ if (mode === 'city') {
+ viewer.scene.globe.show = false;
+ const tileset = await C.Cesium3DTileset.fromUrl(
+ `https://tile.googleapis.com/v1/3dtiles/root.json?key=${GOOGLE_MAPS_API_KEY}`,
+ {
+ showCreditsOnScreen: true,
+ maximumScreenSpaceError,
+ },
+ );
+ viewer.scene.primitives.add(tileset);
+ tilesetRef.current = tileset;
+ }
+
+ viewer.useDefaultRenderLoop = false;
+ viewer.scene.skyAtmosphere.show = true;
+ viewer.scene.fog.enabled = true;
+ viewer.scene.globe.enableLighting = false;
+ viewer.scene.verticalExaggeration = verticalExaggeration;
+ (window as any).__CESIUM_FLYOVER__ = {C, mode};
+ viewerRef.current = viewer;
+ setCamera(C, viewer, 0);
+ await settle(viewer);
+ setReady(true);
+ continueRender(handle);
+ })().catch((error) => cancelRender(error));
+ }, [durationInFrames, fps, handle, mode]);
+
+ useEffect(() => {
+ if (!ready) return;
+ const frameHandle = delayRender(`cesium ${mode} frame ${frame}`, {
+ timeoutInMilliseconds: 60000,
+ });
+ const C = (window as any).__CESIUM_FLYOVER__.C;
+ const viewer = viewerRef.current;
+ const progress = durationInFrames <= 1 ? 0 : frame / (durationInFrames - 1);
+ setCamera(C, viewer, progress);
+ settle(viewer).then(() => continueRender(frameHandle));
+ }, [ready, frame, durationInFrames, mode]);
+
+ return (
+
+
+ {mode === 'city' ? (
+
+ For promotional purposes only
+
+ ) : null}
+
+ );
+};
diff --git a/remotion-best-practices/remotion-markup/remotion-maps/techniques/cesium/assets/cesium-path.json b/remotion-best-practices/remotion-markup/remotion-maps/techniques/cesium/assets/cesium-path.json
new file mode 100644
index 0000000..32b60ba
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/remotion-maps/techniques/cesium/assets/cesium-path.json
@@ -0,0 +1,299 @@
+[
+ [94.986139893537, 29.76417312959953],
+ [94.98637054463002, 29.764163024004816],
+ [94.98661427422437, 29.764153025681516],
+ [94.9868698103708, 29.764142908388347],
+ [94.98713600736019, 29.764132461562934],
+ [94.98741179569139, 29.76412145291623],
+ [94.9876962466277, 29.764109663422126],
+ [94.98798853462426, 29.764096898390772],
+ [94.98828790834106, 29.764082995679242],
+ [94.98859364523021, 29.764067827511347],
+ [94.98890509685035, 29.764051279216236],
+ [94.98922167960325, 29.76403324759024],
+ [94.98954294512464, 29.76401367774424],
+ [94.9898685550894, 29.76399255290906],
+ [94.99019820264337, 29.76396985787546],
+ [94.9905316178847, 29.763945606334815],
+ [94.9908685732739, 29.763919866576575],
+ [94.99120886105722, 29.763892700951896],
+ [94.99155229116181, 29.7638641665054],
+ [94.99189872300363, 29.76383429811986],
+ [94.99224811692223, 29.763803085651237],
+ [94.99260053337049, 29.763770509641105],
+ [94.99295601118384, 29.76373658086857],
+ [94.99331456742908, 29.763701322339223],
+ [94.99367598745215, 29.763664830647013],
+ [94.99404000156176, 29.763627219082974],
+ [94.99440635968021, 29.763588592698778],
+ [94.99477481502787, 29.76354905236459],
+ [94.9951451006731, 29.763508748648892],
+ [94.99578766204738, 29.763462125646818],
+ [94.99643710580968, 29.763412119743368],
+ [94.99709296623192, 29.763358988682928],
+ [94.99775479298779, 29.763302979031952],
+ [94.99842214521965, 29.763244327404465],
+ [94.99909470569231, 29.763183258547627],
+ [94.9997722961385, 29.76312010454948],
+ [95.00045474013422, 29.763055184243758],
+ [95.00114189582168, 29.762988795623112],
+ [95.00183368970049, 29.762921207778405],
+ [95.0025300799095, 29.76285270023514],
+ [95.00323103443773, 29.762783549665084],
+ [95.00393658318124, 29.76271400155497],
+ [95.00464681949704, 29.76264432424487],
+ [95.00536183331896, 29.76257477740286],
+ [95.00608171146906, 29.762505612813378],
+ [95.00680653793428, 29.762437075077955],
+ [95.00753639864557, 29.762369398844733],
+ [95.00827137837749, 29.762302811854063],
+ [95.00901153006761, 29.762237519590354],
+ [95.00975680776318, 29.76217368790719],
+ [95.01050716875933, 29.762111478518566],
+ [95.0112626067996, 29.76205102042169],
+ [95.01202312290016, 29.761992432502932],
+ [95.01278871942189, 29.76193583156792],
+ [95.01355940108247, 29.761881333165324],
+ [95.01433525277555, 29.761829093407865],
+ [95.01511636205572, 29.761779224166457],
+ [95.01590278872715, 29.76173180995877],
+ [95.0166868810408, 29.76168612055982],
+ [95.01746871725406, 29.761642332250204],
+ [95.0182483756254, 29.76160062131038],
+ [95.01902596675926, 29.761561177619345],
+ [95.019801682618, 29.761524238306453],
+ [95.02057570378254, 29.76149004865798],
+ [95.02134818878243, 29.761458838563573],
+ [95.02211921065114, 29.761430763930672],
+ [95.02288888930805, 29.761405973069504],
+ [95.02365734467304, 29.761384614290225],
+ [95.02442469666667, 29.761366835902948],
+ [95.02519095257038, 29.761352731197437],
+ [95.02595602043016, 29.761342344990513],
+ [95.02671980829304, 29.761335722099044],
+ [95.02748221022355, 29.76133286485609],
+ [95.02824308111781, 29.761333684556867],
+ [95.02900227020879, 29.761338090875398],
+ [95.02975960629327, 29.76134599002589],
+ [95.03051480114966, 29.76135728786741],
+ [95.03126749207338, 29.761371921751238],
+ [95.03201723576402, 29.761389829130785],
+ [95.03276363398774, 29.761410893146387],
+ [95.03350632277824, 29.761434973117545],
+ [95.03424521675927, 29.76146183394706],
+ [95.03498037607913, 29.761491215377145],
+ [95.035711917426, 29.761522866578012],
+ [95.03643998610582, 29.761556530192124],
+ [95.03716475930274, 29.761591886465347],
+ [95.03788653744915, 29.761628566185358],
+ [95.03860571883365, 29.76166618469001],
+ [95.03932258585421, 29.76170436456548],
+ [95.04003738892985, 29.76174273062808],
+ [95.04075025083816, 29.76178094997509],
+ [95.0414610559133, 29.76181870813213],
+ [95.04216961904287, 29.761855638407084],
+ [95.04287591713418, 29.761891331889718],
+ [95.04357986124926, 29.761925397709096],
+ [95.04428137757625, 29.761957488479126],
+ [95.04498041854592, 29.76198725048925],
+ [95.04567682817188, 29.762014317811357],
+ [95.04637032968634, 29.762038376323694],
+ [95.04706059416637, 29.762059099770216],
+ [95.04774726432963, 29.762076162373777],
+ [95.0484300050609, 29.762089241174117],
+ [95.04910871445378, 29.762098042845082],
+ [95.04978328153793, 29.762102280852183],
+ [95.05045359964508, 29.76210167552205],
+ [95.05111966253706, 29.76209602004179],
+ [95.05178153406797, 29.762085106891018],
+ [95.05243927503516, 29.762068731547185],
+ [95.05309287649075, 29.762046750046103],
+ [95.0537422946664, 29.762019099359485],
+ [95.05438748396233, 29.761985721609257],
+ [95.05502839823626, 29.76194655859307],
+ [95.05566488201883, 29.761901557942874],
+ [95.05629656919591, 29.761850805510885],
+ [95.05692313234233, 29.761794428680094],
+ [95.0575442743842, 29.761732580860688],
+ [95.0581596433054, 29.761665348138973],
+ [95.05876888708963, 29.761592816601354],
+ [95.05937164047754, 29.761515065256333],
+ [95.05996759228947, 29.761432144038746],
+ [95.06055643134583, 29.761344102883623],
+ [95.06113793491645, 29.761251010034922],
+ [95.06171214230999, 29.761153046649387],
+ [95.06227907948092, 29.761050389948267],
+ [95.06283877238438, 29.760943217152814],
+ [95.06339127381165, 29.760831691663462],
+ [95.06393669678933, 29.760716002374487],
+ [95.06447520396281, 29.76059636241658],
+ [95.06500695797821, 29.760472984920362],
+ [95.06553212847378, 29.760346104258282],
+ [95.0660508986937, 29.760216015040477],
+ [95.06656344194985, 29.760083025494016],
+ [95.06707002648291, 29.75994741412334],
+ [95.06757112978441, 29.759809440866206],
+ [95.06806722979658, 29.759669344181514],
+ [95.06855878142073, 29.759527354008487],
+ [95.06904617625263, 29.759383697903765],
+ [95.06952978875404, 29.75923861533451],
+ [95.07000993080214, 29.759092371156385],
+ [95.07048679175114, 29.758945227682446],
+ [95.07096044787545, 29.75879742836973],
+ [95.07143096114058, 29.758649219939148],
+ [95.0718984144853, 29.758500858117706],
+ [95.07236278188816, 29.7583525823887],
+ [95.07282412506945, 29.758204644682806],
+ [95.07328275575983, 29.75805728963777],
+ [95.07373905641253, 29.757910760813612],
+ [95.07419366476313, 29.757765217208473],
+ [95.07464735762416, 29.757620800921966],
+ [95.07510085345471, 29.757477677507868],
+ [95.07555467766437, 29.757336168750566],
+ [95.07600940811365, 29.757196598118206],
+ [95.07646537399586, 29.75705931280275],
+ [95.0769228207089, 29.756924677394206],
+ [95.07738220221682, 29.756793075496777],
+ [95.07784401968648, 29.75666487927172],
+ [95.07830874492939, 29.756540496044202],
+ [95.07877690647402, 29.756420332181715],
+ [95.07924898851259, 29.75630478841808],
+ [95.07972503722137, 29.756194196891926],
+ [95.08020511490892, 29.756088882533362],
+ [95.0806891403115, 29.75598918720403],
+ [95.08117690920173, 29.75589531641115],
+ [95.08166835685006, 29.755807414283098],
+ [95.08216335868525, 29.75572566824862],
+ [95.08266177736347, 29.755650250535062],
+ [95.08316349491537, 29.75558120546187],
+ [95.08366839703267, 29.755518567048284],
+ [95.08417639041532, 29.75546236367944],
+ [95.08468755179344, 29.755412571989652],
+ [95.08520236790308, 29.755369015997044],
+ [95.08572134650697, 29.75533148313236],
+ [95.0862450098908, 29.755299740305322],
+ [95.08677390781156, 29.75527358808779],
+ [95.08730861289804, 29.755252808551163],
+ [95.08784970300886, 29.755237175354623],
+ [95.08839755885471, 29.755226476280296],
+ [95.08895256438073, 29.755220494902016],
+ [95.089514993805, 29.755219019351184],
+ [95.09008489086116, 29.7552217729881],
+ [95.09066229928165, 29.75522847917293],
+ [95.09124726342738, 29.755238870403907],
+ [95.09183976966378, 29.755252726598844],
+ [95.09243978867215, 29.75526985018834],
+ [95.09304723439128, 29.755290065097345],
+ [95.09366184648091, 29.75531326126932],
+ [95.09428337414857, 29.755339326723966],
+ [95.09491171647382, 29.755368102171502],
+ [95.09554680939114, 29.75539940595205],
+ [95.09618846028675, 29.755433126230766],
+ [95.09683632409143, 29.75546923335011],
+ [95.09749004228215, 29.75550775219342],
+ [95.09814924669702, 29.755548754655436],
+ [95.0988136358514, 29.755592374644042],
+ [95.09948290826172, 29.755638746066982],
+ [95.1001568080277, 29.75568798494813],
+ [95.10083517891061, 29.75574017449467],
+ [95.10151797539464, 29.75579531974171],
+ [95.1022051519645, 29.755853425724286],
+ [95.10289664375364, 29.755914488290983],
+ [95.10359258928374, 29.755978570204803],
+ [95.10429306658138, 29.756045742645284],
+ [95.10499798654989, 29.756116067070348],
+ [95.10570717321444, 29.75618958016383],
+ [95.10642032295875, 29.75626636089044],
+ [95.10713711848761, 29.756346492746122],
+ [95.10785729025027, 29.75643004436662],
+ [95.10858043622838, 29.75651688160893],
+ [95.10930611534633, 29.75660684892344],
+ [95.11003407093642, 29.756699686157475],
+ [95.11076414467685, 29.756795123665622],
+ [95.1114960914754, 29.756892893838618],
+ [95.11222971288655, 29.756992700238396],
+ [95.1129649452222, 29.75709420093414],
+ [95.11370170201873, 29.75719709582746],
+ [95.11443986012442, 29.757301125099488],
+ [95.11517935555177, 29.7574061249826],
+ [95.11592009761476, 29.757511940391662],
+ [95.11666232015585, 29.75761835330566],
+ [95.11740624233691, 29.757725222810585],
+ [95.11815181076378, 29.75783253698326],
+ [95.11889913308254, 29.757940178669305],
+ [95.11964841222917, 29.758048000558695],
+ [95.12039993276164, 29.758155854652614],
+ [95.12115399312397, 29.75826357999786],
+ [95.1219108497459, 29.75837102690515],
+ [95.1226706293697, 29.758478081829693],
+ [95.12343325561484, 29.758584686897258],
+ [95.12419857627997, 29.758690818430438],
+ [95.12496638982559, 29.75879646083105],
+ [95.12573649209446, 29.7589015818837],
+ [95.12650863318528, 29.75900618637391],
+ [95.12728253192327, 29.759110282431784],
+ [95.12805798566751, 29.75921386162033],
+ [95.12883477913662, 29.759316919371038],
+ [95.12961273528985, 29.759419445656786],
+ [95.13039166301432, 29.759521458216526],
+ [95.13117134363408, 29.759622963323043],
+ [95.13195155721434, 29.759723948972997],
+ [95.13273211930314, 29.759824349786275],
+ [95.13351286507051, 29.759924061406032],
+ [95.13428648274362, 29.76002351015658],
+ [95.1350533298064, 29.760122544307915],
+ [95.1358137532818, 29.760221010686855],
+ [95.13656784419986, 29.760318809952974],
+ [95.13731567503761, 29.76041584848236],
+ [95.1380573752464, 29.760511990985425],
+ [95.13879310931623, 29.76060704815151],
+ [95.13952306473344, 29.760700794123938],
+ [95.14024751710419, 29.7607929520901],
+ [95.14096671686433, 29.760883206230545],
+ [95.14168092332761, 29.76097123202995],
+ [95.14239029599311, 29.761056732470486],
+ [95.14309486625548, 29.761139484506582],
+ [95.14379454089128, 29.761219462160696],
+ [95.14448922306659, 29.76129664046317],
+ [95.14517882147311, 29.76137100941381],
+ [95.14586312132259, 29.761442532574584],
+ [95.14654188135431, 29.761511168945386],
+ [95.14721489938523, 29.761576901934955],
+ [95.14788204807155, 29.761639772673718],
+ [95.14854319868547, 29.76169982923195],
+ [95.14919822095698, 29.761757127412878],
+ [95.14984699116548, 29.76181173598209],
+ [95.15048960377052, 29.761863851723042],
+ [95.15112617637942, 29.761913696049017],
+ [95.15175681293137, 29.761961561816054],
+ [95.15238148064795, 29.762007691856205],
+ [95.15300009096235, 29.762052309028526],
+ [95.1533539374323, 29.762086082676035],
+ [95.15370650809008, 29.762118928860186],
+ [95.15405759583123, 29.762150875711065],
+ [95.15440704121897, 29.76218191319173],
+ [95.1547548321985, 29.762211967913583],
+ [95.15510097264206, 29.762240955288657],
+ [95.15544525415498, 29.762268829619945],
+ [95.15578751039571, 29.76229553455492],
+ [95.15612769998111, 29.762320941845203],
+ [95.15646565712565, 29.762344985615734],
+ [95.156801142589, 29.76236761294652],
+ [95.1571338046714, 29.76238883654028],
+ [95.15746323934037, 29.76240869370805],
+ [95.15778903282519, 29.762427217766984],
+ [95.15811077257146, 29.762444433666733],
+ [95.15842800577592, 29.762460368791256],
+ [95.15874028837707, 29.76247502889767],
+ [95.15904716834646, 29.76248842410003],
+ [95.1593481499996, 29.762500590502704],
+ [95.15964271930007, 29.76251153961251],
+ [95.1599303416933, 29.76252129267978],
+ [95.16021045104225, 29.762529892932115],
+ [95.16048243037355, 29.762537389252305],
+ [95.16074559672008, 29.762543832974302],
+ [95.1609993202866, 29.762549265122786],
+ [95.16124294069552, 29.762553753099137],
+ [95.16147571071544, 29.762557390653928],
+ [95.16169677155058, 29.762560323342807]
+]
diff --git a/remotion-best-practices/remotion-markup/remotion-maps/techniques/cesium/assets/city-path.json b/remotion-best-practices/remotion-markup/remotion-maps/techniques/cesium/assets/city-path.json
new file mode 100644
index 0000000..821973f
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/remotion-maps/techniques/cesium/assets/city-path.json
@@ -0,0 +1,12 @@
+[
+ [-74.0135, 40.7047],
+ [-74.0102, 40.7104],
+ [-74.0074, 40.7167],
+ [-74.0047, 40.7232],
+ [-74.0017, 40.7297],
+ [-73.9988, 40.7362],
+ [-73.9954, 40.7429],
+ [-73.9917, 40.7496],
+ [-73.9882, 40.7563],
+ [-73.9848, 40.7631]
+]
diff --git a/remotion-best-practices/remotion-markup/remotion-maps/techniques/cesium/assets/example-Root.tsx b/remotion-best-practices/remotion-markup/remotion-maps/techniques/cesium/assets/example-Root.tsx
new file mode 100644
index 0000000..9a27a0b
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/remotion-maps/techniques/cesium/assets/example-Root.tsx
@@ -0,0 +1,39 @@
+import React from 'react';
+import {Composition} from 'remotion';
+import {CesiumFlythrough, type CesiumFlythroughProps} from './CesiumFlythrough';
+import cityPath from './city-path.json';
+
+export const RemotionRoot: React.FC = () => (
+ <>
+
+
+ >
+);
diff --git a/remotion-best-practices/remotion-markup/remotion-maps/techniques/cesium/assets/flight-path.ts b/remotion-best-practices/remotion-markup/remotion-maps/techniques/cesium/assets/flight-path.ts
new file mode 100644
index 0000000..de7f7bd
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/remotion-maps/techniques/cesium/assets/flight-path.ts
@@ -0,0 +1,35 @@
+export type LngLat = [number, number];
+
+// Chaikin corner cutting turns a sparse route into a continuous curve. Repeated passes round
+// direction changes into deliberate swerves instead of left-right heading bumps.
+export const smoothFlightPath = (source: LngLat[], passes = 3): LngLat[] => {
+ if (source.length < 2)
+ throw new Error('Flyover path needs at least two points');
+
+ // Keep adjacent longitudes continuous for routes that cross the antimeridian.
+ const unwrapped: LngLat[] = [source[0]];
+ for (let index = 1; index < source.length; index++) {
+ const [lng, lat] = source[index];
+ const previous = unwrapped[index - 1][0];
+ let adjusted = lng;
+ while (adjusted - previous > 180) adjusted -= 360;
+ while (adjusted - previous < -180) adjusted += 360;
+ unwrapped.push([adjusted, lat]);
+ }
+
+ let curve = unwrapped;
+ for (let pass = 0; pass < Math.max(0, passes); pass++) {
+ const next: LngLat[] = [curve[0]];
+ for (let i = 0; i < curve.length - 1; i++) {
+ const a = curve[i];
+ const b = curve[i + 1];
+ next.push(
+ [a[0] * 0.75 + b[0] * 0.25, a[1] * 0.75 + b[1] * 0.25],
+ [a[0] * 0.25 + b[0] * 0.75, a[1] * 0.25 + b[1] * 0.75],
+ );
+ }
+ next.push(curve[curve.length - 1]);
+ curve = next;
+ }
+ return curve;
+};
diff --git a/remotion-best-practices/remotion-markup/remotion-maps/techniques/cesium/assets/sample-river.geojson b/remotion-best-practices/remotion-markup/remotion-maps/techniques/cesium/assets/sample-river.geojson
new file mode 100644
index 0000000..5574b30
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/remotion-maps/techniques/cesium/assets/sample-river.geojson
@@ -0,0 +1,215 @@
+{
+ "type": "FeatureCollection",
+ "features": [
+ {
+ "type": "Feature",
+ "properties": {"name": "Yarlung Tsangpo (OSM, gorge way)"},
+ "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [94.8794306, 29.5453548],
+ [94.880058, 29.5500259],
+ [94.8804545, 29.5529773],
+ [94.8872806, 29.559007],
+ [94.8902386, 29.5645817],
+ [94.8945618, 29.5651505],
+ [94.8985437, 29.5703839],
+ [94.8978611, 29.5758448],
+ [94.9077237, 29.5843086],
+ [94.9107706, 29.5872382],
+ [94.9136749, 29.5879042],
+ [94.9208424, 29.5864253],
+ [94.9243692, 29.5890419],
+ [94.9243692, 29.5945028],
+ [94.9268508, 29.597544],
+ [94.9331942, 29.6000111],
+ [94.9350913, 29.6024165],
+ [94.9359736, 29.6042869],
+ [94.9354367, 29.6064452],
+ [94.9350634, 29.608155],
+ [94.9343462, 29.6094434],
+ [94.9295695, 29.6113703],
+ [94.9288061, 29.6124782],
+ [94.9268721, 29.6194181],
+ [94.9273809, 29.6276608],
+ [94.9274409, 29.6286334],
+ [94.9263783, 29.6303683],
+ [94.9250518, 29.6304537],
+ [94.922744, 29.6299103],
+ [94.9170292, 29.6256472],
+ [94.9144757, 29.6243553],
+ [94.9115439, 29.6243318],
+ [94.9008302, 29.6273853],
+ [94.8972905, 29.6276085],
+ [94.8897112, 29.6252949],
+ [94.8827398, 29.6253184],
+ [94.8806998, 29.6268686],
+ [94.8777241, 29.6317051],
+ [94.8768493, 29.6342436],
+ [94.8768641, 29.6346894],
+ [94.8769277, 29.6365972],
+ [94.8775677, 29.6391137],
+ [94.8804943, 29.6418187],
+ [94.8821969, 29.6438716],
+ [94.8877263, 29.6456718],
+ [94.8903366, 29.6468971],
+ [94.8959561, 29.6481151],
+ [94.9032857, 29.6528729],
+ [94.9113869, 29.6568592],
+ [94.9162734, 29.6587881],
+ [94.9182022, 29.6625172],
+ [94.9203882, 29.670104],
+ [94.9197453, 29.6744761],
+ [94.9192644, 29.6754058],
+ [94.9178164, 29.6782052],
+ [94.915116, 29.6816771],
+ [94.9094581, 29.6810342],
+ [94.9043145, 29.6796197],
+ [94.9018712, 29.6806484],
+ [94.8976278, 29.6812914],
+ [94.8909411, 29.6856634],
+ [94.8896552, 29.6890068],
+ [94.892227, 29.6990368],
+ [94.8978849, 29.704952],
+ [94.9017426, 29.7100956],
+ [94.9061206, 29.7112788],
+ [94.9065005, 29.7113815],
+ [94.9225743, 29.7192255],
+ [94.9264023, 29.7212652],
+ [94.9267629, 29.7213678],
+ [94.9341474, 29.723469],
+ [94.9360823, 29.7245705],
+ [94.9357152, 29.7273333],
+ [94.9344915, 29.7289804],
+ [94.9323502, 29.7303263],
+ [94.9298621, 29.73339],
+ [94.9294542, 29.734665],
+ [94.9298213, 29.7382244],
+ [94.9306755, 29.739157],
+ [94.9340021, 29.7439794],
+ [94.9355331, 29.7464083],
+ [94.9364901, 29.7488664],
+ [94.9372115, 29.749423],
+ [94.937775, 29.7498579],
+ [94.939019, 29.7500527],
+ [94.9407117, 29.7501944],
+ [94.9429346, 29.7513629],
+ [94.947778, 29.7543307],
+ [94.9541921, 29.755984],
+ [94.9574551, 29.7555414],
+ [94.9603715, 29.7553644],
+ [94.9629516, 29.755488],
+ [94.9676317, 29.757489],
+ [94.9709355, 29.7587814],
+ [94.9737019, 29.7603278],
+ [94.9738572, 29.7603796],
+ [94.9844009, 29.7638941],
+ [94.9852725, 29.7649069],
+ [94.9861359, 29.7675568],
+ [94.9898232, 29.7694497],
+ [94.9917263, 29.7691954],
+ [94.9966421, 29.7688099],
+ [95.0005707, 29.7670075],
+ [95.0007566, 29.7668999],
+ [95.0028203, 29.7657056],
+ [95.0080406, 29.7614995],
+ [95.0092963, 29.7609572],
+ [95.0138378, 29.7589957],
+ [95.0160159, 29.7574362],
+ [95.0194618, 29.7553902],
+ [95.0222306, 29.7524106],
+ [95.024336, 29.7498815],
+ [95.0273932, 29.7487547],
+ [95.0324981, 29.7493557],
+ [95.0339552, 29.7496724],
+ [95.0346257, 29.7499916],
+ [95.035882, 29.7507411],
+ [95.0375964, 29.7530966],
+ [95.0386203, 29.754818],
+ [95.0383895, 29.7567272],
+ [95.038166, 29.7590432],
+ [95.0395792, 29.7618349],
+ [95.0411334, 29.7631575],
+ [95.0420532, 29.7639402],
+ [95.0467825, 29.7661735],
+ [95.0495101, 29.7673453],
+ [95.0510063, 29.7681933],
+ [95.0516577, 29.7683919],
+ [95.0560621, 29.7692331],
+ [95.0577259, 29.7690047],
+ [95.0588453, 29.7684695],
+ [95.0650773, 29.767807],
+ [95.0705737, 29.761782],
+ [95.0720258, 29.7599696],
+ [95.0736121, 29.7540856],
+ [95.0754147, 29.751782],
+ [95.0758224, 29.751042],
+ [95.0760619, 29.750314],
+ [95.0759483, 29.7495284],
+ [95.0751984, 29.7480135],
+ [95.0728911, 29.7466988],
+ [95.0724585, 29.7445327],
+ [95.0732804, 29.7429802],
+ [95.0734102, 29.740789],
+ [95.0731362, 29.7386729],
+ [95.0744382, 29.7374902],
+ [95.075294, 29.7367129],
+ [95.079535, 29.7361346],
+ [95.081745, 29.736994],
+ [95.083005, 29.737484],
+ [95.0833905, 29.7430745],
+ [95.0844421, 29.7452715],
+ [95.0871532, 29.7473749],
+ [95.0918361, 29.7499864],
+ [95.0931923, 29.7511573],
+ [95.0943202, 29.7514189],
+ [95.0965266, 29.7510558],
+ [95.0991656, 29.7494408],
+ [95.1029871, 29.7472998],
+ [95.1038668, 29.7453591],
+ [95.1063039, 29.7417406],
+ [95.1084814, 29.741365],
+ [95.111726, 29.7426671],
+ [95.1138489, 29.7452914],
+ [95.1152135, 29.7465013],
+ [95.1154175, 29.7473556],
+ [95.1158661, 29.7480506],
+ [95.1167533, 29.7482586],
+ [95.1179004, 29.7491572],
+ [95.119434, 29.7515181],
+ [95.1195997, 29.7517319],
+ [95.1214023, 29.7535598],
+ [95.1239692, 29.754987],
+ [95.1260602, 29.7556005],
+ [95.1284973, 29.7561388],
+ [95.1311663, 29.7559002],
+ [95.1323477, 29.7559385],
+ [95.1344757, 29.7564723],
+ [95.1350155, 29.7583672],
+ [95.1382746, 29.7617848],
+ [95.1400377, 29.7646815],
+ [95.1410982, 29.7654339],
+ [95.1437689, 29.7649144],
+ [95.1469991, 29.7640131],
+ [95.1503617, 29.7622343],
+ [95.1506908, 29.7620602],
+ [95.1532721, 29.7600322],
+ [95.1565312, 29.7590432],
+ [95.1584059, 29.7594063],
+ [95.1589059, 29.7599317],
+ [95.1595043, 29.7612399],
+ [95.1611602, 29.7632119],
+ [95.1635565, 29.7646136],
+ [95.1700434, 29.7649144],
+ [95.1730828, 29.7644136],
+ [95.1748094, 29.7636814],
+ [95.1765005, 29.7628339],
+ [95.1794885, 29.7589784],
+ [95.1830673, 29.7576787],
+ [95.1848212, 29.7580682],
+ [95.1869103, 29.7594603]
+ ]
+ }
+ }
+ ]
+}
diff --git a/remotion-best-practices/remotion-markup/remotion-maps/techniques/cesium/references/3d-data-sources.md b/remotion-best-practices/remotion-markup/remotion-maps/techniques/cesium/references/3d-data-sources.md
new file mode 100644
index 0000000..c5cfcbd
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/remotion-maps/techniques/cesium/references/3d-data-sources.md
@@ -0,0 +1,43 @@
+# Flyover data sources
+
+## Landscape
+
+Use MapTiler for both layers:
+
+- `terrain-quantized-mesh-v2`: elevation encoded as Cesium quantized-mesh terrain.
+- `satellite-v2`: raster satellite imagery draped on that mesh.
+
+CesiumJS renders the layers; it does not supply the data. Set `REMOTION_MAPTILER_KEY`.
+
+Create a key:
+
+- https://cloud.maptiler.com/account/keys/
+
+Official documentation:
+
+- https://docs.maptiler.com/cesium/
+- https://docs.maptiler.com/schema-raster/terrain-3d/
+
+## City
+
+Use Google Photorealistic 3D Tiles. Google supplies one high-resolution 3D mesh already textured
+with imagery. Disable the Cesium globe and do not add MapTiler terrain or satellite beneath it. Set
+`REMOTION_GOOGLE_MAPS_API_KEY`.
+
+Create and configure a key:
+
+- https://developers.google.com/maps/documentation/tile/get-api-key
+
+Enable the Map Tiles API in a billing-enabled Google Cloud project and restrict the key to that API.
+The application restriction must permit the local headless Remotion request.
+
+Official documentation:
+
+- https://developers.google.com/maps/documentation/tile/3d-tiles
+- https://developers.google.com/maps/documentation/tile/policies
+
+## Why not extruded buildings
+
+OSM-, Overture- and vector-tile building products primarily provide footprints, approximate heights
+and optional roof attributes. They are useful for analytical or stylized maps, but they do not
+provide the textured architecture required for a cinematic city flyover.
diff --git a/remotion-best-practices/remotion-markup/remotion-maps/techniques/cesium/references/3d-flyover-architecture.md b/remotion-best-practices/remotion-markup/remotion-maps/techniques/cesium/references/3d-flyover-architecture.md
new file mode 100644
index 0000000..a2222d7
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/remotion-maps/techniques/cesium/references/3d-flyover-architecture.md
@@ -0,0 +1,128 @@
+# 3D Flyover — architecture reference
+
+Deep detail behind `TECHNIQUE.md`: provider loading, the camera-path pipeline, per-frame camera math, and
+the proven terrain values. Both landscape and city modes have been forward-tested through Remotion.
+
+## 1. Provider initialization
+
+Create the Viewer with `baseLayer: false`, UI widgets disabled, and
+`contextOptions.webgl.preserveDrawingBuffer: true`. Never hide the credit display.
+
+### Landscape
+
+Add MapTiler `satellite-v2` with `UrlTemplateImageryProvider`, then load
+`terrain-quantized-mesh-v2` with `CesiumTerrainProvider.fromUrl({requestVertexNormals: true})`.
+MapTiler supplies both datasets; no Cesium ion token is required.
+
+### City
+
+Do not add MapTiler. Hide the globe, then add:
+
+```ts
+viewer.scene.globe.show = false;
+const tileset = await Cesium.Cesium3DTileset.fromUrl(
+ `https://tile.googleapis.com/v1/3dtiles/root.json?key=${GOOGLE_KEY}`,
+ {showCreditsOnScreen: true, maximumScreenSpaceError: 4},
+);
+viewer.scene.primitives.add(tileset);
+```
+
+Lower `maximumScreenSpaceError` improves refinement at substantial download/render cost. Start at
+`4` for a hero landmark and `6–8` for wider urban shots. Enforce the Google 30-second promotional
+video ceiling in the component.
+
+Load Cesium from the CDN after setting `window.CESIUM_BASE_URL`; the tested version is `1.143`.
+
+## 2. The camera path — structure & generation
+
+Four properties matter, in order:
+
+1. **Continuous curvature** — the camera must flow through curves, never "fly straight, snap to a new
+ heading, fly straight." The component applies three passes of **Chaikin corner cutting** to every
+ supplied path. Each pass replaces a segment with quarter and three-quarter points, rounding a
+ corner into a curve. Three passes are the default; four is softer, two is tighter.
+2. **Constant ground speed** — precompute cumulative distance along the rounded curve and interpolate
+ by arc length. Do not animate by source-point index; unequal source spacing creates speed bumps.
+3. **Minimized amplitude** — for detailed landscape centerlines, dampen the prepared path toward its
+ straight start→end chord by a fixed fraction `DAMP` (0 = dead straight, 1 = full river). This is
+ the single swerve-amplitude knob.
+4. **Enough length** — `PATHKM ≥ TRAVEL_KM + 2·LOOK_AHEAD_KM` so the look-ahead aim never clamps.
+
+`../scripts/prep-cesium-path.mjs` does: clip a window of the source centerline → resample to even
+arc-length spacing (0.1 km) → moving-average smooth (±2.8 km window, 2 passes) → dampen toward the chord
+(`DAMP=0.45`). Validate with the heading-delta probe it prints — deltas should be small and change
+_gradually_ (water-wars: `3,0,-1,-3,-4,1,7,9,5,-5,-12,-7,…`). Big jumps = corners = bad.
+
+The component then applies Chaikin smoothing to this prepared route, or directly to a short
+hand-authored city route. Keep city control points sparse and intentional; smoothing cannot rescue a
+zig-zagging route that crosses the subject repeatedly.
+
+**Source data:** OSM via Overpass (~0.3 km vertex spacing) — Natural Earth is too coarse for inner
+gorges. overpass-api.de is often busy → mirror `overpass.kumi.systems`.
+
+## 3. Camera animation per frame (position, heading, pitch, bank)
+
+Walk the path by **arc length** (precompute cumulative distances once). Every frame:
+
+- **Position** = the point at `dCam` km along the path, altitude `lerp(ALT_START, ALT_END, prog)`.
+- **Heading** = bearing from the camera point to a **real point `LOOK_AHEAD_KM` further along the same
+ path**. A far aim averages wiggle → smooth heading; on a curved path it leads into the bend, so the
+ heading turns gently with the path. (A local-tangent aim spins the camera at every kink — don't.)
+- **Pitch** = constant. We keep a MapLibre-style param `PITCH_FROM_NADIR` (90 = horizon), then convert:
+ **Cesium pitch = `-(90 - PITCH_FROM_NADIR)`** (Cesium: 0 = horizon, -90 = straight down). 76° → -14°.
+- **Bank (roll)** = lean _into_ the turn — the helicopter tell. Measure turn rate as the bearing change
+ between `aim` and a point `2·LOOK_AHEAD_KM` ahead; `roll = clamp(dH · BANK_GAIN, ±MAX_BANK)`. Because
+ the path is smooth, `dH` changes gradually → the bank eases in and out, never jerks.
+
+```ts
+const setCamera = (C, viewer, prog) => {
+ const dCam = Math.min(TRAVEL_KM, PATHKM - LOOK_AHEAD_KM * 2) * prog;
+ const cam = alongPath(dCam); // arc-length point
+ const aim = alongPath(dCam + LOOK_AHEAD_KM); // heading target (real point on the path)
+ const aim2 = alongPath(dCam + LOOK_AHEAD_KM * 2); // turn-rate probe → bank
+ const heading = bearing(cam, aim);
+ let dH = bearing(aim, aim2) - heading; while (dH > Math.PI) dH -= 2*Math.PI; while (dH < -Math.PI) dH += 2*Math.PI;
+ viewer.camera.setView({
+ destination: C.Cartesian3.fromDegrees(cam[0], cam[1], lerp(ALT_START, ALT_END, prog)),
+ orientation: { heading, pitch: C.Math.toRadians(-(90 - PITCH_FROM_NADIR)), roll: clamp(dH * BANK_GAIN, -MAX_BANK, MAX_BANK) },
+ });
+};
+```
+
+> **Cesium vs MapLibre conventions (gotcha):** Cesium heading is radians, 0 = north, clockwise. Pitch
+> 0 = horizon, negative = down (MapLibre is the inverse). Roll positive = bank right; tune the sign by eye.
+
+## 4. The feel — proven water-wars values
+
+| Param | Value | Meaning |
+| ------------------------ | ---------------------- | ------------------------------------------------------------------------------------ |
+| `TRAVEL_KM` | 13 | How far the camera travels. **Speed = `TRAVEL_KM / durationSeconds`.** |
+| duration | 24 s (720 f @30) | 13 km / 24 s ≈ **0.54 km/s** — a slow, peaceful glide. 8 s felt "extremely rushed". |
+| `ALT_START → ALT_END` | 4600 → 4300 m ASL | Absolute (terrain-independent). Inside the corridor walls → fly _through_, not over. |
+| `LOOK_AHEAD_KM` | 1.5 | Heading smoothness vs responsiveness. |
+| `PITCH_FROM_NADIR` | 76° | Stare-ahead down the corridor (90 = level). → Cesium -14°. |
+| `MAX_BANK` / `BANK_GAIN` | 0.13 rad (~7.5°) / 0.6 | Helicopter lean into turns. |
+| `verticalExaggeration` | 1.1 | Subtle terrain drama. |
+| `DAMP` (prep) | 0.45 | Swerve amount: higher = weavier, lower = straighter. |
+
+**A slow camera renders fast.** At 0.54 km/s the camera moves ~18 m/frame, so tiles stay cached and each
+`settle()` returns almost immediately; the 720-frame render completed in one pass (no chunk-rendering).
+
+## 5. The complete component
+
+The full, runnable component is `../assets/CesiumFlythrough.tsx` — read it directly. Its shape:
+
+- `loadCesium()` — inject `CESIUM_BASE_URL` + the CDN `Cesium.js`, resolve when loaded.
+- init effect — build the Viewer (§1), `setCamera(…, 0)`, `await settle(viewer)`, `continueRender`.
+- `settle(viewer)` — loop `viewer.render()` until `globe.tilesLoaded` for landscapes or
+ `tileset.tilesLoaded` for cities is stable for ~8 ticks (cap ~600).
+- per-frame effect — `delayRender({timeoutInMilliseconds: 60000})` → `setCamera(prog)` → `settle()` → `continueRender`.
+
+## 6. Render
+
+```bash
+bunx remotion still src/index.ts out.png --frame=N --gl=angle --timeout=180000 # validate framing/bank first
+bunx remotion render src/index.ts out.mp4 --gl=angle --concurrency=1 --timeout=180000
+```
+
+`--gl=angle` is mandatory. Use `--concurrency=1`; `settle()` already serializes tile loading.
diff --git a/remotion-best-practices/remotion-markup/remotion-maps/techniques/cesium/references/3d-troubleshooting.md b/remotion-best-practices/remotion-markup/remotion-maps/techniques/cesium/references/3d-troubleshooting.md
new file mode 100644
index 0000000..488eb9d
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/remotion-maps/techniques/cesium/references/3d-troubleshooting.md
@@ -0,0 +1,57 @@
+# 3D Flyover — troubleshooting
+
+## The headless dead-end (why we render through Remotion)
+
+Cesium's globe **will not draw in a standalone headless Playwright/Chromium** harness. Verified on
+Apple M4 (ANGLE Metal active, WebGL working): the skybox/stars render, but the globe surface produces
+**zero draw commands** (`scene.frameState.commandList.length === 0`), `globe.tilesLoaded` never goes
+true, and frames come back as the black starfield. No network failures; `sampleTerrainMostDetailed`
+succeeds (terrain data is reachable). Dead-ends tried, all failed:
+
+- default render loop, manual `scene.render()`, manual `viewer.render()`, headed mode (context-destroyed).
+
+**What works:** render Cesium **through Remotion** — same headless Chrome, but driven by Remotion's frame
+loop with these four non-negotiables:
+
+1. `useDefaultRenderLoop = false` — drive frames by hand.
+2. Per frame call **`viewer.render()`**, NOT `scene.render()`. `viewer.render()` does the full frame
+ (`initializeFrame` → tile streaming → render); `scene.render()` skips frame-init, so tiles never
+ advance and the globe never appears. **This is the single most important line.**
+3. `contextOptions: { webgl: { preserveDrawingBuffer: true } }` so Remotion's screenshot captures pixels.
+4. Gate init + every frame with `delayRender(…, {timeoutInMilliseconds})` — tile loading can exceed Remotion's
+ default; use 60–120 s.
+
+The standalone `flythrough.html` / `render.mjs` / `probe.mjs` from the original spike are kept only as the
+record of this dead-end. The canonical render path is the Remotion component
+(`../assets/CesiumFlythrough.tsx`).
+
+## Symptom → fix
+
+| Symptom | Cause | Fix |
+| --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- |
+| Frames are black with stars | Globe not drawing (headless Playwright, or `scene.render()` used) | Render through Remotion; use `viewer.render()`; `useDefaultRenderLoop=false`. |
+| Screenshots blank/transparent | No `preserveDrawingBuffer` | `contextOptions:{ webgl:{ preserveDrawingBuffer:true } }`. |
+| "delayRender timed out" | Cold tiles exceed the default | `delayRender(…, {timeoutInMilliseconds: 120000})` + `--timeout=180000`. |
+| Globe is a dark/navy sphere | Imagery layer didn't attach | `baseLayer:false` then `viewer.imageryLayers.addImageryProvider(...)`. |
+| High-pitch frame shows a void/starfield above the horizon | No atmosphere | `viewer.scene.skyAtmosphere.show = true`. |
+| 403 on tiles in headless | Domain-locked MapTiler key | Use an **unrestricted** key. |
+| Google root tileset returns 403 | Map Tiles API disabled, billing absent, wrong key, or application restriction blocks local headless rendering | Enable Map Tiles API and billing; restrict the key to that API while allowing the Remotion request. |
+| Google scene shows a duplicate/competing surface | MapTiler or the Cesium globe is still enabled | Do not add MapTiler; set `viewer.scene.globe.show=false`. |
+| Google mesh remains coarse | Screen-space error is too high or the capture starts before refinement | Lower `maximumScreenSpaceError`; settle on `tileset.tilesLoaded`. |
+| WebGL unavailable / software renderer | Missing GL flag | Render with `--gl=angle`. |
+| Camera looks at sky / ground, not terrain | Pitch sign / convention | Cesium pitch 0 = horizon, negative = down (inverse of MapLibre); `-(90 - PITCH_FROM_NADIR)`. |
+| Aim/turn-probe clamps near the end | Path too short | `PATHKM ≥ TRAVEL_KM + 2·LOOK_AHEAD_KM`; raise `WINDOW_KM` in prep. |
+| Path feels like straight-then-corner | Douglas-Peucker simplification | Use resample → moving-average smooth (see architecture §2), not `turf.simplify`. |
+| Camera bumps left and right instead of swerving | Sparse route vertices are still being followed as straight segments | Keep `pathSmoothingPasses={3}`; use sparse intentional control points and arc-length movement. |
+
+## Gotchas checklist
+
+- **`viewer.render()`, never `scene.render()`** per frame. The single biggest trap.
+- Cesium loads from **CDN**; set `window.CESIUM_BASE_URL` _before_ injecting the script.
+- `preserveDrawingBuffer: true` or screenshots are blank.
+- `delayRender` uses `timeoutInMilliseconds`; set it to at least 60,000.
+- Terrain: `baseLayer:false`, then add MapTiler imagery.
+- Google: no MapTiler, hide the globe, retain `showCreditsOnScreen:true`.
+- Always `skyAtmosphere.show = true`.
+- Validate the path's heading-delta probe and render one **still** (framing + bank) before the full mp4.
+- Cesium pitch/roll conventions are inverted vs MapLibre.
diff --git a/remotion-best-practices/remotion-markup/remotion-maps/techniques/cesium/scripts/prep-cesium-path.mjs b/remotion-best-practices/remotion-markup/remotion-maps/techniques/cesium/scripts/prep-cesium-path.mjs
new file mode 100644
index 0000000..dbb3f0f
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/remotion-maps/techniques/cesium/scripts/prep-cesium-path.mjs
@@ -0,0 +1,161 @@
+// Camera-path generator for the Cesium flythrough. Turns a river/route centerline GeoJSON into a LONG,
+// CONTINUOUSLY-curving camera path so the camera banks through smooth flowing curves (no
+// straight-then-corner). Method: clip → resample to even spacing → moving-average smooth (inherently
+// continuous curvature) → dampen lateral deviation toward the straight chord (dials swerve amplitude).
+// No Douglas-Peucker (that concentrates curvature at sparse control points → corners).
+//
+// RUN (out of the box, against the shipped sample):
+// node prep-cesium-path.mjs
+// → reads assets/sample-river.geojson (override: node prep-cesium-path.mjs )
+// → writes assets/cesium-path.json (then import that JSON in CesiumFlythrough.tsx, or copy it
+// into your Remotion project's src/geo/ and adjust the import)
+//
+// ADAPT for a new location: change START (a point ON your centerline where the corridor opens),
+// WINDOW_KM, and DAMP/SMOOTH below. Input must be a single LineString feature (features[0].geometry).
+
+import {readFileSync, writeFileSync, mkdirSync} from 'fs';
+import {dirname, resolve} from 'path';
+import {fileURLToPath} from 'url';
+
+const __dir = dirname(fileURLToPath(import.meta.url));
+const IN = process.argv[2] || resolve(__dir, '../assets/sample-river.geojson');
+const OUT = process.argv[3] || resolve(__dir, '../assets/cesium-path.json');
+const havKm = (a, b) => {
+ const R = 6371,
+ r = Math.PI / 180,
+ dLat = (b[1] - a[1]) * r,
+ dLng = (b[0] - a[0]) * r;
+ const h =
+ Math.sin(dLat / 2) ** 2 +
+ Math.cos(a[1] * r) * Math.cos(b[1] * r) * Math.sin(dLng / 2) ** 2;
+ return 2 * R * Math.asin(Math.sqrt(h));
+};
+
+const gorge = JSON.parse(readFileSync(IN, 'utf8')).features[0].geometry
+ .coordinates;
+
+// ADAPT: clip ~24 km of river from the reach where the flythrough opens. START must be a point ON the
+// centerline (the script snaps to the nearest vertex). The sample's opening is the Yarlung gorge:
+const START = [94.968, 29.757];
+let s0 = 0,
+ best = Infinity;
+gorge.forEach((p, i) => {
+ const d = havKm(p, START);
+ if (d < best) {
+ best = d;
+ s0 = i;
+ }
+});
+const WINDOW_KM = 30; // clip to ~end of gorge data; smoothing+dampening shrink it to the usable corridor
+const clip = [];
+for (let i = s0, acc = 0; i < gorge.length; i++) {
+ if (i > s0) acc += havKm(gorge[i - 1], gorge[i]);
+ if (acc > WINDOW_KM) break;
+ clip.push(gorge[i]);
+}
+
+// Resample to even arc-length spacing so curvature is distributed evenly along the path.
+const STEP_KM = 0.1;
+const resample = (coords) => {
+ const out = [coords[0].slice()];
+ let carry = 0,
+ from = coords[0];
+ for (let i = 1; i < coords.length; i++) {
+ let segLen = havKm(from, coords[i]);
+ while (carry + segLen >= STEP_KM) {
+ const t = (STEP_KM - carry) / segLen;
+ const np = [
+ from[0] + (coords[i][0] - from[0]) * t,
+ from[1] + (coords[i][1] - from[1]) * t,
+ ];
+ out.push(np);
+ from = np;
+ segLen = havKm(from, coords[i]);
+ carry = 0;
+ }
+ carry += segLen;
+ from = coords[i];
+ }
+ return out;
+};
+
+// Moving-average smoothing — inherently continuous (no kinks). Window in points; repeat for extra glass.
+const smoothMA = (coords, w, passes) => {
+ let c = coords;
+ for (let p = 0; p < passes; p++) {
+ c = c.map((_, i) => {
+ let sx = 0,
+ sy = 0,
+ n = 0;
+ for (
+ let j = Math.max(0, i - w);
+ j <= Math.min(c.length - 1, i + w);
+ j++
+ ) {
+ sx += c[j][0];
+ sy += c[j][1];
+ n++;
+ }
+ return [sx / n, sy / n];
+ });
+ }
+ return c;
+};
+
+const SMOOTH_W = 28; // ±2.8 km window — turns meanders into smooth flowing curves
+const SMOOTH_PASSES = 2;
+const DAMP = 0.45; // keep 45% of the (already-smooth) deviation → gentle, continuous swerve
+
+const even = resample(clip);
+const sm = smoothMA(even, SMOOTH_W, SMOOTH_PASSES);
+
+const lat0 = (sm[0][1] * Math.PI) / 180;
+const kx = 111.32 * Math.cos(lat0),
+ ky = 110.57;
+const toXY = (p) => [(p[0] - sm[0][0]) * kx, (p[1] - sm[0][1]) * ky];
+const toLL = (xy) => [sm[0][0] + xy[0] / kx, sm[0][1] + xy[1] / ky];
+const A = toXY(sm[0]),
+ B = toXY(sm[sm.length - 1]);
+const AB = [B[0] - A[0], B[1] - A[1]],
+ len2 = AB[0] ** 2 + AB[1] ** 2;
+const path = sm.map((p) => {
+ const P = toXY(p);
+ const t = ((P[0] - A[0]) * AB[0] + (P[1] - A[1]) * AB[1]) / len2;
+ const proj = [A[0] + t * AB[0], A[1] + t * AB[1]];
+ return toLL([
+ proj[0] + (P[0] - proj[0]) * DAMP,
+ proj[1] + (P[1] - proj[1]) * DAMP,
+ ]);
+});
+
+mkdirSync(dirname(OUT), {recursive: true});
+writeFileSync(OUT, JSON.stringify(path));
+
+let len = 0;
+for (let i = 1; i < path.length; i++) len += havKm(path[i - 1], path[i]);
+console.log(
+ `cesium-path: clip ${clip.length} → resample ${even.length} → smooth → ${path.length} pts · ${len.toFixed(1)} km`,
+);
+const bear = (a, b) => {
+ const r = Math.PI / 180;
+ const y = Math.sin((b[0] - a[0]) * r) * Math.cos(b[1] * r);
+ const x =
+ Math.cos(a[1] * r) * Math.sin(b[1] * r) -
+ Math.sin(a[1] * r) * Math.cos(b[1] * r) * Math.cos((b[0] - a[0]) * r);
+ return (Math.atan2(y, x) * 180) / Math.PI;
+};
+// heading sampled every ~1.5 km — should change gradually & continuously (no big jumps = no corners)
+const stepPts = Math.round(1.5 / STEP_KM);
+let prev = null,
+ hs = [];
+for (let i = 0; i + stepPts < path.length; i += stepPts) {
+ const h = bear(path[i], path[i + stepPts]);
+ if (prev !== null) {
+ let d = h - prev;
+ while (d > 180) d -= 360;
+ while (d < -180) d += 360;
+ hs.push(d.toFixed(0));
+ }
+ prev = h;
+}
+console.log(` heading deltas every 1.5km (deg): ${hs.join(', ')}`);
diff --git a/remotion-best-practices/remotion-markup/remotion-maps/techniques/mapbox/TECHNIQUE.md b/remotion-best-practices/remotion-markup/remotion-maps/techniques/mapbox/TECHNIQUE.md
new file mode 100644
index 0000000..5af3fe1
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/remotion-maps/techniques/mapbox/TECHNIQUE.md
@@ -0,0 +1,449 @@
+---
+name: maps-mapbox
+description: Make deterministic Remotion 2D map animations with Mapbox GL JS and Turf. Use when the user chooses Mapbox for animated routes, map markers, labels, camera movement, or Mapbox styles.
+metadata:
+ tags: map, map animation, mapbox, turf, geojson, route animation
+---
+
+Use Mapbox GL JS for rendering maps in Remotion when the user wants Mapbox styles or higher-fidelity map visuals and has a Mapbox access token. Use Turf for geospatial operations such as great-circle routes, distances, slicing lines, and positions along routes.
+
+Use this technique only when the user has a Mapbox access token and wants Mapbox styles or data.
+
+## Core rules
+
+- Prefer `@turf/turf` for geospatial work. Do not hand-roll distance, great-circle, route slicing, or coordinate interpolation unless the user explicitly needs a custom non-geodesic effect.
+- Use GeoJSON sources and Mapbox layers for lines, markers, and labels. Avoid DOM `Marker` elements unless the user specifically asks for HTML markers.
+- Keep the live map camera static by default. Before moving it on every frame, read [moving-map stability](references/render-stability.md). Prefer a fixed map plate for satellite imagery, hillshade, or a modest 2D reframe.
+- Use a live per-frame camera only after rendering a short MP4 and checking for shimmer. This 2D technique does not provide genuine terrain, pitch, bearing, or banking.
+- Disable non-deterministic map behavior: `interactive: false`, `fadeDuration: 0`.
+- Drive animation from `useCurrentFrame()`; do not use CSS transitions or browser-timed animation.
+- Use `delayRender()` / `continueRender()` around map loading and per-frame map updates.
+- Set `preserveDrawingBuffer: true` and render WebGL with `bunx remotion ... --gl=angle`.
+- Before continuing the initial render, add sources/layers, apply the frame-0 camera with `jumpTo()` or `setFreeCameraOptions()`, then wait for `idle`.
+- Do not add a `mapInstance.remove()` cleanup function; it can interfere with Remotion's render lifecycle.
+- Use Mapbox style URLs such as `mapbox://styles/mapbox/standard` or a user-provided custom style.
+- Do not install `@types/mapbox-gl`; Mapbox GL JS ships its own types.
+- Keep required provider attribution visible and verify current provider terms before rendering.
+- Record the source and effective date of custom or disputed geography.
+- Inspect rendered pixels, not only Studio playback, at every required aspect ratio.
+
+Coordinates in Mapbox, Turf, and GeoJSON are `[longitude, latitude]`.
+
+```ts
+const zurich: [number, number] = [8.5417, 47.3769];
+const newYork: [number, number] = [-74.006, 40.7128];
+```
+
+## Prerequisites
+
+Install Mapbox GL JS and Turf with the project's package manager.
+
+```bash
+npm i mapbox-gl @turf/turf
+```
+
+```bash
+bun i mapbox-gl @turf/turf
+```
+
+```bash
+yarn add mapbox-gl @turf/turf
+```
+
+```bash
+pnpm i mapbox-gl @turf/turf
+```
+
+Import the Mapbox CSS once in the component or an app-level stylesheet:
+
+```ts
+import 'mapbox-gl/dist/mapbox-gl.css';
+```
+
+Mapbox requires a public access token. Prefer passing it as an input prop or reading it from an environment variable that is available to the bundled Remotion code.
+
+```ts
+const mapboxAccessToken = process.env.REMOTION_MAPBOX_TOKEN;
+
+if (!mapboxAccessToken) {
+ throw new Error('Set REMOTION_MAPBOX_TOKEN to render Mapbox maps.');
+}
+```
+
+## Basic map example
+
+```tsx
+import {useEffect, useRef, useState} from 'react';
+import {AbsoluteFill, useDelayRender, useVideoConfig} from 'remotion';
+import mapboxgl from 'mapbox-gl';
+import 'mapbox-gl/dist/mapbox-gl.css';
+
+const zurich: [number, number] = [8.5417, 47.3769];
+
+const mapboxAccessToken = process.env.REMOTION_MAPBOX_TOKEN;
+
+if (!mapboxAccessToken) {
+ throw new Error('Set REMOTION_MAPBOX_TOKEN to render Mapbox maps.');
+}
+
+export const MyComposition = () => {
+ const containerRef = useRef(null);
+ const {delayRender, continueRender} = useDelayRender();
+ const {width, height} = useVideoConfig();
+ const [loadingHandle] = useState(() => delayRender('Loading Mapbox map'));
+
+ useEffect(() => {
+ if (!containerRef.current) {
+ return;
+ }
+
+ const mapInstance = new mapboxgl.Map({
+ accessToken: mapboxAccessToken,
+ container: containerRef.current,
+ style: 'mapbox://styles/mapbox/standard',
+ center: zurich,
+ zoom: 7,
+ interactive: false,
+ attributionControl: false,
+ fadeDuration: 0,
+ canvasContextAttributes: {
+ preserveDrawingBuffer: true,
+ },
+ });
+
+ mapInstance.on('load', () => {
+ mapInstance.jumpTo({center: zurich, zoom: 7});
+ mapInstance.once('idle', () => {
+ continueRender(loadingHandle);
+ });
+ });
+ }, [continueRender, loadingHandle]);
+
+ return (
+
+
+
+ );
+};
+```
+
+Animated examples should keep the loaded map in React state and skip per-frame updates until that state is set.
+
+## Animated flight route example
+
+This example shows the recommended pattern for route animations:
+
+- Turf creates the route and markers.
+- Turf slices the route for line reveal animation.
+- Mapbox renders the route with GeoJSON sources and layers.
+- The camera uses `jumpTo()` with animated center, zoom, bearing, and pitch.
+- Frame 0 is prepared before `continueRender()`.
+
+```tsx
+import * as turf from '@turf/turf';
+import {useEffect, useRef, useState} from 'react';
+import {
+ AbsoluteFill,
+ Easing,
+ interpolate,
+ useCurrentFrame,
+ useDelayRender,
+ useVideoConfig,
+} from 'remotion';
+import mapboxgl, {type GeoJSONSource, type Map} from 'mapbox-gl';
+import 'mapbox-gl/dist/mapbox-gl.css';
+
+const zurich: [number, number] = [8.5417, 47.3769];
+const newYork: [number, number] = [-74.006, 40.7128];
+
+const mapboxAccessToken = process.env.REMOTION_MAPBOX_TOKEN;
+
+if (!mapboxAccessToken) {
+ throw new Error('Set REMOTION_MAPBOX_TOKEN to render Mapbox maps.');
+}
+
+const greatCircleLine = (from: [number, number], to: [number, number]) => {
+ const route = turf.greatCircle(from, to, {npoints: 100});
+
+ if (route.geometry.type === 'LineString') {
+ return turf.lineString(route.geometry.coordinates);
+ }
+
+ // Great-circle routes crossing the antimeridian can become MultiLineString.
+ // Keep the example valid by choosing the longest segment.
+ const longestSegment = route.geometry.coordinates.reduce((longest, segment) => {
+ return segment.length > longest.length ? segment : longest;
+ });
+
+ return turf.lineString(longestSegment);
+};
+
+const targetRoute = greatCircleLine(zurich, newYork);
+const targetRouteDistance = turf.length(targetRoute);
+
+const cityMarkers = turf.featureCollection([
+ turf.point(zurich, {name: 'Zurich'}),
+ turf.point(newYork, {name: 'New York'}),
+]);
+
+const clampProgress = (progress: number) => Math.min(1, Math.max(0, progress));
+
+const distanceAlong = (totalDistance: number, progress: number) => {
+ // Keep the route non-empty at progress 0; Turf can error on zero-length slices.
+ return Math.max(0.001, totalDistance * clampProgress(progress));
+};
+
+const getPartialTargetRoute = (progress: number) => {
+ return turf.lineSliceAlong(
+ targetRoute,
+ 0,
+ distanceAlong(targetRouteDistance, progress),
+ );
+};
+
+const getCameraOptions = (progress: number) => {
+ const target = turf.along(
+ targetRoute,
+ distanceAlong(targetRouteDistance, progress),
+ ).geometry.coordinates as [number, number];
+
+ return {
+ center: target,
+ zoom: interpolate(progress, [0, 0.5, 1], [7, 2.4, 8], {
+ extrapolateLeft: 'clamp',
+ extrapolateRight: 'clamp',
+ easing: Easing.bezier(0.645, 0.045, 0.355, 1),
+ }),
+ bearing: interpolate(progress, [0, 1], [-20, 35], {
+ extrapolateLeft: 'clamp',
+ extrapolateRight: 'clamp',
+ }),
+ pitch: interpolate(progress, [0, 0.25, 0.75, 1], [25, 55, 55, 30], {
+ extrapolateLeft: 'clamp',
+ extrapolateRight: 'clamp',
+ easing: Easing.bezier(0.645, 0.045, 0.355, 1),
+ }),
+ };
+};
+
+export const MyComposition = () => {
+ const containerRef = useRef(null);
+ const frame = useCurrentFrame();
+ const {delayRender, continueRender} = useDelayRender();
+ const {durationInFrames, height, width} = useVideoConfig();
+ const [map, setMap] = useState(null);
+ const [loadingHandle] = useState(() => delayRender('Loading Mapbox map'));
+
+ useEffect(() => {
+ if (!containerRef.current) {
+ return;
+ }
+
+ const mapInstance = new mapboxgl.Map({
+ accessToken: mapboxAccessToken,
+ container: containerRef.current,
+ style: 'mapbox://styles/mapbox/standard',
+ center: zurich,
+ zoom: 7,
+ interactive: false,
+ attributionControl: false,
+ fadeDuration: 0,
+ canvasContextAttributes: {
+ preserveDrawingBuffer: true,
+ },
+ });
+
+ mapInstance.on('load', () => {
+ mapInstance.addSource('trace', {
+ type: 'geojson',
+ data: getPartialTargetRoute(0),
+ });
+
+ mapInstance.addLayer({
+ id: 'trace-line',
+ type: 'line',
+ source: 'trace',
+ layout: {
+ 'line-cap': 'round',
+ 'line-join': 'round',
+ },
+ paint: {
+ 'line-color': '#111111',
+ 'line-width': 7,
+ },
+ });
+
+ mapInstance.addSource('city-markers', {
+ type: 'geojson',
+ data: cityMarkers,
+ });
+
+ mapInstance.addLayer({
+ id: 'city-marker-dots',
+ type: 'circle',
+ source: 'city-markers',
+ paint: {
+ 'circle-color': '#f03b20',
+ 'circle-radius': 12,
+ 'circle-stroke-color': '#ffffff',
+ 'circle-stroke-width': 4,
+ },
+ });
+
+ mapInstance.addLayer({
+ id: 'city-marker-labels',
+ type: 'symbol',
+ source: 'city-markers',
+ layout: {
+ 'text-allow-overlap': true,
+ 'text-anchor': 'top',
+ 'text-field': ['get', 'name'],
+ 'text-offset': [0, 0.9],
+ 'text-size': 28,
+ },
+ paint: {
+ 'text-color': '#111111',
+ 'text-halo-color': '#ffffff',
+ 'text-halo-width': 3,
+ },
+ });
+
+ mapInstance.jumpTo(getCameraOptions(0));
+ mapInstance.once('idle', () => {
+ setMap(mapInstance);
+ continueRender(loadingHandle);
+ });
+ });
+ }, [continueRender, loadingHandle]);
+
+ useEffect(() => {
+ if (!map) {
+ return;
+ }
+
+ const handle = delayRender('Rendering Mapbox frame');
+ const timelineProgress = interpolate(frame, [0, durationInFrames - 1], [0, 1], {
+ extrapolateLeft: 'clamp',
+ extrapolateRight: 'clamp',
+ });
+ const travelProgress = interpolate(timelineProgress, [0.2, 0.82], [0, 1], {
+ extrapolateLeft: 'clamp',
+ extrapolateRight: 'clamp',
+ easing: Easing.bezier(0.645, 0.045, 0.355, 1),
+ });
+ const trace = map.getSource('trace') as GeoJSONSource | undefined;
+
+ trace?.setData(getPartialTargetRoute(travelProgress));
+ map.jumpTo(getCameraOptions(travelProgress));
+
+ map.once('idle', () => continueRender(handle));
+ // Force an idle event even if the camera parameters are unchanged from the previous frame.
+ map.triggerRepaint();
+ }, [continueRender, delayRender, durationInFrames, frame, map]);
+
+ return (
+
+
+
+ );
+};
+```
+
+## Camera guidance
+
+For a validated live-camera route animation, animate `center`, `zoom`, `bearing`, and `pitch` with `jumpTo()`:
+
+```ts
+map.jumpTo({
+ center,
+ zoom,
+ bearing,
+ pitch,
+});
+```
+
+Keep route progress and camera progress separate if the camera needs to lead, lag, zoom out, or zoom back in. For cinematic 3D camera moves, load the 3D flyover branch from the parent skill.
+
+## Lines
+
+Use GeoJSON sources for lines. Unless the user asks, do not add glow effects or extra decorative points.
+
+For geodesic flight routes, use Turf:
+
+```ts
+const line = greatCircleLine(start, end);
+const distance = turf.length(line);
+const partialLine = turf.lineSliceAlong(
+ line,
+ 0,
+ // Keep the route non-empty at progress 0.
+ Math.max(0.001, distance * progress),
+);
+```
+
+For a visually straight line on the map, use a simple GeoJSON `LineString` between the two points instead of `greatCircle()`.
+
+## Markers and labels
+
+Use map-native GeoJSON layers for markers and labels:
+
+```tsx
+mapInstance.addSource('markers', {
+ type: 'geojson',
+ data: turf.featureCollection([
+ turf.point([-118.2437, 34.0522], {name: 'Los Angeles'}),
+ ]),
+});
+
+mapInstance.addLayer({
+ id: 'marker-dots',
+ type: 'circle',
+ source: 'markers',
+ paint: {
+ 'circle-color': '#f03b20',
+ 'circle-radius': 12,
+ 'circle-stroke-color': '#ffffff',
+ 'circle-stroke-width': 4,
+ },
+});
+
+mapInstance.addLayer({
+ id: 'marker-labels',
+ type: 'symbol',
+ source: 'markers',
+ layout: {
+ 'text-allow-overlap': true,
+ 'text-anchor': 'top',
+ 'text-field': ['get', 'name'],
+ 'text-offset': [0, 0.9],
+ 'text-size': 28,
+ },
+ paint: {
+ 'text-color': '#111111',
+ 'text-halo-color': '#ffffff',
+ 'text-halo-width': 3,
+ },
+});
+```
+
+Make marker sizes and label font sizes large enough for the composition resolution.
+
+## Styles
+
+Default to Mapbox Standard:
+
+```ts
+style: 'mapbox://styles/mapbox/standard'
+```
+
+If the user requests another style, use any valid Mapbox style URL.
+
+## Rendering
+
+For WebGL map renders, prefer single concurrency and ANGLE:
+
+```bash
+bunx remotion render [composition-id] out/video.mp4 --gl=angle --concurrency=1
+```
+
+Use the equivalent package runner for the project. In npm projects, use `npx`; in Bun projects, use `bunx`.
diff --git a/remotion-best-practices/remotion-markup/remotion-maps/techniques/mapbox/references/render-stability.md b/remotion-best-practices/remotion-markup/remotion-maps/techniques/mapbox/references/render-stability.md
new file mode 100644
index 0000000..fc40033
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/remotion-maps/techniques/mapbox/references/render-stability.md
@@ -0,0 +1,64 @@
+# Moving Map Render Stability
+
+Read this reference before building a moving 2D MapTiler scene or diagnosing a wavering Remotion render.
+
+## Symptom and cause
+
+If basemap detail shimmers or jitters during a pan/zoom, the likely cause is per-frame `map.jumpTo()`.
+Headless MapTiler capture can resample both vector hillshade and satellite imagery differently frame to
+frame. Tile retries, easing changes, and label changes do not solve that renderer effect.
+
+## Required pattern: fixed map plate
+
+For any 2D pan/zoom:
+
+1. Render the MapTiler canvas once at the largest required zoom in an oversized container. Size it from the camera route and keep each dimension below the browser's reliable WebGL render-buffer limit (commonly 4096 px). Do **not** blindly use 3×: a 1920×1080 composition becomes 5760 px wide and Chromium may silently downsample it, causing visible pixelation during the CSS zoom.
+2. Keep the map's camera static.
+3. For each frame, calculate the approved target centre/zoom, then move the canvas with CSS `translate` + `scale`.
+4. Apply the same transform to every projected HTML overlay.
+5. Continue to animate GeoJSON data and paint properties imperatively; only the renderer camera is frozen.
+
+Keep pitch and bearing constant. Use a 3D engine such as Cesium for genuine changing pitch/bearing or a terrain flythrough.
+
+```ts
+const baseZoom = Math.max(start.zoom, end.zoom);
+const map = new maptilersdk.Map({
+ container,
+ style,
+ center: end.center,
+ zoom: baseZoom,
+ pitch: end.pitch ?? 0,
+ bearing: end.bearing ?? 0,
+ interactive: false,
+ fadeDuration: 0,
+ canvasContextAttributes: {preserveDrawingBuffer: true},
+});
+
+// Per Remotion frame. `camera` is the approved centre/zoom interpolation.
+const projected = map.project(camera.center);
+const scale = 2 ** (camera.zoom - baseZoom);
+const plate = {
+ transform: `translate(${width / 2 - projected.x * scale}px, ${height / 2 - projected.y * scale}px) scale(${scale})`,
+ transformOrigin: "0 0",
+};
+
+// Convert label projection with exactly the same plate transform.
+const labelX = labelPoint.x * scale + width / 2 - projected.x * scale;
+const labelY = labelPoint.y * scale + height / 2 - projected.y * scale;
+```
+
+### Plate sizing and sharpness
+
+- Render at the maximum zoom reached by **any** camera waypoint, including intermediate or hold cameras. The CSS scale should never exceed `1`; otherwise the plate is being enlarged.
+- Centre the frozen map on the midpoint of the camera route's geographic extent, not automatically on the final camera. This minimizes required overscan.
+- Keep the largest canvas dimension at or below 4096 px unless the actual render environment has been tested with a larger `MAX_RENDERBUFFER_SIZE`.
+- For 1920×1080, a 3840×2160 plate is a safe default. For 1080×1920, use approximately 2700×3840 when the route needs extra horizontal pan room.
+- If the route cannot fit within that plate at the required zoom, split the shot into two fixed plates with a deliberate editorial transition. Do not trade sharpness for one enormous canvas.
+- Distinguish failure modes: repeating shimmer means the live renderer is moving; steadily soft tiles during a CSS push means the fixed plate is underspecified, internally downsampled, or being scaled above `1`.
+
+## Verification
+
+- Render a short MP4, not only a Studio preview.
+- Inspect static terrain texture and satellite detail while the camera moves.
+- If any underlying map detail wavers, use the fixed map plate. Do not approve it as a minor preview artefact.
+- Render WebGL with `--gl=angle`, `preserveDrawingBuffer:true`, and conservative concurrency (`1`) while validating.
diff --git a/remotion-best-practices/remotion-markup/remotion-maps/techniques/maplibre/TECHNIQUE.md b/remotion-best-practices/remotion-markup/remotion-maps/techniques/maplibre/TECHNIQUE.md
new file mode 100644
index 0000000..94ef160
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/remotion-maps/techniques/maplibre/TECHNIQUE.md
@@ -0,0 +1,484 @@
+---
+name: maps-maplibre
+description: Make deterministic Remotion 2D map animations with MapLibre GL JS and Turf. Use when the user chooses MapLibre for animated routes, map markers, labels, and camera movement.
+metadata:
+ tags: map, map animation, maplibre, turf, geojson, route animation
+---
+
+Use MapLibre GL JS for rendering maps in Remotion. Use Turf for geospatial operations such as great-circle routes, distances, slicing lines, and positions along routes.
+
+## Core rules
+
+- Prefer `@turf/turf` for geospatial work. Do not hand-roll distance, great-circle, route slicing, or coordinate interpolation unless the user explicitly needs a custom non-geodesic effect.
+- Use GeoJSON sources and MapLibre layers for lines, markers, and labels. Avoid DOM `Marker` elements unless the user specifically asks for HTML markers.
+- Keep the live map camera static by default. Before moving it on every frame, read [moving-map stability](references/render-stability.md). Prefer a fixed map plate for satellite imagery, hillshade, or a modest 2D reframe.
+- Use a live per-frame camera only after rendering a short MP4 and checking for shimmer. This 2D technique does not provide genuine terrain, pitch, bearing, or banking.
+- Disable non-deterministic map behavior: `interactive: false`, `fadeDuration: 0`.
+- Drive animation from `useCurrentFrame()`; do not use CSS transitions or browser-timed animation.
+- Use `delayRender()` / `continueRender()` around map loading and per-frame map updates.
+- Set `preserveDrawingBuffer: true` and render WebGL with `bunx remotion ... --gl=angle`.
+- Before continuing the initial render, add sources/layers, apply the frame-0 camera with `jumpTo()`, then wait for `idle`.
+- Do not add a `mapInstance.remove()` cleanup function; it can interfere with Remotion's render lifecycle.
+- Use standard MapLibre style JSON URLs and layer/source APIs.
+- Do not install `@types/maplibre-gl`; MapLibre ships its own types.
+- Keep required provider attribution visible and verify the current terms of the chosen style and tile providers before rendering.
+- Record the source and effective date of custom or disputed geography.
+- Inspect rendered pixels, not only Studio playback, at every required aspect ratio.
+
+Coordinates in MapLibre, Turf, and GeoJSON are `[longitude, latitude]`.
+
+```ts
+const zurich: [number, number] = [8.5417, 47.3769];
+const newYork: [number, number] = [-74.006, 40.7128];
+```
+
+## Prerequisites
+
+Install MapLibre and Turf with the project's package manager.
+
+```bash
+npm i maplibre-gl @turf/turf
+```
+
+```bash
+bun i maplibre-gl @turf/turf
+```
+
+```bash
+yarn add maplibre-gl @turf/turf
+```
+
+```bash
+pnpm i maplibre-gl @turf/turf
+```
+
+Import the MapLibre CSS once in the component or an app-level stylesheet:
+
+```ts
+import 'maplibre-gl/dist/maplibre-gl.css';
+```
+
+## Basic map example
+
+```tsx
+import {useEffect, useRef, useState} from 'react';
+import {AbsoluteFill, useDelayRender, useVideoConfig} from 'remotion';
+import * as maplibregl from 'maplibre-gl';
+import 'maplibre-gl/dist/maplibre-gl.css';
+
+const zurich: [number, number] = [8.5417, 47.3769];
+
+export const MyComposition = () => {
+ const containerRef = useRef(null);
+ const {delayRender, continueRender} = useDelayRender();
+ const {width, height} = useVideoConfig();
+ const [loadingHandle] = useState(() => delayRender('Loading map'));
+
+ useEffect(() => {
+ if (!containerRef.current) {
+ return;
+ }
+
+ maplibregl.setWorkerUrl(
+ URL.createObjectURL(
+ new Blob(
+ [`import "https://unpkg.com/maplibre-gl@${maplibregl.getVersion()}/dist/maplibre-gl-worker.mjs";`],
+ {type: 'text/javascript'},
+ ),
+ ),
+ );
+
+ const mapInstance = new maplibregl.Map({
+ container: containerRef.current,
+ style: 'https://demotiles.maplibre.org/style.json',
+ center: zurich,
+ zoom: 7,
+ interactive: false,
+ attributionControl: false,
+ fadeDuration: 0,
+ canvasContextAttributes: {
+ preserveDrawingBuffer: true,
+ },
+ });
+
+ mapInstance.on('load', () => {
+ mapInstance.jumpTo({center: zurich, zoom: 7});
+ mapInstance.once('idle', () => {
+ continueRender(loadingHandle);
+ });
+ });
+ }, [continueRender, loadingHandle]);
+
+ return (
+
+
+
+ );
+};
+```
+
+Animated examples should keep the loaded map in React state and skip per-frame updates until that state is set.
+
+## Animated flight route example
+
+This example shows the recommended pattern for route animations:
+
+- Turf creates the route and markers.
+- Turf slices the route for line reveal animation.
+- The camera has a separate route from the target route.
+- MapLibre's `calculateCameraOptionsFromTo()` is used for camera movement.
+- Frame 0 is prepared before `continueRender()`.
+
+```tsx
+import * as turf from '@turf/turf';
+import {useEffect, useRef, useState} from 'react';
+import {
+ AbsoluteFill,
+ Easing,
+ interpolate,
+ useCurrentFrame,
+ useDelayRender,
+ useVideoConfig,
+} from 'remotion';
+import * as maplibregl from 'maplibre-gl';
+import {type GeoJSONSource, type Map} from 'maplibre-gl';
+import 'maplibre-gl/dist/maplibre-gl.css';
+
+const zurich: [number, number] = [8.5417, 47.3769];
+const newYork: [number, number] = [-74.006, 40.7128];
+
+const greatCircleLine = (from: [number, number], to: [number, number]) => {
+ const route = turf.greatCircle(from, to, {npoints: 100});
+
+ if (route.geometry.type === 'LineString') {
+ return turf.lineString(route.geometry.coordinates);
+ }
+
+ // Great-circle routes crossing the antimeridian can become MultiLineString.
+ // Keep the example valid by choosing the longest segment.
+ const longestSegment = route.geometry.coordinates.reduce((longest, segment) => {
+ return segment.length > longest.length ? segment : longest;
+ });
+
+ return turf.lineString(longestSegment);
+};
+
+const targetRoute = greatCircleLine(zurich, newYork);
+const targetRouteDistance = turf.length(targetRoute);
+
+const cameraRoute = greatCircleLine(zurich, newYork);
+const cameraRouteDistance = turf.length(cameraRoute);
+
+const cityMarkers = turf.featureCollection([
+ turf.point(zurich, {name: 'Zurich'}),
+ turf.point(newYork, {name: 'New York'}),
+]);
+
+const clampProgress = (progress: number) => Math.min(1, Math.max(0, progress));
+
+const distanceAlong = (totalDistance: number, progress: number) => {
+ // Keep the route non-empty at progress 0; Turf can error on zero-length slices.
+ return Math.max(0.001, totalDistance * clampProgress(progress));
+};
+
+const getPartialTargetRoute = (progress: number) => {
+ return turf.lineSliceAlong(
+ targetRoute,
+ 0,
+ distanceAlong(targetRouteDistance, progress),
+ );
+};
+
+const getCameraOptions = (
+ map: Map,
+ progress: number,
+ cameraAltitudeMeters: number,
+ cameraLatitudeOffset: number,
+) => {
+ const target = turf.along(
+ targetRoute,
+ distanceAlong(targetRouteDistance, progress),
+ ).geometry.coordinates;
+ const camera = turf.along(
+ cameraRoute,
+ distanceAlong(cameraRouteDistance, progress),
+ ).geometry.coordinates;
+
+ return map.calculateCameraOptionsFromTo(
+ new maplibregl.LngLat(camera[0], camera[1] - cameraLatitudeOffset),
+ cameraAltitudeMeters,
+ new maplibregl.LngLat(target[0], target[1]),
+ );
+};
+
+export const MyComposition = () => {
+ const containerRef = useRef(null);
+ const frame = useCurrentFrame();
+ const {delayRender, continueRender} = useDelayRender();
+ const {durationInFrames, height, width} = useVideoConfig();
+ const [map, setMap] = useState(null);
+ const [loadingHandle] = useState(() => delayRender('Loading MapLibre map'));
+
+ useEffect(() => {
+ if (!containerRef.current) {
+ return;
+ }
+
+ maplibregl.setWorkerUrl(
+ URL.createObjectURL(
+ new Blob(
+ [`import "https://unpkg.com/maplibre-gl@${maplibregl.getVersion()}/dist/maplibre-gl-worker.mjs";`],
+ {type: 'text/javascript'},
+ ),
+ ),
+ );
+
+ const mapInstance = new maplibregl.Map({
+ container: containerRef.current,
+ style: 'https://demotiles.maplibre.org/style.json',
+ center: zurich,
+ zoom: 7,
+ interactive: false,
+ attributionControl: false,
+ fadeDuration: 0,
+ canvasContextAttributes: {
+ preserveDrawingBuffer: true,
+ },
+ });
+
+ mapInstance.on('load', () => {
+ mapInstance.addSource('trace', {
+ type: 'geojson',
+ data: getPartialTargetRoute(0),
+ });
+
+ mapInstance.addLayer({
+ id: 'trace-line',
+ type: 'line',
+ source: 'trace',
+ layout: {
+ 'line-cap': 'round',
+ 'line-join': 'round',
+ },
+ paint: {
+ 'line-color': '#111111',
+ 'line-width': 7,
+ },
+ });
+
+ mapInstance.addSource('city-markers', {
+ type: 'geojson',
+ data: cityMarkers,
+ });
+
+ mapInstance.addLayer({
+ id: 'city-marker-dots',
+ type: 'circle',
+ source: 'city-markers',
+ paint: {
+ 'circle-color': '#f03b20',
+ 'circle-radius': 12,
+ 'circle-stroke-color': '#ffffff',
+ 'circle-stroke-width': 4,
+ },
+ });
+
+ mapInstance.addLayer({
+ id: 'city-marker-labels',
+ type: 'symbol',
+ source: 'city-markers',
+ layout: {
+ 'text-allow-overlap': true,
+ 'text-anchor': 'top',
+ 'text-field': ['get', 'name'],
+ 'text-offset': [0, 0.9],
+ 'text-size': 28,
+ },
+ paint: {
+ 'text-color': '#111111',
+ 'text-halo-color': '#ffffff',
+ 'text-halo-width': 3,
+ },
+ });
+
+ mapInstance.jumpTo(getCameraOptions(mapInstance, 0, 180000, 1.1));
+ mapInstance.once('idle', () => {
+ setMap(mapInstance);
+ continueRender(loadingHandle);
+ });
+ });
+ }, [continueRender, loadingHandle]);
+
+ useEffect(() => {
+ if (!map) {
+ return;
+ }
+
+ const handle = delayRender('Rendering MapLibre frame');
+ const timelineProgress = interpolate(frame, [0, durationInFrames - 1], [0, 1], {
+ extrapolateLeft: 'clamp',
+ extrapolateRight: 'clamp',
+ });
+ const travelProgress = interpolate(timelineProgress, [0.2, 0.82], [0, 1], {
+ extrapolateLeft: 'clamp',
+ extrapolateRight: 'clamp',
+ easing: Easing.bezier(0.645, 0.045, 0.355, 1),
+ });
+ const cameraAltitudeMeters = interpolate(
+ timelineProgress,
+ [0, 0.28, 0.74, 1],
+ [180000, 2200000, 2200000, 180000],
+ {
+ extrapolateLeft: 'clamp',
+ extrapolateRight: 'clamp',
+ easing: Easing.bezier(0.645, 0.045, 0.355, 1),
+ },
+ );
+ const cameraLatitudeOffset = interpolate(
+ timelineProgress,
+ [0, 0.28, 0.74, 1],
+ [1.1, 8, 8, 1.1],
+ {
+ extrapolateLeft: 'clamp',
+ extrapolateRight: 'clamp',
+ easing: Easing.bezier(0.645, 0.045, 0.355, 1),
+ },
+ );
+ const trace = map.getSource('trace') as GeoJSONSource | undefined;
+
+ trace?.setData(getPartialTargetRoute(travelProgress));
+ map.jumpTo(
+ getCameraOptions(
+ map,
+ travelProgress,
+ cameraAltitudeMeters,
+ cameraLatitudeOffset,
+ ),
+ );
+
+ map.once('idle', () => continueRender(handle));
+ // Force an idle event even if the camera parameters are unchanged from the previous frame.
+ map.triggerRepaint();
+ }, [continueRender, delayRender, durationInFrames, frame, map]);
+
+ return (
+
+
+
+ );
+};
+```
+
+## Camera guidance
+
+Use MapLibre's camera helper for camera movement:
+
+```ts
+map.calculateCameraOptionsFromTo(cameraLngLat, cameraAltitudeMeters, targetLngLat);
+```
+
+A good pattern is to keep two concepts separate:
+
+- `targetRoute`: where the animated line is and where the camera looks.
+- `cameraRoute`: where the camera moves.
+
+Then use Turf to read positions from both routes for the same progress value:
+
+```ts
+const target = turf.along(targetRoute, targetDistance * progress).geometry.coordinates;
+const camera = turf.along(cameraRoute, cameraDistance * progress).geometry.coordinates;
+
+map.jumpTo(
+ map.calculateCameraOptionsFromTo(
+ new maplibregl.LngLat(camera[0], camera[1]),
+ cameraAltitudeMeters,
+ new maplibregl.LngLat(target[0], target[1]),
+ ),
+);
+```
+
+For zoom-out / travel / zoom-in animations, animate travel progress separately from camera altitude. Camera altitude is measured in meters. This avoids heavy custom camera math.
+
+## Lines
+
+Use GeoJSON sources for lines. Unless the user asks, do not add glow effects or extra decorative points.
+
+For geodesic flight routes, use Turf:
+
+```ts
+const line = greatCircleLine(start, end);
+const distance = turf.length(line);
+const partialLine = turf.lineSliceAlong(
+ line,
+ 0,
+ // Keep the route non-empty at progress 0.
+ Math.max(0.001, distance * progress),
+);
+```
+
+For a visually straight line on the map, use a simple GeoJSON `LineString` between the two points instead of `greatCircle()`.
+
+## Markers and labels
+
+Use map-native GeoJSON layers for markers and labels:
+
+```tsx
+mapInstance.addSource('markers', {
+ type: 'geojson',
+ data: turf.featureCollection([
+ turf.point([-118.2437, 34.0522], {name: 'Los Angeles'}),
+ ]),
+});
+
+mapInstance.addLayer({
+ id: 'marker-dots',
+ type: 'circle',
+ source: 'markers',
+ paint: {
+ 'circle-color': '#f03b20',
+ 'circle-radius': 12,
+ 'circle-stroke-color': '#ffffff',
+ 'circle-stroke-width': 4,
+ },
+});
+
+mapInstance.addLayer({
+ id: 'marker-labels',
+ type: 'symbol',
+ source: 'markers',
+ layout: {
+ 'text-allow-overlap': true,
+ 'text-anchor': 'top',
+ 'text-field': ['get', 'name'],
+ 'text-offset': [0, 0.9],
+ 'text-size': 28,
+ },
+ paint: {
+ 'text-color': '#111111',
+ 'text-halo-color': '#ffffff',
+ 'text-halo-width': 3,
+ },
+});
+```
+
+Make marker sizes and label font sizes large enough for the composition resolution.
+
+## Styles
+
+Default to the stock MapLibre demo style:
+
+```ts
+style: 'https://demotiles.maplibre.org/style.json'
+```
+
+If the user requests another style, use any valid MapLibre style JSON URL.
+
+## Rendering
+
+For WebGL map renders, prefer single concurrency and ANGLE:
+
+```bash
+bunx remotion render [composition-id] out/video.mp4 --gl=angle --concurrency=1
+```
+
+Use the equivalent package runner for the project. In npm projects, use `npx`; in Bun projects, use `bunx`.
diff --git a/remotion-best-practices/remotion-markup/remotion-maps/techniques/maplibre/references/render-stability.md b/remotion-best-practices/remotion-markup/remotion-maps/techniques/maplibre/references/render-stability.md
new file mode 100644
index 0000000..fc40033
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/remotion-maps/techniques/maplibre/references/render-stability.md
@@ -0,0 +1,64 @@
+# Moving Map Render Stability
+
+Read this reference before building a moving 2D MapTiler scene or diagnosing a wavering Remotion render.
+
+## Symptom and cause
+
+If basemap detail shimmers or jitters during a pan/zoom, the likely cause is per-frame `map.jumpTo()`.
+Headless MapTiler capture can resample both vector hillshade and satellite imagery differently frame to
+frame. Tile retries, easing changes, and label changes do not solve that renderer effect.
+
+## Required pattern: fixed map plate
+
+For any 2D pan/zoom:
+
+1. Render the MapTiler canvas once at the largest required zoom in an oversized container. Size it from the camera route and keep each dimension below the browser's reliable WebGL render-buffer limit (commonly 4096 px). Do **not** blindly use 3×: a 1920×1080 composition becomes 5760 px wide and Chromium may silently downsample it, causing visible pixelation during the CSS zoom.
+2. Keep the map's camera static.
+3. For each frame, calculate the approved target centre/zoom, then move the canvas with CSS `translate` + `scale`.
+4. Apply the same transform to every projected HTML overlay.
+5. Continue to animate GeoJSON data and paint properties imperatively; only the renderer camera is frozen.
+
+Keep pitch and bearing constant. Use a 3D engine such as Cesium for genuine changing pitch/bearing or a terrain flythrough.
+
+```ts
+const baseZoom = Math.max(start.zoom, end.zoom);
+const map = new maptilersdk.Map({
+ container,
+ style,
+ center: end.center,
+ zoom: baseZoom,
+ pitch: end.pitch ?? 0,
+ bearing: end.bearing ?? 0,
+ interactive: false,
+ fadeDuration: 0,
+ canvasContextAttributes: {preserveDrawingBuffer: true},
+});
+
+// Per Remotion frame. `camera` is the approved centre/zoom interpolation.
+const projected = map.project(camera.center);
+const scale = 2 ** (camera.zoom - baseZoom);
+const plate = {
+ transform: `translate(${width / 2 - projected.x * scale}px, ${height / 2 - projected.y * scale}px) scale(${scale})`,
+ transformOrigin: "0 0",
+};
+
+// Convert label projection with exactly the same plate transform.
+const labelX = labelPoint.x * scale + width / 2 - projected.x * scale;
+const labelY = labelPoint.y * scale + height / 2 - projected.y * scale;
+```
+
+### Plate sizing and sharpness
+
+- Render at the maximum zoom reached by **any** camera waypoint, including intermediate or hold cameras. The CSS scale should never exceed `1`; otherwise the plate is being enlarged.
+- Centre the frozen map on the midpoint of the camera route's geographic extent, not automatically on the final camera. This minimizes required overscan.
+- Keep the largest canvas dimension at or below 4096 px unless the actual render environment has been tested with a larger `MAX_RENDERBUFFER_SIZE`.
+- For 1920×1080, a 3840×2160 plate is a safe default. For 1080×1920, use approximately 2700×3840 when the route needs extra horizontal pan room.
+- If the route cannot fit within that plate at the required zoom, split the shot into two fixed plates with a deliberate editorial transition. Do not trade sharpness for one enormous canvas.
+- Distinguish failure modes: repeating shimmer means the live renderer is moving; steadily soft tiles during a CSS push means the fixed plate is underspecified, internally downsampled, or being scaled above `1`.
+
+## Verification
+
+- Render a short MP4, not only a Studio preview.
+- Inspect static terrain texture and satellite detail while the camera moves.
+- If any underlying map detail wavers, use the fixed map plate. Do not approve it as a minor preview artefact.
+- Render WebGL with `--gl=angle`, `preserveDrawingBuffer:true`, and conservative concurrency (`1`) while validating.
diff --git a/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/TECHNIQUE.md b/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/TECHNIQUE.md
new file mode 100644
index 0000000..d358791
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/TECHNIQUE.md
@@ -0,0 +1,80 @@
+# MapTiler maps in Remotion
+
+MapTiler is a good solution for map animations where geographics features should be drawn as annotations on top of the map: Country borders, rivers, labels for POIs.
+
+## MapTiler SDK (`@maptiler/sdk`)
+
+Draw the basemap plus MapTiler Planet vector layers and custom GeoJSON into a WebGL canvas. Default styled-vector starting point: `MapStyle.BASIC`; satellite is an equally valid choice.
+
+## Remotion
+
+Imperatively update `setData`/`setPaintProperty`.
+
+Use `jumpTo` only for a static shot, or a fixed map plate for any pan/zoom.
+Gate with [`delayRender`](https://www.remotion.dev/docs/delay-render.md) until `map.once('idle')`.
+
+Use `preserveDrawingBuffer:true`.
+
+Render labels as positioned [``](https://www.remotion.dev/docs/interactive.md) elements.
+
+Env `REMOTION_MAPTILER_KEY` (unrestricted). Init the map once (ref guard); update imperatively per frame.
+
+When constructing MapLibre/MapTiler layer objects, omit optional properties that are absent.
+In particular, use `...(layer.filter ? {filter: layer.filter} : {})`; do not pass `filter: undefined`. An undefined filter can suppress the layer while separately created halo or border layers continue rendering, producing missing country fills and dark marker halos with no coloured cores.
+
+Drive animation from `useCurrentFrame()` rather than CSS transitions or browser timers.
+
+## Choose the source for each map element
+
+Do not begin by manufacturing GeoJSON. First check whether MapTiler Planet already exposes the element as filtered vector data.
+
+### MapTiler vector
+
+Use it when the feature exists in a provider `source-layer`, its attributes support an exact filter, and provider geometry is editorially acceptable.
+
+### Hybrid
+
+Use it when ordinary geographic context can come from MapTiler while the claim depends on custom
+evidence.
+
+Animate each layer according to its source and meaning.
+
+MapTiler vector features remain split across tiles. Do not use them for a semantic start-to-end line draw; extract, verify, order, and bake that element to GeoJSON first. Read **`references/map-data-sources.md`** and reuse **`assets/MapTilerVectorElement.ts`** for provider-layer setup and per-frame paint updates.
+
+## Motion stability
+
+**Do not call `map.jumpTo()` on every Remotion frame when the camera moves.** In headless capture it can make both MapTiler hillshade **and satellite imagery** shimmer/jitter, even when the source tiles load correctly. This is renderer resampling, not a data, network, or label problem.
+
+For the implementation, read **`references/render-stability.md`** before building or debugging any moving map. It contains the fixed-map-plate recipe, diagnostics, and render checks.
+
+- Use the live MapTiler camera only for a static shot.
+- Keep pitch and bearing constant for a fixed plate. This technique does not implement a genuine changing 3D camera.
+- Verify the moving preview and a short rendered MP4 before approving a beat. If any basemap detail wavers, switch to the fixed-plate pattern; do not try to solve it with tile retries or camera easing.
+
+## Drawing rivers
+
+Use `turf.lineSliceAlong(line, 0, lineKm*reveal)` to draw rivers.
+
+## Source selection
+
+Use MapTiler vector layers for suitable provider features and custom GeoJSON for story-specific or ordered geometry. If the beat needs country-entry triggers or a progressive line draw, run `scripts/prep-geo.mjs` to bake `country-meta.json`, `borders.geojson`, and the ordered line. Details → `references/map-data-sources.md` and `references/map-geo-prep.md`.
+
+## Keep it minmal
+
+Strip clutter on `load`: remove `symbol` layers (place labels) and `/other border/i` (admin-1 inner borders); hide the logo via CSS. Keep country + disputed borders.
+
+## Files
+
+Use as reference:
+
+- `assets/RiverReveal.tsx` — the main component.
+- `assets/MapTilerVectorElement.ts` — filtered MapTiler Planet elements.
+- `assets/CountryLabel.tsx` — reusable example label.
+- `assets/tokens.ts` — example palette and durations.
+- `assets/example-Root.tsx` — minimal composition scaffold.
+- `assets/sample-data/` — example route and generated country metadata.
+- `scripts/prep-geo.mjs` — geo pipeline.
+- `references/map-explainer-architecture.md` — timing model and implementation.
+- `references/map-data-sources.md` — provider vector versus custom GeoJSON selection.
+- `references/map-geo-prep.md` — basemap stripping and geo preparation.
+- `references/render-stability.md` — camera motion and stable headless renders.
diff --git a/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/assets/CountryLabel.tsx b/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/assets/CountryLabel.tsx
new file mode 100644
index 0000000..3e4b887
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/assets/CountryLabel.tsx
@@ -0,0 +1,70 @@
+import React from 'react';
+import {Easing, interpolate} from 'remotion';
+
+// Reusable country label. Supply typography and final values from the consuming project; the CSS custom
+// properties below provide neutral fallbacks. Positioned by its centre (x,y in screen px).
+export const CountryLabel: React.FC<{
+ name: string;
+ color: string;
+ reveal: number;
+ x: number;
+ y: number;
+}> = ({name, color, reveal, x, y}) => {
+ const e = interpolate(reveal, [0, 1], [0, 1], {
+ extrapolateLeft: 'clamp',
+ extrapolateRight: 'clamp',
+ easing: Easing.bezier(0.3333333333333333, 1, 0.6666666666666666, 1),
+ });
+ return (
+
+
+ {/* accent rule — draws out from the centre in the country's colour */}
+
+
+ {name}
+
+
+
+ );
+};
diff --git a/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/assets/MapTilerVectorElement.ts b/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/assets/MapTilerVectorElement.ts
new file mode 100644
index 0000000..9d91691
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/assets/MapTilerVectorElement.ts
@@ -0,0 +1,80 @@
+// Surface an existing MapTiler Planet feature without maintaining duplicate GeoJSON.
+// Paint animation is deterministic; geometry slicing is not. For a source-to-end line draw,
+// bake the selected feature to ordered GeoJSON and use RiverReveal.tsx instead.
+
+type VectorLayerType = 'fill' | 'line' | 'circle' | 'symbol';
+
+export type MapTilerVectorElement = {
+ id: string;
+ sourceLayer: string;
+ type: VectorLayerType;
+ filter?: unknown[];
+ minzoom?: number;
+ maxzoom?: number;
+ layout?: Record;
+ paint: Record;
+};
+
+const SOURCE_ID = 'maptiler-planet';
+
+export const addMapTilerVectorElement = (
+ map: any,
+ apiKey: string,
+ element: MapTilerVectorElement,
+ beforeId?: string,
+) => {
+ if (!map.getSource(SOURCE_ID)) {
+ map.addSource(SOURCE_ID, {
+ type: 'vector',
+ url: `https://api.maptiler.com/tiles/v3/tiles.json?key=${apiKey}`,
+ });
+ }
+
+ if (map.getLayer(element.id)) return;
+
+ map.addLayer(
+ {
+ id: element.id,
+ type: element.type,
+ source: SOURCE_ID,
+ 'source-layer': element.sourceLayer,
+ ...(element.filter ? {filter: element.filter} : {}),
+ ...(element.minzoom === undefined ? {} : {minzoom: element.minzoom}),
+ ...(element.maxzoom === undefined ? {} : {maxzoom: element.maxzoom}),
+ ...(element.layout ? {layout: element.layout} : {}),
+ paint: element.paint,
+ },
+ beforeId,
+ );
+};
+
+export const setVectorElementPaint = (
+ map: any,
+ layerId: string,
+ paint: Record,
+) => {
+ for (const [property, value] of Object.entries(paint)) {
+ map.setPaintProperty(layerId, property, value);
+ }
+};
+
+// Example:
+//
+// addMapTilerVectorElement(map, process.env.REMOTION_MAPTILER_KEY!, {
+// id: "story-river",
+// sourceLayer: "waterway",
+// type: "line",
+// filter: [
+// "all",
+// ["==", ["get", "class"], "river"],
+// ["==", ["coalesce", ["get", "name_en"], ["get", "name"]], "Yarlung Tsangpo"],
+// ],
+// layout: {"line-cap": "round", "line-join": "round"},
+// paint: {"line-color": "#E8F7FF", "line-width": 3, "line-opacity": 0},
+// });
+//
+// Per Remotion frame:
+// setVectorElementPaint(map, "story-river", {
+// "line-opacity": reveal,
+// "line-width": 2 + reveal * 2,
+// });
diff --git a/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/assets/RiverReveal.tsx b/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/assets/RiverReveal.tsx
new file mode 100644
index 0000000..a0ade54
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/assets/RiverReveal.tsx
@@ -0,0 +1,363 @@
+import * as maptilersdk from '@maptiler/sdk';
+import * as turf from '@turf/turf';
+import React, {useEffect, useRef, useState} from 'react';
+import '@maptiler/sdk/dist/maptiler-sdk.css';
+import {
+ AbsoluteFill,
+ Easing,
+ continueRender,
+ delayRender,
+ interpolate,
+ useCurrentFrame,
+ useVideoConfig,
+} from 'remotion';
+import {CountryLabel} from './CountryLabel';
+import countryMeta from './sample-data/country-meta.json';
+import flowCoords from './sample-data/yarlung-flow.json';
+import {COLORS, COUNTRY, COUNTRY_DARK, FILL_OPACITY} from './tokens';
+
+// Sample route reveal. Replace the imported sample geometry, names, timing, and visual tokens in the
+// consuming production. The renderer stays static; approved centre/zoom motion is a CSS plate transform.
+
+maptilersdk.config.apiKey = process.env.REMOTION_MAPTILER_KEY as string;
+
+const line = turf.lineString(flowCoords as [number, number][]);
+const lineKm = turf.length(line);
+
+const START = {
+ center: [89.6, 27.7] as [number, number],
+ zoom: 4.75,
+ pitch: 0,
+ bearing: 0,
+};
+const END = {
+ center: [90.2, 27.0] as [number, number],
+ zoom: 5.05,
+ pitch: 0,
+ bearing: 0,
+};
+const lerp = (a: number, b: number, t: number) => a + (b - a) * t;
+const clamp01 = (v: number) => Math.max(0, Math.min(1, v));
+
+const ORDER = ['china', 'india', 'bangladesh'] as const;
+type Country = (typeof ORDER)[number];
+const META = countryMeta as Record<
+ Country,
+ {stop: number; anchor: [number, number]; border: [number, number][][]}
+>;
+const countryPolygons = {
+ type: 'FeatureCollection' as const,
+ features: ORDER.map((country) => ({
+ type: 'Feature' as const,
+ properties: {country},
+ geometry: {
+ type: 'MultiPolygon' as const,
+ coordinates: META[country].border.map((ring) => [ring]),
+ },
+ })),
+};
+
+// Pre-build each country's border as ordered segments with cumulative lengths (for the multi-segment draw).
+const DRAW = Object.fromEntries(
+ ORDER.map((c) => {
+ const segLines = META[c].border.map((s) => turf.lineString(s));
+ const segLen = segLines.map((l) => turf.length(l));
+ const cum: number[] = [];
+ let acc = 0;
+ for (const L of segLen) {
+ cum.push(acc);
+ acc += L;
+ }
+ return [c, {segLines, segLen, cum, total: acc}];
+ }),
+) as Record<
+ Country,
+ {segLines: any[]; segLen: number[]; cum: number[]; total: number}
+>;
+
+// Reveal the portion of the border between fromKm and toKm as a MultiLineString (no joins across gaps).
+const sliceBorder = (
+ d: (typeof DRAW)[Country],
+ fromKm: number,
+ toKm: number,
+) => {
+ const out: number[][][] = [];
+ for (let i = 0; i < d.segLines.length; i++) {
+ const start = d.cum[i],
+ end = start + d.segLen[i];
+ const a = Math.max(fromKm, start),
+ b = Math.min(toKm, end);
+ if (b - a <= 0.0008) continue;
+ out.push(
+ turf.lineSliceAlong(d.segLines[i], a - start, b - start).geometry
+ .coordinates,
+ );
+ }
+ return {
+ type: 'Feature' as const,
+ properties: {},
+ geometry: {type: 'MultiLineString' as const, coordinates: out},
+ };
+};
+const EMPTY = {
+ type: 'Feature' as const,
+ properties: {},
+ geometry: {type: 'MultiLineString' as const, coordinates: [] as number[][][]},
+};
+
+// --- Timing (seconds). River draws over [RIVER_START, RIVER_END]; each country triggers when the river
+// reaches it (stop · span), then runs border → fill → label. Beat length is derived from these. ---
+const RIVER_START = 0.3;
+const RIVER_END = 8.0;
+const BORDER_S = 2.5;
+const FILL_S = 1.0;
+const LABEL_S = 0.7;
+const trigger = (c: Country) =>
+ RIVER_START + META[c].stop * (RIVER_END - RIVER_START);
+
+export const RiverReveal: React.FC = () => {
+ const ref = useRef(null);
+ const started = useRef(false);
+ const frame = useCurrentFrame();
+ const {fps, durationInFrames, width, height} = useVideoConfig();
+ const [map, setMap] = useState(null);
+ const [labels, setLabels] = useState<
+ Record
+ >({});
+ const [plate, setPlate] = useState({x: 0, y: 0, scale: 1});
+ const [handle] = useState(() => delayRender('maptiler init A'));
+
+ useEffect(() => {
+ if (!ref.current || started.current) return;
+ started.current = true;
+ const m = new maptilersdk.Map({
+ container: ref.current,
+ style: maptilersdk.MapStyle.BASIC,
+ center: END.center,
+ zoom: Math.max(START.zoom, END.zoom),
+ pitch: END.pitch,
+ bearing: END.bearing,
+ interactive: false,
+ attributionControl: true,
+ navigationControl: false,
+ geolocateControl: false,
+ maptilerLogo: true,
+ fadeDuration: 0,
+ canvasContextAttributes: {preserveDrawingBuffer: true},
+ } as any);
+
+ m.on('load', () => {
+ // Strip basemap labels (symbols) AND the inner admin-1 borders ('Other border[ dash]',
+ // admin_level 3–10) to cut basemap clutter. Keep country + disputed borders.
+ for (const l of m.getStyle().layers as any[])
+ if (l.type === 'symbol' || /other border/i.test(l.id))
+ m.removeLayer(l.id);
+
+ m.addSource('countries', {type: 'geojson', data: countryPolygons});
+ for (const c of ORDER) {
+ m.addLayer({
+ id: `fill-${c}`,
+ type: 'fill',
+ source: 'countries',
+ filter: ['==', ['get', 'country'], c],
+ paint: {'fill-color': COUNTRY[c], 'fill-opacity': 0},
+ });
+ }
+ // Per country: just the border that draws on, settled to a darker shade of the country colour
+ // (the electricity now lives on the river, not the borders).
+ for (const c of ORDER) {
+ m.addSource(`trail-${c}`, {type: 'geojson', data: EMPTY});
+ m.addLayer({
+ id: `trail-${c}`,
+ type: 'line',
+ source: `trail-${c}`,
+ layout: {'line-cap': 'round', 'line-join': 'round'},
+ paint: {
+ 'line-color': COUNTRY_DARK[c],
+ 'line-width': 2,
+ 'line-opacity': 0.95,
+ },
+ });
+ }
+
+ const seed = turf.lineSliceAlong(
+ line,
+ 0,
+ Math.max(0.001, lineKm * 0.001),
+ );
+ m.addSource('river', {type: 'geojson', data: seed});
+ m.addSource('river-head', {type: 'geojson', data: seed});
+ // Electric water: soft blue glow → icy core → white-hot leading head with its own glow.
+ m.addLayer({
+ id: 'river-glow',
+ type: 'line',
+ source: 'river',
+ layout: {'line-cap': 'round', 'line-join': 'round'},
+ paint: {
+ 'line-color': '#49C6FF',
+ 'line-width': 11,
+ 'line-opacity': 0.32,
+ 'line-blur': 6,
+ },
+ });
+ m.addLayer({
+ id: 'river-line',
+ type: 'line',
+ source: 'river',
+ layout: {'line-cap': 'round', 'line-join': 'round'},
+ paint: {'line-color': COLORS.river, 'line-width': 3},
+ });
+ m.addLayer({
+ id: 'river-headglow',
+ type: 'line',
+ source: 'river-head',
+ layout: {'line-cap': 'round', 'line-join': 'round'},
+ paint: {
+ 'line-color': COLORS.riverHeadGlow,
+ 'line-width': 16,
+ 'line-opacity': 0,
+ 'line-blur': 9,
+ },
+ });
+ m.addLayer({
+ id: 'river-head',
+ type: 'line',
+ source: 'river-head',
+ layout: {'line-cap': 'round', 'line-join': 'round'},
+ paint: {
+ 'line-color': COLORS.riverHead,
+ 'line-width': 4.5,
+ 'line-opacity': 0,
+ },
+ });
+
+ m.once('idle', () => {
+ setMap(m);
+ continueRender(handle);
+ });
+ });
+ }, [handle]);
+
+ useEffect(() => {
+ if (!map) return;
+ const h = delayRender(`frame A ${frame}`);
+ const t = frame / fps; // seconds
+ const tt = interpolate(frame, [0, durationInFrames - 1], [0, 1], {
+ extrapolateLeft: 'clamp',
+ extrapolateRight: 'clamp',
+ });
+
+ // River draw
+ const reveal = interpolate(t, [RIVER_START, RIVER_END], [0, 1], {
+ extrapolateLeft: 'clamp',
+ extrapolateRight: 'clamp',
+ easing: Easing.bezier(0.645, 0.045, 0.355, 1),
+ });
+ const riverDrawnKm = lineKm * reveal;
+ (map.getSource('river') as any)?.setData(
+ turf.lineSliceAlong(line, 0, Math.max(0.001, riverDrawnKm)),
+ );
+ // Electric draw-head leading the river: white-hot core + glow, fading out once the river completes.
+ const riverHeadKm = lineKm * 0.03;
+ (map.getSource('river-head') as any)?.setData(
+ turf.lineSliceAlong(
+ line,
+ Math.max(0, riverDrawnKm - riverHeadKm),
+ Math.max(0.001, riverDrawnKm),
+ ),
+ );
+ let riverHeadFade = 0;
+ if (reveal > 0.002 && reveal < 0.999) riverHeadFade = 1;
+ else if (reveal >= 0.999)
+ riverHeadFade = 1 - clamp01((t - RIVER_END) / 0.5);
+ map.setPaintProperty(
+ 'river-headglow',
+ 'line-opacity',
+ 0.85 * riverHeadFade,
+ );
+ map.setPaintProperty('river-head', 'line-opacity', riverHeadFade);
+
+ const camera = {
+ center: [
+ lerp(START.center[0], END.center[0], tt),
+ lerp(START.center[1], END.center[1], tt),
+ ] as [number, number],
+ zoom: lerp(START.zoom, END.zoom, tt),
+ };
+ const cameraPoint = map.project(camera.center);
+ const plateScale = 2 ** (camera.zoom - Math.max(START.zoom, END.zoom));
+ const plateX = width / 2 - cameraPoint.x * plateScale;
+ const plateY = height / 2 - cameraPoint.y * plateScale;
+
+ const pos: Record = {};
+ for (const c of ORDER) {
+ const d = DRAW[c];
+ const lt = t - trigger(c); // local seconds since this country triggered
+
+ // 1) border draws on (constant duration), settling to a darker shade — no electric head
+ const bp = interpolate(clamp01(lt / BORDER_S), [0, 1], [0, 1], {
+ easing: Easing.bezier(0.645, 0.045, 0.355, 1),
+ });
+ (map.getSource(`trail-${c}`) as any)?.setData(
+ bp <= 0 ? EMPTY : sliceBorder(d, 0, d.total * bp),
+ );
+
+ // 2) fill blooms in (overshoot then settle) after the border completes
+ const fp = clamp01((lt - BORDER_S) / FILL_S);
+ const fo = interpolate(
+ fp,
+ [0, 0.6, 1],
+ [0, FILL_OPACITY * 1.25, FILL_OPACITY],
+ {
+ extrapolateLeft: 'clamp',
+ extrapolateRight: 'clamp',
+ easing: Easing.bezier(0.3333333333333333, 1, 0.6666666666666666, 1),
+ },
+ );
+ map.setPaintProperty(`fill-${c}`, 'fill-opacity', fp <= 0 ? 0 : fo);
+
+ // 3) label rises in after the fill
+ const lp = clamp01((lt - BORDER_S - FILL_S) / LABEL_S);
+ const p = map.project(META[c].anchor);
+ pos[c] = {
+ x: p.x * plateScale + plateX,
+ y: p.y * plateScale + plateY,
+ reveal: lp,
+ };
+ }
+ setLabels(pos);
+
+ setPlate({x: plateX, y: plateY, scale: plateScale});
+ map.once('idle', () => continueRender(h));
+ map.triggerRepaint();
+ }, [map, frame, fps, durationInFrames, width, height]);
+
+ return (
+
+
+
+ {ORDER.map((c) =>
+ labels[c] ? (
+
+ ) : null,
+ )}
+
+
+ );
+};
diff --git a/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/assets/example-Root.tsx b/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/assets/example-Root.tsx
new file mode 100644
index 0000000..4e25267
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/assets/example-Root.tsx
@@ -0,0 +1,22 @@
+// Minimal Remotion scaffold for the map explainer. In a Remotion project (`bunx create-video@latest`,
+// blank template), this is `src/Root.tsx`; `src/index.ts` is just `registerRoot(RemotionRoot)`.
+//
+// The Composition sets DURATION (the beat) and dimensions. The component reads durationInFrames / width /
+// height from useVideoConfig(). The beat must be long enough for the last country's full sequence after
+// the river reaches it. See references/map-explainer-architecture.md §2.
+// Render with: bunx remotion render src/index.ts MapExplainer out.mp4 --gl=angle --concurrency=1 --timeout=120000
+
+import React from 'react';
+import {Composition} from 'remotion';
+import {RiverReveal} from './RiverReveal'; // → src/components/RiverReveal.tsx in your project
+
+export const RemotionRoot: React.FC = () => (
+
+);
diff --git a/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/assets/sample-data/country-meta.json b/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/assets/sample-data/country-meta.json
new file mode 100644
index 0000000..59ed681
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/assets/sample-data/country-meta.json
@@ -0,0 +1,7535 @@
+{
+ "china": {
+ "stop": 0,
+ "anchor": [87.78260869565217, 30.663811291452628],
+ "border": [
+ [
+ [104, 22.607404598007214],
+ [103.99006555200009, 22.58534088100008],
+ [103.98556970200013, 22.57025136400007],
+ [103.98556970200013, 22.554541728000103],
+ [103.98737837800013, 22.540175680000104],
+ [103.9853629970001, 22.527153219000056],
+ [103.97399418100008, 22.515267639000044],
+ [103.95952478000004, 22.507102763000105],
+ [103.95094649200013, 22.516456197000068],
+ [103.94071455900007, 22.52467275],
+ [103.92541833500007, 22.528238424000065],
+ [103.91704675300014, 22.533251038000017],
+ [103.90278405800007, 22.55857249000009],
+ [103.89461918200004, 22.56921783500009],
+ [103.88867639200004, 22.571749980000064],
+ [103.87265669800007, 22.573610332000086],
+ [103.86681726100005, 22.575419007000065],
+ [103.84418298400004, 22.599293519000057],
+ [103.8363281660001, 22.60275583900001],
+ [103.82966190600007, 22.609163717000044],
+ [103.80966312700014, 22.638722636000082],
+ [103.80532230700004, 22.647404277000035],
+ [103.79421187400004, 22.659444886000088],
+ [103.72641239500012, 22.716288961000046],
+ [103.65850956200006, 22.79320933000004],
+ [103.64693404200005, 22.799048768000134],
+ [103.60383589700012, 22.776026917000067],
+ [103.59003829000005, 22.76801707],
+ [103.58254520700012, 22.755795593000087],
+ [103.57680912300009, 22.740835267000122],
+ [103.56833418800005, 22.724970602000027],
+ [103.5471468500001, 22.70068267900011],
+ [103.54456302900013, 22.691019185000087],
+ [103.54992302200003, 22.64866216800003],
+ [103.55091923000003, 22.640789694000134],
+ [103.54621667500004, 22.631436259000097],
+ [103.5142806400001, 22.587356262000114],
+ [103.5036352950001, 22.581413473000012],
+ [103.48544519000006, 22.584100647000028],
+ [103.47314620000003, 22.59164540600007],
+ [103.44751469000005, 22.61825876900012],
+ [103.41092777500012, 22.674741109000067],
+ [103.40431319200013, 22.68879709900007],
+ [103.4023494870001, 22.706522115],
+ [103.40400313400005, 22.723885397000018],
+ [103.4017293710001, 22.737838033000102],
+ [103.38751835200003, 22.745176087000104],
+ [103.37894006300013, 22.756777446000044],
+ [103.36875980700006, 22.767138570000057],
+ [103.35708093300008, 22.776026917000067],
+ [103.34416182500007, 22.782977397000067],
+ [103.32157922400012, 22.790392965000095],
+ [103.30964196800011, 22.78793833400003],
+ [103.2699544680001, 22.723265279000046],
+ [103.25248783400008, 22.67856516500011],
+ [103.2448913980001, 22.66869496700012],
+ [103.22840661600003, 22.655827536000018],
+ [103.16846195500011, 22.626475321000058],
+ [103.14174524000009, 22.60704498300008],
+ [103.13001469000005, 22.57795115100005],
+ [103.13259851100008, 22.569786276000045],
+ [103.14469079600008, 22.55578196300003],
+ [103.14572432500006, 22.54555002900007],
+ [103.14200362100013, 22.537798564000056],
+ [103.09125736500005, 22.50508738200007],
+ [103.07441084800007, 22.49816274000007],
+ [103.05828780100006, 22.495475566000053],
+ [103.04418013600008, 22.486483867000018],
+ [103.04485192900006, 22.4728929650001],
+ [103.04908939600011, 22.45682159400006],
+ [103.04505863500009, 22.440543518000126],
+ [103.02903894100007, 22.43015655500001],
+ [103.00893680900009, 22.43031158500004],
+ [102.9890930580001, 22.437597962000027],
+ [102.95653690600005, 22.45971547400005],
+ [102.9195882570001, 22.469223938000127],
+ [102.90258671100008, 22.47723378500008],
+ [102.89369836400004, 22.487362366000056],
+ [102.85928186100011, 22.550510966],
+ [102.85313236500014, 22.568442689000065],
+ [102.8451741940001, 22.585237529000054],
+ [102.83184167500008, 22.599706930000067],
+ [102.81339318800013, 22.608698629000017],
+ [102.77122522000008, 22.617793681000094],
+ [102.75189823400007, 22.625286764000023],
+ [102.69272871900006, 22.6705036420001],
+ [102.67216149900008, 22.67835845900005],
+ [102.63226729400003, 22.684973043000056],
+ [102.61247522000008, 22.691587626000043],
+ [102.60611901900012, 22.696703593000038],
+ [102.59118453000008, 22.712568258000132],
+ [102.58668868000007, 22.716082256000092],
+ [102.5761983650001, 22.713808493000087],
+ [102.57035892700003, 22.70709055600004],
+ [102.56575972500008, 22.699545797],
+ [102.55836999500008, 22.694946595000047],
+ [102.53578739400012, 22.695825094],
+ [102.52891442900005, 22.707814026000037],
+ [102.52633060700003, 22.72595245400008],
+ [102.51578861500008, 22.745176087000104],
+ [102.49434289600009, 22.76039479600003],
+ [102.46778121000006, 22.76858551000005],
+ [102.44271814000012, 22.765174866000038],
+ [102.42561324100006, 22.745305278000032],
+ [102.42561324100006, 22.745176087000104],
+ [102.41522627800009, 22.7098294070001],
+ [102.4072681070001, 22.693447978000037],
+ [102.39496911700007, 22.680528870000032],
+ [102.38463383000004, 22.677738343000087],
+ [102.37316166200003, 22.67835845900005],
+ [102.36272302300011, 22.677428283],
+ [102.35585005700005, 22.669935201000058],
+ [102.35626346800007, 22.658721415000016],
+ [102.3633431400001, 22.65143503800003],
+ [102.37269657400003, 22.64575063100007],
+ [102.37858768800004, 22.639084371000067],
+ [102.38246342000008, 22.63081614200003],
+ [102.38432377100008, 22.628852437000077],
+ [102.37688236500003, 22.615571595000077],
+ [102.25254886900007, 22.495475566000053],
+ [102.24252364200004, 22.477182109000083],
+ [102.23663252800003, 22.443437398000114],
+ [102.23130985600011, 22.426332500000072],
+ [102.2180290120001, 22.410674540000016],
+ [102.20355961100006, 22.41248321500011],
+ [102.18655806500004, 22.421061503000132],
+ [102.16454390500007, 22.425505676000043],
+ [102.14702559400007, 22.421061503000132],
+ [102.12883549000003, 22.410881246000073],
+ [102.11865523300008, 22.39754872600004],
+ [102.10734543400008, 22.39754872600004],
+ [102.10062015800008, 22.405765280000068],
+ [102.0999483650001, 22.414860331000042],
+ [102.09534916200005, 22.423128561000098],
+ [102.08553064000006, 22.429123027000017],
+ [102.07591882300005, 22.432430319000034],
+ [102.01457889800008, 22.446072896000132],
+ [101.9949935300001, 22.4474164840001],
+ [101.97421960500003, 22.445142720000078],
+ [101.95287723800004, 22.436874491000125],
+ [101.90936568200004, 22.435892639000073],
+ [101.89164066600011, 22.42969146700007],
+ [101.88151208500005, 22.412173157000026],
+ [101.87727461800011, 22.39186431900002],
+ [101.86792118300008, 22.378841858000058],
+ [101.84259973100006, 22.38333770800007],
+ [101.81779504400004, 22.406333720000035],
+ [101.7848771570001, 22.472221171000044],
+ [101.75505985600012, 22.49552724300007],
+ [101.7506156820001, 22.496044007000094],
+ [101.74177901200011, 22.496044007000094],
+ [101.7131502680001, 22.491548157000082],
+ [101.68912072800009, 22.478887431000047],
+ [101.66865686100004, 22.46229929700003],
+ [101.65454919500007, 22.446124573000034],
+ [101.64509240800004, 22.42421376500009],
+ [101.64416223200004, 22.4040082800001],
+ [101.64571252500008, 22.384526266000094],
+ [101.64369714400004, 22.364682516000116],
+ [101.64111332200014, 22.363287252000035],
+ [101.62369836500011, 22.346647441000115],
+ [101.6225098060001, 22.342358297000047],
+ [101.61987430900007, 22.32644195500002],
+ [101.60612837700012, 22.284842427000015],
+ [101.60121911700008, 22.27698761000009],
+ [101.58798995000012, 22.27135487900007],
+ [101.5757426350001, 22.27311187800005],
+ [101.56370202700009, 22.276780905000024],
+ [101.55098962400007, 22.276677552000095],
+ [101.54065433700003, 22.271458232000086],
+ [101.5317143150001, 22.263396708000087],
+ [101.51574629800007, 22.245361634000105],
+ [101.51822676600005, 22.22820505800003],
+ [101.54902592000013, 22.19353017200011],
+ [101.56153161700013, 22.17611521400009],
+ [101.56695764200009, 22.149346822000027],
+ [101.5618416750001, 22.13007151300006],
+ [101.55502038600014, 22.112398173000074],
+ [101.55543379800014, 22.090332337000078],
+ [101.56494226100006, 22.069506734000115],
+ [101.59217574100006, 22.02811391300007],
+ [101.60039229400007, 22.007495016000078],
+ [101.60680017100003, 21.96760081000012],
+ [101.61630863500011, 21.953648173000133],
+ [101.6381160890001, 21.940884094000054],
+ [101.67366947500005, 21.931375631],
+ [101.68059411600007, 21.9226423140001],
+ [101.68245446800006, 21.91483917300009],
+ [101.68307458600003, 21.907139384000104],
+ [101.68586511300009, 21.898612773000067],
+ [101.70870609600007, 21.869570618000083],
+ [101.72126346900012, 21.844352519000054],
+ [101.72617272900004, 21.837272848000012],
+ [101.7510807700001, 21.81613718700008],
+ [101.75154585800004, 21.806370341000033],
+ [101.73165043200004, 21.75050811800004],
+ [101.72798140500004, 21.7326797490001],
+ [101.72854984500009, 21.717538554000086],
+ [101.73278731300013, 21.71144073500004],
+ [101.74911706500006, 21.698056539000092],
+ [101.75480147300004, 21.689788310000054],
+ [101.75562829600005, 21.68002146400009],
+ [101.75232100500006, 21.659144186000034],
+ [101.75593835500013, 21.648653870000075],
+ [101.77082116700007, 21.638835348],
+ [101.78952803600004, 21.634029440000077],
+ [101.80384240700005, 21.62591623900009],
+ [101.8061678470001, 21.60596913700006],
+ [101.79355879700006, 21.588244121000045],
+ [101.77268151900006, 21.582508036],
+ [101.75092574100006, 21.57966583300002],
+ [101.73619795800005, 21.570880839000026],
+ [101.73475101700006, 21.554396057000062],
+ [101.74823856600005, 21.514501852000123],
+ [101.74425948100009, 21.495588277000067],
+ [101.72968672700011, 21.474245911000068],
+ [101.7255526130001, 21.37538889600002],
+ [101.71557906100008, 21.338181865000095],
+ [101.71511397300003, 21.321128642000062],
+ [101.72250370300003, 21.30423044800007],
+ [101.73650801600007, 21.292293193000134],
+ [101.7885461840001, 21.274206442000022],
+ [101.80115523300003, 21.267075094000077],
+ [101.81226566600003, 21.25813507100007],
+ [101.82022383600008, 21.247283020000012],
+ [101.82373783400004, 21.234467265000134],
+ [101.8228076580001, 21.224131979000035],
+ [101.82149033400009, 21.221071138000084],
+ [101.81929366100013, 21.215967102000022],
+ [101.81329919500013, 21.209559225000064],
+ [101.80523767100004, 21.204494934000095],
+ [101.79603926600004, 21.20294464100006],
+ [101.77356001800013, 21.207388815000073],
+ [101.76007246900008, 21.19596832300006],
+ [101.7635864660001, 21.18465118400009],
+ [101.77020105000003, 21.170440166000034],
+ [101.76845334900003, 21.16044957700005],
+ [101.76673872900005, 21.150648092000054],
+ [101.75599003200006, 21.143258362000054],
+ [101.73748986800013, 21.137573954000104],
+ [101.71790450000009, 21.134473369000048],
+ [101.70426192200011, 21.135093485000127],
+ [101.68829390500014, 21.145842183000056],
+ [101.67015547700004, 21.17705474900002],
+ [101.65511763500012, 21.18919871100003],
+ [101.63594567900003, 21.189457092000097],
+ [101.59651656100004, 21.173385722000134],
+ [101.58178877800003, 21.175659485000054],
+ [101.57724125200008, 21.18516794800003],
+ [101.58096195500008, 21.194728089000037],
+ [101.58664636300006, 21.204236552000012],
+ [101.58819665600004, 21.21333160400009],
+ [101.58395918800011, 21.2243903600001],
+ [101.57967004400012, 21.227594299000074],
+ [101.57290043100011, 21.228162740000116],
+ [101.53910404500004, 21.23885976100003],
+ [101.51760664900007, 21.242632141000044],
+ [101.49512740100005, 21.2428388470001],
+ [101.38149092600008, 21.22247833200008],
+ [101.36226729400005, 21.215812073000066],
+ [101.31389815300014, 21.184754537000018],
+ [101.29271081600007, 21.176072897000054],
+ [101.27529585800005, 21.174109192000046],
+ [101.25974125100004, 21.179483541000096],
+ [101.24434167500004, 21.192867737000128],
+ [101.23478153500014, 21.206251933000075],
+ [101.22036381100003, 21.23369211800012],
+ [101.20899499500013, 21.245526021000032],
+ [101.21907189900008, 21.28247467100006],
+ [101.22036381100003, 21.296272278000018],
+ [101.2184001060001, 21.29994130500002],
+ [101.20951176000005, 21.308674622000083],
+ [101.20744470200003, 21.31482411700007],
+ [101.22284427900007, 21.33508127800006],
+ [101.23478153500014, 21.363658345000132],
+ [101.23312788900006, 21.371719869000017],
+ [101.23080244900007, 21.371771546000033],
+ [101.22646163000007, 21.370893046],
+ [101.20796146700013, 21.38350209600013],
+ [101.17912601800003, 21.39817820200001],
+ [101.17142622900013, 21.403397522000134],
+ [101.16827396700006, 21.424533183000065],
+ [101.18775598100007, 21.505871887000083],
+ [101.18656742400003, 21.53532745400007],
+ [101.17452681500004, 21.551657206000115],
+ [101.15902388500007, 21.5526907350001],
+ [101.15421797700003, 21.568038635000065],
+ [101.1577319750001, 21.586228740000095],
+ [101.16765384900009, 21.600181376000094],
+ [101.17385502100007, 21.611911926000076],
+ [101.16672367300004, 21.623280742000063],
+ [101.1688424080001, 21.637853496000034],
+ [101.1614526780001, 21.65836903900002],
+ [101.14925704000007, 21.676765849],
+ [101.13633793100007, 21.684724019000058],
+ [101.12765629100005, 21.695162659000104],
+ [101.12486576400005, 21.74415191700011],
+ [101.11887129800004, 21.759809876000062],
+ [101.08280114800004, 21.766734518000064],
+ [101.06869348200013, 21.76203196200008],
+ [101.05530928600007, 21.754538880000027],
+ [101.04290694200012, 21.745392152000065],
+ [100.99278080300007, 21.71144073500004],
+ [100.97428064000007, 21.704154358000054],
+ [100.87749068200003, 21.677334290000047],
+ [100.83490930200009, 21.657542217000085],
+ [100.79703047700008, 21.626122946000052],
+ [100.75661950700004, 21.569847310000043],
+ [100.70396122300008, 21.51641387900004],
+ [100.66153487100007, 21.49553660100007],
+ [100.66132816600003, 21.495329896],
+ [100.64577356000007, 21.479878642000116],
+ [100.62174401800007, 21.469078268000075],
+ [100.57182458500012, 21.45507395500006],
+ [100.5459863690001, 21.453006897000094],
+ [100.49710046400003, 21.4617918900001],
+ [100.4742594810001, 21.45683095300005],
+ [100.45668949400005, 21.455022278000044],
+ [100.44346032800013, 21.463497213000053],
+ [100.43426192300012, 21.478380026000096],
+ [100.42930098500005, 21.495381572000028],
+ [100.39912194900006, 21.518894348000018],
+ [100.38367069500009, 21.527834371000054],
+ [100.36325850400004, 21.53176178000011],
+ [100.34196781400004, 21.53036651700002],
+ [100.32651656100006, 21.524268698000057],
+ [100.31463098200004, 21.512951559],
+ [100.30248702000011, 21.49553660100007],
+ [100.30228031400009, 21.495329896],
+ [100.28951623500012, 21.483134258000078],
+ [100.27520186400011, 21.475176087000037],
+ [100.24409265100007, 21.464530742000036],
+ [100.23024336800012, 21.45683095300005],
+ [100.19789392100012, 21.433214824000046],
+ [100.18714522300007, 21.427892151],
+ [100.16249556500009, 21.43636708600009],
+ [100.12833744300008, 21.482359110000075],
+ [100.1077702230001, 21.49553660100007],
+ [100.09727990800008, 21.508300680000033],
+ [100.08999353000007, 21.528919577000025],
+ [100.08606612200003, 21.550933737000022],
+ [100.08560103400009, 21.567573548000027],
+ [100.08864994300012, 21.581836243000012],
+ [100.0948511150001, 21.59883778900003],
+ [100.10394616700006, 21.615632629000103],
+ [100.11572839400009, 21.629481914000067],
+ [100.12611535700012, 21.6348562620001],
+ [100.13619226100013, 21.63681996700005],
+ [100.14373702000006, 21.640023906000025],
+ [100.14632084200008, 21.649222310000127],
+ [100.14280684400012, 21.654906718000078],
+ [100.13515873200004, 21.662348124000076],
+ [100.12053430200007, 21.673665263000075],
+ [100.08234541900003, 21.684465638000106],
+ [99.99671757100003, 21.686119283000053],
+ [99.96069909700003, 21.70477447500012],
+ [99.95026045800012, 21.72115590400007],
+ [99.93920170100012, 21.77701812800005],
+ [99.92209680200006, 21.812261455000012],
+ [99.91796268700006, 21.8291596480001],
+ [99.92018477400006, 21.852000631000024],
+ [99.95527307100008, 21.924554342000036],
+ [99.96566003400011, 21.963001608000084],
+ [99.95046716400009, 21.995351054000068],
+ [99.9398218180001, 22.005893046000025],
+ [99.93434411600009, 22.018863831000047],
+ [99.93491255700013, 22.03250640900005],
+ [99.94240564000006, 22.04552886900011],
+ [99.86685469600008, 22.057879537000062],
+ [99.84783776900008, 22.055037333000072],
+ [99.84230839000008, 22.047027486],
+ [99.84173995000003, 22.027080384000087],
+ [99.83367842700005, 22.01948394800003],
+ [99.82101770100007, 22.017778626000066],
+ [99.81342126500004, 22.022997946000075],
+ [99.80747847600003, 22.03095611600004],
+ [99.79988204000006, 22.037467347000117],
+ [99.73916223200007, 22.066767884000072],
+ [99.72365930200004, 22.07059194000003],
+ [99.70381555200004, 22.061238505000077],
+ [99.69379032400013, 22.046924133000076],
+ [99.68386844900004, 22.039017639000022],
+ [99.66381799300007, 22.04873280900007],
+ [99.65927046800005, 22.054572245000045],
+ [99.65007206200005, 22.071935527000065],
+ [99.64221724500004, 22.079945374000047],
+ [99.63353560400009, 22.084751282000056],
+ [99.53896773300005, 22.106713766000027],
+ [99.50506799400006, 22.103354798000012],
+ [99.49039188700004, 22.104336650000064],
+ [99.43861210200009, 22.12423207600007],
+ [99.42496952300007, 22.12242340100009],
+ [99.36492150900006, 22.098858948],
+ [99.32998824100008, 22.095551656000097],
+ [99.25288700400006, 22.102786357000056],
+ [99.2122693280001, 22.112449849000072],
+ [99.16638065600006, 22.13208689400001],
+ [99.14446984900007, 22.153532613000053],
+ [99.17506229700007, 22.168673808000065],
+ [99.15935266100013, 22.184693502000115],
+ [99.16638065600006, 22.204640605000023],
+ [99.1993502200001, 22.245258281000062],
+ [99.20617150900006, 22.261329651000025],
+ [99.21836714700004, 22.310008851000063],
+ [99.22570520000005, 22.321222637000105],
+ [99.24368859900005, 22.34122141600004],
+ [99.2483394780001, 22.353675435000028],
+ [99.24637577300007, 22.365922750000053],
+ [99.24058801300009, 22.372950745000068],
+ [99.23738407400003, 22.38013376900001],
+ [99.24306848200007, 22.39315623000006],
+ [99.28275598100004, 22.411914775000056],
+ [99.3450777590001, 22.472841288],
+ [99.35344934100004, 22.484106751000056],
+ [99.35779016200013, 22.495475566000053],
+ [99.35634322100003, 22.50617258700005],
+ [99.34662805200003, 22.523070781000044],
+ [99.34414758300005, 22.533251038000017],
+ [99.34704146400003, 22.55335317000008],
+ [99.35737675000013, 22.587097881000048],
+ [99.35499963400008, 22.60854360000006],
+ [99.30787072800007, 22.719596252000045],
+ [99.30797408000012, 22.745176087000104],
+ [99.31696578000003, 22.754116109000037],
+ [99.32719771300003, 22.76049814900007],
+ [99.33846317600006, 22.764916484000068],
+ [99.3506588140001, 22.76814626100004],
+ [99.3590303960001, 22.77489003500007],
+ [99.37887414600004, 22.813233948000075],
+ [99.40357548100008, 22.841061707000065],
+ [99.41442753200005, 22.856900533000058],
+ [99.416908, 22.874341330000092],
+ [99.41122359200006, 22.919248149000097],
+ [99.41339400300006, 22.930746155000023],
+ [99.42993046000004, 22.936740622000045],
+ [99.48450077400008, 22.910256450000063],
+ [99.51529992700006, 22.90880951000007],
+ [99.53803755700011, 22.92643117300004],
+ [99.53462691200008, 22.949323832000076],
+ [99.49876346900004, 22.99516082800004],
+ [99.49039188700004, 23.0120073450001],
+ [99.49163212100012, 23.028207906000105],
+ [99.49504276500005, 23.043478292000046],
+ [99.49307906100012, 23.057379252000132],
+ [99.47819624900006, 23.0657508340001],
+ [99.40326542100007, 23.068334656],
+ [99.38104455600006, 23.08164133800001],
+ [99.35096887200007, 23.11926178000003],
+ [99.33381229700012, 23.129622904000044],
+ [99.31407189900006, 23.126470642000086],
+ [99.30218632100014, 23.112595520000028],
+ [99.29402144400012, 23.096782532000034],
+ [99.28482303900012, 23.088152568000098],
+ [99.26673628800012, 23.08386342400003],
+ [99.25743452900008, 23.07921254500006],
+ [99.23614384000007, 23.062314352000058],
+ [99.22487837700004, 23.056888327000095],
+ [99.21661014900008, 23.057379252000132],
+ [99.20958215400009, 23.061539206000063],
+ [99.20214074800003, 23.067275289000023],
+ [99.19966027900006, 23.073838196000096],
+ [99.1993502200001, 23.09226084400011],
+ [99.1941825770001, 23.09577484200007],
+ [99.18488081900006, 23.0948446660001],
+ [99.18271040800005, 23.095206401],
+ [99.17867964700008, 23.09642079700005],
+ [99.16400354000007, 23.09768687000009],
+ [99.1386820890001, 23.105205790000028],
+ [99.13000044800003, 23.10623931900001],
+ [99.09217329900008, 23.101510926000017],
+ [99.0749133710001, 23.10166595500006],
+ [99.05506962100009, 23.109598287000026],
+ [99.0392566330001, 23.127142436000085],
+ [99.03315881300006, 23.146417745000022],
+ [99.02644087800013, 23.160447897000026],
+ [99.00938765500007, 23.162153218000086],
+ [98.99037072800013, 23.160034485000025],
+ [98.9707336840001, 23.162204895000016],
+ [98.93342330000013, 23.172152608000104],
+ [98.85900923700012, 23.179387309000063],
+ [98.86014611800005, 23.212279358000032],
+ [98.91068566900009, 23.297597148000094],
+ [98.89652632700012, 23.323280335000064],
+ [98.86045617700012, 23.322375997000037],
+ [98.85342818200007, 23.3248823040001],
+ [98.85322147600004, 23.334985047000046],
+ [98.86210982300008, 23.340591940000067],
+ [98.87378869600013, 23.344571025000064],
+ [98.88185022000005, 23.34968699200006],
+ [98.89011844900006, 23.3679029340001],
+ [98.89228886000006, 23.386894023000067],
+ [98.88960168400013, 23.406789449000073],
+ [98.87554569500003, 23.44642527300003],
+ [98.86397017400009, 23.46660491900012],
+ [98.84888065700005, 23.480402527000066],
+ [98.83007043500004, 23.480014954000055],
+ [98.80981327300003, 23.474098002000048],
+ [98.7999947510001, 23.48073842400005],
+ [98.78087447100006, 23.532854106000016],
+ [98.78438846900013, 23.54703928700006],
+ [98.7962740480001, 23.557917175000043],
+ [98.84329960100007, 23.5840137740001],
+ [98.85022424400012, 23.590628357000114],
+ [98.85735559100004, 23.604348450000046],
+ [98.85601200400009, 23.610007020000083],
+ [98.84960412600009, 23.614735413000076],
+ [98.80795292200003, 23.67579111800005],
+ [98.80030481000006, 23.69271514900005],
+ [98.79906457500005, 23.743228862000066],
+ [98.79317346200003, 23.758473409000104],
+ [98.77787723800009, 23.76929962100006],
+ [98.73839644400005, 23.77555247000005],
+ [98.70832076000005, 23.78469919800004],
+ [98.68496301300013, 23.784802551000084],
+ [98.67566125500008, 23.787386373000075],
+ [98.66367232300013, 23.796946513000066],
+ [98.66356897000003, 23.803070171000044],
+ [98.66832320200012, 23.808702902000064],
+ [98.67142378700004, 23.816738587000046],
+ [98.66418908700007, 23.89037750200005],
+ [98.66480920400005, 23.9033741250001],
+ [98.67297408100006, 23.928308004000073],
+ [98.6745243740001, 23.936886292000096],
+ [98.6657393800001, 23.953216045000133],
+ [98.65881473800005, 23.961122539000073],
+ [98.66325891200012, 23.969545797000066],
+ [98.67989872200008, 23.976263733000096],
+ [98.69922570900007, 23.981560568000035],
+ [98.71679569500009, 23.988407695],
+ [98.76557824800005, 24.02706166600008],
+ [98.85621871000006, 24.083802388000024],
+ [98.87347863800005, 24.11449819000005],
+ [98.86696740800011, 24.143256124000075],
+ [98.86572717300004, 24.145684917000025],
+ [98.85528853400012, 24.13896698000009],
+ [98.8180815020001, 24.12896759100009],
+ [98.7161755780001, 24.12134531700012],
+ [98.68175907400007, 24.106875916],
+ [98.64041792900014, 24.100752258000014],
+ [98.61251265500005, 24.087548930000125],
+ [98.59711307800006, 24.083078919000016],
+ [98.58522749900004, 24.075715027000015],
+ [98.57024133400006, 24.08209706600006],
+ [98.54305953000005, 24.093956807000083],
+ [98.50326867700005, 24.121267802000077],
+ [98.47453658000006, 24.127830709000065],
+ [98.43495243300009, 24.130259501000026],
+ [98.39557499200009, 24.128063253000036],
+ [98.37872847500012, 24.122404684000102],
+ [98.3473092050001, 24.10493804900007],
+ [98.33066939300005, 24.099486186000078],
+ [98.2932556560001, 24.10013214100006],
+ [98.21915165200005, 24.117366231000048],
+ [98.18153120900013, 24.118658142000086],
+ [98.10505009000008, 24.101527405000027],
+ [97.88997277800013, 24.022617493],
+ [97.87664025900011, 24.014400940000044],
+ [97.83633264200006, 23.971767883000084],
+ [97.81783247900012, 23.95815114400007],
+ [97.8040865480001, 23.954507955000068],
+ [97.78951379400013, 23.95313853],
+ [97.76780969300012, 23.946472270000086],
+ [97.74817264900008, 23.93406992600002],
+ [97.69680627400004, 23.887121887000077],
+ [97.67696252500014, 23.878698629000084],
+ [97.65567183400009, 23.87254913300002],
+ [97.64734483100005, 23.868524415000067],
+ [97.63706831900004, 23.86355743500006],
+ [97.62466597500003, 23.846710918],
+ [97.61970503700007, 23.865986226000032],
+ [97.61546757000013, 23.875132955000097],
+ [97.60988651500003, 23.88314280200008],
+ [97.5726794840001, 23.907559916000125],
+ [97.53299198400003, 23.92370880200012],
+ [97.51645552600013, 23.942829081000113],
+ [97.70765832500007, 24.12529856400009],
+ [97.72006066900008, 24.1474419150001],
+ [97.72305790200005, 24.171264751000066],
+ [97.71871708200007, 24.181548361000083],
+ [97.70455774000004, 24.19924753800008],
+ [97.70156050600013, 24.210926412000063],
+ [97.70466109300008, 24.221726786000076],
+ [97.71117232300003, 24.228470561000037],
+ [97.71851037600004, 24.233974101000015],
+ [97.72409143100003, 24.241518860000056],
+ [97.71840702300011, 24.277666524],
+ [97.64450972500003, 24.302393698000103],
+ [97.63820520100012, 24.328102722],
+ [97.65360477700011, 24.338722229000084],
+ [97.67427535100012, 24.340840963000048],
+ [97.68957157400007, 24.346473694000068],
+ [97.68833134000005, 24.36771270800004],
+ [97.68099328600005, 24.377763774000087],
+ [97.66259647700014, 24.390062765000025],
+ [97.65732548000011, 24.402000020000074],
+ [97.6554651290001, 24.412076925000108],
+ [97.65226119000005, 24.422722270000108],
+ [97.6473002520001, 24.432334086000097],
+ [97.6398588460001, 24.439284567000087],
+ [97.62435591600007, 24.442281799000014],
+ [97.60068811000014, 24.44192006400003],
+ [97.51955611200009, 24.430783794],
+ [97.51325158700007, 24.438586935],
+ [97.51387170400005, 24.46168629900008],
+ [97.53857303900003, 24.597259420000015],
+ [97.53278527800006, 24.723324077000072],
+ [97.53609257000005, 24.745028178000084],
+ [97.5361959230001, 24.745079854],
+ [97.60399540200012, 24.78644683900002],
+ [97.6425460210001, 24.816780904000055],
+ [97.66394006400003, 24.829777527000104],
+ [97.68595422400011, 24.833524068000102],
+ [97.72657190000012, 24.826289368000047],
+ [97.74848270700011, 24.826470235],
+ [97.76522587100004, 24.834660950000043],
+ [97.77297733600005, 24.85468556800008],
+ [97.76098840300006, 24.870291850000015],
+ [97.72409143100003, 24.897215272000025],
+ [97.70827844300004, 24.927290955],
+ [97.70331750500003, 24.960415548000086],
+ [97.70517785700014, 25.02883514400007],
+ [97.69959680200009, 25.065008647000113],
+ [97.7036275640001, 25.073922831000047],
+ [97.72161096200006, 25.079271342000098],
+ [97.73752730300009, 25.090510967000043],
+ [97.7540637620001, 25.11355865500009],
+ [97.77700809800012, 25.15862050400004],
+ [97.80098596300013, 25.237633769000112],
+ [97.82362023900009, 25.26161163300013],
+ [97.86031050700007, 25.244093323000058],
+ [97.87178267400009, 25.227660217],
+ [97.87881066900007, 25.213552551000063],
+ [97.88893925000013, 25.205646057000124],
+ [97.90991988100006, 25.20755808500006],
+ [97.93079716000011, 25.218513489000102],
+ [97.97627242100009, 25.27225697900012],
+ [97.99239546700005, 25.28248891200009],
+ [98.03352990700012, 25.301299134000104],
+ [98.04489872300013, 25.311944479000104],
+ [98.06257206300012, 25.35431915300002],
+ [98.0756978760001, 25.376074932000037],
+ [98.08996057100006, 25.385945129],
+ [98.10835738100008, 25.388890686000096],
+ [98.11207808500006, 25.396228739000023],
+ [98.11021773300007, 25.410439759000056],
+ [98.11197473100003, 25.448473613000104],
+ [98.10887414600012, 25.458240459000066],
+ [98.10474003100006, 25.466973775000028],
+ [98.09946903500003, 25.493328756],
+ [98.09977909300005, 25.50004669200011],
+ [98.10463667800013, 25.506764628000056],
+ [98.12303348900014, 25.522215882000054],
+ [98.13419559800008, 25.534618225000102],
+ [98.13936324100007, 25.550224508000056],
+ [98.13843306500013, 25.598955384000092],
+ [98.1400867110001, 25.611461080000097],
+ [98.15021529100005, 25.613063050000036],
+ [98.23238081900007, 25.586553040000027],
+ [98.24716027900007, 25.579163310000112],
+ [98.2766158450001, 25.552446594000045],
+ [98.28943160000006, 25.550379538000087],
+ [98.31206587700012, 25.55745920800011],
+ [98.3326330970001, 25.566967672000104],
+ [98.34710249800003, 25.577819723000047],
+ [98.35723107900009, 25.592754212],
+ [98.36984012900012, 25.636782532000055],
+ [98.37521447800009, 25.649288229000078],
+ [98.41324833200008, 25.69207631400009],
+ [98.41634891800004, 25.700189514],
+ [98.41665897600012, 25.712591859000057],
+ [98.41872603400009, 25.724219056000024],
+ [98.42472050000003, 25.730833639000124],
+ [98.43226525900008, 25.736104635000046],
+ [98.43929325400006, 25.7435977170001],
+ [98.45262577300008, 25.777962545000022],
+ [98.46130741400009, 25.79465403300007],
+ [98.47453658000006, 25.80576446500008],
+ [98.49810103400006, 25.830724183000072],
+ [98.50946984900003, 25.838062236000056],
+ [98.52683313100005, 25.838785706000053],
+ [98.53954553200003, 25.833721415000085],
+ [98.56238651600012, 25.816358135000073],
+ [98.59091190600009, 25.806384583000053],
+ [98.60031701600013, 25.801733704000085],
+ [98.61003218700006, 25.800596822000088],
+ [98.62605188000003, 25.806487936000067],
+ [98.6778316650001, 25.843281555000075],
+ [98.68485966000003, 25.853100078000054],
+ [98.69023400900005, 25.86555409700013],
+ [98.69240441900007, 25.87898997100008],
+ [98.68982059800004, 25.8915990200001],
+ [98.68465295400006, 25.897593486000048],
+ [98.67235396300009, 25.90183095400009],
+ [98.66728967300003, 25.905758362000043],
+ [98.65809126800013, 25.925033671000094],
+ [98.62532841000012, 25.969992168000104],
+ [98.61623335800004, 25.979397278000064],
+ [98.6042444260001, 25.982497864],
+ [98.59246219900007, 25.98074086500013],
+ [98.5824369720001, 25.98229115900004],
+ [98.57540897700005, 25.99510691300013],
+ [98.57716597500013, 26.01732778000006],
+ [98.5726184500001, 26.035569560000013],
+ [98.5538082280001, 26.071071269000058],
+ [98.54729699800004, 26.088279521000047],
+ [98.54553999900003, 26.105642803000066],
+ [98.55019087800008, 26.12078399700006],
+ [98.5630066330001, 26.131222636000118],
+ [98.60217736800013, 26.13995595300007],
+ [98.61933394400012, 26.145743714000062],
+ [98.62574182200012, 26.144348450000066],
+ [98.62429488100014, 26.108485006000038],
+ [98.63080611200013, 26.096909485000097],
+ [98.64444869000005, 26.097891337000064],
+ [98.68082889800013, 26.12496978800003],
+ [98.68672001200008, 26.133238017000068],
+ [98.68651330600005, 26.15411529600003],
+ [98.69240441900007, 26.159954732000116],
+ [98.70025923700007, 26.16532908200007],
+ [98.7055302330001, 26.174940898000088],
+ [98.70149947100003, 26.191167298],
+ [98.67700484200009, 26.239329733000076],
+ [98.66821984900008, 26.248218079000097],
+ [98.64816939300005, 26.244807434000066],
+ [98.6421749270001, 26.25452260400003],
+ [98.64455204300003, 26.271575827000035],
+ [98.64951298000011, 26.290592753000013],
+ [98.65778120900006, 26.31162506100013],
+ [98.6976754150001, 26.35405141200006],
+ [98.70739058400011, 26.371052959000068],
+ [98.7134884030001, 26.389449768000063],
+ [98.7172091060001, 26.408725077000028],
+ [98.72113651600006, 26.538898011000086],
+ [98.72795780400003, 26.57259104500004],
+ [98.74852502400012, 26.6059740190001],
+ [98.7555530190001, 26.625042623000084],
+ [98.75069543500007, 26.646126607000028],
+ [98.74707808400012, 26.655738424000035],
+ [98.74676802600004, 26.664420064000083],
+ [98.74738814300008, 26.672688293000036],
+ [98.74645796800013, 26.681059876000106],
+ [98.73198856700003, 26.71351267500002],
+ [98.73436568300014, 26.73428660100008],
+ [98.74924849500007, 26.77144195600006],
+ [98.75038537600011, 26.792009176000064],
+ [98.74242720500013, 26.81040598600005],
+ [98.71813928200004, 26.842497050000063],
+ [98.71452193200008, 26.862030741000083],
+ [98.71865604700008, 26.872676087000073],
+ [98.73312544800012, 26.88792063400011],
+ [98.73632938600008, 26.89825592100003],
+ [98.73570927000003, 26.907299296000062],
+ [98.71266158100008, 26.995149231000042],
+ [98.72061975100013, 27.013959452000066],
+ [98.73167850700003, 27.031064352],
+ [98.73777632600007, 27.048686015],
+ [98.73136844900006, 27.068788147000063],
+ [98.71648563700012, 27.082482402000082],
+ [98.70273970500006, 27.086823222000064],
+ [98.69137089100008, 27.092404276000067],
+ [98.68268925000012, 27.110077617000073],
+ [98.67256066900006, 27.17560333200008],
+ [98.67359419800005, 27.207901103000054],
+ [98.68020878100003, 27.237046611000082],
+ [98.70418664600004, 27.304174296000028],
+ [98.70770064400011, 27.337247213000083],
+ [98.69736535700008, 27.368924866],
+ [98.69106083200006, 27.373162334000043],
+ [98.6837227790001, 27.37362742200007],
+ [98.67731490100005, 27.376107890000057],
+ [98.67442102100006, 27.3865982060001],
+ [98.66832320200012, 27.475249126000094],
+ [98.67111372900007, 27.516151022000102],
+ [98.68175907400007, 27.55648447700007],
+ [98.67927860500009, 27.57733591800003],
+ [98.67421431500003, 27.586120911000123],
+ [98.6657393800001, 27.597076315],
+ [98.65592085800006, 27.60676564500004],
+ [98.6472392170001, 27.611726583000078],
+ [98.63504357900007, 27.611054789],
+ [98.62584517500005, 27.6055512490001],
+ [98.61654341700006, 27.59841990200006],
+ [98.60455448400006, 27.59273549400011],
+ [98.5784062090001, 27.59172780400003],
+ [98.56435022000005, 27.603535869000055],
+ [98.54336958800008, 27.642525737000042],
+ [98.5221822520001, 27.656297506000087],
+ [98.4923132730001, 27.643430074],
+ [98.47453658000006, 27.65717600500004],
+ [98.42224003100006, 27.680895487000058],
+ [98.4102510990001, 27.68425445600009],
+ [98.40001916500012, 27.675727844000065],
+ [98.3974353430001, 27.656814270000027],
+ [98.39815881400011, 27.619813945000075],
+ [98.39288781700009, 27.587154440000106],
+ [98.38327600100007, 27.55578684500007],
+ [98.36394901500012, 27.532170716000067],
+ [98.32860233600007, 27.52286895700003],
+ [98.29470259600009, 27.536614889000063],
+ [98.27568566900004, 27.570101217000072],
+ [98.25439497900004, 27.648132629000074],
+ [98.23806522600012, 27.680223694000077],
+ [98.20437219300004, 27.727300924000062],
+ [98.20178837100013, 27.736551005000095],
+ [98.21150354000008, 27.760322164000044],
+ [98.20840295400006, 27.766161601000036],
+ [98.20209842900005, 27.7712517290001],
+ [98.1978609620001, 27.780631002000078],
+ [98.19848107900003, 27.800448914000057],
+ [98.20065148900005, 27.813600565000016],
+ [98.19662072800003, 27.823186544000023],
+ [98.16241092900003, 27.842849427000075],
+ [98.14577111900013, 27.860729472000045],
+ [98.1400867110001, 27.878557841000074],
+ [98.1567265220001, 27.889203187000064],
+ [98.17667362500003, 27.898117371000083],
+ [98.17729374200007, 27.91292266900011],
+ [98.16582157400006, 27.92969167100007],
+ [98.14897505700009, 27.944548645000012],
+ [98.11352502500006, 27.96170522100006],
+ [98.10711714700011, 27.973074036000057],
+ [98.11848596200014, 27.99472646100004],
+ [98.12251672400004, 28.015448710000058],
+ [98.1279944260001, 28.105469056000018],
+ [98.12696089700012, 28.124279277000042],
+ [98.11869266800005, 28.140789897000033],
+ [98.1150022760001, 28.14388835700008],
+ [98.04861942600013, 28.199623515000027],
+ [98.03135949800003, 28.208330994000065],
+ [97.9910518800001, 28.214015401000026],
+ [97.98485070800012, 28.2242214970001],
+ [97.99384240800003, 28.25254018200009],
+ [97.9929122320001, 28.26892161100004],
+ [97.97875288900013, 28.280600484],
+ [97.9447497970001, 28.29884226500006],
+ [97.8975175380001, 28.35532460500012],
+ [97.85907027200005, 28.370129903000034],
+ [97.79726525900003, 28.34392995200001],
+ [97.76532922400008, 28.352430725000133],
+ [97.74000777200007, 28.38260976200003],
+ [97.69959680200009, 28.48802968300008],
+ [97.67045129400009, 28.511284079000077],
+ [97.6410990810001, 28.498364970000083],
+ [97.61360721800003, 28.481983541000133],
+ [97.58993941300008, 28.49469594300008],
+ [97.56751184100011, 28.525495097000046],
+ [97.54622115100011, 28.53846588100008],
+ [97.52772098800011, 28.52952585900006],
+ [97.51397505800009, 28.49469594300008],
+ [97.50301965300008, 28.47772023600008],
+ [97.48813684100003, 28.44193430600005],
+ [97.47459761600004, 28.426198832000082],
+ [97.47149703000014, 28.414959209000116],
+ [97.46570927000005, 28.40669097900006],
+ [97.45010298700004, 28.39191152000005],
+ [97.44534875500011, 28.382971497000128],
+ [97.4467956950001, 28.374005636000092],
+ [97.45020634000014, 28.364858907],
+ [97.45237674900005, 28.355479635000066],
+ [97.45237674900005, 28.317678324000084],
+ [97.44782922400009, 28.29760203100004],
+ [97.43666711400004, 28.286414083000082],
+ [97.41672001200004, 28.286052348000098],
+ [97.3982198490001, 28.28889455200006],
+ [97.38437056500004, 28.284837952000075],
+ [97.3778593350001, 28.26359893900009],
+ [97.36959110600003, 28.25347035700004],
+ [97.33383101400011, 28.235254415],
+ [97.32349572800013, 28.217477723000073],
+ [97.2852551680001, 28.235667827],
+ [97.22965132700011, 28.274606018000085],
+ [97.22076298000007, 28.28339101200008],
+ [97.21053104700013, 28.308092346000066],
+ [97.20277958200012, 28.31155466700004],
+ [97.19327111900003, 28.311399638000083],
+ [97.18272912600008, 28.31499115000007],
+ [97.11554976400004, 28.366564230000066],
+ [97.07844608600004, 28.3751425170001],
+ [97.03297082600005, 28.357029928000074],
+ [96.9974174400001, 28.337082825000053],
+ [96.96579146400012, 28.330468242000066],
+ [96.93395878200005, 28.336617737000026],
+ [96.89788863200005, 28.354704489000042],
+ [96.71692392905247, 28.436539447625634],
+ [96.60442611830537, 28.444534241434948],
+ [96.5615177204665, 28.44729288316006],
+ [96.51238244700005, 28.428808492000073],
+ [96.49522587100006, 28.42147043900009],
+ [96.44112658162652, 28.39541577691665],
+ [96.36964414401973, 28.378115826943503],
+ [96.30185249373439, 28.420710938634112],
+ [96.33645875408492, 28.47966681390912],
+ [96.40901887262294, 28.558928647938785],
+ [96.50237514126326, 28.644476217418358],
+ [96.50104350465409, 28.687631303142155],
+ [96.59800971353144, 28.709910398443995],
+ [96.59258426900004, 28.757884013000094],
+ [96.57666792800006, 28.808526917000066],
+ [96.52375126100003, 28.864414979000045],
+ [96.51083215400013, 28.885524801000074],
+ [96.50039351400005, 28.929243062000054],
+ [96.49222863800003, 28.94800160700005],
+ [96.47465865100008, 28.962057597000054],
+ [96.46008589700011, 28.963349507000103],
+ [96.45212772700006, 28.970377502000034],
+ [96.45119755100012, 28.98138458300012],
+ [96.45760542900013, 28.99458791100001],
+ [96.36656829155606, 29.036536563468914],
+ [96.29465549772947, 28.99232448388489],
+ [96.24858762565306, 28.945343306324006],
+ [96.19532275757172, 28.941105845485463],
+ [96.17595371463305, 29.017353609711428],
+ [96.17462528500005, 29.108844503000043],
+ [96.1835136310001, 29.123778992000027],
+ [96.19364221300003, 29.13693064400009],
+ [96.21007531700008, 29.145767314000082],
+ [96.31642541500008, 29.171863912000063],
+ [96.32748417200008, 29.180442200000087],
+ [96.34236698400014, 29.21064707500001],
+ [96.36686161300008, 29.24421091700013],
+ [96.36624149600004, 29.257233379000056],
+ [96.34991174300006, 29.274234924],
+ [96.33709598900009, 29.27971262700008],
+ [96.32324670400004, 29.275010071000096],
+ [96.30412642400006, 29.261212464000053],
+ [96.26784956900008, 29.24173044900006],
+ [96.23529341600005, 29.241213684000016],
+ [96.20542443800014, 29.256949158000097],
+ [96.17627893100013, 29.28645640100011],
+ [96.16604699800013, 29.303173726000054],
+ [96.15095747900011, 29.35407501200008],
+ [96.14196578000008, 29.368466899000097],
+ [96.07453626532634, 29.369285607240855],
+ [96.01413548284108, 29.364252208700393],
+ [95.95373470035588, 29.35921881015993],
+ [95.86313352662813, 29.32398502037684],
+ [95.79594038900007, 29.352886455000046],
+ [95.77640669800007, 29.345548401000073],
+ [95.74478072100004, 29.340432435000068],
+ [95.7473653601981, 29.27365103497256],
+ [95.71716496895556, 29.218283651027733],
+ [95.64669738938943, 29.22835044810863],
+ [95.59233524600006, 29.249688619000025],
+ [95.58168990100006, 29.24746653300012],
+ [95.57290490800006, 29.247259827000065],
+ [95.56442997300007, 29.2456061810001],
+ [95.55378462800007, 29.239043275000128],
+ [95.55068404100012, 29.230284119000046],
+ [95.55202762800008, 29.220129700000072],
+ [95.55016727700007, 29.212481588000017],
+ [95.51533736200014, 29.209432679000074],
+ [95.51192671700011, 29.19754709900006],
+ [95.52267541500004, 29.161192729000064],
+ [95.52143518100007, 29.13786082000003],
+ [95.51130660000013, 29.131788839000095],
+ [95.48757683710141, 29.068994487006023],
+ [95.42982403198397, 29.046524645630395],
+ [95.36740605062847, 29.03649616327051],
+ [95.2815531820001, 29.052672221000094],
+ [95.22491581200012, 29.05936431900001],
+ [95.21633752500009, 29.06499705000003],
+ [95.21406376100009, 29.07308441200003],
+ [95.21282352700013, 29.08186940500012],
+ [95.2078625900001, 29.089595032000105],
+ [95.19969771300003, 29.094245911000073],
+ [95.19153283800006, 29.096829733000092],
+ [95.11691206900008, 29.108095195000047],
+ [95.09903202400011, 29.113779603000083],
+ [95.04766564900007, 29.140806377000033],
+ [94.98906457600003, 29.15398386700012],
+ [94.89129276600005, 29.160495097000094],
+ [94.85408573500007, 29.17000356000007],
+ [94.81543176300005, 29.16886667900006],
+ [94.79879195200004, 29.1664378870001],
+ [94.77657108500011, 29.16669626900007],
+ [94.76148156800008, 29.174706116000053],
+ [94.76768273900007, 29.21385101300008],
+ [94.75641727800013, 29.230516663000017],
+ [94.70422408000013, 29.284699402000044],
+ [94.66846399000013, 29.306610209000084],
+ [94.6304301350001, 29.319451803000064],
+ [94.59994104000009, 29.316635437000016],
+ [94.5826811120001, 29.302915345000073],
+ [94.52862756400003, 29.2312401330001],
+ [94.51477828000009, 29.22105987600004],
+ [94.49824182200007, 29.21522043900005],
+ [94.47498742700003, 29.210802104000052],
+ [94.42238081900007, 29.210492045000066],
+ [94.39643925000013, 29.207081400000035],
+ [94.37287479700012, 29.19630686500001],
+ [94.36253951000009, 29.185325623000026],
+ [94.34631311100009, 29.1590739950001],
+ [94.33577111900013, 29.149617208000038],
+ [94.32378218600007, 29.146025696000052],
+ [94.28750533100003, 29.147937724000073],
+ [94.27078578096348, 29.097929973215642],
+ [94.30904814105469, 29.059667613124404],
+ [94.34731050114596, 29.024348511501685],
+ [94.29138859024334, 28.977256376004746],
+ [94.2501829716835, 28.933107498976327],
+ [94.17365825150097, 28.930164240507835],
+ [94.1353958914097, 28.897788397353693],
+ [94.07947398050715, 28.883072105010925],
+ [94.02684940600011, 28.864182435000075],
+ [94.01144982900013, 28.85302032500003],
+ [93.99201949100012, 28.844648743000064],
+ [93.99313607399837, 28.80188742309345],
+ [93.9815905577272, 28.768130860141966],
+ [93.96109345404737, 28.72994349590268],
+ [93.92778566056765, 28.68275160171495],
+ [93.86307969177443, 28.704870831024095],
+ [93.78174379684887, 28.68050383781251],
+ [93.72247522000009, 28.696647441000053],
+ [93.70552535000007, 28.69189320900007],
+ [93.66490848182954, 28.690238755807428],
+ [93.64341027900008, 28.680240174000105],
+ [93.62553023300006, 28.67235951800005],
+ [93.60713342300005, 28.672204488000105],
+ [93.55173628800009, 28.67894826200005],
+ [93.44621301300003, 28.671894430000023],
+ [93.35543239724171, 28.624065359777703],
+ [93.31717003715039, 28.603462550497838],
+ [93.30284340070244, 28.556921073348917],
+ [93.2869721652333, 28.520517242676647],
+ [93.25906765301328, 28.496023260000364],
+ [93.21883846222534, 28.457435846387227],
+ [93.1862858334245, 28.431995228097378],
+ [93.21807344565363, 28.39464655767386],
+ [93.20782489381371, 28.340539283245555],
+ [93.12982812476821, 28.325961566073488],
+ [93.04639880818196, 28.302097099545048],
+ [92.97492395000006, 28.28230580700007],
+ [92.96035119600003, 28.270213521000088],
+ [92.92200728300008, 28.25863800100005],
+ [92.90381717900004, 28.2496979780001],
+ [92.88955448400009, 28.23582285600004],
+ [92.8653699140001, 28.20520457000002],
+ [92.85028039600013, 28.19194956500003],
+ [92.8347774660001, 28.183526306000132],
+ [92.81989465400005, 28.17926300100008],
+ [92.80532190000008, 28.17802276700003],
+ [92.79023238100007, 28.178901266000068],
+ [92.78537479700009, 28.183293762000076],
+ [92.78289432800011, 28.190941874000046],
+ [92.77917362500011, 28.195902812],
+ [92.7700785720001, 28.192182108000097],
+ [92.70786014900011, 28.155414328000106],
+ [92.67861128800007, 28.133064270000105],
+ [92.65484012900009, 28.105830790000127],
+ [92.63727014200003, 28.071982728000123],
+ [92.63892378800006, 28.057487488000092],
+ [92.65422001100012, 28.052087301000128],
+ [92.68925663200014, 28.048314921],
+ [92.70134891800006, 28.037824606000058],
+ [92.70134891800006, 28.025241394000133],
+ [92.73639150917766, 27.98590893651867],
+ [92.71077012957788, 27.949702392409918],
+ [92.68367428669768, 27.910450219011963],
+ [92.63646812873851, 27.89536981004999],
+ [92.59291178341888, 27.868193283595886],
+ [92.57497681769904, 27.847806414432647],
+ [92.51815087726021, 27.839468002981643],
+ [92.47510949800005, 27.846595968000074],
+ [92.43903934800005, 27.823289897000066],
+ [92.42756717900005, 27.82117116400009],
+ [92.41733524600005, 27.828948466],
+ [92.40441613800004, 27.85383066900006],
+ [92.39284061800004, 27.85602691700005],
+ [92.38105839100012, 27.842461853000074],
+ [92.37558068800013, 27.821119487000075],
+ [92.36793257700003, 27.80383372000007],
+ [92.35005253100007, 27.802541809000033],
+ [92.33982059800013, 27.815564270000053],
+ [92.33465295400003, 27.83127390600002],
+ [92.32917525300013, 27.832927552000072],
+ [92.31728967300006, 27.80367869100003],
+ [92.30385380100006, 27.786160380000055],
+ [92.28876428200005, 27.793085022000056],
+ [92.27522505700006, 27.81168853700011],
+ [92.25827518700004, 27.848197937000023],
+ [92.24918013500007, 27.862641500000038],
+ [92.23956831900006, 27.865276998000056],
+ [92.1262935790001, 27.81272206600009],
+ [92.10615954418942, 27.786080717238843],
+ [92.06487820550117, 27.76172129397611],
+ [91.98889765320416, 27.76939841380579],
+ [91.96800093766346, 27.746278233869482],
+ [91.95224735500011, 27.724820455],
+ [91.90873579900006, 27.731900126000127],
+ [91.86491418500009, 27.72998809800002],
+ [91.85637335954294, 27.764539482011514],
+ [91.82658872441321, 27.807627271770244],
+ [91.72987134422583, 27.804136158001306],
+ [91.68013149075769, 27.849823277598603],
+ [91.6283394780001, 27.852693787000035],
+ [91.6371244710001, 27.87724009300011],
+ [91.64890669800008, 27.897213033000057],
+ [91.65283410700005, 27.91674672500004],
+ [91.63795129500011, 27.93974273700009],
+ [91.62172489400012, 27.950723979000074],
+ [91.6006409100001, 27.959276429000013],
+ [91.57862675000007, 27.96470245400009],
+ [91.53749231000012, 27.969353333000058],
+ [91.49749475100003, 27.98408111600004],
+ [91.4609078370001, 27.98436533600004],
+ [91.44643843600005, 27.986354879000075],
+ [91.43648287100012, 27.989375107000015],
+ [91.41884322100009, 27.99472646100004],
+ [91.34143192600004, 28.03056406700007],
+ [91.3095992430001, 28.056402283000082],
+ [91.29016890500003, 28.0914130660001],
+ [91.26970503800004, 28.072861227000075],
+ [91.24614058500003, 28.071465963],
+ [91.2206124270001, 28.07487660700012],
+ [91.19467085800005, 28.07058746400004],
+ [91.17586063600004, 28.057487488000092],
+ [91.13379602000003, 28.01410512300002],
+ [91.11963667900005, 27.994881490000083],
+ [91.11942997200003, 27.99472646100004],
+ [91.09255822800003, 27.97167877200006],
+ [91.05194055200008, 27.96279042600007],
+ [91.00884240800008, 27.966769512000056],
+ [90.97514937400013, 27.982091573],
+ [90.96057662000004, 27.99472646100004],
+ [90.90952030400007, 28.032656963000036],
+ [90.85091923100009, 28.044025777000044],
+ [90.78870080600007, 28.047488098000073],
+ [90.75527753600005, 28.055173215000096],
+ [90.7268957930001, 28.06169911800005],
+ [90.6839010010001, 28.087072245000044],
+ [90.66746789600012, 28.090327860000016],
+ [90.65103479000004, 28.086994731000104],
+ [90.62188928300003, 28.0729645790001],
+ [90.59739465400008, 28.07058746400004],
+ [90.57527714000008, 28.06583323200006],
+ [90.51006148300007, 28.074101461000012],
+ [90.49259484900011, 28.074411519000094],
+ [90.4752315670001, 28.07234446300002],
+ [90.48566935150171, 28.12465735277827],
+ [90.51529856561535, 28.154286566892026],
+ [90.54821991463052, 28.157578701793526],
+ [90.56797272403975, 28.19050005080878],
+ [90.59760193815339, 28.200376455513336],
+ [90.58772553344886, 28.233297804528476],
+ [90.54821991463052, 28.246466344134532],
+ [90.50542216091083, 28.249758479036117],
+ [90.45604013738802, 28.282679828051258],
+ [90.41653451856979, 28.282679828051258],
+ [90.38690530445604, 28.2991405025589],
+ [90.35398395544087, 28.2991405025589],
+ [90.32950402800009, 28.25579579700006],
+ [90.29147017500009, 28.261351014000084],
+ [90.2618041781983, 28.2991405025589],
+ [90.2618041781983, 28.335353986475624],
+ [90.22559069428155, 28.358398930786237],
+ [90.1992536150695, 28.34852252608168],
+ [90.1762086707588, 28.325477581771068],
+ [90.15316372644816, 28.322185446869483],
+ [90.12353451233452, 28.335353986475624],
+ [90.07086035391018, 28.34523039118018],
+ [89.99045495700005, 28.32062388100009],
+ [89.97159305900004, 28.318040060000087],
+ [89.95252445500006, 28.30824737600004],
+ [89.91613001353875, 28.31560117706651],
+ [89.88131433100011, 28.29752451600011],
+ [89.87361454300003, 28.300599263000052],
+ [89.86291752100004, 28.295793356000033],
+ [89.85402917500011, 28.28726674400012],
+ [89.83862959800013, 28.267913921000073],
+ [89.82974125100003, 28.259154765000076],
+ [89.79604821800007, 28.240189515000054],
+ [89.78085534700011, 28.228769023000027],
+ [89.77362064600004, 28.21277516700009],
+ [89.75584395400011, 28.184378967000058],
+ [89.71781010000007, 28.169082744000022],
+ [89.59781742400008, 28.149807434000067],
+ [89.57942061400007, 28.144639791000074],
+ [89.56148889100012, 28.134640401000055],
+ [89.51503177900008, 28.081904602000023],
+ [89.49534305900005, 28.06800364200005],
+ [89.47534428000012, 28.061337382000133],
+ [89.45880782100011, 28.04779815700006],
+ [89.44454512600004, 28.031184184000054],
+ [89.42118737800007, 27.99472646100004],
+ [89.42098067200004, 27.99472646100004],
+ [89.41736367800007, 27.988654027000038],
+ [89.37013106300003, 27.90935699500004],
+ [89.33602461800007, 27.8690752160001],
+ [89.29948938000013, 27.844244690000053],
+ [89.25871667500007, 27.827553203000022],
+ [89.22492028800008, 27.807812806000058],
+ [89.21659020133723, 27.77114152368786],
+ [89.19820315021519, 27.730581852095057],
+ [89.15602109175876, 27.665686377546805],
+ [89.1273589238333, 27.627289888438966],
+ [89.12465494572706, 27.614851589150547],
+ [89.11948401016275, 27.61820054938572],
+ [89.10956515172722, 27.62225826420017],
+ [89.1058645948479, 27.62295211861509],
+ [89.10235143650146, 27.623610835805025],
+ [89.09153086366274, 27.62586512181302],
+ [89.06402857436444, 27.615946263377637],
+ [89.05095371551772, 27.60828169095022],
+ [89.0396822854774, 27.594305117700188],
+ [89.03337028465484, 27.57897597284547],
+ [89.01623771099366, 27.57581997243416],
+ [89.00271199494523, 27.560490827579358],
+ [89.00496628095334, 27.549670254740633],
+ [88.99279313650976, 27.53749711029714],
+ [88.97836570605818, 27.53028339507135],
+ [88.97295541963888, 27.517659393426257],
+ [88.97520970564693, 27.506838820587532],
+ [88.98004625332288, 27.497980380569217],
+ [88.98296649296316, 27.49263177875116],
+ [88.96620182870481, 27.478030296977792],
+ [88.95754909876507, 27.456939267749547],
+ [88.95105955131027, 27.433144260415148],
+ [88.96401118394226, 27.392923642327176],
+ [88.98117510746783, 27.35463488984705],
+ [88.99701872918376, 27.33086945727318],
+ [88.97193299480028, 27.312385231937938],
+ [88.95080816584573, 27.32822885365387],
+ [88.91516001698494, 27.33086945727318],
+ [88.89233077000011, 27.315543111000082],
+ [88.86463220200005, 27.332389628000087],
+ [88.85202315300006, 27.342363180000078],
+ [88.8308358160001, 27.36732289600006],
+ [88.8198287350001, 27.37362742200007],
+ [88.80820153800005, 27.378381653000062],
+ [88.79538578300009, 27.385926412000018],
+ [88.77357832900003, 27.408509013000057],
+ [88.75978072200007, 27.435070699000065],
+ [88.75435469600012, 27.464216207000092],
+ [88.75719689900006, 27.49496368400004],
+ [88.75755863400008, 27.511448466000033],
+ [88.74164229300004, 27.531679789000023],
+ [88.7410221770001, 27.545709941000027],
+ [88.74815352400003, 27.560127666000042],
+ [88.76737715600007, 27.586198425000035],
+ [88.78308679200012, 27.622036031000064],
+ [88.80566939300007, 27.655108948000063],
+ [88.85388350400007, 27.843676249000097],
+ [88.85507206300008, 27.859179179000094],
+ [88.85155806500012, 27.877162577],
+ [88.84277307100012, 27.892407125000133],
+ [88.81889856000004, 27.91519643200003],
+ [88.81068200700014, 27.927857158000066],
+ [88.80975183200007, 27.9444969690001],
+ [88.81967370600006, 27.977337342000013],
+ [88.81771000200013, 27.99472646100004],
+ [88.81771000200013, 27.994881490000083],
+ [88.8175032960001, 27.994881490000083],
+ [88.80293054200013, 28.011004537000062],
+ [88.78014123500003, 28.028341980000064],
+ [88.73564782700004, 28.055265402000074],
+ [88.7101196700001, 28.061983337000115],
+ [88.65203536000013, 28.069398906000018],
+ [88.63167484600007, 28.083351542000017],
+ [88.61048750800012, 28.105830790000127],
+ [88.59400272600004, 28.106605937000026],
+ [88.55281660900005, 28.078054708000067],
+ [88.53080245000007, 28.0590119430001],
+ [88.5171598720001, 28.039581604000105],
+ [88.50207035300008, 28.02888458300002],
+ [88.47540531400011, 28.036248474000033],
+ [88.45576827000008, 28.03152008100004],
+ [88.39990604700012, 27.994881490000083],
+ [88.39985437100012, 27.99472646100004],
+ [88.39975101800007, 27.99472646100004],
+ [88.37877038600004, 27.982634176000047],
+ [88.19785119700003, 27.95829457600003],
+ [88.17485518400008, 27.94976796500002],
+ [88.16296960500006, 27.946899923000032],
+ [88.15118737800003, 27.947209982000018],
+ [88.12669274900009, 27.950439759000105],
+ [88.11573734600012, 27.947261658000045],
+ [88.09992435700008, 27.928322246000093],
+ [88.09749556500003, 27.904008484000073],
+ [88.10488529500003, 27.8797205610001],
+ [88.11821781400005, 27.860884501000058],
+ [88.09573856600008, 27.86532867500007],
+ [88.05279545100012, 27.88651601100004],
+ [88.02995446800008, 27.893337301000074],
+ [88.01812056500006, 27.892148743000078],
+ [87.99181726100005, 27.882640280000075],
+ [87.9784330650001, 27.880521545000093],
+ [87.96639245600011, 27.8827436320001],
+ [87.9452051190001, 27.892303772],
+ [87.93455977400009, 27.895301006000025],
+ [87.85611495000006, 27.898608297000024],
+ [87.83668461200006, 27.908323467000073],
+ [87.82588423700014, 27.906566467000076],
+ [87.81415368700004, 27.890960185000054],
+ [87.79865075700013, 27.863468323000077],
+ [87.77984053500012, 27.839438782000045],
+ [87.75637943500004, 27.82037017900005],
+ [87.72682051600003, 27.807761129000042],
+ [87.70046553600008, 27.80564239500005],
+ [87.67852882500011, 27.813351022000077],
+ [87.65995121300006, 27.819879252000035],
+ [87.63607670100009, 27.82365163200005],
+ [87.62109053600011, 27.81954335600004],
+ [87.58998132300013, 27.804608867000084],
+ [87.57334151200013, 27.805022278000095],
+ [87.56507328300006, 27.810861715000087],
+ [87.55980228700014, 27.819078268000013],
+ [87.5559782310001, 27.827088115],
+ [87.55132735200004, 27.83189402300009],
+ [87.53158695500008, 27.836803284000027],
+ [87.51453373200013, 27.835201314000088],
+ [87.47556970200009, 27.82670054200007],
+ [87.38678959100014, 27.804402161000027],
+ [87.36911625200014, 27.803937073],
+ [87.36911625200014, 27.819078268000013],
+ [87.38069177200009, 27.83582143200006],
+ [87.38534265100003, 27.849412334000064],
+ [87.36384525500011, 27.855251770000038],
+ [87.33583662900008, 27.846363424000018],
+ [87.31392582200004, 27.8285867310001],
+ [87.29051639800008, 27.816081035000096],
+ [87.23289717600005, 27.829723613000013],
+ [87.18199589000011, 27.82450429300009],
+ [87.15579593900009, 27.825796204000042],
+ [87.11652185100013, 27.84458058700004],
+ [87.06200321500012, 27.9084268190001],
+ [87.03053226700013, 27.938089091000037],
+ [87.0056759040001, 27.951499126],
+ [86.98872603400008, 27.952480978000054],
+ [86.98209267100003, 27.950674405000072],
+ [86.97022587100014, 27.947442525],
+ [86.94035689300006, 27.943101705000018],
+ [86.91472538200009, 27.945117086000053],
+ [86.89307295800012, 27.954186300000018],
+ [86.87689823400012, 27.970645243],
+ [86.86816491700012, 27.99472646100004],
+ [86.86816491700012, 27.994881490000083],
+ [86.84046634900011, 28.014776917000077],
+ [86.76997969600006, 28.01208974300006],
+ [86.73980065900014, 28.02149485300002],
+ [86.7322042240001, 28.03495656300008],
+ [86.73597660400003, 28.064851380000093],
+ [86.73173913600004, 28.07691782600007],
+ [86.71768314700006, 28.088260804000058],
+ [86.69964807100013, 28.098751119],
+ [86.68006270300003, 28.105727437],
+ [86.66197595200009, 28.106838481000082],
+ [86.64947025600003, 28.101179911000074],
+ [86.62714603700005, 28.08348073300006],
+ [86.6123149010001, 28.080276794000085],
+ [86.59686364700013, 28.086503805000078],
+ [86.58311771700005, 28.098027649000088],
+ [86.56952681500007, 28.106605937000026],
+ [86.55355879700005, 28.104151306000077],
+ [86.54415368700006, 28.09301503600004],
+ [86.54125980600003, 28.078209738000012],
+ [86.54074304200009, 28.06216420600005],
+ [86.53836592600004, 28.047178040000077],
+ [86.5309245200001, 28.03369049100003],
+ [86.52229455600013, 28.02371694000003],
+ [86.51619673700009, 28.012244771],
+ [86.51645511900006, 27.99472646100004],
+ [86.51676433500006, 27.971432200000024],
+ [86.51046065300005, 27.952429301000038],
+ [86.49692142700007, 27.937882385000094],
+ [86.47547570800003, 27.927598775],
+ [86.43883711700005, 27.91085561100006],
+ [86.42529789200012, 27.909925435],
+ [86.40571252400008, 27.917005107000122],
+ [86.37196781400013, 27.941964824000095],
+ [86.36297611500004, 27.946098938000105],
+ [86.35367435800003, 27.944807028000085],
+ [86.34561283400006, 27.940931295000027],
+ [86.33755131000004, 27.93803741500004],
+ [86.3277327880001, 27.93969106100009],
+ [86.31822432400003, 27.945788880000052],
+ [86.29465987200012, 27.97237640400006],
+ [86.27807173600007, 27.98369354300003],
+ [86.25900313300014, 27.987646790000028],
+ [86.23853926600003, 27.98955881800005],
+ [86.21838545700007, 27.99472646100004],
+ [86.21792037000006, 27.99493316600008],
+ [86.21776534000003, 27.99498484300001],
+ [86.20303755700013, 28.00258127900007],
+ [86.19600956200009, 28.01457021100002],
+ [86.18913659700013, 28.043612366000033],
+ [86.18185022000006, 28.054877828000073],
+ [86.17446049000006, 28.062448425000028],
+ [86.17223840400004, 28.071827698000092],
+ [86.18076501500008, 28.088751729000094],
+ [86.18717289300008, 28.108698832000087],
+ [86.18603601100011, 28.133529358000047],
+ [86.17601078300004, 28.15301137300004],
+ [86.1559603280001, 28.156525371],
+ [86.06873050900003, 28.07676279700003],
+ [86.07017745000013, 28.066711731000098],
+ [86.0815462650001, 28.0516997270001],
+ [86.08469852700006, 28.04387074800009],
+ [86.08392338100003, 28.038548076000055],
+ [86.07953088400006, 28.021649882000062],
+ [86.07953088400006, 28.013329977000083],
+ [86.07761885600013, 28.00694793700005],
+ [86.07916914900005, 28.001134339000075],
+ [86.08929772900012, 27.994881490000083],
+ [86.08940108300004, 27.994881490000083],
+ [86.08940108300004, 27.99472646100004],
+ [86.09813439900012, 27.985631409000078],
+ [86.09803104700006, 27.977518209000053],
+ [86.09508549000009, 27.968888245000116],
+ [86.09560225500013, 27.957855326000114],
+ [86.10056319200004, 27.950233053000048],
+ [86.10717777500008, 27.9442385870001],
+ [86.11224206500003, 27.93726226900013],
+ [86.11286218300012, 27.926797791000084],
+ [86.10717777500008, 27.922844544],
+ [86.07565515100009, 27.894784241000067],
+ [86.06170251500009, 27.889048157000033],
+ [86.05459969400005, 27.888013072],
+ [86.0514189050001, 27.887549540000023],
+ [86.02645918800005, 27.88992665600007],
+ [85.98026045800009, 27.88517242400006],
+ [85.9626904700001, 27.891373596000065],
+ [85.95121830300008, 27.916229961000013],
+ [85.95183841900007, 27.936797181000102],
+ [85.95628259300008, 27.956873474000062],
+ [85.95659265100005, 27.9762262980001],
+ [85.94398360200012, 27.99472646100004],
+ [85.9089469810001, 28.022425029000075],
+ [85.8983016360001, 28.03601593000006],
+ [85.89044681900009, 28.059192810000056],
+ [85.88982670100012, 28.071259257000023],
+ [85.89106693500014, 28.080896912000057],
+ [85.88910323100004, 28.090276184000103],
+ [85.87173995000006, 28.110920919000094],
+ [85.86703739500012, 28.13293508],
+ [85.86336836800012, 28.14334788000012],
+ [85.84827885000004, 28.158928325000048],
+ [85.82688480700011, 28.170478007],
+ [85.78275313300003, 28.188099671000074],
+ [85.7566048590001, 28.203240866],
+ [85.7344873450001, 28.221534323000057],
+ [85.71557377100004, 28.243367615000082],
+ [85.69976078300004, 28.269102478],
+ [85.6980037840001, 28.31344085700003],
+ [85.69293949400003, 28.33522247300006],
+ [85.67914188700007, 28.332897034000027],
+ [85.67598962500011, 28.32473215800009],
+ [85.67619633000004, 28.315120341000082],
+ [85.67505944900006, 28.306387024000017],
+ [85.66813480600007, 28.30054758800013],
+ [85.6469474700001, 28.293700460000068],
+ [85.6390926520001, 28.287886862000093],
+ [85.61180749500005, 28.251144918000094],
+ [85.59894006300004, 28.25083486000004],
+ [85.58550419100004, 28.263185526000072],
+ [85.56529870600014, 28.27538116400008],
+ [85.54369795800005, 28.28039377900005],
+ [85.5206502690001, 28.282925924000054],
+ [85.49755090300005, 28.282615865000068],
+ [85.47569177300011, 28.279101868000012],
+ [85.4466496170001, 28.29215016700006],
+ [85.43156010000007, 28.297059428000082],
+ [85.41523034700003, 28.2964393110001],
+ [85.40138106300009, 28.288791199000045],
+ [85.37781661000008, 28.265976054000035],
+ [85.36257206200014, 28.259671529000016],
+ [85.3453638100001, 28.261247660000052],
+ [85.33482181800008, 28.268689067000068],
+ [85.32572676600006, 28.277396546000134],
+ [85.31260095200008, 28.282770895000098],
+ [85.30102543200013, 28.28106557200003],
+ [85.27312015800004, 28.269825949000094],
+ [85.25958093300005, 28.266932068000088],
+ [85.24340620900006, 28.267913921000073],
+ [85.22392419500005, 28.2716863000001],
+ [85.20573409100012, 28.278275045000086],
+ [85.1735913490001, 28.30431996600005],
+ [85.15457442200005, 28.30085764600001],
+ [85.13416223200011, 28.291969300000105],
+ [85.10940922100008, 28.292253520000074],
+ [85.08739506100005, 28.304113261000097],
+ [85.08021203600003, 28.318789368000083],
+ [85.0818671020001, 28.331702005000082],
+ [85.08568973800004, 28.361525777000097],
+ [85.08568973800004, 28.38100779200009],
+ [85.07757653800013, 28.435681457000058],
+ [85.08367435700006, 28.44552581800012],
+ [85.10946089700008, 28.45929758700005],
+ [85.11555871600012, 28.4727334600001],
+ [85.11566206800006, 28.491492005000012],
+ [85.11721236200009, 28.4973314410001],
+ [85.1231551510001, 28.504591980000058],
+ [85.14036340400008, 28.510922343000075],
+ [85.14764978100004, 28.515831604000127],
+ [85.15374760000003, 28.52490081800009],
+ [85.1569515380001, 28.533143209000045],
+ [85.16801029400006, 28.583191833000043],
+ [85.16098230000006, 28.59499989900003],
+ [85.11188968900012, 28.6088233440001],
+ [85.07504439300004, 28.6316643280001],
+ [85.05494226100006, 28.63869232200001],
+ [85.03210127800014, 28.634067281000043],
+ [85.02527998900013, 28.62840871200011],
+ [85.01876875900012, 28.619856262],
+ [85.00915694200012, 28.60254465700008],
+ [85.00249068200003, 28.594431458000074],
+ [84.99406742400004, 28.5908141070001],
+ [84.9847656660001, 28.588592021000082],
+ [84.95494836400007, 28.57430348700011],
+ [84.94895389800007, 28.568283183000077],
+ [84.93644820200007, 28.544770406000097],
+ [84.92849003100008, 28.53846588100008],
+ [84.91872318600014, 28.535675354000105],
+ [84.90787113500011, 28.537018942000074],
+ [84.89143802900003, 28.541773173000067],
+ [84.87929406700005, 28.54363352400007],
+ [84.82394860900007, 28.540532939000045],
+ [84.81195967600013, 28.54197987900004],
+ [84.79914392100005, 28.54663075800009],
+ [84.78178064000014, 28.558903910000126],
+ [84.75563236500005, 28.58541392100004],
+ [84.73661543800006, 28.594173075000114],
+ [84.69083011900005, 28.596136780000037],
+ [84.67775598100008, 28.604405009000075],
+ [84.68297530100011, 28.65075876900009],
+ [84.67114139800009, 28.658949483000114],
+ [84.65227950100007, 28.66238596600006],
+ [84.63264245600004, 28.668793844000092],
+ [84.62582116700008, 28.676080221000078],
+ [84.61620935100007, 28.693650207000033],
+ [84.6072176510001, 28.69819773400006],
+ [84.55182051600008, 28.7063884490001],
+ [84.53197676600007, 28.712692973000017],
+ [84.51564701300003, 28.721400452000083],
+ [84.49859379100008, 28.72786000600003],
+ [84.4757528080001, 28.727291565000073],
+ [84.45084476800014, 28.73388031000006],
+ [84.43782230700009, 28.753336487000055],
+ [84.42273278800008, 28.79917348300002],
+ [84.41430953000008, 28.808268534],
+ [84.39307051600014, 28.82433990500006],
+ [84.37658573500005, 28.848834534],
+ [84.36630212500006, 28.85674102800006],
+ [84.3540031330001, 28.861288554000097],
+ [84.28599694900004, 28.873742574000076],
+ [84.23514733900004, 28.900020040000115],
+ [84.2252905100001, 28.914115306],
+ [84.20672530100012, 28.940663554000068],
+ [84.2314266360001, 29.025981343000026],
+ [84.22057458500007, 29.03890045200005],
+ [84.19819869000008, 29.045308329000093],
+ [84.17546106000009, 29.05740061400006],
+ [84.16972497600005, 29.08892323900004],
+ [84.16621097900008, 29.098457540000126],
+ [84.16011316000004, 29.105485535000028],
+ [84.13799564600004, 29.124657492000054],
+ [84.13225956200006, 29.143803609000045],
+ [84.14171634900003, 29.160262554000028],
+ [84.15520389800008, 29.175946351000093],
+ [84.16166345300007, 29.19253448500008],
+ [84.15546228100004, 29.206642151000025],
+ [84.14197473200011, 29.208269959000077],
+ [84.12600671400008, 29.2062545780001],
+ [84.11236413600005, 29.20909678200009],
+ [84.10533614100007, 29.219922994000044],
+ [84.09913496900009, 29.247001445000095],
+ [84.08972985800011, 29.256613261],
+ [84.07205651900011, 29.256974996000096],
+ [84.05303959200006, 29.25036041300011],
+ [84.0352112220001, 29.24762156200005],
+ [84.02151696800007, 29.25976552300007],
+ [84.01252526900004, 29.270204163000088],
+ [84.00089807100005, 29.27252960200012],
+ [83.98823734600012, 29.269532369],
+ [83.97583500200005, 29.263744609000028],
+ [83.97325118100008, 29.277025452000046],
+ [83.96725671400003, 29.284699402000044],
+ [83.9579549560001, 29.289040222000025],
+ [83.94555261300013, 29.291830750000074],
+ [83.93315026800008, 29.291779073000058],
+ [83.91439172400004, 29.28940195700001],
+ [83.88343754100003, 29.282012228],
+ [83.87739139900003, 29.276767070000076],
+ [83.86886478700012, 29.263434550000042],
+ [83.86163008600005, 29.26020477300007],
+ [83.83785892700007, 29.254003601000093],
+ [83.79321049000004, 29.23475413100006],
+ [83.77062788900008, 29.232247824000083],
+ [83.74535811400006, 29.234469910000072],
+ [83.71972660300008, 29.233591411000035],
+ [83.6954903570001, 29.22617584200013],
+ [83.67507816600005, 29.208760885000103],
+ [83.66774011200005, 29.192327780000127],
+ [83.66339929300005, 29.174809469000067],
+ [83.65600956200007, 29.160779318000053],
+ [83.65499238900003, 29.160413575000078],
+ [83.63926639800013, 29.15475901300003],
+ [83.62443526200008, 29.155456645000115],
+ [83.58381758700006, 29.16214874300003],
+ [83.57203536000003, 29.168401592000023],
+ [83.56139001500003, 29.176230570000072],
+ [83.53596521000003, 29.179227804000064],
+ [83.52371789500012, 29.183594462000073],
+ [83.51705163600008, 29.19170766200007],
+ [83.51457116700004, 29.201810405000018],
+ [83.51250410900008, 29.223488668000087],
+ [83.50299564700009, 29.26103159600011],
+ [83.49338383000008, 29.276146952000104],
+ [83.47581384300008, 29.28692148900005],
+ [83.44821862800012, 29.29676584900001],
+ [83.4372115480001, 29.30524078400002],
+ [83.42816817300007, 29.33345611600008],
+ [83.41778120900005, 29.340897523000095],
+ [83.40501713000009, 29.3464785770001],
+ [83.39313155100012, 29.35624542300006],
+ [83.38827396600004, 29.37022389700006],
+ [83.38941084800013, 29.382445374],
+ [83.38724043800005, 29.393504130000096],
+ [83.35700972500013, 29.415363261000024],
+ [83.35520105000012, 29.427972310000072],
+ [83.35778487100004, 29.44275177100006],
+ [83.35520105000012, 29.460735168000056],
+ [83.32796757000006, 29.48502309200005],
+ [83.26394047000014, 29.47300832100008],
+ [83.24719730600009, 29.49473826100011],
+ [83.24874760000012, 29.506572164000104],
+ [83.25401859500005, 29.513290101000038],
+ [83.25990970900006, 29.518767802000028],
+ [83.26332035400009, 29.52708770800008],
+ [83.26083988500011, 29.542048035000064],
+ [83.25257165600004, 29.555199687000126],
+ [83.22931726100012, 29.575947774000056],
+ [83.22187585400007, 29.579823507000114],
+ [83.2049259850001, 29.58491363600011],
+ [83.19717452000009, 29.58909942700005],
+ [83.19448734600007, 29.59364695300006],
+ [83.19086999600006, 29.606901957000062],
+ [83.18725264500011, 29.612095439000072],
+ [83.17355839100009, 29.62126800500009],
+ [83.16208622200014, 29.625169576000033],
+ [83.15004561400008, 29.62563466400006],
+ [83.12668786600005, 29.623412577000053],
+ [83.10028120900006, 29.617676493000104],
+ [83.09335656700006, 29.615144349000033],
+ [83.08844730700014, 29.604421488000085],
+ [83.08555342600005, 29.59039133800009],
+ [83.07955896000004, 29.579642640000074],
+ [83.06493453000007, 29.57878997800013],
+ [83.05449589000011, 29.586050517],
+ [83.04090498800014, 29.610286764000094],
+ [83.03289514200009, 29.620467021000067],
+ [82.9758960370001, 29.664030253000092],
+ [82.96432051600004, 29.665890605000087],
+ [82.9420996500001, 29.6629450490001],
+ [82.93191939300004, 29.664185283000037],
+ [82.92370284000009, 29.669662984000027],
+ [82.90913008600012, 29.684623312],
+ [82.89972497600007, 29.688421529000024],
+ [82.88008793200004, 29.68110931400004],
+ [82.8574536540001, 29.666200664000073],
+ [82.83657637600004, 29.65979278600004],
+ [82.82236535700014, 29.67795705200008],
+ [82.81554406800012, 29.690126851000073],
+ [82.80515710500009, 29.695966289000083],
+ [82.7930648200001, 29.699506124000052],
+ [82.78107588700004, 29.705113017000073],
+ [82.77012048400007, 29.71415639300001],
+ [82.75151696800003, 29.73932281500005],
+ [82.69095218900003, 29.780741476000017],
+ [82.68175378500007, 29.797717183000103],
+ [82.68464766500006, 29.809706116000072],
+ [82.68919519100007, 29.81957631400006],
+ [82.68898848500004, 29.827741191000072],
+ [82.67730961100006, 29.834407451000075],
+ [82.66697432500013, 29.83502756700007],
+ [82.64640710500004, 29.82934316100001],
+ [82.63586511200009, 29.829033101000036],
+ [82.61850183100006, 29.839833476000067],
+ [82.54181400500005, 29.923239238000022],
+ [82.52424401900004, 29.932385966000098],
+ [82.47582320100008, 29.945511780000075],
+ [82.4570646570001, 29.9540900680001],
+ [82.43892622900006, 29.965768942000082],
+ [82.4228548590001, 29.979669902000055],
+ [82.40978072100006, 29.99460439100001],
+ [82.39443282100007, 30.00313100200013],
+ [82.37913659700013, 30.00323435500006],
+ [82.36373702000003, 30.001167298],
+ [82.34730391400007, 30.003441061000032],
+ [82.33908736200004, 30.009228821000093],
+ [82.32715010600009, 30.025713603000057],
+ [82.31888187700014, 30.031811422000132],
+ [82.2965059820001, 30.036824036],
+ [82.27599043800012, 30.036927388000024],
+ [82.25573327600011, 30.039666240000074],
+ [82.21067142800007, 30.064419251000075],
+ [82.19217126400014, 30.06147369400007],
+ [82.17423954300006, 30.055479228000067],
+ [82.15382735200012, 30.058166402],
+ [82.14452559400007, 30.069431865000055],
+ [82.13522383600014, 30.08974070200007],
+ [82.12871260600008, 30.110773010000074],
+ [82.1275757250001, 30.124363912000078],
+ [82.15098514800013, 30.162242737000057],
+ [82.15568770300013, 30.181363017000066],
+ [82.14039148000006, 30.194023743000102],
+ [82.11424320500004, 30.202188619000125],
+ [82.09589807100008, 30.21345408200007],
+ [82.0849943450001, 30.2308173630001],
+ [82.08210046400012, 30.25732737300011],
+ [82.09321089700006, 30.31473988900011],
+ [82.08876672400004, 30.330087789000075],
+ [82.07321211800013, 30.337219137000105],
+ [82.04985437000005, 30.339234518000055],
+ [82.00763472500006, 30.336805726000094],
+ [81.99817793800014, 30.33406687500006],
+ [81.98846276900008, 30.329777731],
+ [81.97885095300006, 30.326832174000074],
+ [81.96903243000008, 30.32827911400007],
+ [81.96210778900013, 30.333653463000033],
+ [81.95011885600007, 30.348381246000045],
+ [81.94123050900004, 30.353962301000067],
+ [81.92149011200007, 30.35737294600007],
+ [81.88717696200007, 30.35499583000005],
+ [81.84438887500005, 30.371170553000027],
+ [81.82278812700008, 30.368173320000025],
+ [81.80149743700008, 30.36130035400005],
+ [81.77901818800007, 30.35804473900008],
+ [81.7573657640001, 30.362902324000075],
+ [81.63571944200004, 30.410961406000055],
+ [81.61401534000004, 30.416904195000072],
+ [81.59158776800007, 30.414268697000054],
+ [81.58507653800007, 30.408119202000066],
+ [81.58197595200005, 30.399437561000113],
+ [81.57670495600007, 30.390962626000103],
+ [81.56326908400007, 30.385588277000053],
+ [81.54425215700007, 30.38264272100004],
+ [81.53681075100008, 30.378560283000056],
+ [81.53195316600005, 30.370343730000016],
+ [81.52068770400007, 30.33194814000008],
+ [81.5093705650001, 30.328382467000026],
+ [81.48306726100009, 30.331896464000053],
+ [81.46281010000007, 30.34135325100003],
+ [81.4261198320001, 30.372514140000092],
+ [81.40741296400012, 30.37918040000001],
+ [81.38751753800011, 30.37390940300007],
+ [81.3848820400001, 30.360938619000066],
+ [81.38725915500004, 30.345125631000045],
+ [81.38214318800004, 30.3312763470001],
+ [81.37154952000009, 30.3169102990001],
+ [81.36803552300012, 30.30104563400009],
+ [81.36901737500006, 30.26606068900007],
+ [81.3705159910001, 30.257275696000093],
+ [81.37692386900011, 30.241204325000027],
+ [81.37785404500005, 30.232626038],
+ [81.37439172400013, 30.223117574000113],
+ [81.36183435100014, 30.20477244100003],
+ [81.35728682500007, 30.173559876000056],
+ [81.35005212400011, 30.157230123000105],
+ [81.33826989700003, 30.143535868000086],
+ [81.3224052330001, 30.133769023000028],
+ [81.30953780200008, 30.132063701000064],
+ [81.29325972600009, 30.132838847000087],
+ [81.27770511900007, 30.131856995000092],
+ [81.26695642100003, 30.125087382000075],
+ [81.26633630400005, 30.117749329000063],
+ [81.27450118000007, 30.10219472300004],
+ [81.27594812100006, 30.09537343300009],
+ [81.27202071100004, 30.07992218],
+ [81.2679026460001, 30.07205300500003],
+ [81.2668013920001, 30.06994862900008],
+ [81.25708622300004, 30.063540752000037],
+ [81.2395162360001, 30.058786520000055],
+ [81.22571862800004, 30.050466614000086],
+ [81.22726892100007, 30.022457987000095],
+ [81.21683028200005, 30.008195292000025],
+ [81.19450606300006, 30.004474589],
+ [81.14810062700013, 30.02323313400008],
+ [81.12458785000007, 30.02276804700007],
+ [81.09776778200006, 30.01692860900009],
+ [81.08484867400006, 30.026178690000094],
+ [81.08445364600004, 30.027875774000094],
+ [81.07420332800007, 30.071912334000032],
+ [81.06660689300008, 30.08715688100007],
+ [81.04366255800005, 30.12022979700005],
+ [81.0308984780001, 30.152734274000082],
+ [81.01942631000009, 30.172267965000074],
+ [81.00650720200008, 30.188907776000107],
+ [80.99601688700011, 30.19696930000002],
+ [81.00330326400012, 30.212730611000083],
+ [80.99627526900008, 30.226889954000043],
+ [80.97601810700007, 30.255208638000042],
+ [80.94377201300011, 30.270143128000072],
+ [80.86698083500005, 30.28848826100007],
+ [80.78166304500007, 30.320992737],
+ [80.76719364400003, 30.331431376000026],
+ [80.75499800600005, 30.345797425000043],
+ [80.73536096200007, 30.378198547000054],
+ [80.72306197200004, 30.392047832000102],
+ [80.69474328600006, 30.41173655200005],
+ [80.59635136000003, 30.45979563500002],
+ [80.57526737500012, 30.466255188000062],
+ [80.55997115100007, 30.465118306000065],
+ [80.54508833800008, 30.461035869000042],
+ [80.52514123600008, 30.458607076000092],
+ [80.5082947190001, 30.46232777900009],
+ [80.47542850700006, 30.48046620700002],
+ [80.42499230900006, 30.49782948800005],
+ [80.32587691200013, 30.54650868700007],
+ [80.2528064380001, 30.565008851000087],
+ [80.21621952300006, 30.566817526000094],
+ [80.17983931500004, 30.559479472000092],
+ [80.18841760200007, 30.576997783000067],
+ [80.19782271300005, 30.591363831000066],
+ [80.20330041600005, 30.60634999600005],
+ [80.19988977100013, 30.62588368700004],
+ [80.19058801300008, 30.637975973000025],
+ [80.17725549300008, 30.649861552000047],
+ [80.16692020700003, 30.661902161000043],
+ [80.16661014800007, 30.674407858000038],
+ [80.1729146730001, 30.67916208900003],
+ [80.18200972500006, 30.680040589000058],
+ [80.19172489400012, 30.679678853000055],
+ [80.19988977100013, 30.68071238200004],
+ [80.20702111900005, 30.68613840700003],
+ [80.23141239400007, 30.724947408000062],
+ [80.22459110500012, 30.734094137000042],
+ [80.19606571500009, 30.748098450000057],
+ [80.16929732200009, 30.78525380400005],
+ [80.15710168400011, 30.793160299000093],
+ [80.14066858000012, 30.79321197500009],
+ [80.10924930900006, 30.778122458],
+ [80.09219608500007, 30.774505107000024],
+ [80.06253381400006, 30.784788717000097],
+ [80.04444706200007, 30.80669952400008],
+ [80.02863407400008, 30.830780742000016],
+ [80.00558638600012, 30.847265524000093],
+ [79.93489302600011, 30.872535299000063],
+ [79.91936951600007, 30.88118194500005],
+ [79.91463535600008, 30.88381888700009],
+ [79.90316369700008, 30.89020863900005],
+ [79.8804260660001, 30.912842916],
+ [79.86285607900004, 30.941523336],
+ [79.85035038300003, 30.954494120000035],
+ [79.83350386600006, 30.96152211500005],
+ [79.76064009600009, 30.977231751000105],
+ [79.73903934800012, 30.979247131000065],
+ [79.68849979700008, 30.96741322900003],
+ [79.64819217900003, 30.965759583000093],
+ [79.63031213400006, 30.962503967000103],
+ [79.58948775300007, 30.94023142500005],
+ [79.57780887900009, 30.938371074000045],
+ [79.56592329900008, 30.942453512000057],
+ [79.54421919800006, 30.947414449000107],
+ [79.5296464440001, 30.953563945000084],
+ [79.51269657400007, 30.966172994000104],
+ [79.4976070560001, 30.981210836000074],
+ [79.48820194600006, 30.99449167900009],
+ [79.48685835800006, 31.00022776300004],
+ [79.4842745360001, 31.005447083000078],
+ [79.48076053900013, 31.01004628500003],
+ [79.47641971900003, 31.014025371000102],
+ [79.46164025900003, 31.02110504200003],
+ [79.4463440350001, 31.023792216000047],
+ [79.43073775300013, 31.023172099000092],
+ [79.414408, 31.02038157100013],
+ [79.40159224500013, 31.02363718700012],
+ [79.3949776610001, 31.036711324000052],
+ [79.38836307800011, 31.069474182000064],
+ [79.38259259500006, 31.07833466600009],
+ [79.37234338400009, 31.094072165000043],
+ [79.3670479880583, 31.111559061766084],
+ [79.31941711251294, 31.142279974197177],
+ [79.30216249530298, 31.163450395319558],
+ [79.30320907773682, 31.183103768324315],
+ [79.29807839147153, 31.203242202430214],
+ [79.28832134985049, 31.225473994629226],
+ [79.2783162706794, 31.240043992036647],
+ [79.2528602604927, 31.24543676949139],
+ [79.24843045010522, 31.256703749478504],
+ [79.26202358591979, 31.27851309060668],
+ [79.25411000876994, 31.29900573432724],
+ [79.2392392007286, 31.311723913427898],
+ [79.23831863759511, 31.3296556045226],
+ [79.20762798854088, 31.351372703987124],
+ [79.19244185390846, 31.369789449823315],
+ [79.17921754805144, 31.393795999286],
+ [79.15769333967592, 31.414925750622956],
+ [79.13139720595568, 31.438433157420082],
+ [79.07799043411131, 31.461664353726974],
+ [79.07021024772884, 31.461381390199218],
+ [79.04993667283924, 31.422952683719416],
+ [79.01552948833853, 31.383397147758455],
+ [78.98880090300014, 31.34325592100005],
+ [78.95955204300003, 31.325117493000036],
+ [78.94028174400734, 31.301576298907094],
+ [78.92100839989331, 31.269685496828163],
+ [78.88697183608144, 31.28417089736905],
+ [78.86198693800009, 31.291476135],
+ [78.84865441900007, 31.29090769500003],
+ [78.82198938000005, 31.29369822200009],
+ [78.79604781100005, 31.288117167000067],
+ [78.78447229000005, 31.288272197000097],
+ [78.75315637200003, 31.30196645100004],
+ [78.74509484900005, 31.308115947000104],
+ [78.74085738200006, 31.317727763000036],
+ [78.73848026600012, 31.334987691000023],
+ [78.74550826100005, 31.373538310000086],
+ [78.7600810140001, 31.412037252000047],
+ [78.76256148300007, 31.44511016900013],
+ [78.73300256300007, 31.467744446000083],
+ [78.69538212100014, 31.488104961000104],
+ [78.69951623500003, 31.51001576800006],
+ [78.79697798700005, 31.578848775000054],
+ [78.81403120900006, 31.59502349900005],
+ [78.81888879400009, 31.607374166000014],
+ [78.79532434100008, 31.633780823000095],
+ [78.75811731000005, 31.666595358],
+ [78.73982385300008, 31.666026917000053],
+ [78.7313489180001, 31.668042298],
+ [78.72401086500008, 31.67331329300005],
+ [78.71842981000009, 31.680599671000024],
+ [78.71047164000004, 31.698169658],
+ [78.69806929500004, 31.71103709000009],
+ [78.69321171100006, 31.71853017200003],
+ [78.69259159400008, 31.728400370000102],
+ [78.69517541500005, 31.737960511],
+ [78.69558882600006, 31.746693827000072],
+ [78.67088749200008, 31.770516663000038],
+ [78.67409143000003, 31.786949768000014],
+ [78.7003430580001, 31.821676331000035],
+ [78.70664758300006, 31.840796611000044],
+ [78.71419234300004, 31.88301625600012],
+ [78.72018680900004, 31.902911682000124],
+ [78.7419942630001, 31.945338033000056],
+ [78.74457808500011, 31.964199931000067],
+ [78.73382938700007, 31.984663798000028],
+ [78.72215051300009, 31.99458567300003],
+ [78.67832889800007, 32.01675486300006],
+ [78.64928674300012, 32.036443583],
+ [78.55182499200004, 32.15039011700007],
+ [78.53497847500006, 32.18134429900006],
+ [78.51306766800008, 32.2075700890001],
+ [78.47648075400014, 32.22441660600008],
+ [78.46901739200007, 32.226532615000096],
+ [78.46854076900007, 32.22666774700009],
+ [78.45798059100014, 32.229661764000085],
+ [78.45632694500006, 32.24211578400009],
+ [78.46139123600005, 32.26015085900009],
+ [78.46273482300012, 32.28180328400008],
+ [78.43886031100004, 32.37329640700004],
+ [78.43596643100005, 32.377973125],
+ [78.43451949100006, 32.38376088500006],
+ [78.43637984200006, 32.39616322900004],
+ [78.44144413200013, 32.40494822200013],
+ [78.44816206900003, 32.41065846800008],
+ [78.45219283000006, 32.41678212500004],
+ [78.44878218600013, 32.42678151500006],
+ [78.40919803900005, 32.4766234340001],
+ [78.3809827070001, 32.528041484000084],
+ [78.38480676200004, 32.54754933700006],
+ [78.40816451000006, 32.55837555],
+ [78.44754195200011, 32.566256205000045],
+ [78.58985884700007, 32.569925232000045],
+ [78.63016646300008, 32.57801259400004],
+ [78.64773645100007, 32.58597076500011],
+ [78.66489302600013, 32.59901906300006],
+ [78.69445194500008, 32.629663188000066],
+ [78.7132621670001, 32.637518006],
+ [78.73682661900011, 32.629844056000124],
+ [78.75098596200013, 32.61279083300009],
+ [78.74912561100012, 32.5958668010001],
+ [78.74065067600003, 32.578684387000024],
+ [78.73496626800011, 32.56064931300004],
+ [78.73692997300003, 32.54579233800008],
+ [78.75470666500013, 32.493805847000075],
+ [78.77144982900012, 32.461663106000046],
+ [78.85568241400006, 32.40045237300011],
+ [78.88152063000013, 32.37626780200013],
+ [78.9112862550001, 32.35474456800007],
+ [78.94342899600014, 32.346372986000105],
+ [78.97619185400004, 32.36161753300006],
+ [78.98983443200012, 32.364098003000024],
+ [79.01474247300007, 32.373994039000095],
+ [79.02817834500007, 32.377094626000044],
+ [79.03965051300008, 32.37598358100006],
+ [79.0663155520001, 32.37006663100006],
+ [79.07530725100014, 32.370790100000036],
+ [79.0917403570001, 32.39055633500003],
+ [79.10290246600005, 32.449855042000124],
+ [79.11292769400006, 32.47238596700005],
+ [79.13287479700011, 32.4854601040001],
+ [79.16140018800013, 32.496467184],
+ [79.19116581200012, 32.504270325],
+ [79.21524703000006, 32.507913513000105],
+ [79.23560754400012, 32.504296163000035],
+ [79.28741156145267, 32.53257939116813],
+ [79.32046626650504, 32.59226722135526],
+ [79.37947682579494, 32.57644972217696],
+ [79.40682034478317, 32.52968335070614],
+ [79.44349727169374, 32.53477259180094],
+ [79.47211298523796, 32.56547177661887],
+ [79.51574063362341, 32.608119744630585],
+ [79.53120131304826, 32.648316794003655],
+ [79.57617012539868, 32.6706463645242],
+ [79.62067291506752, 32.72872513425561],
+ [79.61391341067542, 32.76503545442273],
+ [79.56409288128151, 32.793927891059354],
+ [79.4710886681076, 32.908959488689504],
+ [79.41408948759245, 32.9720529162554],
+ [79.3784615590933, 32.97888079862581],
+ [79.33358605900014, 32.99429209500006],
+ [79.33978723100012, 33.013257345000014],
+ [79.39927298712544, 33.026877543090805],
+ [79.38106298759733, 33.06176785943445],
+ [79.3731702070001, 33.11214019800006],
+ [79.42347470306436, 33.15782502934888],
+ [79.45609607657275, 33.25039903388836],
+ [79.42008441515759, 33.27516911050025],
+ [79.34030669939472, 33.27513188662732],
+ [79.26006124250934, 33.29177628972042],
+ [79.15021349475705, 33.29255492117272],
+ [79.12503824122189, 33.29020260316764],
+ [79.09802822725385, 33.28765466454805],
+ [79.07504815721146, 33.29574255484219],
+ [79.05327756453967, 33.307872984457326],
+ [79.02304063027336, 33.31798038693261],
+ [78.99344870739196, 33.330781826020484],
+ [78.96498571648198, 33.344254148471954],
+ [78.91769413200012, 33.386257833000045]
+ ]
+ ]
+ },
+ "india": {
+ "stop": 0.5622801389605236,
+ "anchor": [80.10836486026088, 22.5],
+ "border": [
+ [
+ [78.79898227941202, 33.5],
+ [78.80090539600008, 33.494235738],
+ [78.82426314300005, 33.46105946900006],
+ [78.91594777500006, 33.387655981000094],
+ [78.91769413200012, 33.386257833000045],
+ [78.96498571648198, 33.344254148471954],
+ [78.99344870739196, 33.330781826020484],
+ [79.02304063027336, 33.31798038693261],
+ [79.05327756453967, 33.307872984457326],
+ [79.07504815721146, 33.29574255484219],
+ [79.09802822725385, 33.28765466454805],
+ [79.12503824122189, 33.29020260316764],
+ [79.15021349475705, 33.29255492117272],
+ [79.26006124250934, 33.29177628972042],
+ [79.34030669939472, 33.27513188662732],
+ [79.42008441515759, 33.27516911050025],
+ [79.45609607657275, 33.25039903388836],
+ [79.42347470306436, 33.15782502934888],
+ [79.3731702070001, 33.11214019800006],
+ [79.38106298759733, 33.06176785943445],
+ [79.39927298712544, 33.026877543090805],
+ [79.33978723100012, 33.013257345000014],
+ [79.33358605900014, 32.99429209500006],
+ [79.3784615590933, 32.97888079862581],
+ [79.41408948759245, 32.9720529162554],
+ [79.4710886681076, 32.908959488689504],
+ [79.56409288128151, 32.793927891059354],
+ [79.61391341067542, 32.76503545442273],
+ [79.62067291506752, 32.72872513425561],
+ [79.57617012539868, 32.6706463645242],
+ [79.53120131304826, 32.648316794003655],
+ [79.51574063362341, 32.608119744630585],
+ [79.47211298523796, 32.56547177661887],
+ [79.44349727169374, 32.53477259180094],
+ [79.40682034478317, 32.52968335070614],
+ [79.37947682579494, 32.57644972217696],
+ [79.32046626650504, 32.59226722135526],
+ [79.28741156145267, 32.53257939116813],
+ [79.23560754400012, 32.504296163000035],
+ [79.21524703000006, 32.507913513000105],
+ [79.19116581200012, 32.504270325],
+ [79.16140018800013, 32.496467184],
+ [79.13287479700011, 32.4854601040001],
+ [79.11292769400006, 32.47238596700005],
+ [79.10290246600005, 32.449855042000124],
+ [79.0917403570001, 32.39055633500003],
+ [79.07530725100014, 32.370790100000036],
+ [79.0663155520001, 32.37006663100006],
+ [79.03965051300008, 32.37598358100006],
+ [79.02817834500007, 32.377094626000044],
+ [79.01474247300007, 32.373994039000095],
+ [78.98983443200012, 32.364098003000024],
+ [78.97619185400004, 32.36161753300006],
+ [78.94342899600014, 32.346372986000105],
+ [78.9112862550001, 32.35474456800007],
+ [78.88152063000013, 32.37626780200013],
+ [78.85568241400006, 32.40045237300011],
+ [78.77144982900012, 32.461663106000046],
+ [78.75470666500013, 32.493805847000075],
+ [78.73692997300003, 32.54579233800008],
+ [78.73496626800011, 32.56064931300004],
+ [78.74065067600003, 32.578684387000024],
+ [78.74912561100012, 32.5958668010001],
+ [78.75098596200013, 32.61279083300009],
+ [78.73682661900011, 32.629844056000124],
+ [78.7132621670001, 32.637518006],
+ [78.69445194500008, 32.629663188000066],
+ [78.66489302600013, 32.59901906300006],
+ [78.64773645100007, 32.58597076500011],
+ [78.63016646300008, 32.57801259400004],
+ [78.58985884700007, 32.569925232000045],
+ [78.44754195200011, 32.566256205000045],
+ [78.40816451000006, 32.55837555],
+ [78.38480676200004, 32.54754933700006],
+ [78.3809827070001, 32.528041484000084],
+ [78.40919803900005, 32.4766234340001],
+ [78.44878218600013, 32.42678151500006],
+ [78.45219283000006, 32.41678212500004],
+ [78.44816206900003, 32.41065846800008],
+ [78.44144413200013, 32.40494822200013],
+ [78.43637984200006, 32.39616322900004],
+ [78.43451949100006, 32.38376088500006],
+ [78.43596643100005, 32.377973125],
+ [78.43886031100004, 32.37329640700004],
+ [78.46273482300012, 32.28180328400008],
+ [78.46139123600005, 32.26015085900009],
+ [78.45632694500006, 32.24211578400009],
+ [78.45798059100014, 32.229661764000085],
+ [78.46854076900007, 32.22666774700009],
+ [78.46901739200007, 32.226532615000096],
+ [78.47648075400014, 32.22441660600008],
+ [78.51306766800008, 32.2075700890001],
+ [78.53497847500006, 32.18134429900006],
+ [78.55182499200004, 32.15039011700007],
+ [78.64928674300012, 32.036443583],
+ [78.67832889800007, 32.01675486300006],
+ [78.72215051300009, 31.99458567300003],
+ [78.73382938700007, 31.984663798000028],
+ [78.74457808500011, 31.964199931000067],
+ [78.7419942630001, 31.945338033000056],
+ [78.72018680900004, 31.902911682000124],
+ [78.71419234300004, 31.88301625600012],
+ [78.70664758300006, 31.840796611000044],
+ [78.7003430580001, 31.821676331000035],
+ [78.67409143000003, 31.786949768000014],
+ [78.67088749200008, 31.770516663000038],
+ [78.69558882600006, 31.746693827000072],
+ [78.69517541500005, 31.737960511],
+ [78.69259159400008, 31.728400370000102],
+ [78.69321171100006, 31.71853017200003],
+ [78.69806929500004, 31.71103709000009],
+ [78.71047164000004, 31.698169658],
+ [78.71842981000009, 31.680599671000024],
+ [78.72401086500008, 31.67331329300005],
+ [78.7313489180001, 31.668042298],
+ [78.73982385300008, 31.666026917000053],
+ [78.75811731000005, 31.666595358],
+ [78.79532434100008, 31.633780823000095],
+ [78.81888879400009, 31.607374166000014],
+ [78.81403120900006, 31.59502349900005],
+ [78.79697798700005, 31.578848775000054],
+ [78.69951623500003, 31.51001576800006],
+ [78.69538212100014, 31.488104961000104],
+ [78.73300256300007, 31.467744446000083],
+ [78.76256148300007, 31.44511016900013],
+ [78.7600810140001, 31.412037252000047],
+ [78.74550826100005, 31.373538310000086],
+ [78.73848026600012, 31.334987691000023],
+ [78.74085738200006, 31.317727763000036],
+ [78.74509484900005, 31.308115947000104],
+ [78.75315637200003, 31.30196645100004],
+ [78.78447229000005, 31.288272197000097],
+ [78.79604781100005, 31.288117167000067],
+ [78.82198938000005, 31.29369822200009],
+ [78.84865441900007, 31.29090769500003],
+ [78.86198693800009, 31.291476135],
+ [78.88697183608144, 31.28417089736905],
+ [78.92100839989331, 31.269685496828163],
+ [78.94028174400734, 31.301576298907094],
+ [78.95955204300003, 31.325117493000036],
+ [78.98880090300014, 31.34325592100005],
+ [79.01552948833853, 31.383397147758455],
+ [79.04993667283924, 31.422952683719416],
+ [79.07021024772884, 31.461381390199218],
+ [79.07799043411131, 31.461664353726974],
+ [79.13139720595568, 31.438433157420082],
+ [79.15769333967592, 31.414925750622956],
+ [79.17921754805144, 31.393795999286],
+ [79.19244185390846, 31.369789449823315],
+ [79.20762798854088, 31.351372703987124],
+ [79.23831863759511, 31.3296556045226],
+ [79.2392392007286, 31.311723913427898],
+ [79.25411000876994, 31.29900573432724],
+ [79.26202358591979, 31.27851309060668],
+ [79.24843045010522, 31.256703749478504],
+ [79.2528602604927, 31.24543676949139],
+ [79.2783162706794, 31.240043992036647],
+ [79.28832134985049, 31.225473994629226],
+ [79.29807839147153, 31.203242202430214],
+ [79.30320907773682, 31.183103768324315],
+ [79.30216249530298, 31.163450395319558],
+ [79.31941711251294, 31.142279974197177],
+ [79.3670479880583, 31.111559061766084],
+ [79.37234338400009, 31.094072165000043],
+ [79.38259259500006, 31.07833466600009],
+ [79.38836307800011, 31.069474182000064],
+ [79.3949776610001, 31.036711324000052],
+ [79.40159224500013, 31.02363718700012],
+ [79.414408, 31.02038157100013],
+ [79.43073775300013, 31.023172099000092],
+ [79.4463440350001, 31.023792216000047],
+ [79.46164025900003, 31.02110504200003],
+ [79.47641971900003, 31.014025371000102],
+ [79.48076053900013, 31.01004628500003],
+ [79.4842745360001, 31.005447083000078],
+ [79.48685835800006, 31.00022776300004],
+ [79.48820194600006, 30.99449167900009],
+ [79.4976070560001, 30.981210836000074],
+ [79.51269657400007, 30.966172994000104],
+ [79.5296464440001, 30.953563945000084],
+ [79.54421919800006, 30.947414449000107],
+ [79.56592329900008, 30.942453512000057],
+ [79.57780887900009, 30.938371074000045],
+ [79.58948775300007, 30.94023142500005],
+ [79.63031213400006, 30.962503967000103],
+ [79.64819217900003, 30.965759583000093],
+ [79.68849979700008, 30.96741322900003],
+ [79.73903934800012, 30.979247131000065],
+ [79.76064009600009, 30.977231751000105],
+ [79.83350386600006, 30.96152211500005],
+ [79.85035038300003, 30.954494120000035],
+ [79.86285607900004, 30.941523336],
+ [79.8804260660001, 30.912842916],
+ [79.90316369700008, 30.89020863900005],
+ [79.91463535600008, 30.88381888700009],
+ [79.91936951600007, 30.88118194500005],
+ [79.93489302600011, 30.872535299000063],
+ [80.00558638600012, 30.847265524000093],
+ [80.02863407400008, 30.830780742000016],
+ [80.04444706200007, 30.80669952400008],
+ [80.06253381400006, 30.784788717000097],
+ [80.09219608500007, 30.774505107000024],
+ [80.10924930900006, 30.778122458],
+ [80.14066858000012, 30.79321197500009],
+ [80.15710168400011, 30.793160299000093],
+ [80.16929732200009, 30.78525380400005],
+ [80.19606571500009, 30.748098450000057],
+ [80.22459110500012, 30.734094137000042],
+ [80.23141239400007, 30.724947408000062],
+ [80.20702111900005, 30.68613840700003],
+ [80.19988977100013, 30.68071238200004],
+ [80.19172489400012, 30.679678853000055],
+ [80.18200972500006, 30.680040589000058],
+ [80.1729146730001, 30.67916208900003],
+ [80.16661014800007, 30.674407858000038],
+ [80.16692020700003, 30.661902161000043],
+ [80.17725549300008, 30.649861552000047],
+ [80.19058801300008, 30.637975973000025],
+ [80.19988977100013, 30.62588368700004],
+ [80.20330041600005, 30.60634999600005],
+ [80.19782271300005, 30.591363831000066],
+ [80.18841760200007, 30.576997783000067],
+ [80.17983931500004, 30.559479472000092],
+ [80.21621952300006, 30.566817526000094],
+ [80.2528064380001, 30.565008851000087],
+ [80.32587691200013, 30.54650868700007],
+ [80.42499230900006, 30.49782948800005],
+ [80.47542850700006, 30.48046620700002],
+ [80.5082947190001, 30.46232777900009],
+ [80.52514123600008, 30.458607076000092],
+ [80.54508833800008, 30.461035869000042],
+ [80.55997115100007, 30.465118306000065],
+ [80.57526737500012, 30.466255188000062],
+ [80.59635136000003, 30.45979563500002],
+ [80.69474328600006, 30.41173655200005],
+ [80.72306197200004, 30.392047832000102],
+ [80.73536096200007, 30.378198547000054],
+ [80.75499800600005, 30.345797425000043],
+ [80.76719364400003, 30.331431376000026],
+ [80.78166304500007, 30.320992737],
+ [80.86698083500005, 30.28848826100007],
+ [80.94377201300011, 30.270143128000072],
+ [80.97601810700007, 30.255208638000042],
+ [80.99627526900008, 30.226889954000043],
+ [81.00330326400012, 30.212730611000083],
+ [80.99601688700011, 30.19696930000002],
+ [80.98816225269584, 30.196555926350566],
+ [80.92082703591576, 30.176660408536822],
+ [80.903309336412, 30.180432806924035],
+ [80.89364690080846, 30.198104359137524],
+ [80.8838787660946, 30.210405146915726],
+ [80.88368373459112, 30.210280032524576],
+ [80.8679110110001, 30.200173238000062],
+ [80.85039270000004, 30.181931458000022],
+ [80.83644006400004, 30.170045879000085],
+ [80.84966923100006, 30.143380840000034],
+ [80.82982548000007, 30.11712921200011],
+ [80.76967411300012, 30.077286682000093],
+ [80.75572147700012, 30.06457428000003],
+ [80.72574914600011, 30.02276804700007],
+ [80.71582727100008, 30.013311259000105],
+ [80.68017053200003, 29.99207224500013],
+ [80.65412561000005, 29.970574849000073],
+ [80.64141320800007, 29.96344350200006],
+ [80.62229292800009, 29.958172506000025],
+ [80.58622277800009, 29.95414174500003],
+ [80.57133996600004, 29.946855367000055],
+ [80.56286503100006, 29.92969879200008],
+ [80.5495325120001, 29.893680319000097],
+ [80.52731164500005, 29.86241607700002],
+ [80.47615197800008, 29.806140442000114],
+ [80.45486128700009, 29.79058583600009],
+ [80.39522668500007, 29.776581523000075],
+ [80.36897505700006, 29.757926330000103],
+ [80.35429895100009, 29.730279440000103],
+ [80.35440230300009, 29.704880473000102],
+ [80.36391076700005, 29.679714050000072],
+ [80.37755334500008, 29.652945659000082],
+ [80.38675175000009, 29.626823222],
+ [80.38520145600006, 29.604834900000114],
+ [80.37331587800003, 29.58419016500001],
+ [80.35078495300013, 29.562072652],
+ [80.3451005450001, 29.558351949000084],
+ [80.33269820200007, 29.552460836000094],
+ [80.32722050000012, 29.548585103000036],
+ [80.32360314900012, 29.541660462000053],
+ [80.3250500900001, 29.535510966000075],
+ [80.32763391200012, 29.529929911000053],
+ [80.32722050000012, 29.524839783000075],
+ [80.3200891520001, 29.515822245000024],
+ [80.31151086400013, 29.508122457000027],
+ [80.29146040900008, 29.49473826100011],
+ [80.29115035000012, 29.494609070000067],
+ [80.28205529800005, 29.48429962200005],
+ [80.27306359800008, 29.47866689100003],
+ [80.26624231000005, 29.47212982200007],
+ [80.26345178200006, 29.459236552000064],
+ [80.25745731700005, 29.450063986000075],
+ [80.22831180800006, 29.441718242],
+ [80.21766646400005, 29.434638570000075],
+ [80.21373905400009, 29.416887716000062],
+ [80.22097375500005, 29.4001187140001],
+ [80.24216109200012, 29.367407532000087],
+ [80.24949914600006, 29.326996562000105],
+ [80.25497684700008, 29.316635437000016],
+ [80.26355513600004, 29.315317688000064],
+ [80.27275354000011, 29.315705261000048],
+ [80.28009159300012, 29.310150045000043],
+ [80.28277876900012, 29.29131398500003],
+ [80.27874800600006, 29.26808542900001],
+ [80.25818078600014, 29.202456360000085],
+ [80.24867232300005, 29.204394226000105],
+ [80.23606327400006, 29.213075867000057],
+ [80.21880334400004, 29.21108632400002],
+ [80.21373905400009, 29.196565246],
+ [80.23048221800013, 29.154733174000015],
+ [80.23306604000004, 29.139307760000023],
+ [80.22066369600003, 29.12607859300003],
+ [80.20144006400005, 29.121169332000093],
+ [80.18056278500006, 29.12132436100005],
+ [80.16350956300005, 29.1233655810001],
+ [80.13260705600004, 29.11021392800002],
+ [80.11307336500005, 29.072205913000104],
+ [80.10470178300005, 29.027609151000078],
+ [80.10790572100012, 28.99476877900007],
+ [80.10790572100012, 28.99458791100001],
+ [80.09943078600008, 28.977276306000093],
+ [80.08516809100013, 28.967483623000035],
+ [80.06842492700008, 28.959938864],
+ [80.05292199700006, 28.94911265000006],
+ [80.04051965400004, 28.932808737000116],
+ [80.03390507000012, 28.915936381000037],
+ [80.03111454300006, 28.897797953000108],
+ [80.03028772000005, 28.877669983000132],
+ [80.0363855390001, 28.837026469000094],
+ [80.05478234800006, 28.824184876000103],
+ [80.07305357600006, 28.820924647000098],
+ [80.08186079900014, 28.819353129],
+ [80.11421024600014, 28.80258412700003],
+ [80.14759322100008, 28.763310038000057],
+ [80.16206262200012, 28.753284811000057],
+ [80.18118290200005, 28.74729034500011],
+ [80.21642622900009, 28.74194183400006],
+ [80.23327274600007, 28.732717591000053],
+ [80.23895715300011, 28.726258037],
+ [80.24939579300008, 28.71021250500003],
+ [80.25704390500005, 28.7027452600001],
+ [80.26520878100007, 28.69928293800008],
+ [80.28339888500011, 28.6953555300001],
+ [80.29104699700008, 28.689671123000053],
+ [80.31833215400007, 28.64011342400009],
+ [80.32970096800005, 28.627478537000073],
+ [80.34975142400003, 28.620217998000086],
+ [80.3690784100001, 28.622646789000058],
+ [80.38830204300012, 28.627245993000102],
+ [80.40835249900005, 28.626341655000047],
+ [80.42654260300009, 28.616807353000056],
+ [80.46881392500006, 28.571848857000035],
+ [80.48845096900004, 28.562443746],
+ [80.49341190600006, 28.575647074000088],
+ [80.48493697100008, 28.63928660100008],
+ [80.4876241450001, 28.65646901500004],
+ [80.49754602100006, 28.670137431000043],
+ [80.51759647600005, 28.680033468000133],
+ [80.53444380100007, 28.679555368000095],
+ [80.55583703600013, 28.67894826200005],
+ [80.55904097500007, 28.67303131200005],
+ [80.55738732900005, 28.664349671000068],
+ [80.55687056500011, 28.655022075000048],
+ [80.56358850100014, 28.647038066000064],
+ [80.58136519400006, 28.638950704000067],
+ [80.59852176900012, 28.633783061000074],
+ [80.6356254480001, 28.627866109000067],
+ [80.64833785000008, 28.61975291000006],
+ [80.66818160000014, 28.586344097000094],
+ [80.6786202400001, 28.57471689800012],
+ [80.69577681500004, 28.567508036000063],
+ [80.72709273300006, 28.559679057000054],
+ [80.74352583900003, 28.549963887],
+ [80.78166304500007, 28.514746399000032],
+ [80.79840620900012, 28.505703024000084],
+ [80.8170097260001, 28.502550761000023],
+ [80.85798913600013, 28.502447409000084],
+ [80.87225183100009, 28.496866353000073],
+ [80.88036503100011, 28.481880189],
+ [80.88186364800004, 28.46684234700011],
+ [80.88666955600013, 28.452786357],
+ [80.90527307200006, 28.44084910100004],
+ [80.92134444200013, 28.436198222000073],
+ [80.94118819200014, 28.432684225000045],
+ [80.9605151780001, 28.432270814000034],
+ [80.97601810700007, 28.43692169200007],
+ [80.9878003340001, 28.430978902000064],
+ [80.99131433200006, 28.420256043000066],
+ [80.99317468300006, 28.407827861000087],
+ [81.00040938300003, 28.397001649000046],
+ [81.04706637000004, 28.389087804],
+ [81.14634362800007, 28.3722486380001],
+ [81.16970137600003, 28.361319072000057],
+ [81.19037194900005, 28.33811635300013],
+ [81.21073246300006, 28.27863678000007],
+ [81.22432336400004, 28.25078318300011],
+ [81.28235599800013, 28.191587830000017],
+ [81.2959469000001, 28.167454936000055],
+ [81.2807540280001, 28.161977234000076],
+ [81.27677494300008, 28.153786520000054],
+ [81.28307946800004, 28.146086731000068],
+ [81.29940922000009, 28.1425210580001],
+ [81.29620528100008, 28.128310038000038],
+ [81.30705733200006, 28.1238141890001],
+ [81.32369714400005, 28.12624298100006],
+ [81.3381148690001, 28.132728373000035],
+ [81.34726159700006, 28.144433086],
+ [81.35144738800011, 28.156809591000084],
+ [81.35790694200006, 28.165982157000073],
+ [81.37320316600011, 28.167842509000067],
+ [81.39604414900003, 28.16063364700001],
+ [81.41733483900009, 28.147016907000122],
+ [81.43526656100005, 28.12978281600003],
+ [81.4482373460001, 28.111411845000035],
+ [81.4529399010001, 28.097045797000035],
+ [81.45402510600007, 28.086607157000103],
+ [81.45821089700013, 28.077279562000072],
+ [81.47345544400014, 28.066401672000026],
+ [81.56192549700006, 28.025990703000033],
+ [81.58218265800008, 28.013278300000067],
+ [81.59510176600008, 27.994881490000083],
+ [81.59536014800005, 27.994778138000058],
+ [81.61504886900013, 27.98123891300007],
+ [81.66543339000003, 27.97080027300005],
+ [81.6889461670001, 27.96320383700008],
+ [81.71039188600014, 27.9475200400001],
+ [81.75013106300014, 27.909667054000025],
+ [81.80015384900008, 27.88408722000007],
+ [81.82785241700003, 27.86563873300007],
+ [81.85565433700009, 27.850936788000055],
+ [81.88319787600005, 27.84905059900005],
+ [81.90609053500009, 27.863106588000065],
+ [81.94639815300013, 27.905352072000042],
+ [81.97590539600009, 27.91695343000002],
+ [82.0272200930001, 27.912405904000067],
+ [82.05021249900011, 27.90558612200006],
+ [82.05161136900006, 27.90517120300011],
+ [82.07166182500009, 27.890030009],
+ [82.09036869300007, 27.87233083100007],
+ [82.10742191600008, 27.863571675000102],
+ [82.15103682400007, 27.84827545200004],
+ [82.27040938300007, 27.760477193],
+ [82.34792403200004, 27.726009013000024],
+ [82.40192590400011, 27.67717478400006],
+ [82.44068322800007, 27.666426086000044],
+ [82.52615604700009, 27.67521108000004],
+ [82.65214318800008, 27.704149883000085],
+ [82.67389143300011, 27.696458430000078],
+ [82.6796867270001, 27.694408875000036],
+ [82.69705000800008, 27.669397481000047],
+ [82.70924564600011, 27.630924377],
+ [82.71885746300012, 27.556122742000056],
+ [82.7297095130001, 27.518166402000062],
+ [82.75213708500007, 27.49496368400004],
+ [82.87626387600011, 27.487548116000127],
+ [82.90127526900011, 27.48036509200007],
+ [82.94716394100004, 27.457317403000033],
+ [83.01046757100005, 27.443390604000044],
+ [83.13278568600009, 27.444217428000073],
+ [83.16963098200011, 27.431194967000025],
+ [83.2192403570001, 27.393781230000045],
+ [83.23159102400007, 27.381223856000034],
+ [83.24311486900007, 27.36215525300007],
+ [83.2494193930001, 27.348099263000037],
+ [83.25949629800004, 27.338125713000025],
+ [83.28244063400007, 27.330942688000093],
+ [83.30486820500005, 27.33192454100005],
+ [83.32435022000004, 27.341691386000022],
+ [83.34114506000003, 27.35693593300006],
+ [83.3627458090001, 27.38561635400005],
+ [83.36956709800012, 27.398173726000053],
+ [83.37096236200011, 27.41021433500002],
+ [83.35582116800009, 27.42866282200005],
+ [83.35385746300005, 27.440290019000102],
+ [83.35592452000003, 27.45248565700011],
+ [83.36098881100008, 27.462200826000057],
+ [83.38703373200008, 27.470469056000084],
+ [83.48098148600008, 27.469745585000098],
+ [83.59043217000004, 27.456619771000035],
+ [83.66339929300005, 27.432280172000034],
+ [83.80199548400003, 27.365927633000084],
+ [83.84798750900012, 27.35104482000004],
+ [83.85334011200007, 27.346194023000052],
+ [83.8546020920001, 27.345050354000122],
+ [83.86173343900003, 27.354507142000088],
+ [83.86752120000006, 27.358382873000053],
+ [83.87739139900003, 27.361741842000058],
+ [83.87764978000007, 27.36990671900007],
+ [83.8736706950001, 27.380086975000026],
+ [83.87119022600012, 27.389440410000063],
+ [83.8427165120001, 27.418069153000047],
+ [83.83408654800013, 27.43403717000008],
+ [83.85351688700013, 27.440961813000072],
+ [83.89987064700011, 27.44385569200007],
+ [83.92204311000006, 27.449695761],
+ [83.92302168800012, 27.449953511000032],
+ [83.93594079600012, 27.446077780000067],
+ [83.97583500200005, 27.439721578000032],
+ [84.00766768400013, 27.440806783000127],
+ [84.02890669800007, 27.453725891000047],
+ [84.07960127800004, 27.509536438000012],
+ [84.0995483800001, 27.51687449100011],
+ [84.11717004400009, 27.51328297900004],
+ [84.12156254100006, 27.49496368400004],
+ [84.1309676510001, 27.486411235000034],
+ [84.14171634900003, 27.480752666000072],
+ [84.16574589100009, 27.472174378000048],
+ [84.17509932500008, 27.46297597300007],
+ [84.18584802300012, 27.43863637400004],
+ [84.1952531340001, 27.43605255100003],
+ [84.22553552300008, 27.440393372000116],
+ [84.23902307100008, 27.43114329100011],
+ [84.24889327000005, 27.412436422000027],
+ [84.26770349200007, 27.388561910000035],
+ [84.28940759300008, 27.376107890000057],
+ [84.5770386150001, 27.329030660000072],
+ [84.60654585800012, 27.310478821000018],
+ [84.63191898600013, 27.277044169000035],
+ [84.64819706300005, 27.240715637000065],
+ [84.65765384900004, 27.203405253000128],
+ [84.65982426000011, 27.165113017000024],
+ [84.65439823400004, 27.12537384100004],
+ [84.64452803500006, 27.103721415000038],
+ [84.63036869400008, 27.08082875600003],
+ [84.6214803470001, 27.057987773000022],
+ [84.62726810700008, 27.036490377000078],
+ [84.64023889200007, 27.02837717700008],
+ [84.7606966560001, 26.999024963000082],
+ [84.77196211800009, 26.999179993000055],
+ [84.78550134300013, 27.008481751000076],
+ [84.80193444900004, 27.013752747000083],
+ [84.81748905400013, 27.01060048400005],
+ [84.82813440000012, 26.994942526000088],
+ [84.82828942900005, 26.994839172000056],
+ [84.85175052900007, 26.982126770000022],
+ [84.90156661000009, 26.967192281000038],
+ [84.92404585800011, 26.95566843700003],
+ [84.93856693500004, 26.936599834000035],
+ [84.94425134300008, 26.915722554000055],
+ [84.95272627800011, 26.897635803000057],
+ [84.97577396700007, 26.886887105000127],
+ [84.98817631000003, 26.883786520000072],
+ [85.00083703600006, 26.882236227000064],
+ [85.01804528800005, 26.874433086000053],
+ [85.01685673100013, 26.859240214000025],
+ [85.01856205200005, 26.84580434200008],
+ [85.0439868580001, 26.843737284],
+ [85.10021081500008, 26.863529358000093],
+ [85.12284509300008, 26.865699768000084],
+ [85.16201582800005, 26.851023662000088],
+ [85.16552982600012, 26.82079294900008],
+ [85.16568485500005, 26.786273092],
+ [85.1949337160001, 26.75888458300004],
+ [85.28727950000007, 26.736973776000085],
+ [85.30236901900008, 26.73733551],
+ [85.33704390500003, 26.746792298000074],
+ [85.35321862800009, 26.757592672],
+ [85.35535245800008, 26.759912352000086],
+ [85.36923832200006, 26.77500762900003],
+ [85.38587813300006, 26.788443502000078],
+ [85.4031897380001, 26.787616679000067],
+ [85.42153487200005, 26.782655742000102],
+ [85.43962162300011, 26.787720032],
+ [85.47569177300011, 26.805238343000056],
+ [85.51946171000009, 26.8264256800001],
+ [85.59857832800009, 26.854382630000103],
+ [85.60937870300012, 26.851023662000088],
+ [85.6877718500001, 26.811852926000043],
+ [85.70182784000013, 26.7966083780001],
+ [85.70963098200014, 26.762450256000122],
+ [85.70224125100003, 26.68844960600002],
+ [85.71288659700014, 26.65320627900003],
+ [85.72704593900005, 26.637599996000105],
+ [85.78099613500012, 26.599204407000073],
+ [85.7899878340001, 26.597033997000082],
+ [85.80006473800012, 26.600703023000065],
+ [85.80972823100007, 26.603028463],
+ [85.81763472500006, 26.596723938000096],
+ [85.81954675300011, 26.588300680000103],
+ [85.81975345900008, 26.579515687000097],
+ [85.82161381000009, 26.571712545000096],
+ [85.82853845200003, 26.566131490000075],
+ [85.84476485200008, 26.568508606000123],
+ [85.86636560100004, 26.579929098000022],
+ [85.93468184400007, 26.632897441000026],
+ [85.95214847900013, 26.6420441690001],
+ [85.97571293100003, 26.644369609000037],
+ [86.01136967000014, 26.65444651300008],
+ [86.04170373500006, 26.645454814000047],
+ [86.11069177300004, 26.60674916600003],
+ [86.11585941500005, 26.602563375000088],
+ [86.12206058800012, 26.600289612000054],
+ [86.14479821800006, 26.601529847000094],
+ [86.14635461800009, 26.60135577600009],
+ [86.15265303600012, 26.600651347000067],
+ [86.16779423000014, 26.596620585000053],
+ [86.17446049000006, 26.593313293000065],
+ [86.17926639900003, 26.58861073800007],
+ [86.18536421800007, 26.584424947000045],
+ [86.19585453300004, 26.582667949000083],
+ [86.20288252800009, 26.584579977000075],
+ [86.22515507100013, 26.597395732000066],
+ [86.26308557100003, 26.60907460600005],
+ [86.28442793800014, 26.612020162000036],
+ [86.30137780800004, 26.609022930000023],
+ [86.30861250800007, 26.60214996300006],
+ [86.30902592000012, 26.58799062200002],
+ [86.31600223800012, 26.58096262700009],
+ [86.32318526200004, 26.580084127000063],
+ [86.34483768800004, 26.582616272000067],
+ [86.35367435800003, 26.582616272000067],
+ [86.38364668800006, 26.572849427],
+ [86.4448315840001, 26.543083802000112],
+ [86.47547570800003, 26.531973368000095],
+ [86.4949060460001, 26.527839254000085],
+ [86.5106156820001, 26.52013946600009],
+ [86.52430993700011, 26.509080709000088],
+ [86.53774580900006, 26.4948696900001],
+ [86.53795251500003, 26.4948696900001],
+ [86.55789961800014, 26.484017639000072],
+ [86.62533736100005, 26.45631907100004],
+ [86.69520389800005, 26.418233541000077],
+ [86.71360070900005, 26.414564515000095],
+ [86.72409102400007, 26.421954244000105],
+ [86.73070560700006, 26.43378814800012],
+ [86.7381986900001, 26.44371002200002],
+ [86.75189294500012, 26.44551869700011],
+ [86.78723962400005, 26.43306467700002],
+ [86.79643802900006, 26.431514384000096],
+ [86.82186283400006, 26.438128967000083],
+ [86.84635746300012, 26.452650045000055],
+ [86.86568444800014, 26.472442119000036],
+ [86.87596805800007, 26.494921367000032],
+ [86.9071289470001, 26.51150950100005],
+ [86.93515347300013, 26.520289336000033],
+ [86.97244795800009, 26.531973368000095],
+ [86.98521203600012, 26.540655009000048],
+ [87.01544274900004, 26.568973694000064],
+ [87.02991215000009, 26.579774068000077],
+ [87.04133264100005, 26.580187480000106],
+ [87.04443322800012, 26.561170553000025],
+ [87.04500166800005, 26.544272359000033],
+ [87.05647383700011, 26.494921367000032],
+ [87.05668054200004, 26.4948696900001],
+ [87.06670577000006, 26.46562082900006],
+ [87.08329390500006, 26.43208282500005],
+ [87.10628991700014, 26.40474599300002],
+ [87.13502201400013, 26.394204],
+ [87.18845544500005, 26.399578349000123],
+ [87.2190995690001, 26.408104960000045],
+ [87.22943485500008, 26.398751526000083],
+ [87.23630782100014, 26.383300273000103],
+ [87.24529952000012, 26.370226136000056],
+ [87.25842533400004, 26.36293975800008],
+ [87.3004899500001, 26.345989888000062],
+ [87.31402917500009, 26.343767802000073],
+ [87.32622481300007, 26.353327942000064],
+ [87.3449316820001, 26.389346416000038],
+ [87.35640384900006, 26.403712464000037],
+ [87.38420577000005, 26.418646953000106],
+ [87.41645186400012, 26.426966858000057],
+ [87.44962813400014, 26.428620504000023],
+ [87.48032393400007, 26.423401185],
+ [87.55205082300006, 26.38671091700003],
+ [87.58698409000004, 26.378029277000067],
+ [87.6239844160001, 26.392912089],
+ [87.64874495200013, 26.40999327100006],
+ [87.6596411540001, 26.417510071],
+ [87.68119022600013, 26.424228007000025],
+ [87.6975716550001, 26.41626983700006],
+ [87.71090417500011, 26.405676168000085],
+ [87.72754398600011, 26.403764140000064],
+ [87.74222009300013, 26.410482076000093],
+ [87.7494547930001, 26.425726624000035],
+ [87.75617273000012, 26.446913961000078],
+ [87.76898848500008, 26.451461487000117],
+ [87.78593835400011, 26.445983785000024],
+ [87.80443851800004, 26.437353821000087],
+ [87.8215950930001, 26.437508851000032],
+ [87.85208418800005, 26.460659892000123],
+ [87.86980920500008, 26.464638978],
+ [87.87068770400003, 26.460711569000026],
+ [87.89476892100004, 26.442934876000024],
+ [87.89730106600007, 26.44345164000005],
+ [87.90200362200005, 26.43528676300012],
+ [87.90851485200011, 26.417820130000067],
+ [87.91476770100007, 26.408259990000076],
+ [87.92897871900004, 26.396426086000062],
+ [87.96122481300011, 26.378959453000036],
+ [87.97548750900012, 26.366557108000066],
+ [88.00664839700005, 26.369864400000054],
+ [88.04432051600008, 26.405676168000085],
+ [88.07418949400011, 26.453941955000104],
+ [88.08225101700009, 26.4948696900001],
+ [88.07915043200006, 26.507375387000096],
+ [88.07982222500004, 26.51755564400007],
+ [88.08713624100011, 26.539100004000105],
+ [88.10168135600009, 26.581944479000086],
+ [88.14663985200008, 26.661216126000014],
+ [88.16338301600007, 26.70514109300005],
+ [88.16751713100007, 26.725036519000057],
+ [88.1690674240001, 26.74400177000011],
+ [88.16782718900004, 26.762915344000035],
+ [88.15904219600009, 26.802551169000097],
+ [88.15532149300003, 26.845597636000022],
+ [88.15139408400006, 26.862805888000096],
+ [88.14281579600004, 26.878412170000033],
+ [88.12043990100005, 26.9088495890001],
+ [88.11180993700003, 26.924300842],
+ [88.09682377100006, 26.95933746400003],
+ [88.07687666900006, 26.991790263000027],
+ [88.05594771400007, 27.018041891000067],
+ [88.04282190000009, 27.028945618000122],
+ [88.02737064700011, 27.03535349500008],
+ [88.00949060100004, 27.04563710500007],
+ [87.99130049700011, 27.08150055],
+ [87.97548750900012, 27.095143128000117],
+ [87.97073327700008, 27.10273956300007],
+ [87.96918298300005, 27.11080108700007],
+ [87.97083663000012, 27.119224345000063],
+ [87.9854610590001, 27.148369853000062],
+ [87.98933679200007, 27.2183914190001],
+ [88.0046627590001, 27.249163088],
+ [88.02902429200003, 27.298076477000066],
+ [88.03512211100008, 27.322571106000012],
+ [88.0325382900001, 27.333888245000068],
+ [88.02013594600004, 27.353370260000062],
+ [88.01579512500007, 27.364222311000034],
+ [88.01476159700007, 27.378071594000076],
+ [88.01724206500006, 27.389233704000034],
+ [88.02582035300009, 27.412074686000025],
+ [88.02959273300007, 27.418740947000046],
+ [88.03481205300011, 27.42380523700011],
+ [88.03930790200013, 27.42948964400007],
+ [88.04163334200007, 27.438067933000085],
+ [88.03977299000007, 27.442357077000068],
+ [88.03078129100004, 27.450728659000035],
+ [88.02809411600009, 27.45512115500013],
+ [88.02333988400011, 27.474654847000025],
+ [88.02209965000009, 27.48424082500013],
+ [88.02333988400011, 27.494912008000128],
+ [88.04876468900011, 27.545348206000043],
+ [88.11087976100009, 27.639502666000013],
+ [88.1348576260001, 27.723166809000062],
+ [88.14932702700014, 27.748772482],
+ [88.15966231300013, 27.774119772000105],
+ [88.15459802200007, 27.815150859000042],
+ [88.16658695500013, 27.83359934600007],
+ [88.16462325100008, 27.84535573400005],
+ [88.15640669800007, 27.85127268500007],
+ [88.14302250200012, 27.855716858000065],
+ [88.11821781400005, 27.860884501000058],
+ [88.10488529500003, 27.8797205610001],
+ [88.09749556500003, 27.904008484000073],
+ [88.09992435700008, 27.928322246000093],
+ [88.11573734600012, 27.947261658000045],
+ [88.12669274900009, 27.950439759000105],
+ [88.15118737800003, 27.947209982000018],
+ [88.16296960500006, 27.946899923000032],
+ [88.17485518400008, 27.94976796500002],
+ [88.19785119700003, 27.95829457600003],
+ [88.37877038600004, 27.982634176000047],
+ [88.39975101800007, 27.99472646100004],
+ [88.39985437100012, 27.99472646100004],
+ [88.39990604700012, 27.994881490000083],
+ [88.45576827000008, 28.03152008100004],
+ [88.47540531400011, 28.036248474000033],
+ [88.50207035300008, 28.02888458300002],
+ [88.5171598720001, 28.039581604000105],
+ [88.53080245000007, 28.0590119430001],
+ [88.55281660900005, 28.078054708000067],
+ [88.59400272600004, 28.106605937000026],
+ [88.61048750800012, 28.105830790000127],
+ [88.63167484600007, 28.083351542000017],
+ [88.65203536000013, 28.069398906000018],
+ [88.7101196700001, 28.061983337000115],
+ [88.73564782700004, 28.055265402000074],
+ [88.78014123500003, 28.028341980000064],
+ [88.80293054200013, 28.011004537000062],
+ [88.8175032960001, 27.994881490000083],
+ [88.81771000200013, 27.994881490000083],
+ [88.81771000200013, 27.99472646100004],
+ [88.81967370600006, 27.977337342000013],
+ [88.80975183200007, 27.9444969690001],
+ [88.81068200700014, 27.927857158000066],
+ [88.81889856000004, 27.91519643200003],
+ [88.84277307100012, 27.892407125000133],
+ [88.85155806500012, 27.877162577],
+ [88.85507206300008, 27.859179179000094],
+ [88.85388350400007, 27.843676249000097],
+ [88.80566939300007, 27.655108948000063],
+ [88.78308679200012, 27.622036031000064],
+ [88.76737715600007, 27.586198425000035],
+ [88.74815352400003, 27.560127666000042],
+ [88.7410221770001, 27.545709941000027],
+ [88.74164229300004, 27.531679789000023],
+ [88.75755863400008, 27.511448466000033],
+ [88.75719689900006, 27.49496368400004],
+ [88.75435469600012, 27.464216207000092],
+ [88.75978072200007, 27.435070699000065],
+ [88.77357832900003, 27.408509013000057],
+ [88.79538578300009, 27.385926412000018],
+ [88.80820153800005, 27.378381653000062],
+ [88.8198287350001, 27.37362742200007],
+ [88.8308358160001, 27.36732289600006],
+ [88.85202315300006, 27.342363180000078],
+ [88.86463220200005, 27.332389628000087],
+ [88.89233077000011, 27.315543111000082],
+ [88.88463098200003, 27.286345927000056],
+ [88.87611560500005, 27.28048567900005],
+ [88.86142826300011, 27.270377910000022],
+ [88.80117354300006, 27.256425273000033],
+ [88.77585209100005, 27.240870667000095],
+ [88.75435469600012, 27.21260365800002],
+ [88.7384383540001, 27.17978912300002],
+ [88.73006677200004, 27.150953674000064],
+ [88.73308231500005, 27.148972387000114],
+ [88.74257246900004, 27.142737122000042],
+ [88.80525598100013, 27.11302317300006],
+ [88.82763187700004, 27.097881979000064],
+ [88.84080936700008, 27.075247701000094],
+ [88.84561527500011, 27.04956451400004],
+ [88.84561527500011, 26.994942526000088],
+ [88.84561527500011, 26.994839172000056],
+ [88.85171309400005, 26.94543650400003],
+ [88.86711267100003, 26.964246725000052],
+ [88.8864396570001, 26.978974508000064],
+ [88.90664514100007, 26.98109324200003],
+ [88.92447351100003, 26.96166290300006],
+ [88.92695398000012, 26.94941558800012],
+ [88.9254036860001, 26.939028626],
+ [88.92530033400004, 26.929365133000076],
+ [88.9323283280001, 26.9192365520001],
+ [88.94276696800011, 26.913707174000123],
+ [88.95454919500008, 26.91262196900003],
+ [88.96581465700007, 26.915464173000103],
+ [88.97532312000004, 26.921717021000077],
+ [88.99661381100003, 26.92275054900007],
+ [89.02157352700004, 26.912673645000027],
+ [89.04487959900007, 26.897119039000117],
+ [89.06069258700006, 26.88146108000005],
+ [89.07433516500004, 26.856398010000035],
+ [89.08244836400007, 26.836037496000117],
+ [89.0965043540001, 26.821413066000034],
+ [89.12807865500008, 26.813454895000078],
+ [89.18461267100014, 26.81056101500009],
+ [89.21282800300008, 26.813041484000067],
+ [89.24083662900011, 26.819759420000096],
+ [89.25261885600008, 26.826787415000084],
+ [89.26295414200013, 26.836347555000103],
+ [89.27359948700007, 26.84389231400006],
+ [89.28636356600009, 26.84497751900004],
+ [89.3001611730001, 26.844409078000083],
+ [89.34165734900012, 26.854330953000087],
+ [89.36889455700003, 26.837358593000076],
+ [89.40733809400012, 26.81340321900005],
+ [89.44289148000007, 26.797021789000027],
+ [89.50541996200008, 26.80368804900003],
+ [89.54650272600003, 26.79753855400004],
+ [89.5860868740001, 26.784051005],
+ [89.61135664900007, 26.76596425400008],
+ [89.61347538300004, 26.748549296000036],
+ [89.59750736500013, 26.720954081000045],
+ [89.60980635600004, 26.712220765000083],
+ [89.6283065180001, 26.71253082300005],
+ [89.66323978700007, 26.725501607000083],
+ [89.68515059500004, 26.72457143100003],
+ [89.73873905400006, 26.703280742000047],
+ [89.75466966300013, 26.700988568000113],
+ [89.76028812700014, 26.700180156],
+ [89.80007898000014, 26.700490214000084],
+ [89.80405806500005, 26.699766744000087],
+ [89.81366988200006, 26.696149394000102],
+ [89.81728723200013, 26.6962010700001],
+ [89.82209314000005, 26.70100697900004],
+ [89.82524540200006, 26.70767323900013],
+ [89.8267956950001, 26.71351267500002],
+ [89.8267440190001, 26.715683085000094],
+ [89.82726078300004, 26.7179051720001],
+ [89.82767419500004, 26.722452698000055],
+ [89.82974125100003, 26.727620341000048],
+ [89.83496057100012, 26.73154775000002],
+ [89.83904301000013, 26.731237691000032],
+ [89.84700118000012, 26.724829814000103],
+ [89.85077355900012, 26.72317616800005],
+ [89.85870063400006, 26.722056524000052],
+ [89.85992028800013, 26.7218842570001],
+ [89.88028080200013, 26.71625152600008],
+ [89.89040938400007, 26.714856262000083],
+ [89.91211348500008, 26.716716614000077],
+ [89.97526208500005, 26.73185780900009],
+ [90.0891569420001, 26.741728008000095],
+ [90.12719079600004, 26.75139150000011],
+ [90.15220218900004, 26.771752014000057],
+ [90.17742028900005, 26.832058410000045],
+ [90.21090661700009, 26.85148875000003],
+ [90.22914839700013, 26.852884013000093],
+ [90.26599369300004, 26.851592103000044],
+ [90.28444218000004, 26.857069804000034],
+ [90.30087528500013, 26.868283590000075],
+ [90.31420780500014, 26.88037587500007],
+ [90.32857385300014, 26.890659485000057],
+ [90.34883101400004, 26.89665395100009],
+ [90.38262740100004, 26.891796367000055],
+ [90.4752315670001, 26.832420146000047],
+ [90.58778283800007, 26.78007192000011],
+ [90.71707727100011, 26.767049459000063],
+ [90.94449258000003, 26.778869550000096],
+ [91.00739546800008, 26.78213897700006],
+ [91.01278080700007, 26.784348086000065],
+ [91.06206913300014, 26.804566549000057],
+ [91.09193811100005, 26.80477325500003],
+ [91.12707808500011, 26.800897522000056],
+ [91.19818485600013, 26.80234446200005],
+ [91.23249800600013, 26.795161438000022],
+ [91.26195357300003, 26.779038392000032],
+ [91.27600956200007, 26.77407745400008],
+ [91.29657678200005, 26.77459421800002],
+ [91.31321659300005, 26.77867665700002],
+ [91.33006311000014, 26.785497945000074],
+ [91.34556604000005, 26.79469635000008],
+ [91.35838179600006, 26.806168519],
+ [91.37006066900011, 26.824668681000034],
+ [91.37812219300008, 26.84280710800006],
+ [91.38845747900012, 26.858465068],
+ [91.4063375240001, 26.869523824000012],
+ [91.42018680900003, 26.871539205000047],
+ [91.46059777800014, 26.869368795000057],
+ [91.47506717900006, 26.86554473900013],
+ [91.4844722900001, 26.852728984000052],
+ [91.50741662600007, 26.80802887],
+ [91.52064579300003, 26.79759023000007],
+ [91.53935266200011, 26.798830465000023],
+ [91.5756295170001, 26.81014760300009],
+ [91.5937162680001, 26.81076772100006],
+ [91.63795129500011, 26.798985494000036],
+ [91.6537642830001, 26.797951965000053],
+ [91.70213342300013, 26.803481344000076],
+ [91.73158898900004, 26.816193746000025],
+ [91.79525435400006, 26.853504131000065],
+ [91.82512333200009, 26.858465068],
+ [91.84393355300006, 26.849370015000133],
+ [91.8495146080001, 26.834745586000068],
+ [91.8524084880001, 26.818519185000056],
+ [91.8630538330001, 26.80477325500003],
+ [91.8786601160001, 26.80301625600005],
+ [91.88692834500006, 26.814436747000045],
+ [91.88589481600008, 26.830869853000095],
+ [91.87400923700005, 26.84430572500007],
+ [91.89550663300008, 26.853504131000065],
+ [91.89550663300008, 26.868283590000075],
+ [91.89312951700003, 26.881357727000122],
+ [91.90821903500006, 26.885181784000068],
+ [91.92568566900007, 26.878670553000106],
+ [91.9574149980001, 26.85427927700006],
+ [91.97508833800003, 26.84663116500009],
+ [92.03585982200013, 26.85484771800013],
+ [92.07275679500003, 26.88776560500007],
+ [92.08037091600005, 26.921570891000087],
+ [92.08391890500008, 26.937323303000127],
+ [92.06696903500006, 26.994839172000056],
+ [92.06696903500006, 26.994942526000088],
+ [92.04970910700007, 27.026826885000062],
+ [91.99989302600005, 27.071526998000095],
+ [91.98769738800013, 27.104031474000024],
+ [91.9879040940001, 27.122273255],
+ [91.99079797400009, 27.140773418000023],
+ [91.99586226400004, 27.158033346000096],
+ [92.00299361200007, 27.172606100000067],
+ [92.00578806200014, 27.1761123430001],
+ [92.00847131400008, 27.179479065000024],
+ [92.02149377500012, 27.19182973300009],
+ [92.02707482900013, 27.199839580000074],
+ [92.02996871000005, 27.208469544000096],
+ [92.03317264800012, 27.227434794000047],
+ [92.03678999800007, 27.236478170000012],
+ [92.05063928300012, 27.25141265900008],
+ [92.08185184800004, 27.2751321410001],
+ [92.08877648900011, 27.292340394000078],
+ [92.08484908100013, 27.30422597300013],
+ [92.02359761663678, 27.446779847112282],
+ [91.97508833800003, 27.472432760000018],
+ [91.96330611200011, 27.468918763000076],
+ [91.90059085495413, 27.459729852655357],
+ [91.8565776472989, 27.46623873822671],
+ [91.8162322069483, 27.4613571100768],
+ [91.77955453390229, 27.45647526576099],
+ [91.72709172100008, 27.45994159900009],
+ [91.72704146300003, 27.46000457700005],
+ [91.70492395000008, 27.468763733000046],
+ [91.6802226160001, 27.47284617100003],
+ [91.65738163300011, 27.479150696000048],
+ [91.6416719980001, 27.49496368400004],
+ [91.63288700400005, 27.51165517200009],
+ [91.60446496600008, 27.53214487700005],
+ [91.59505985500004, 27.54638173400012],
+ [91.57325240100005, 27.619710592000033],
+ [91.57986698400003, 27.65797699000005],
+ [91.62668583200013, 27.716423035000034],
+ [91.6349570594208, 27.746570816190285],
+ [91.63576961127859, 27.78252481766623],
+ [91.60533558693375, 27.810658168996827],
+ [91.5660232169979, 27.821073950502466],
+ [91.56435452404213, 27.85137236654151],
+ [91.6283394780001, 27.852693787000035],
+ [91.68013149075769, 27.849823277598603],
+ [91.72987134422583, 27.804136158001306],
+ [91.82658872441321, 27.807627271770244],
+ [91.85637335954294, 27.764539482011514],
+ [91.86491418500009, 27.72998809800002],
+ [91.90873579900006, 27.731900126000127],
+ [91.95224735500011, 27.724820455],
+ [91.96800093766346, 27.746278233869482],
+ [91.98889765320416, 27.76939841380579],
+ [92.06487820550117, 27.76172129397611],
+ [92.10615954418942, 27.786080717238843],
+ [92.1262935790001, 27.81272206600009],
+ [92.23956831900006, 27.865276998000056],
+ [92.24918013500007, 27.862641500000038],
+ [92.25827518700004, 27.848197937000023],
+ [92.27522505700006, 27.81168853700011],
+ [92.28876428200005, 27.793085022000056],
+ [92.30385380100006, 27.786160380000055],
+ [92.31728967300006, 27.80367869100003],
+ [92.32917525300013, 27.832927552000072],
+ [92.33465295400003, 27.83127390600002],
+ [92.33982059800013, 27.815564270000053],
+ [92.35005253100007, 27.802541809000033],
+ [92.36793257700003, 27.80383372000007],
+ [92.37558068800013, 27.821119487000075],
+ [92.38105839100012, 27.842461853000074],
+ [92.39284061800004, 27.85602691700005],
+ [92.40441613800004, 27.85383066900006],
+ [92.41733524600005, 27.828948466],
+ [92.42756717900005, 27.82117116400009],
+ [92.43903934800005, 27.823289897000066],
+ [92.47510949800005, 27.846595968000074],
+ [92.51815087726021, 27.839468002981643],
+ [92.57497681769904, 27.847806414432647],
+ [92.59291178341888, 27.868193283595886],
+ [92.63646812873851, 27.89536981004999],
+ [92.68367428669768, 27.910450219011963],
+ [92.71077012957788, 27.949702392409918],
+ [92.73639150917766, 27.98590893651867],
+ [92.70134891800006, 28.025241394000133],
+ [92.70134891800006, 28.037824606000058],
+ [92.68925663200014, 28.048314921],
+ [92.65422001100012, 28.052087301000128],
+ [92.63892378800006, 28.057487488000092],
+ [92.63727014200003, 28.071982728000123],
+ [92.65484012900009, 28.105830790000127],
+ [92.67861128800007, 28.133064270000105],
+ [92.70786014900011, 28.155414328000106],
+ [92.7700785720001, 28.192182108000097],
+ [92.77917362500011, 28.195902812],
+ [92.78289432800011, 28.190941874000046],
+ [92.78537479700009, 28.183293762000076],
+ [92.79023238100007, 28.178901266000068],
+ [92.80532190000008, 28.17802276700003],
+ [92.81989465400005, 28.17926300100008],
+ [92.8347774660001, 28.183526306000132],
+ [92.85028039600013, 28.19194956500003],
+ [92.8653699140001, 28.20520457000002],
+ [92.88955448400009, 28.23582285600004],
+ [92.90381717900004, 28.2496979780001],
+ [92.92200728300008, 28.25863800100005],
+ [92.96035119600003, 28.270213521000088],
+ [92.97492395000006, 28.28230580700007],
+ [93.04639880818196, 28.302097099545048],
+ [93.12982812476821, 28.325961566073488],
+ [93.20782489381371, 28.340539283245555],
+ [93.21807344565363, 28.39464655767386],
+ [93.1862858334245, 28.431995228097378],
+ [93.21883846222534, 28.457435846387227],
+ [93.25906765301328, 28.496023260000364],
+ [93.2869721652333, 28.520517242676647],
+ [93.30284340070244, 28.556921073348917],
+ [93.31717003715039, 28.603462550497838],
+ [93.35543239724171, 28.624065359777703],
+ [93.44621301300003, 28.671894430000023],
+ [93.55173628800009, 28.67894826200005],
+ [93.60713342300005, 28.672204488000105],
+ [93.62553023300006, 28.67235951800005],
+ [93.64341027900008, 28.680240174000105],
+ [93.66490848182954, 28.690238755807428],
+ [93.70552535000007, 28.69189320900007],
+ [93.72247522000009, 28.696647441000053],
+ [93.78174379684887, 28.68050383781251],
+ [93.86307969177443, 28.704870831024095],
+ [93.92778566056765, 28.68275160171495],
+ [93.96109345404737, 28.72994349590268],
+ [93.9815905577272, 28.768130860141966],
+ [93.99313607399837, 28.80188742309345],
+ [93.99201949100012, 28.844648743000064],
+ [94.01144982900013, 28.85302032500003],
+ [94.02684940600011, 28.864182435000075],
+ [94.07947398050715, 28.883072105010925],
+ [94.1353958914097, 28.897788397353693],
+ [94.17365825150097, 28.930164240507835],
+ [94.2501829716835, 28.933107498976327],
+ [94.29138859024334, 28.977256376004746],
+ [94.34731050114596, 29.024348511501685],
+ [94.30904814105469, 29.059667613124404],
+ [94.27078578096348, 29.097929973215642],
+ [94.28750533100003, 29.147937724000073],
+ [94.32378218600007, 29.146025696000052],
+ [94.33577111900013, 29.149617208000038],
+ [94.34631311100009, 29.1590739950001],
+ [94.36253951000009, 29.185325623000026],
+ [94.37287479700012, 29.19630686500001],
+ [94.39643925000013, 29.207081400000035],
+ [94.42238081900007, 29.210492045000066],
+ [94.47498742700003, 29.210802104000052],
+ [94.49824182200007, 29.21522043900005],
+ [94.51477828000009, 29.22105987600004],
+ [94.52862756400003, 29.2312401330001],
+ [94.5826811120001, 29.302915345000073],
+ [94.59994104000009, 29.316635437000016],
+ [94.6304301350001, 29.319451803000064],
+ [94.66846399000013, 29.306610209000084],
+ [94.70422408000013, 29.284699402000044],
+ [94.75641727800013, 29.230516663000017],
+ [94.76768273900007, 29.21385101300008],
+ [94.76148156800008, 29.174706116000053],
+ [94.77657108500011, 29.16669626900007],
+ [94.79879195200004, 29.1664378870001],
+ [94.81543176300005, 29.16886667900006],
+ [94.85408573500007, 29.17000356000007],
+ [94.89129276600005, 29.160495097000094],
+ [94.98906457600003, 29.15398386700012],
+ [95.04766564900007, 29.140806377000033],
+ [95.09903202400011, 29.113779603000083],
+ [95.11691206900008, 29.108095195000047],
+ [95.19153283800006, 29.096829733000092],
+ [95.19969771300003, 29.094245911000073],
+ [95.2078625900001, 29.089595032000105],
+ [95.21282352700013, 29.08186940500012],
+ [95.21406376100009, 29.07308441200003],
+ [95.21633752500009, 29.06499705000003],
+ [95.22491581200012, 29.05936431900001],
+ [95.2815531820001, 29.052672221000094],
+ [95.36740605062847, 29.03649616327051],
+ [95.42982403198397, 29.046524645630395],
+ [95.48757683710141, 29.068994487006023],
+ [95.51130660000013, 29.131788839000095],
+ [95.52143518100007, 29.13786082000003],
+ [95.52267541500004, 29.161192729000064],
+ [95.51192671700011, 29.19754709900006],
+ [95.51533736200014, 29.209432679000074],
+ [95.55016727700007, 29.212481588000017],
+ [95.55202762800008, 29.220129700000072],
+ [95.55068404100012, 29.230284119000046],
+ [95.55378462800007, 29.239043275000128],
+ [95.56442997300007, 29.2456061810001],
+ [95.57290490800006, 29.247259827000065],
+ [95.58168990100006, 29.24746653300012],
+ [95.59233524600006, 29.249688619000025],
+ [95.64669738938943, 29.22835044810863],
+ [95.71716496895556, 29.218283651027733],
+ [95.7473653601981, 29.27365103497256],
+ [95.74478072100004, 29.340432435000068],
+ [95.77640669800007, 29.345548401000073],
+ [95.79594038900007, 29.352886455000046],
+ [95.86313352662813, 29.32398502037684],
+ [95.95373470035588, 29.35921881015993],
+ [96.01413548284108, 29.364252208700393],
+ [96.07453626532634, 29.369285607240855],
+ [96.14196578000008, 29.368466899000097],
+ [96.15095747900011, 29.35407501200008],
+ [96.16604699800013, 29.303173726000054],
+ [96.17627893100013, 29.28645640100011],
+ [96.20542443800014, 29.256949158000097],
+ [96.23529341600005, 29.241213684000016],
+ [96.26784956900008, 29.24173044900006],
+ [96.30412642400006, 29.261212464000053],
+ [96.32324670400004, 29.275010071000096],
+ [96.33709598900009, 29.27971262700008],
+ [96.34991174300006, 29.274234924],
+ [96.36624149600004, 29.257233379000056],
+ [96.36686161300008, 29.24421091700013],
+ [96.34236698400014, 29.21064707500001],
+ [96.32748417200008, 29.180442200000087],
+ [96.31642541500008, 29.171863912000063],
+ [96.21007531700008, 29.145767314000082],
+ [96.19364221300003, 29.13693064400009],
+ [96.1835136310001, 29.123778992000027],
+ [96.17462528500005, 29.108844503000043],
+ [96.17595371463305, 29.017353609711428],
+ [96.19532275757172, 28.941105845485463],
+ [96.24858762565306, 28.945343306324006],
+ [96.29465549772947, 28.99232448388489],
+ [96.36656829155606, 29.036536563468914],
+ [96.45760542900013, 28.99458791100001],
+ [96.45119755100012, 28.98138458300012],
+ [96.45212772700006, 28.970377502000034],
+ [96.46008589700011, 28.963349507000103],
+ [96.47465865100008, 28.962057597000054],
+ [96.49222863800003, 28.94800160700005],
+ [96.50039351400005, 28.929243062000054],
+ [96.51083215400013, 28.885524801000074],
+ [96.52375126100003, 28.864414979000045],
+ [96.57666792800006, 28.808526917000066],
+ [96.59258426900004, 28.757884013000094],
+ [96.59800971353144, 28.709910398443995],
+ [96.50104350465409, 28.687631303142155],
+ [96.50237514126326, 28.644476217418358],
+ [96.40901887262294, 28.558928647938785],
+ [96.33645875408492, 28.47966681390912],
+ [96.30185249373439, 28.420710938634112],
+ [96.36964414401973, 28.378115826943503],
+ [96.44112658162652, 28.39541577691665],
+ [96.49522587100006, 28.42147043900009],
+ [96.51238244700005, 28.428808492000073],
+ [96.5615177204665, 28.44729288316006],
+ [96.60442611830537, 28.444534241434948],
+ [96.71692392905247, 28.436539447625634],
+ [96.89788863200005, 28.354704489000042],
+ [96.93395878200005, 28.336617737000026],
+ [96.96579146400012, 28.330468242000066],
+ [96.9974174400001, 28.337082825000053],
+ [97.03297082600005, 28.357029928000074],
+ [97.07844608600004, 28.3751425170001],
+ [97.11554976400004, 28.366564230000066],
+ [97.18272912600008, 28.31499115000007],
+ [97.19327111900003, 28.311399638000083],
+ [97.20277958200012, 28.31155466700004],
+ [97.21053104700013, 28.308092346000066],
+ [97.22076298000007, 28.28339101200008],
+ [97.22965132700011, 28.274606018000085],
+ [97.2852551680001, 28.235667827],
+ [97.32349572800013, 28.217477723000073],
+ [97.32866337100012, 28.190011699000095],
+ [97.29889774600014, 28.12924021400009],
+ [97.29290328000008, 28.095082092],
+ [97.3065458580001, 28.0696572880001],
+ [97.3551217050001, 28.02304514600003],
+ [97.36225305200003, 27.994881490000083],
+ [97.35677535000013, 27.98056711800008],
+ [97.34003218600003, 27.951809184000084],
+ [97.33569136600005, 27.93560862200006],
+ [97.33631148300009, 27.91318105100008],
+ [97.33817183500008, 27.90155385300004],
+ [97.33352095600003, 27.894164124000028],
+ [97.3149174400001, 27.884603983000105],
+ [97.29290328000008, 27.877550151],
+ [97.28866581300014, 27.88434560200004],
+ [97.28804569500005, 27.8977556360001],
+ [97.27636682200011, 27.910338847],
+ [97.26065718600006, 27.912044170000073],
+ [97.24122684700006, 27.907858379000047],
+ [97.2229333900001, 27.899719341000022],
+ [97.21094445800003, 27.88951324500006],
+ [97.19802535100013, 27.87326100700004],
+ [97.1821090090001, 27.857267151000073],
+ [97.13177616400003, 27.816856181],
+ [97.12319787600006, 27.812153625000022],
+ [97.11244917900007, 27.809208069000036],
+ [97.10604130000013, 27.805539043000024],
+ [97.09818648300006, 27.791017965],
+ [97.09219201700006, 27.785488587000074],
+ [97.07234826700005, 27.779184062000084],
+ [97.06532027200006, 27.773990581000064],
+ [97.06201298100007, 27.763345235000074],
+ [97.06035933400011, 27.750451965000067],
+ [97.05674198400004, 27.746782939000056],
+ [97.05054081200007, 27.746782939000056],
+ [97.03617476400007, 27.742920068000032],
+ [97.00403202400008, 27.73427724200006],
+ [96.99090621000005, 27.72662913000009],
+ [96.95700647000012, 27.68807851200002],
+ [96.93953983600011, 27.6740225220001],
+ [96.89974898300005, 27.649476217000128],
+ [96.88352258400005, 27.636324565000066],
+ [96.87019006400004, 27.61909047500008],
+ [96.86212854000007, 27.599298401000098],
+ [96.86202518800013, 27.57836944600011],
+ [96.86615930200003, 27.56844757100002],
+ [96.87732141200007, 27.553073832000038],
+ [96.88031864400011, 27.543849589000033],
+ [96.88104211500007, 27.534392802000056],
+ [96.88465946500008, 27.515840963000116],
+ [96.88848352100013, 27.507185160000077],
+ [96.89024051900009, 27.492483215000064],
+ [96.87701135200007, 27.463079325000095],
+ [96.8813521730001, 27.44411407500003],
+ [96.90512333200013, 27.408405660000128],
+ [97.06790409400008, 27.21709950800006],
+ [97.09549930900005, 27.19126129200002],
+ [97.10128706900014, 27.183303121000066],
+ [97.10170048100014, 27.165268046000065],
+ [97.1043876550001, 27.15601796500006],
+ [97.11172570800005, 27.14883494100009],
+ [97.12082076100006, 27.143925680000066],
+ [97.12929569600004, 27.137879537000018],
+ [97.13477339700012, 27.12733754500006],
+ [97.13301639900004, 27.119586080000047],
+ [97.1228878170001, 27.093696188000123],
+ [97.1191671140001, 27.08728831000009],
+ [97.10604130000013, 27.08258575400002],
+ [97.09797977800014, 27.085893046000095],
+ [97.08991825400005, 27.09219757100003],
+ [97.07720585100009, 27.09648671500007],
+ [97.06697391800003, 27.095246480000057],
+ [97.05882660700013, 27.092075635000057],
+ [97.0478536380001, 27.087805074000116],
+ [97.03803511600006, 27.087029928],
+ [97.02676965400008, 27.091474101000117],
+ [97.01891483600014, 27.098708802000075],
+ [97.01188684100003, 27.107028707000055],
+ [97.00299849500004, 27.11452179000007],
+ [96.86533247900013, 27.1716242480001],
+ [96.84269820200007, 27.188522441000075],
+ [96.84176802600012, 27.204387106000084],
+ [96.85127649000003, 27.221181946000073],
+ [96.85964807200008, 27.240715637000065],
+ [96.85375695800008, 27.248725485000037],
+ [96.82171757000009, 27.273065084000066],
+ [96.80993534400005, 27.285777487000118],
+ [96.78916141700012, 27.31797190400006],
+ [96.77634566300003, 27.330632630000096],
+ [96.75887902800008, 27.341743063000123],
+ [96.72415246600008, 27.35626414000005],
+ [96.70523889200012, 27.360759989000073],
+ [96.68725549300012, 27.361741842000058],
+ [96.67588667900003, 27.357659404000046],
+ [96.65924686700004, 27.341433004000024],
+ [96.64901493300005, 27.336213685000118],
+ [96.63640588400011, 27.335541891000034],
+ [96.62927453600008, 27.338694153000077],
+ [96.62317671800014, 27.34365509100003],
+ [96.61418501800006, 27.34840932300004],
+ [96.58689986200005, 27.353576966000034],
+ [96.57604781100014, 27.34541208900002],
+ [96.5674695240001, 27.328307191000064],
+ [96.54731571500014, 27.306448059000033],
+ [96.53181278500011, 27.298541565000065],
+ [96.51093550700006, 27.292495422000044],
+ [96.49005822700008, 27.290738424000054],
+ [96.47465865100008, 27.29538930300002],
+ [96.40778934700012, 27.29817983000008],
+ [96.14258589700006, 27.25751047800013],
+ [96.07416630100005, 27.22986358600012],
+ [96.01318811100009, 27.190796204000023],
+ [95.97484419800008, 27.142892151000083],
+ [95.93836063700007, 27.079898580000062],
+ [95.91644983000003, 27.051373189000017],
+ [95.88885461500013, 27.0270335900001],
+ [95.86146610500009, 27.014217835000025],
+ [95.8049320880001, 27.00476104800005],
+ [95.77795699100005, 26.995149231000042],
+ [95.73496219900011, 26.947296855000033],
+ [95.70922733600003, 26.907454326000035],
+ [95.69930546100011, 26.896188863000063],
+ [95.68607629400003, 26.89127960300003],
+ [95.63998091600007, 26.88642201800009],
+ [95.62427128100012, 26.880737610000054],
+ [95.61331587700005, 26.867921855000063],
+ [95.60339400200013, 26.844254049000043],
+ [95.59130171700008, 26.823738505000065],
+ [95.57476525900006, 26.81614207000011],
+ [95.55440474400012, 26.816607157000035],
+ [95.53135705600005, 26.820276185000026],
+ [95.4898092040001, 26.810716044000046],
+ [95.46273075300013, 26.777178040000123],
+ [95.43999312400007, 26.73537180600006],
+ [95.4106409100001, 26.701627096],
+ [95.3926575110001, 26.691756898],
+ [95.31596968600007, 26.66907094300005],
+ [95.27896936100012, 26.65294789700006],
+ [95.26057255100011, 26.647625224000123],
+ [95.24693311800007, 26.64890392100004],
+ [95.23907515500008, 26.649640605000073],
+ [95.22326216700009, 26.67036285400009],
+ [95.20486535700007, 26.66757232700003],
+ [95.19556359900014, 26.660751038000072],
+ [95.18161096200004, 26.641682435000106],
+ [95.1732393800001, 26.63382761700008],
+ [95.16342085800011, 26.62974517800005],
+ [95.14140669800014, 26.624990946000068],
+ [95.13262170500013, 26.620805155000127],
+ [95.12280318300009, 26.611606751000025],
+ [95.11908247900004, 26.604217021000025],
+ [95.1158785400001, 26.575639954000067],
+ [95.11618859900005, 26.56933542900005],
+ [95.11494836400004, 26.562565816000117],
+ [95.10957401600007, 26.55130035400005],
+ [95.09923872900009, 26.536107484000027],
+ [95.06988651600011, 26.506238506],
+ [95.05438358600009, 26.494921367000032],
+ [95.04063765500013, 26.47559438100008],
+ [95.04260135900006, 26.459678040000043],
+ [95.0617216390001, 26.426605123000073],
+ [95.06606245900014, 26.407433167000065],
+ [95.06420210800013, 26.392602031000123],
+ [95.05045617700011, 26.359064026000013],
+ [95.04363488800004, 26.327696432],
+ [95.04177453600005, 26.287595520000096],
+ [95.04632206200006, 26.24795969700004],
+ [95.05872440600007, 26.217677307000102],
+ [95.06637251800004, 26.2110110470001],
+ [95.07453739500005, 26.208323873000055],
+ [95.08280562300007, 26.20661855100009],
+ [95.09076379400005, 26.202691142000035],
+ [95.09448449700005, 26.195043030000065],
+ [95.08973026500007, 26.187601624000123],
+ [95.08239221200006, 26.179798483000113],
+ [95.07836145100009, 26.171323548000103],
+ [95.08817997300008, 26.10409250900004],
+ [95.10171919800013, 26.09339548800004],
+ [95.13747928900005, 26.082956848],
+ [95.1500883380001, 26.070967916000043],
+ [95.15122522000007, 26.04993560800004],
+ [95.13954634600003, 26.02993682900008],
+ [95.10823042800013, 25.99510691300013],
+ [95.0658557540001, 25.953817444000023],
+ [95.04942264900012, 25.943740540000064],
+ [95.01200891200006, 25.93144154900004],
+ [95.0006400960001, 25.922036438000063],
+ [94.99402551300005, 25.90043569],
+ [94.99319869000004, 25.88095367400011],
+ [95.01345585200005, 25.777704163000053],
+ [95.01531620300005, 25.755121562000014],
+ [95.00880497300011, 25.73713816300004],
+ [94.99991662700006, 25.731557109000036],
+ [94.97862593600007, 25.72907664000006],
+ [94.96901412000005, 25.725614319],
+ [94.96146936100013, 25.717966207000032],
+ [94.87165572100014, 25.59802520800004],
+ [94.86803837100007, 25.59471791600005],
+ [94.85749637900005, 25.589343567000085],
+ [94.8534656170001, 25.58603627500007],
+ [94.85294885300004, 25.58076528000005],
+ [94.86101037600014, 25.571411846],
+ [94.86028690600006, 25.567174378000047],
+ [94.85077844300014, 25.56278188100005],
+ [94.83103804600012, 25.56247182300008],
+ [94.82235640500005, 25.559112854000077],
+ [94.80799035600012, 25.542628072000085],
+ [94.78235884600008, 25.504594219000055],
+ [94.76437544800007, 25.49167511000003],
+ [94.74577193200014, 25.486610820000053],
+ [94.71114872200013, 25.482786764000124],
+ [94.69202844200004, 25.476327210000065],
+ [94.65947229000005, 25.45550160800012],
+ [94.6503600370001, 25.446649705000098],
+ [94.63053348800008, 25.427389629000075],
+ [94.60800256400012, 25.394626770000073],
+ [94.55012496000006, 25.245281881],
+ [94.55332889800013, 25.20414744000003],
+ [94.57689335200013, 25.173606670000126],
+ [94.61296350100014, 25.1613593550001],
+ [94.65327111800008, 25.15412465400003],
+ [94.68913456300004, 25.138518372000092],
+ [94.70680790300014, 25.10994130500002],
+ [94.71383589700014, 25.068264262000085],
+ [94.7085649010001, 25.025889587000094],
+ [94.68975467900003, 24.99509043400012],
+ [94.67352828000008, 24.974807434000112],
+ [94.65482141100011, 24.889153748000027],
+ [94.63911177600005, 24.862798767000058],
+ [94.59901086400004, 24.813473612000067],
+ [94.59322310400006, 24.7837855020001],
+ [94.59322310400006, 24.765931295000044],
+ [94.58950240100006, 24.747250264000073],
+ [94.58154423100012, 24.73011952800003],
+ [94.56945194600013, 24.716399434],
+ [94.55570601400007, 24.70885467600006],
+ [94.54340702300004, 24.70733022000003],
+ [94.53100468000008, 24.70748525000006],
+ [94.51632857300007, 24.704953105000087],
+ [94.50795699100013, 24.689010925000062],
+ [94.48707971200014, 24.620462138000036],
+ [94.47498742700003, 24.597388611000056],
+ [94.43023563600008, 24.570904439000074],
+ [94.4184534100001, 24.56031077100009],
+ [94.41080529800013, 24.54594472300009],
+ [94.39705936700005, 24.495069275000063],
+ [94.38186649600004, 24.486310120000084],
+ [94.37039432800003, 24.47773183300005],
+ [94.36367639200012, 24.46582041500001],
+ [94.36119592300014, 24.425409444000124],
+ [94.35220422300011, 24.413937277000016],
+ [94.34000858600007, 24.40600494400006],
+ [94.32874312400003, 24.39448110000002],
+ [94.32832971200003, 24.388486634000103],
+ [94.33174035600013, 24.371097514000084],
+ [94.33070682800013, 24.36285512300013],
+ [94.32367883300003, 24.35466440800009],
+ [94.30280155400004, 24.341021831000106],
+ [94.29536014800004, 24.332598572],
+ [94.28998580000007, 24.316759746000017],
+ [94.28688521300006, 24.283066712000064],
+ [94.28275109900011, 24.26642690100003],
+ [94.23396854600009, 24.160335185000108],
+ [94.22218632100004, 24.122637228000073],
+ [94.21846561700005, 24.086670431000087],
+ [94.21412479700007, 24.069177959000044],
+ [94.20368615700005, 24.05775746700003],
+ [94.19913863200003, 24.048093974000025],
+ [94.19386763500006, 24.00967254700008],
+ [94.1902502850001, 23.995280660000063],
+ [94.14487837800004, 23.93887583400003],
+ [94.13505985500007, 23.919006246000052],
+ [94.13361291500007, 23.899162496000045],
+ [94.13505985500007, 23.877303365],
+ [94.13185591700011, 23.856968689000084],
+ [94.12885926700005, 23.853904873000076],
+ [94.11686975100014, 23.84164662700003],
+ [94.09971317600008, 23.842628479000084],
+ [94.08534712700009, 23.857511292000126],
+ [94.07108443200008, 23.876114808000082],
+ [94.05506473800006, 23.88794871],
+ [93.99791060400014, 23.916965027000074],
+ [93.97506962100005, 23.920918274000044],
+ [93.94054976400014, 23.928876445000114],
+ [93.91233443200008, 23.93900502500007],
+ [93.88318892500007, 23.94530955000009],
+ [93.80371057200006, 23.936059469000057],
+ [93.78283329300007, 23.94546457900013],
+ [93.74304244000007, 23.995280660000063],
+ [93.71110640500012, 24.005460917000036],
+ [93.66046350100004, 24.011222839000098],
+ [93.61240441900009, 24.00905243000001],
+ [93.58801314300007, 23.995228984000036],
+ [93.58563602700008, 23.98729665100008],
+ [93.58181197200008, 23.979596863],
+ [93.57695438700006, 23.97300811800001],
+ [93.57106327400004, 23.968021343000046],
+ [93.5613481040001, 23.965695903000025],
+ [93.55525028500006, 23.97099273700006],
+ [93.54997928900013, 23.978020732000076],
+ [93.54346805900013, 23.980888774000064],
+ [93.52682824700014, 23.97538523300007],
+ [93.49571903500009, 23.959132996000037],
+ [93.47484175700009, 23.957505189000088],
+ [93.45665165200006, 23.959959819000076],
+ [93.44900354000009, 23.96892568],
+ [93.44559289600005, 23.98161224400006],
+ [93.4391850180001, 23.995228984000036],
+ [93.40652551300013, 24.025847270000057],
+ [93.39650028500012, 24.03752614400004],
+ [93.36828495300006, 24.078479716000075],
+ [93.34854455600009, 24.088892517000104],
+ [93.32218957500004, 24.080055847],
+ [93.30968387900003, 24.063984477000034],
+ [93.30296594200013, 24.041143494000025],
+ [93.30255946900013, 24.035774655000083],
+ [93.30110559100012, 24.016571350000035],
+ [93.30296594200013, 23.995280660000063],
+ [93.30813358600011, 23.977503968000022],
+ [93.31609175600005, 23.961096700000084],
+ [93.33758915200013, 23.928411357000087],
+ [93.34596073400007, 23.918696188000055],
+ [93.35185184800008, 23.913916117000056],
+ [93.35598596200003, 23.906991475000083],
+ [93.3591899010001, 23.89094594300012],
+ [93.35825972500004, 23.85526336700012],
+ [93.37479618400005, 23.739017232000023],
+ [93.4063188070001, 23.719121806000132],
+ [93.41231327300011, 23.708709005000102],
+ [93.42595585100014, 23.69080312100003],
+ [93.43029667200011, 23.6803386430001],
+ [93.43236372900009, 23.647317404000106],
+ [93.40022098800011, 23.454021709000088],
+ [93.3998075770001, 23.426090597000027],
+ [93.4059053960001, 23.367670390000043],
+ [93.4077657470001, 23.35637908900007],
+ [93.40724898300004, 23.34725819900008],
+ [93.40373498600007, 23.338757426000072],
+ [93.38420129400009, 23.313125916000033],
+ [93.37789676900007, 23.29682200100008],
+ [93.37644982900008, 23.279484559000068],
+ [93.38079065000005, 23.237264913],
+ [93.37272912600008, 23.169827169000072],
+ [93.37303918400005, 23.15422088700005],
+ [93.37520959500006, 23.142154439000066],
+ [93.37489953600004, 23.129726257000087],
+ [93.33335168500008, 23.05228912300005],
+ [93.31826216700006, 23.033659770000085],
+ [93.29883182800006, 23.01795013400003],
+ [93.27278690600008, 23.005909526000053],
+ [93.24653527900006, 23.00448842400006],
+ [93.22555464700008, 23.020378927000067],
+ [93.21211877500014, 23.03988678000006],
+ [93.19651249200007, 23.053839417000077],
+ [93.17708215400012, 23.058438619000114],
+ [93.15238081900009, 23.049937846000105],
+ [93.14008182800006, 23.031902771000105],
+ [93.13822147700006, 23.005263570000054],
+ [93.14318241400008, 22.97751332600002],
+ [93.15114058400007, 22.95622263600005],
+ [93.17108768700007, 22.92043670700012],
+ [93.17739221200009, 22.900205384000017],
+ [93.17553186100008, 22.881705220000086],
+ [93.16106246000004, 22.86098297200006],
+ [93.12530236800012, 22.821553854000044],
+ [93.11589725800007, 22.79840281200005],
+ [93.11238326000012, 22.799953105000085],
+ [93.07951704900012, 22.772719626000068],
+ [93.07083540900004, 22.69287953700008],
+ [93.07393599400007, 22.671898905000077],
+ [93.08189416500005, 22.652830302000027],
+ [93.10442509000006, 22.61593332900007],
+ [93.11052290900011, 22.596347962000053],
+ [93.10907596900012, 22.57469553600008],
+ [93.09822391800009, 22.535266419000052],
+ [93.09915409300004, 22.511960347000027],
+ [93.10959273300006, 22.479042460000088],
+ [93.11786096200012, 22.46286773700008],
+ [93.15351770000012, 22.427521057],
+ [93.16592004400007, 22.38659332300007],
+ [93.17429162700006, 22.26939117400012],
+ [93.17367150900009, 22.259417623000033],
+ [93.16902063000003, 22.246911927000028],
+ [93.16126916500008, 22.24251943000003],
+ [93.15145064300003, 22.24096913700002],
+ [93.12974654200013, 22.23161570200007],
+ [93.12478560400007, 22.23228749600004],
+ [93.12354537000004, 22.230685527],
+ [93.12313195800004, 22.218386536000068],
+ [93.14173547400009, 22.18727732400002],
+ [93.11951460800009, 22.180972799000088],
+ [93.10432173700013, 22.187173970000075],
+ [93.09057580600012, 22.197147522000094],
+ [93.07248905400007, 22.202470195000032],
+ [93.04582401500005, 22.20686269100004],
+ [93.03641890500006, 22.206242575000076],
+ [93.02453332500005, 22.201901754000076],
+ [93.02236291600008, 22.19621734600004],
+ [93.02391320800007, 22.18882761700003],
+ [93.02256962100012, 22.120976461000097],
+ [93.0254635010001, 22.1129149370001],
+ [93.00748010300003, 22.1059386190001],
+ [92.99518111200007, 22.103251445000083],
+ [92.98546594300012, 22.095965068000012],
+ [92.9671724860001, 22.06268544600006],
+ [92.96531213400004, 22.049559632000083],
+ [92.96841272000012, 22.03617543500006],
+ [92.97492395000006, 22.02330800400007],
+ [92.97792118400008, 22.016486715000028],
+ [92.97957482900006, 22.009355367000083],
+ [92.97988488800013, 22.00227569600004],
+ [92.97895471200007, 21.995351054000068],
+ [92.97709436100007, 21.993025615000036],
+ [92.97492395000006, 21.990906881000072],
+ [92.96810266200004, 21.98723785400007],
+ [92.9616947830001, 21.98687611900006],
+ [92.95559696500004, 21.98961497],
+ [92.95032596900006, 21.995351054000068],
+ [92.93740686000007, 22.013024394000055],
+ [92.92097375600014, 22.02180938700006],
+ [92.90619429500009, 22.01731353800004],
+ [92.89864953600005, 21.995402731000084],
+ [92.88924442500007, 21.966722311000083],
+ [92.87746219900009, 21.95700714200005],
+ [92.86702356000006, 21.966515605000026],
+ [92.8620626230001, 21.995402731000084],
+ [92.85389774600009, 22.024134827000083],
+ [92.83612105300006, 22.046510722000065],
+ [92.77162886600013, 22.104181621000052],
+ [92.7080668540001, 22.14795155800003],
+ [92.68377893100006, 22.154307760000066],
+ [92.67396040900007, 22.147073059],
+ [92.67106652800004, 22.133895569000018],
+ [92.6746838790001, 22.105576884000115],
+ [92.67396040900007, 22.0952415980001],
+ [92.6695162360001, 22.092657777000014],
+ [92.66455529800004, 22.093846334000133],
+ [92.66207482900006, 22.094776510000074],
+ [92.65618371600004, 22.075294495],
+ [92.65608036300006, 22.060566711],
+ [92.65835412600006, 22.04656239800009],
+ [92.65835412600006, 22.032816468000036],
+ [92.65091272000012, 22.019173890000033],
+ [92.63985396300012, 22.013386129000068],
+ [92.6275549720001, 22.012352600000085],
+ [92.61525598200006, 22.0087869260001],
+ [92.60388716700004, 21.995402731000084],
+ [92.59799605400008, 21.989304912000122],
+ [92.59127811700006, 21.98424062200006],
+ [92.58383671100012, 21.98031321200007],
+ [92.57587854000013, 21.977574362000027],
+ [92.57515507000005, 21.98656606100009],
+ [92.57308801300007, 21.995402731000084],
+ [92.55996219900004, 22.061341859],
+ [92.5373279210001, 22.128624573000067],
+ [92.54931685400004, 22.138494772000072],
+ [92.56419966700008, 22.1383397420001],
+ [92.57556848200005, 22.143300680000053],
+ [92.57701542200004, 22.168673808000065],
+ [92.51893111200008, 22.49537221300004],
+ [92.51738081900004, 22.512580465],
+ [92.50456506400008, 22.54379303000009],
+ [92.50084436000009, 22.560536194000022],
+ [92.50291141800011, 22.618620504000106],
+ [92.49588342300012, 22.695618388000028],
+ [92.49154260200004, 22.711069641000037],
+ [92.48069055200011, 22.726159159000034],
+ [92.45371545400008, 22.74796661400005],
+ [92.44203658000009, 22.762926941000032],
+ [92.4350085860001, 22.793286846000072],
+ [92.42632694500003, 22.871059876000103],
+ [92.4118575440001, 22.887932231],
+ [92.37868127500008, 22.900437928000073],
+ [92.35987105300006, 22.92661204000008],
+ [92.3522229410001, 22.96033091300005],
+ [92.3530497650001, 23.02991322800007],
+ [92.3276249590001, 23.171429138000022],
+ [92.32855513500004, 23.211194153000022],
+ [92.3326892500001, 23.226257833000105],
+ [92.35067264900005, 23.26098439500005],
+ [92.35749393700013, 23.278941956000025],
+ [92.35687382000003, 23.289122213],
+ [92.3522229410001, 23.29883738200003],
+ [92.3470552980001, 23.315425517000037],
+ [92.34674523900009, 23.325295715000024],
+ [92.34953576700013, 23.344958598000076],
+ [92.34860559100008, 23.354105326000038],
+ [92.34488488800008, 23.359117940000104],
+ [92.33165572100012, 23.368652243],
+ [92.32669478400004, 23.375266825],
+ [92.32535119700009, 23.382165629000085],
+ [92.32690149000013, 23.39601491300003],
+ [92.32535119700009, 23.403507995000083],
+ [92.31977014200004, 23.412163798000037],
+ [92.30674768100005, 23.423868510000105],
+ [92.30147668500007, 23.431800842000072],
+ [92.29682580600013, 23.446580302000072],
+ [92.29103804500005, 23.49528534000011],
+ [92.25279748500009, 23.609309388],
+ [92.25000695800003, 23.642614848000036],
+ [92.26168583200007, 23.68511871300008],
+ [92.25973660500011, 23.702640572000078],
+ [92.25930871600013, 23.706486918000095],
+ [92.23874149600005, 23.7168480430001],
+ [92.22210168500004, 23.70777882900005],
+ [92.20938928200007, 23.661605937],
+ [92.19429976400005, 23.648144226000042],
+ [92.18076053900012, 23.665378317000105],
+ [92.17063195800006, 23.70364471400002],
+ [92.15078820800005, 23.731653341000126],
+ [92.10841353400014, 23.718243307000094],
+ [92.09218713400003, 23.701345114],
+ [92.05963098100005, 23.659487203000126],
+ [92.04237105300007, 23.64556040500004],
+ [92.01901330600003, 23.640056865000034],
+ [92.00351037700005, 23.647420757000035],
+ [91.96165246600009, 23.691139018000015],
+ [91.94914677000008, 23.709768372000084],
+ [91.93664107300009, 23.723540141000043],
+ [91.9226884360001, 23.72297170000006],
+ [91.91648726400007, 23.7098717250001],
+ [91.91442020700003, 23.68832265300007],
+ [91.91597050000007, 23.650159607000077],
+ [91.94232548000008, 23.534430237000052],
+ [91.94077518800009, 23.495181986000077],
+ [91.91814091000003, 23.459938660000105],
+ [91.9051184490001, 23.446631979000088],
+ [91.88909875500013, 23.43593495800009],
+ [91.83380497300004, 23.413894959000103],
+ [91.81768192600003, 23.40092417400008],
+ [91.79163700400005, 23.368342183000024],
+ [91.7625948490001, 23.321549174],
+ [91.74368127400004, 23.27232737300004],
+ [91.74915897700004, 23.232407329000083],
+ [91.76393843600005, 23.200626323000037],
+ [91.77902795400013, 23.131767476000036],
+ [91.79194706200013, 23.101149190000015],
+ [91.79556441200003, 23.08949615500005],
+ [91.7913269450001, 23.080375265000086],
+ [91.77623742700007, 23.065259909000062],
+ [91.77375695800004, 23.06489817300006],
+ [91.76424849400013, 23.065647481000084],
+ [91.76094120300013, 23.065492453000033],
+ [91.75598026500006, 23.061539206000063],
+ [91.75556685400005, 23.05683665000008],
+ [91.75629032400008, 23.052159933000027],
+ [91.75505009000011, 23.048232524000056],
+ [91.73830692600006, 23.02466807100005],
+ [91.73127893100008, 23.017330018000038],
+ [91.7144324140001, 23.00311899800009],
+ [91.70699100800005, 22.995367534000067],
+ [91.69469201700014, 22.98813283300011],
+ [91.66761356600006, 22.982629293000016],
+ [91.65407434100007, 22.978055929000064],
+ [91.64694299300004, 22.97658315000008],
+ [91.63991499800005, 22.978004253000066],
+ [91.63278365100012, 22.98030385300008],
+ [91.62575565600008, 22.98154408800012],
+ [91.61666060400012, 22.978055929000064],
+ [91.61200972500006, 22.969839376000053],
+ [91.60828902200006, 22.96033091300005],
+ [91.60239790900005, 22.95296702100005],
+ [91.58606815600012, 22.94446624800004],
+ [91.58296757000005, 22.94790273100007],
+ [91.5830709230001, 22.957798767000057],
+ [91.57676639900006, 22.96880584800006],
+ [91.5631238200001, 22.974981181000132],
+ [91.54979130000004, 22.977229106000053],
+ [91.53656213400006, 22.981854146],
+ [91.52364302600006, 22.995212504000037],
+ [91.51940555800007, 23.005625305000066],
+ [91.51816532400005, 23.03508087200008],
+ [91.51558150200009, 23.03880157500008],
+ [91.50607303900006, 23.041178691000127],
+ [91.50328251200011, 23.0444084680001],
+ [91.49811486900012, 23.069962464000056],
+ [91.47506717900006, 23.14308461500012],
+ [91.47041630100011, 23.153290711000082],
+ [91.46359501200004, 23.184115702000057],
+ [91.46121789600011, 23.184425761000043],
+ [91.44643843600005, 23.1978874710001],
+ [91.44540490800011, 23.203029277],
+ [91.44674849500007, 23.20879119900006],
+ [91.44643843600005, 23.215534973],
+ [91.43992720500012, 23.223518983000062],
+ [91.43961714700004, 23.22264048200013],
+ [91.43620650200012, 23.215715841000062],
+ [91.43651656100008, 23.214863180000023],
+ [91.42814498000013, 23.229513449000095],
+ [91.41357222500005, 23.248633728000087],
+ [91.39434859200003, 23.2626638790001],
+ [91.37212772600009, 23.261888733000077],
+ [91.36096561700003, 23.247522685],
+ [91.35569462100011, 23.224139099000027],
+ [91.35590132700008, 23.17964569100006],
+ [91.37460819500006, 23.095723165000052],
+ [91.37088749200007, 23.06277944],
+ [91.33740116400003, 23.071073507000037],
+ [91.31352665200006, 23.101045838000076],
+ [91.30050419200012, 23.14230946900001],
+ [91.27724979600009, 23.303255717000027],
+ [91.27290897700004, 23.313487651000017],
+ [91.26753462700009, 23.321549174],
+ [91.26577762900007, 23.329352315000037],
+ [91.27290897700004, 23.338499044000017],
+ [91.28293420400007, 23.34764577300008],
+ [91.28727502500004, 23.35555226700005],
+ [91.28396773300005, 23.36144338000004],
+ [91.27094527200006, 23.3645956430001],
+ [91.2581295170001, 23.37363901800005],
+ [91.24789758300005, 23.393766989000127],
+ [91.23446171100005, 23.436270854000085],
+ [91.22970747900007, 23.461178894000042],
+ [91.22733036300014, 23.4687753300001],
+ [91.22081913300008, 23.47789622000009],
+ [91.20335249900012, 23.487921448000108],
+ [91.19508426900006, 23.495181986000077],
+ [91.1858858650001, 23.511563416000044],
+ [91.17751428300011, 23.544274597000125],
+ [91.16986617000003, 23.561973776000045],
+ [91.14082401500013, 23.61209991500006],
+ [91.13627648900012, 23.629514872000087],
+ [91.13968713400004, 23.65357025100012],
+ [91.15229618400014, 23.655094707000032],
+ [91.1664555260001, 23.654087016000048],
+ [91.1752405200001, 23.67031341600007],
+ [91.16893599500008, 23.685377096000067],
+ [91.15239953700006, 23.691009827000087],
+ [91.13658654800008, 23.698890483000028],
+ [91.13234908000004, 23.720646261000056],
+ [91.14175419100008, 23.73989573200008],
+ [91.15756717900007, 23.744985861000046],
+ [91.17658410700005, 23.746536154000083],
+ [91.19498091600013, 23.755166118000105],
+ [91.20521285000012, 23.77157338500008],
+ [91.2252633060001, 23.82614369800011],
+ [91.22815718600009, 23.844979757000104],
+ [91.22402307100003, 23.857485453000024],
+ [91.2127576090001, 23.880739848000033],
+ [91.21193078600004, 23.89445994100008],
+ [91.21627160700012, 23.90838673900005],
+ [91.25037805200003, 23.96404225700006],
+ [91.26092004400004, 23.97727142400008],
+ [91.27414921100006, 23.988226827000048],
+ [91.29161584500008, 23.994815573000025],
+ [91.30494836400004, 23.993859558000068],
+ [91.30843257700013, 23.992501035000103],
+ [91.31621382700007, 23.989467062000088],
+ [91.32706587800004, 23.987865092000035],
+ [91.3390548100001, 23.995228984000036],
+ [91.34928674300005, 24.036053366000132],
+ [91.35083703600009, 24.074242249000022],
+ [91.36303267500011, 24.099847921000062],
+ [91.40458052600007, 24.103129374000062],
+ [91.48044152900013, 24.088014018000067],
+ [91.51754520700007, 24.085197652000076],
+ [91.55867964700008, 24.089667663000014],
+ [91.58183068900007, 24.096101380000064],
+ [91.59650679500004, 24.104989726000056],
+ [91.60601525900012, 24.11886484800003],
+ [91.61376672300014, 24.140103862],
+ [91.62451542100007, 24.203459168000037],
+ [91.62906294800007, 24.21531890900006],
+ [91.63950158700004, 24.211701559000076],
+ [91.65717492700003, 24.17136810400011],
+ [91.66616662600006, 24.155916850000025],
+ [91.68415002500006, 24.145478211000082],
+ [91.70368371600006, 24.14294606500009],
+ [91.72115035100012, 24.148992208000024],
+ [91.73262251800003, 24.164314270000077],
+ [91.73200240000006, 24.181677551000107],
+ [91.72580122900007, 24.202063904000042],
+ [91.72301070200012, 24.22097747800008],
+ [91.73293257600011, 24.234284159000097],
+ [91.79659794100013, 24.221597595000063],
+ [91.80703658100003, 24.221132507000036],
+ [91.8097237550001, 24.214543763000037],
+ [91.81137740100013, 24.192038676000024],
+ [91.81375451700006, 24.183124492],
+ [91.84424361200007, 24.155322571000042],
+ [91.86450077300009, 24.15059417700006],
+ [91.87710982300007, 24.158035584000075],
+ [91.88434452300004, 24.17555389500005],
+ [91.90594527200011, 24.260639140000066],
+ [91.90687544800005, 24.28035369900003],
+ [91.89643680900014, 24.32011871400003],
+ [91.89984745300006, 24.338050435000085],
+ [91.92186161300003, 24.34450999000005],
+ [91.93095666500011, 24.336965231000093],
+ [91.95307417800012, 24.322986755],
+ [91.97219445900004, 24.316062114000104],
+ [91.97136763500009, 24.329678853000118],
+ [91.94883671100007, 24.363526917000016],
+ [91.9499735920001, 24.37538665800004],
+ [92.03337935400003, 24.368849590000067],
+ [92.06273156800012, 24.37102],
+ [92.08825972500006, 24.38163950700003],
+ [92.10758671100012, 24.40597910600006],
+ [92.11120406100008, 24.43429779100005],
+ [92.10593306500004, 24.495250143000092],
+ [92.11089400300011, 24.514292908000087],
+ [92.12319299300003, 24.525377503000087],
+ [92.13859257000013, 24.533723246000065],
+ [92.14997986200007, 24.54218295400004],
+ [92.1531653240001, 24.54454945900001],
+ [92.16360396300013, 24.55919972800008],
+ [92.16887496000004, 24.574315084000077],
+ [92.1734224860001, 24.60839569200006],
+ [92.18293094900008, 24.647256368000015],
+ [92.23378055900008, 24.777532654000098],
+ [92.23646773300004, 24.793035584],
+ [92.23688114400005, 24.808590190000032],
+ [92.23502079300005, 24.824764914000028],
+ [92.23492786100007, 24.82499071000008],
+ [92.22179162600014, 24.856907654000068],
+ [92.22175905800003, 24.857046883000052],
+ [92.21765751100003, 24.874580994000084],
+ [92.2230318610001, 24.89137583400013],
+ [92.2521773680001, 24.902977194000087],
+ [92.29024450000003, 24.891351286000045],
+ [92.29041792900011, 24.891298320000104],
+ [92.35814605200005, 24.853748899000024],
+ [92.35832076000014, 24.853652039000096],
+ [92.35932057700006, 24.84642836600004],
+ [92.35935428900012, 24.846184794000052],
+ [92.36350740900014, 24.841120014000026],
+ [92.36359175600006, 24.84101715100006],
+ [92.37092980900007, 24.837916565000015],
+ [92.38074833200005, 24.836702169000077],
+ [92.44203658000009, 24.855409037000058],
+ [92.47769331900008, 24.863909810000067],
+ [92.49154260200004, 24.883727722000046],
+ [92.49453983600006, 24.894863993000072],
+ [92.49133589700006, 24.91227895100012],
+ [92.49126714800008, 24.912424218000055],
+ [92.48379113800013, 24.92822113000004],
+ [92.4743860270001, 24.93667022800004],
+ [92.4742723330001, 24.936715371000062],
+ [92.4497880460001, 24.946437073000098],
+ [92.45002848600006, 24.94663618700004],
+ [92.45805627500005, 24.953284201000045],
+ [92.45782812800007, 24.953557685000035],
+ [92.45402551300003, 24.95811594700008],
+ [92.45376877000012, 24.9582310630001],
+ [92.44451704900007, 24.96237925200002],
+ [92.44444627300004, 24.962427197000082],
+ [92.41247766200007, 24.98408335400002],
+ [92.41246032100014, 24.98436081700008],
+ [92.4122709560001, 24.987390646000037],
+ [92.41213950000014, 24.987434336],
+ [92.41186000600004, 24.987527227000058],
+ [92.39470096900004, 24.993230082000096],
+ [92.38694950400003, 24.99509043400012],
+ [92.38692635100006, 24.99520183],
+ [92.38687592400004, 24.9954444560001],
+ [92.38493703500006, 25.004773236000048],
+ [92.38105839100012, 25.02343495700002],
+ [92.35625370300005, 25.037000021],
+ [92.32814172400003, 25.048007101000096],
+ [92.31212203000007, 25.0686001590001],
+ [92.30354374200004, 25.07428456600003],
+ [92.25155725100012, 25.080795797000107],
+ [92.2336772060001, 25.08495575000005],
+ [92.22013798000012, 25.090381775000097],
+ [92.20804569500012, 25.098107401],
+ [92.19409305900012, 25.109166159000026],
+ [92.17921024600008, 25.126684469000068],
+ [92.17269901600008, 25.131955465000104],
+ [92.16474084500004, 25.133557434000053],
+ [92.15099491400008, 25.129733379000086],
+ [92.14551721200013, 25.13169708200003],
+ [92.13859257000013, 25.136399638000015],
+ [92.12412316900003, 25.136968079000056],
+ [92.11616499900003, 25.139448548000033],
+ [92.11037723800007, 25.144874573000024],
+ [92.1004553630001, 25.159085592000068],
+ [92.09291060400011, 25.164718323],
+ [92.06603886000005, 25.174536845000077],
+ [92.03399947100013, 25.181668193000107],
+ [92.00175337700006, 25.18296010400006],
+ [91.97508833800003, 25.175363668],
+ [91.95627811700012, 25.169782613000066],
+ [91.90057092300009, 25.177585754000106],
+ [91.79370406100003, 25.16533844000007],
+ [91.74533492100011, 25.169369202000055],
+ [91.73014204900005, 25.167457174000063],
+ [91.72373417200004, 25.161927796000057],
+ [91.71773970600009, 25.149835511000063],
+ [91.7107117110001, 25.14466786800007],
+ [91.70182336400006, 25.14714833600003],
+ [91.68890425700005, 25.15298777300002],
+ [91.67743208800005, 25.152626038000037],
+ [91.67226444500005, 25.13650299100003],
+ [91.66203251100006, 25.127201233],
+ [91.63867476400003, 25.12404897100005],
+ [91.61314660700009, 25.12513417600006],
+ [91.59619673700007, 25.128906555000086],
+ [91.5801770430001, 25.140895488000027],
+ [91.57345910700008, 25.152264302000034],
+ [91.56612105300007, 25.15996409100002],
+ [91.5487577720001, 25.161100973000103],
+ [91.54017948400013, 25.157638652000074],
+ [91.52343632100008, 25.145184632000095],
+ [91.51165409400011, 25.14249745700006],
+ [91.50090539600006, 25.14115387],
+ [91.4807515870001, 25.135262757000092],
+ [91.47103641800004, 25.133919170000027],
+ [91.43186568300013, 25.137949931000023],
+ [91.28396773300005, 25.178981018000073],
+ [91.23570194500013, 25.201925354000096],
+ [91.22495324700009, 25.201615296000043],
+ [91.20314579300009, 25.191331686000026],
+ [91.19084680200012, 25.189471334000032],
+ [91.13534631400006, 25.191228333000097],
+ [90.97514937400013, 25.167818909000047],
+ [90.9434200450001, 25.15743194600013],
+ [90.93482138600007, 25.156359858000044],
+ [90.82198042800007, 25.142290752000108],
+ [90.7939718020001, 25.14539133700005],
+ [90.77939904800013, 25.151954244000038],
+ [90.76689335100014, 25.16053253200006],
+ [90.75397424300013, 25.167560527000077],
+ [90.73795454900005, 25.16942087900007],
+ [90.73268355400006, 25.16688873300008],
+ [90.72203820800007, 25.15660512300009],
+ [90.71635380000009, 25.153556214000062],
+ [90.70767216000013, 25.15298777300002],
+ [90.67056848100009, 25.158775533],
+ [90.64896773300012, 25.167818909000047],
+ [90.6375989180001, 25.171074524000048],
+ [90.62343957500008, 25.171436259000032],
+ [90.58333866400005, 25.16203114900007],
+ [90.50137984200012, 25.168800761000014],
+ [90.39978397700008, 25.149008687000034],
+ [90.36464400300014, 25.149990540000104],
+ [90.28692264800003, 25.180066223000082],
+ [90.13008467700013, 25.211588847000044],
+ [89.90813440000011, 25.29690663700002],
+ [89.87020389800011, 25.29556305000007],
+ [89.83459883600011, 25.282437236000092],
+ [89.81904423000009, 25.284969381000067],
+ [89.80736535600005, 25.304503073],
+ [89.79852868700004, 25.340056458000035],
+ [89.79501469000007, 25.374162903000112],
+ [89.79923403500004, 25.402892809000022],
+ [89.80069909700012, 25.41286855100013],
+ [89.80856794000005, 25.439507112000015],
+ [89.82323002100003, 25.489142965000056],
+ [89.82509037300014, 25.56448720300004],
+ [89.83439213000008, 25.63476715100002],
+ [89.82421187300008, 25.674092916000106],
+ [89.80152592000013, 25.72468414400005],
+ [89.78312911000006, 25.81444610700005],
+ [89.7869531660001, 25.839147441000065],
+ [89.83005131100009, 25.90798044900005],
+ [89.83439213000008, 25.931751608000113],
+ [89.82643396000003, 25.937487691000072],
+ [89.81072432500014, 25.938779603000015],
+ [89.79201745600005, 25.94911488900003],
+ [89.81155114700005, 25.955212708000076],
+ [89.82560713700008, 25.965703024000035],
+ [89.82865604700004, 25.979397278000064],
+ [89.8152718500001, 25.99510691300013],
+ [89.81413496900007, 25.99614044200011],
+ [89.81268802900007, 25.996347148000055],
+ [89.81103438300005, 25.99603708900007],
+ [89.80932906100008, 25.995210266000058],
+ [89.80917403100011, 25.99510691300013],
+ [89.80886397300003, 25.99510691300013],
+ [89.80204268400007, 25.98864736000006],
+ [89.79553145400013, 25.985960185000053],
+ [89.78943363500014, 25.9879755650001],
+ [89.78395593200008, 25.99510691300013],
+ [89.77641117400003, 26.008232727000077],
+ [89.75584395400011, 26.032417297000066],
+ [89.75021122300012, 26.041564026000046],
+ [89.74871260600008, 26.05903066000009],
+ [89.75114139900006, 26.071536357000085],
+ [89.74984948700012, 26.08388702400005],
+ [89.73672367300003, 26.100578511],
+ [89.72876550300009, 26.114169413000084],
+ [89.72432133000007, 26.130654195000048],
+ [89.7184818930001, 26.14553700800009],
+ [89.70654463700004, 26.154166972000056],
+ [89.69765629100004, 26.154787089000095],
+ [89.67770918800011, 26.153133443000073],
+ [89.6703711340001, 26.15411529600003],
+ [89.65817549700012, 26.159231262000034],
+ [89.65579838100007, 26.161298320000085],
+ [89.65724532100006, 26.165380758000097],
+ [89.6578286080001, 26.18717448300005],
+ [89.65838220200004, 26.207858785000028],
+ [89.65300785400007, 26.222689921000054],
+ [89.63492110200008, 26.22584218300001],
+ [89.61332035300012, 26.219382629000066],
+ [89.60639571100012, 26.2110110470001],
+ [89.60846276900008, 26.180676982000037],
+ [89.61528405800004, 26.169101461000096],
+ [89.6144055580001, 26.164192200000073],
+ [89.59399336800004, 26.16972157800008],
+ [89.58675866700008, 26.169204814000025],
+ [89.57993737800012, 26.166104228000094],
+ [89.57342614800007, 26.16072987900013],
+ [89.56278080300007, 26.142591452000104],
+ [89.56939538600005, 26.130085754],
+ [89.58577681500003, 26.122902731000053],
+ [89.60422530100004, 26.120732320000073],
+ [89.59254642800005, 26.113962708000102],
+ [89.57787032100009, 26.107244771000083],
+ [89.56691491700008, 26.098976543000063],
+ [89.56701827000012, 26.087090963000023],
+ [89.57694014500004, 26.082646790000112],
+ [89.5907894290001, 26.085023906000046],
+ [89.60386356700013, 26.084662171000062],
+ [89.61135664900007, 26.072208150000066],
+ [89.60288171400009, 26.055258280000075],
+ [89.55916345200006, 26.02223704],
+ [89.55068851700008, 25.995055237000102],
+ [89.55182539900011, 25.98151601200003],
+ [89.54908654800005, 25.96885528600008],
+ [89.54169681900004, 25.959708558],
+ [89.52841597500003, 25.957124735000022],
+ [89.51818404200003, 25.96208567400005],
+ [89.50945072500008, 25.97262766500002],
+ [89.49534305900005, 25.995055237000102],
+ [89.49064050300007, 25.997329],
+ [89.4856278900001, 25.998724263000028],
+ [89.48061527500005, 25.999241028000043],
+ [89.42640669700012, 25.995055237000102],
+ [89.42635502100012, 25.994951884000088],
+ [89.42118737800007, 25.993194885000023],
+ [89.41612308700013, 25.992626444000066],
+ [89.4112655030001, 25.993194885000023],
+ [89.40661462500003, 25.995055237000102],
+ [89.39142175300003, 26.015467428000065],
+ [89.37974287900005, 26.015312399000024],
+ [89.3677539470001, 26.005442200000047],
+ [89.35147587100005, 25.996863912000023],
+ [89.33530114700005, 25.998569235000062],
+ [89.31514733900008, 26.006785787000084],
+ [89.29690555800005, 26.0181546030001],
+ [89.27297937100013, 26.043476054000067],
+ [89.23763269000011, 26.058100484000036],
+ [89.22926110800006, 26.067195537000103],
+ [89.22305993600008, 26.086574198000065],
+ [89.21262129800004, 26.098976543000063],
+ [89.19784183700011, 26.107709859000025],
+ [89.13159265100012, 26.133754781],
+ [89.11919030800004, 26.1466222130001],
+ [89.11169722500011, 26.16450225900006],
+ [89.10337732000005, 26.22517039000003],
+ [89.09588423700012, 26.24103505500004],
+ [89.07588545700008, 26.271059062000106],
+ [89.06942590300014, 26.287388815000057],
+ [89.0688574620001, 26.314260559000033],
+ [89.0803296310001, 26.315604146000013],
+ [89.09479903200014, 26.30950632700005],
+ [89.10353234900009, 26.313692118000077],
+ [89.10291223200011, 26.327334696],
+ [89.09572920800008, 26.33451772100004],
+ [89.07185469600006, 26.34061554],
+ [89.05521488500005, 26.347023417000045],
+ [89.05407800300003, 26.353948059000018],
+ [89.05728194200003, 26.362629700000085],
+ [89.05263106300004, 26.374618632000036],
+ [89.04374271700004, 26.381078186000096],
+ [89.02178023300007, 26.38624582900009],
+ [89.01087650500011, 26.390173239000077],
+ [89.00178145400014, 26.397149557000077],
+ [88.98653690600008, 26.4127041630001],
+ [88.97532312000004, 26.417871806000093],
+ [88.95930342700012, 26.428568828],
+ [88.95015669700012, 26.436940410000076],
+ [88.94100996900005, 26.439420878000064],
+ [88.92457686400007, 26.43213450100008],
+ [88.91196781400004, 26.421230774000023],
+ [88.89946211800003, 26.40448761000006],
+ [88.89124556500013, 26.38578074100006],
+ [88.89186568200006, 26.368779196000062],
+ [88.91243290200009, 26.348935445000066],
+ [88.94121667500008, 26.340098775000072],
+ [88.96602136200005, 26.328471578000105],
+ [88.97532312000004, 26.29994618800005],
+ [88.9817309980001, 26.291832987000063],
+ [88.98968916900009, 26.289404195000074],
+ [88.99862919200007, 26.291522929000067],
+ [89.00798262600011, 26.29715566],
+ [89.00436527500005, 26.275709941000073],
+ [89.01159997600013, 26.2691987110001],
+ [89.02353723100003, 26.2688369750001],
+ [89.03433760600007, 26.26578806600007],
+ [89.03971195500003, 26.24718455000003],
+ [89.01945479300014, 26.23447214800005],
+ [88.97532312000004, 26.22434356700002],
+ [88.94684940600013, 26.232921855000043],
+ [88.90271773300003, 26.272919414000015],
+ [88.8757943110001, 26.27736358600002],
+ [88.85564050400012, 26.2651162720001],
+ [88.84065433800009, 26.2320433550001],
+ [88.82484134900005, 26.22656565400011],
+ [88.80799483200008, 26.23343861900007],
+ [88.7984863690001, 26.247649638000055],
+ [88.79202681500004, 26.264599508000046],
+ [88.78401696800006, 26.27994740900003],
+ [88.74794681800006, 26.292504782000023],
+ [88.6634041750001, 26.26444447900009],
+ [88.64583418800004, 26.27601999900004],
+ [88.65327559400004, 26.283099671000073],
+ [88.69012089100005, 26.299842835000035],
+ [88.70298832200007, 26.309661357],
+ [88.71223840300007, 26.328264872000048],
+ [88.70970625900009, 26.34061554],
+ [88.69627038600004, 26.350279032000046],
+ [88.67337772700012, 26.360717672000064],
+ [88.66743493700011, 26.36815907800009],
+ [88.66852014200009, 26.385729065000064],
+ [88.66107873600009, 26.388881328000124],
+ [88.6522420660001, 26.39151682600003],
+ [88.64986495000005, 26.3983897910001],
+ [88.65193200700008, 26.407071432000052],
+ [88.65627282700007, 26.41513295500006],
+ [88.63301843300013, 26.4200938930001],
+ [88.62237308800007, 26.424538066000096],
+ [88.6115210370001, 26.43084259100003],
+ [88.60356286700005, 26.44019602500005],
+ [88.59787845900007, 26.451461487000117],
+ [88.59116052200005, 26.46122833300008],
+ [88.57917159000004, 26.466034241000088],
+ [88.55798425300009, 26.465724182000102],
+ [88.54976770000013, 26.466654358000042],
+ [88.52682336400011, 26.475387676000125],
+ [88.50682458500006, 26.487634989000057],
+ [88.49865970900004, 26.4948696900001],
+ [88.48791101100011, 26.50577341800009],
+ [88.47540531400011, 26.514971823000067],
+ [88.46238285300007, 26.528821106000052],
+ [88.44646651200009, 26.53553904300007],
+ [88.41101648000011, 26.545099182000072],
+ [88.39789066600008, 26.558690084000048],
+ [88.39499678600009, 26.578378805000014],
+ [88.39592696100004, 26.599566142000057],
+ [88.39437666800012, 26.61801462800007],
+ [88.38528161700003, 26.623544007000064],
+ [88.37251753700008, 26.611606751000025],
+ [88.36027022300004, 26.59310658800011],
+ [88.35282881700005, 26.578688864000085],
+ [88.33236495000006, 26.514661764],
+ [88.31934248900012, 26.494921367000032],
+ [88.31386478700006, 26.481537170000095],
+ [88.31510502100008, 26.465052389],
+ [88.32254642700008, 26.451771546000103],
+ [88.33562056500006, 26.44820587200003],
+ [88.34021976700006, 26.454148662000065],
+ [88.34301029400007, 26.477196351000103],
+ [88.34652429200008, 26.484017639000072],
+ [88.35355228700013, 26.484586080000028],
+ [88.37691003500004, 26.475335999000023],
+ [88.43458093200013, 26.465155741000032],
+ [88.46114261900004, 26.453890280000067],
+ [88.47540531400011, 26.432031148000036],
+ [88.49545577000009, 26.378080953000094],
+ [88.49762618100004, 26.352707825],
+ [88.47540531400011, 26.35580841100004],
+ [88.46791223200006, 26.35405141200006],
+ [88.4579903560001, 26.353017883000078],
+ [88.44863692200005, 26.353431295000078],
+ [88.44202233900006, 26.356118470000112],
+ [88.43168705300013, 26.362216289000074],
+ [88.4260026450001, 26.35792714500009],
+ [88.42119673700012, 26.348728740000112],
+ [88.41380700700006, 26.340202129000076],
+ [88.36678145400003, 26.31343373600002],
+ [88.35169193600012, 26.300979717000033],
+ [88.33660241700011, 26.281807760000035],
+ [88.33293339100004, 26.267235006000064],
+ [88.33453536000013, 26.23080312100008],
+ [88.32626713100012, 26.215920309000026],
+ [88.30869714400012, 26.206101787000065],
+ [88.25030277600007, 26.18801503500005],
+ [88.22978723200009, 26.18403595000005],
+ [88.21888350500012, 26.180160217000022],
+ [88.21195886300006, 26.173752340000064],
+ [88.20565433800004, 26.16641428700008],
+ [88.19692102100004, 26.159644674000035],
+ [88.16379642800007, 26.140472717000122],
+ [88.15563155100006, 26.128483785000057],
+ [88.14446944200012, 26.095875957000104],
+ [88.14136885600004, 26.090501607000036],
+ [88.13992191600005, 26.085333964000043],
+ [88.14116215000013, 26.075463766000055],
+ [88.14477950000008, 26.0705028280001],
+ [88.15098067200006, 26.066988830000057],
+ [88.15640669800007, 26.061407776000053],
+ [88.15790531400006, 26.050452373000056],
+ [88.1510323490001, 26.031332093000074],
+ [88.12586592600007, 26.013400371],
+ [88.10653894000012, 25.97996571900002],
+ [88.08803877800005, 25.923224996],
+ [88.08266442900003, 25.9159386190001],
+ [88.07739343300005, 25.91278635700006],
+ [88.07439620000008, 25.90813547800009],
+ [88.08204431200005, 25.86384877600007],
+ [88.08896895400005, 25.84865590400004],
+ [88.08757369000006, 25.839974264000077],
+ [88.08757369000006, 25.830982564000024],
+ [88.10333500200005, 25.814807841000047],
+ [88.1080375570001, 25.806281230000124],
+ [88.11491052200006, 25.787264303000043],
+ [88.12772627800007, 25.77491363500009],
+ [88.14643314600005, 25.77574045800013],
+ [88.16622522000011, 25.78364695300006],
+ [88.18271000200008, 25.792431946000065],
+ [88.22746179300003, 25.80426584900006],
+ [88.25991459200009, 25.789021301000034],
+ [88.32027266500006, 25.725252584000103],
+ [88.39298140400012, 25.680759176000024],
+ [88.41943973800011, 25.653784078000072],
+ [88.42378055900008, 25.592237447000073],
+ [88.43778487200012, 25.579835104],
+ [88.47540531400011, 25.56257517600001],
+ [88.48558557100012, 25.542628072000085],
+ [88.51276737500007, 25.523714498000047],
+ [88.52046716400008, 25.50929677400002],
+ [88.53028568600013, 25.500201721000067],
+ [88.55095625800004, 25.49648101800004],
+ [88.59358931500003, 25.495085755000062],
+ [88.61317468300007, 25.486404114000024],
+ [88.64542077600004, 25.46733551000004],
+ [88.66634973200013, 25.46289133800012],
+ [88.67808028100006, 25.465888570000047],
+ [88.68707198100003, 25.47389841700003],
+ [88.69565026900005, 25.48361358600006],
+ [88.70619226100013, 25.49167511000003],
+ [88.71415043100006, 25.492811992000057],
+ [88.72314213100003, 25.49141672800006],
+ [88.73265059500011, 25.49100331700005],
+ [88.74257246900004, 25.495189108000105],
+ [88.74195235200006, 25.51275909400006],
+ [88.77233809500012, 25.501958720000047],
+ [88.78096805800004, 25.495189108000105],
+ [88.79311202000014, 25.481959941000085],
+ [88.80582442200011, 25.471676331000097],
+ [88.81491947500007, 25.45860219300006],
+ [88.81631473800007, 25.437208151000036],
+ [88.79931319200006, 25.401706442000105],
+ [88.79962325000014, 25.39560862300003],
+ [88.81037194800012, 25.388425598000097],
+ [88.81326582800011, 25.380054016000102],
+ [88.81404097600006, 25.370390524000086],
+ [88.81833011900011, 25.35964182600007],
+ [88.84199792500004, 25.332821757000076],
+ [88.84902592000003, 25.327189026000056],
+ [88.85925785400013, 25.32470855700008],
+ [88.88018680800008, 25.32346832300003],
+ [88.88612959800014, 25.31907582600006],
+ [88.90287276200007, 25.30341786700008],
+ [88.92648889200007, 25.300472310000075],
+ [88.97532312000004, 25.302642721000083],
+ [88.98271285000004, 25.29447784400007],
+ [88.98493493700005, 25.284969381000067],
+ [88.98235111500009, 25.27489247700005],
+ [88.97532312000004, 25.265228984000103],
+ [88.93775435400005, 25.240165914],
+ [88.9290727130001, 25.229417216000073],
+ [88.9279875090001, 25.215929667000026],
+ [88.93077803600005, 25.202648825000026],
+ [88.92788415600006, 25.192726949000118],
+ [88.90964237500003, 25.189161275000046],
+ [88.92416345200007, 25.167870585000074],
+ [88.89863529500013, 25.169317526000057],
+ [88.83021569900012, 25.191331686000026],
+ [88.82360111500003, 25.194845683],
+ [88.81708988500009, 25.19680938700013],
+ [88.8091317140001, 25.195259094],
+ [88.80251713100012, 25.188127747000053],
+ [88.79233687400006, 25.166578675000025],
+ [88.78422367300004, 25.16094594400009],
+ [88.72453739400004, 25.166475322000068],
+ [88.66459273300012, 25.18688751200004],
+ [88.6342586670001, 25.19226186200008],
+ [88.59911869300004, 25.193140361000033],
+ [88.59012699400012, 25.190143127000013],
+ [88.57772465000005, 25.177482401000063],
+ [88.57069665500012, 25.173244935000028],
+ [88.55937951600004, 25.17076446600005],
+ [88.55467696100004, 25.171126201000035],
+ [88.5500260820001, 25.1731415820001],
+ [88.5231543380001, 25.179807841000112],
+ [88.49183842000008, 25.191124980000083],
+ [88.47540531400011, 25.195104065000052],
+ [88.44129886900004, 25.189729716],
+ [88.4314803470001, 25.173038229000056],
+ [88.43416752100012, 25.11665924100005],
+ [88.42579593900007, 25.051056010000124],
+ [88.41411706500008, 25.021522929000085],
+ [88.39101770100007, 24.99509043400012],
+ [88.38786543800006, 24.968761292000053],
+ [88.37566980000014, 24.945610251000076],
+ [88.34089156100009, 24.904139913],
+ [88.32275313400004, 24.8746843470001],
+ [88.31360640500009, 24.868302307000064],
+ [88.29681156400011, 24.86969757100006],
+ [88.25485030100009, 24.87995534300005],
+ [88.24275801600004, 24.880601299000105],
+ [88.24187951700009, 24.898765564000044],
+ [88.23283614100012, 24.918273417000037],
+ [88.21878015100009, 24.93514577200004],
+ [88.20245039900004, 24.945300191000072],
+ [88.1830200610001, 24.946979675000037],
+ [88.16451989700005, 24.941114400000046],
+ [88.11491052200006, 24.916413066000032],
+ [88.11491052200006, 24.912020569000035],
+ [88.12033654800007, 24.906775411000027],
+ [88.12493575100012, 24.89814544700006],
+ [88.13806156400005, 24.863496399000056],
+ [88.14095544500003, 24.844582825000103],
+ [88.13124027500004, 24.831767070000055],
+ [88.11739099100004, 24.81926137300003],
+ [88.10777917500013, 24.801097107000103],
+ [88.09480839000008, 24.803112488000053],
+ [88.08824548300004, 24.796136170000054],
+ [88.08535160400004, 24.78401804600007],
+ [88.0840080160001, 24.770452983000084],
+ [88.07698002200004, 24.761177063000062],
+ [88.06426761900013, 24.759161682000112],
+ [88.05320886200013, 24.754975891000086],
+ [88.04845463100014, 24.71120595300009],
+ [88.0354321690001, 24.69381683400006],
+ [88.02716394100014, 24.675730082000044],
+ [88.02178959200006, 24.64560272200005],
+ [88.04090987200004, 24.640435079000056],
+ [88.05723962400003, 24.63410471600004],
+ [88.06726485200005, 24.613666687000077],
+ [88.08183760600008, 24.599869080000033],
+ [88.08498986800004, 24.593874614000086],
+ [88.08498986800004, 24.541733093000047],
+ [88.08602339700013, 24.536720480000085],
+ [88.09000248300003, 24.532999777000057],
+ [88.0987874760001, 24.5224836230001],
+ [88.10793420400006, 24.50796254500007],
+ [88.10994958500004, 24.50098622700007],
+ [88.13878503400008, 24.495250143000092],
+ [88.40130131100011, 24.36941803000012],
+ [88.47540531400011, 24.315467835000064],
+ [88.49834965000008, 24.31097198500005],
+ [88.56310021900003, 24.308207296000077],
+ [88.61245121300004, 24.292885234000025],
+ [88.63451705000006, 24.294125468000047],
+ [88.64950321500004, 24.31536448200002],
+ [88.66014856000004, 24.338257141000057],
+ [88.68180098500011, 24.333890483000076],
+ [88.71456384300012, 24.315416158000048],
+ [88.73750817900003, 24.28709747300006],
+ [88.74303755700004, 24.24753916500002],
+ [88.74494958500009, 24.24337921200008],
+ [88.74748173000006, 24.226971945000017],
+ [88.74980717000005, 24.223251242000103],
+ [88.74639652500014, 24.21407867500001],
+ [88.73482100400008, 24.19842071500007],
+ [88.73161706600013, 24.18984242800012],
+ [88.73145573500011, 24.1897713150001],
+ [88.71590743000007, 24.182917786000033],
+ [88.69378991700006, 24.17532135100008],
+ [88.68376468900004, 24.166536356000094],
+ [88.67808028100006, 24.154289043000077],
+ [88.67828698800014, 24.144651388000042],
+ [88.68298954300013, 24.12429087300002],
+ [88.68180098500011, 24.112663676000054],
+ [88.67539310700005, 24.09183807400008],
+ [88.67410119700003, 24.082639669000102],
+ [88.67901045700006, 24.071219178],
+ [88.69782067900007, 24.05625885000002],
+ [88.70092126500009, 24.043649801000086],
+ [88.72500248200004, 24.03837880500008],
+ [88.72546757000009, 24.028896179000085],
+ [88.7138403730001, 24.01468516100003],
+ [88.70159305800007, 23.995280660000063],
+ [88.70836267100003, 23.98355011000008],
+ [88.71435713700004, 23.964403992000072],
+ [88.71714766500003, 23.9431391400001],
+ [88.71415043100006, 23.925155742000115],
+ [88.70443526200006, 23.913709412000102],
+ [88.66650476100006, 23.87949961400001],
+ [88.65312056500011, 23.869784445000064],
+ [88.63394860900007, 23.866141256000063],
+ [88.61317468300007, 23.867846578000027],
+ [88.59358931500003, 23.866916402000086],
+ [88.57762129700012, 23.855160014000077],
+ [88.57436568200012, 23.845625712000086],
+ [88.5754508870001, 23.836556499000025],
+ [88.57762129700012, 23.827616476000102],
+ [88.57751794500007, 23.818521424000025],
+ [88.57235030200007, 23.806894226000068],
+ [88.55767419400007, 23.785681051000026],
+ [88.55271325700005, 23.774984029],
+ [88.55250655100008, 23.765423890000093],
+ [88.55974125200004, 23.75028269500008],
+ [88.56118819200003, 23.74100677500006],
+ [88.54010420800012, 23.64995290100005],
+ [88.54155114800011, 23.63876495400008],
+ [88.55095625800004, 23.6344241340001],
+ [88.56123986800003, 23.632486268],
+ [88.56635583500014, 23.628739726000063],
+ [88.56439213100009, 23.61620819100007],
+ [88.5610848390001, 23.608611756000087],
+ [88.56170495600009, 23.602023010000025],
+ [88.57142012600013, 23.592333679000077],
+ [88.58154870600009, 23.58832875600008],
+ [88.60128910400005, 23.59034413700003],
+ [88.6092472740001, 23.588793844000023],
+ [88.62423344000007, 23.573859355000067],
+ [88.64764286400003, 23.535076193000023],
+ [88.66448938000008, 23.518307190000073],
+ [88.69378991700006, 23.499807028000035],
+ [88.70464196800003, 23.495181986000077],
+ [88.71942142800003, 23.468103536000015],
+ [88.73192712400004, 23.472625224000055],
+ [88.74370935100012, 23.489316711000086],
+ [88.7568351650001, 23.49879933700005],
+ [88.77016768400011, 23.48882578600005],
+ [88.76789392100011, 23.467276713],
+ [88.71926639800006, 23.348291728000063],
+ [88.69503015100008, 23.312609152000064],
+ [88.68593510000005, 23.293308004000025],
+ [88.68660689300003, 23.271603902000024],
+ [88.69658044500011, 23.252354432000104],
+ [88.71001631700005, 23.241218160000088],
+ [88.77569706300011, 23.22163279200005],
+ [88.78618737800008, 23.221529439000037],
+ [88.79419722500006, 23.224965922000067],
+ [88.80096683800008, 23.23075368300003],
+ [88.80954512500011, 23.236050517000066],
+ [88.82267093900009, 23.237962545000087],
+ [88.83962080900011, 23.234810283000044],
+ [88.90964237500003, 23.212434388000062],
+ [88.91806563300008, 23.208584493],
+ [88.92695398000012, 23.206517436000055],
+ [88.95423913600013, 23.207421773000092],
+ [88.9599752200001, 23.2026933800001],
+ [88.95982019100006, 23.19445098900006],
+ [88.95470422400007, 23.18380564400009],
+ [88.94586755400007, 23.174348857000027],
+ [88.91909916200007, 23.153859152000038],
+ [88.86478723200014, 23.10027069100009],
+ [88.85129968300004, 23.07513010700005],
+ [88.84871586100007, 23.02384124800001],
+ [88.83941410300014, 22.995367534000067],
+ [88.83879398700009, 22.975808004000058],
+ [88.84277307100012, 22.964568380000017],
+ [88.86173832200006, 22.942399190000074],
+ [88.87217696100004, 22.926767070000054],
+ [88.89346765200008, 22.879638164000127],
+ [88.90514652600007, 22.86643483500005],
+ [88.93310347500011, 22.85811492900008],
+ [88.94452396600008, 22.848012187000037],
+ [88.94679773000013, 22.834524638000076],
+ [88.94514408400005, 22.815094300000098],
+ [88.94121667500008, 22.795663961000017],
+ [88.9368758550001, 22.782331441000096],
+ [88.92623051000004, 22.767035218000032],
+ [88.91496504800006, 22.75440033000011],
+ [88.90814375800011, 22.74078359000002],
+ [88.91057255100009, 22.722593486000065],
+ [88.92250980600011, 22.69370636000012],
+ [88.92592045100014, 22.680838928000114],
+ [88.93000288900004, 22.658618063000077],
+ [88.9423535570001, 22.637482402000032],
+ [88.95201704900012, 22.611902568000076],
+ [88.95640954600003, 22.584979146000066],
+ [88.95031172700004, 22.561983134000016],
+ [88.9279875090001, 22.54813385000007],
+ [88.95904504400005, 22.53681671100007],
+ [88.97098230000006, 22.52792836500008],
+ [88.979974, 22.490928039000025],
+ [88.99837080900011, 22.45124053900004],
+ [89.00250492300006, 22.427986145000105],
+ [89.00074792500004, 22.420131328000068],
+ [88.99216963700013, 22.406953837000103],
+ [88.98948246300012, 22.396670227000115],
+ [88.98958581600004, 22.386903382000057],
+ [89.00152307100007, 22.333676656000094],
+ [89.00694909700013, 22.32142934200006],
+ [89.02353723100003, 22.294815979000035],
+ [89.00911950700004, 22.285617575000046],
+ [89.01862797100011, 22.26468861900004],
+ [89.06229455500011, 22.21156524700011],
+ [89.07071781400009, 22.194822083000062],
+ [89.07619551700009, 22.175030009000082],
+ [89.07815922000009, 22.150845439000122],
+ [89.06069258700006, 22.130484925000076],
+ [89.06039472700007, 22.12986888200004],
+ [89.06031334700003, 22.130601304000038],
+ [89.04371178500003, 22.13739655200004],
+ [89.04859459700003, 22.12295156500005],
+ [89.04566491000003, 22.11204661700009],
+ [89.03988691500007, 22.100897528000075],
+ [89.03687584700003, 22.085598049000055],
+ [89.04004967500003, 22.069525458000044],
+ [89.05404707100007, 22.04364655200004],
+ [89.05738366000003, 22.03123607000009],
+ [89.06560306100005, 21.96710846600007],
+ [89.06088300900007, 21.93846263200004],
+ [89.03687584700003, 21.925116278000075],
+ [89.02312259200005, 21.93109772300005],
+ [89.01303144600007, 21.929429429000038],
+ [89.00806725400008, 21.92055898600006],
+ [89.00953209700003, 21.90460846600007],
+ [88.99301191500007, 21.912665106000077],
+ [88.96045983200008, 21.93431224200009],
+ [88.94467207100007, 21.938788153000075],
+ [88.93783613400007, 21.94871653900009],
+ [88.93458092500003, 21.969305731000077],
+ [88.92872155000003, 21.98655833500004],
+ [88.91391035200007, 21.98655833500004],
+ [88.90503991000003, 21.96942780200004],
+ [88.91081790500004, 21.946478583000044],
+ [88.92408287900008, 21.926336981000077],
+ [88.93783613400007, 21.917669989000046],
+ [88.95191491000003, 21.913885809000078],
+ [88.96827233200008, 21.904730536000045],
+ [88.99586022200003, 21.88418203300006],
+ [89.01587975400008, 21.853338934000078],
+ [89.03093509200005, 21.770453192000048],
+ [89.04371178500003, 21.733343817000048],
+ [89.04786217500003, 21.72801341400009],
+ [89.06788170700008, 21.709133205000057],
+ [89.08277428500003, 21.678208726000037],
+ [89.08521569100003, 21.674709377000056],
+ [89.08822675900007, 21.633734442000048],
+ [89.08269290500004, 21.617336330000057],
+ [89.06421959700003, 21.609198309000078],
+ [89.05323326900003, 21.609808661000045],
+ [89.04468834700003, 21.61351146000004],
+ [89.03882897200003, 21.61945221600007],
+ [89.03687584700003, 21.626898505000042],
+ [89.03394616000003, 21.633246161000045],
+ [89.02759850400008, 21.62457916900007],
+ [89.02165774800005, 21.611802476000037],
+ [89.01978600400008, 21.60610586100006],
+ [89.00025475400008, 21.60342031500005],
+ [88.97575931100005, 21.61591217700004],
+ [88.93384850400008, 21.64394765800006],
+ [88.89698326900003, 21.650132554000038],
+ [88.89161217500003, 21.653509833000044],
+ [88.88607832100007, 21.661810614000046],
+ [88.88160241000003, 21.672023830000057],
+ [88.87208092500003, 21.74900950700004],
+ [88.86605879000007, 21.766831773000035],
+ [88.85865319100003, 21.766831773000035],
+ [88.85572350400008, 21.748846747000073],
+ [88.84156334700003, 21.71625397300005],
+ [88.83822675900007, 21.701971747000073],
+ [88.84294681100005, 21.684149481000077],
+ [88.85987389400003, 21.65257396000004],
+ [88.85865319100003, 21.636542059000078],
+ [88.84424889400003, 21.622219143000052],
+ [88.82398522200003, 21.617254950000074],
+ [88.80583743600005, 21.622870184000078],
+ [88.79786217500003, 21.64020416900007],
+ [88.81478925900007, 21.65387604400007],
+ [88.81836998800003, 21.65761953300006],
+ [88.81853274800005, 21.665838934000078],
+ [88.81666100400008, 21.675034898000035],
+ [88.81088300900007, 21.69171784100007],
+ [88.80494225400008, 21.67186107000009],
+ [88.80046634200005, 21.661851304000038],
+ [88.79420006600003, 21.65761953300006],
+ [88.78402754000007, 21.655951239000046],
+ [88.77906334700003, 21.651190497000073],
+ [88.77711022200003, 21.64354075700004],
+ [88.77686608200008, 21.63344961100006],
+ [88.78174889400003, 21.61424388200004],
+ [88.79102623800003, 21.598863023000035],
+ [88.79664147200003, 21.584418036000045],
+ [88.79053795700008, 21.56826406500005],
+ [88.76246178500003, 21.555853583000044],
+ [88.72787519600007, 21.559881903000075],
+ [88.70753014400003, 21.57831452000005],
+ [88.72217858200008, 21.609198309000078],
+ [88.68799889400003, 21.678127346000053],
+ [88.68490644600007, 21.697211005000042],
+ [88.70362389400003, 21.810614325000074],
+ [88.69800866000003, 21.825506903000075],
+ [88.69450931100005, 21.83982982000009],
+ [88.71469160200007, 21.89785390800006],
+ [88.71697024800005, 21.951971747000073],
+ [88.72217858200008, 21.966131903000075],
+ [88.73316491000003, 21.97719961100006],
+ [88.74683678500003, 21.987127997000073],
+ [88.75831139400003, 21.99945709800005],
+ [88.76303144600007, 22.017279364000046],
+ [88.75464928500003, 22.037583726000037],
+ [88.71705162900008, 22.05805084800005],
+ [88.70850670700008, 22.072211005000042],
+ [88.71485436300003, 22.08698151200008],
+ [88.73015384200005, 22.103583075000074],
+ [88.76303144600007, 22.130560614000046],
+ [88.74390709700003, 22.129339911000045],
+ [88.72657311300003, 22.121161200000074],
+ [88.71216881600003, 22.109035549000055],
+ [88.70167076900003, 22.095851955000057],
+ [88.69483483200008, 22.08152903900009],
+ [88.69288170700008, 22.06586334800005],
+ [88.69947350400008, 22.053208726000037],
+ [88.71851647200003, 22.048041083000044],
+ [88.73072350400008, 22.037176825000074],
+ [88.72331790500004, 22.01308828300006],
+ [88.70167076900003, 21.97601959800005],
+ [88.69841556100005, 21.962591864000046],
+ [88.68995201900003, 21.94599030200004],
+ [88.67872155000003, 21.936672268000052],
+ [88.66700280000003, 21.945013739000046],
+ [88.65626061300003, 21.941066799000055],
+ [88.64258873800003, 21.94090403900009],
+ [88.63086998800003, 21.945461330000057],
+ [88.62598717500003, 21.955511786000045],
+ [88.62745201900003, 21.970404364000046],
+ [88.63168379000007, 21.979803778000075],
+ [88.64633222700007, 22.00023021000004],
+ [88.65349368600005, 22.018011786000045],
+ [88.65259850400008, 22.031805731000077],
+ [88.64877363400007, 22.046047268000052],
+ [88.64503014400003, 22.075140692000048],
+ [88.63949629000007, 22.09723541900007],
+ [88.63949629000007, 22.109523830000057],
+ [88.65699303500003, 22.15106842700004],
+ [88.67400149800005, 22.162054755000042],
+ [88.68311608200008, 22.18496328300006],
+ [88.67994225400008, 22.204413153000075],
+ [88.66016686300003, 22.205023505000042],
+ [88.66114342500003, 22.198960679000038],
+ [88.65601647200003, 22.183254299000055],
+ [88.64966881600003, 22.169094143000052],
+ [88.64633222700007, 22.167792059000078],
+ [88.64429772200003, 22.16229889500005],
+ [88.63493899800005, 22.144964911000045],
+ [88.63086998800003, 22.125799872000073],
+ [88.62208092500003, 22.116034247000073],
+ [88.61915123800003, 22.109523830000057],
+ [88.61833743600005, 22.10297272300005],
+ [88.61996504000007, 22.07831452000005],
+ [88.62549889400003, 22.05927155200004],
+ [88.62598717500003, 22.048041083000044],
+ [88.62037194100003, 22.02997467700004],
+ [88.60254967500003, 22.006415106000077],
+ [88.59864342500003, 21.990301825000074],
+ [88.60027103000004, 21.947211005000042],
+ [88.59839928500003, 21.929348049000055],
+ [88.56706790500004, 21.850816148000035],
+ [88.56462649800005, 21.83234284100007],
+ [88.56544030000003, 21.771185614000046],
+ [88.56462649800005, 21.766831773000035],
+ [88.58130944100003, 21.76943594000005],
+ [88.60417728000004, 21.77875397300005],
+ [88.62403405000003, 21.77802155200004],
+ [88.63282311300003, 21.750067450000074],
+ [88.63021894600007, 21.731756903000075],
+ [88.62338300900007, 21.710272528000075],
+ [88.61264082100007, 21.69749583500004],
+ [88.59864342500003, 21.70538971600007],
+ [88.59180748800003, 21.70538971600007],
+ [88.59961998800003, 21.637274481000077],
+ [88.59506269600007, 21.612127997000073],
+ [88.57813561300003, 21.623439846000053],
+ [88.57813561300003, 21.57168203300006],
+ [88.57227623800003, 21.557928778000075],
+ [88.55892988400007, 21.555568752000056],
+ [88.54476972700007, 21.56199778900009],
+ [88.53646894600007, 21.575100002000056],
+ [88.53028405000003, 21.564398505000042],
+ [88.52963300900007, 21.55337148600006],
+ [88.53443444100003, 21.542914130000042],
+ [88.54395592500003, 21.534084377000056],
+ [88.51295006600003, 21.524644273000035],
+ [88.49390709700003, 21.534816799000055],
+ [88.48796634200005, 21.55654531500005],
+ [88.49561608200008, 21.581854559000078],
+ [88.50212649800005, 21.58934153900009],
+ [88.50879967500003, 21.59438711100006],
+ [88.51400800900007, 21.600816148000035],
+ [88.51612389400003, 21.612616278000075],
+ [88.51661217500003, 21.62641022300005],
+ [88.51880944100003, 21.639146226000037],
+ [88.52295983200008, 21.64988841400009],
+ [88.52963300900007, 21.65761953300006],
+ [88.50953209700003, 21.71230703300006],
+ [88.50489342500003, 21.741522528000075],
+ [88.51270592500003, 21.763413804000038],
+ [88.53288821700005, 21.795314846000053],
+ [88.53101647200003, 21.82412344000005],
+ [88.51587975400008, 21.850816148000035],
+ [88.49561608200008, 21.876695054000038],
+ [88.51465905000003, 21.91620514500005],
+ [88.51498457100007, 21.937201239000046],
+ [88.49561608200008, 21.95180898600006],
+ [88.49984785200007, 21.933661200000074],
+ [88.49236087300005, 21.922023830000057],
+ [88.48121178500003, 21.909898179000038],
+ [88.47445722700007, 21.890326239000046],
+ [88.47706139400003, 21.87181224200009],
+ [88.49203535200007, 21.837144273000035],
+ [88.49561608200008, 21.81867096600007],
+ [88.49350019600007, 21.805161851000037],
+ [88.48829186300003, 21.803656317000048],
+ [88.48145592500003, 21.805161851000037],
+ [88.47445722700007, 21.80097077000005],
+ [88.46827233200008, 21.77724844000005],
+ [88.45769290500004, 21.75885651200008],
+ [88.45337975400008, 21.74176666900007],
+ [88.45215905000003, 21.722805080000057],
+ [88.45476321700005, 21.70538971600007],
+ [88.46859785200007, 21.67715078300006],
+ [88.47217858200008, 21.663275458000044],
+ [88.46827233200008, 21.64394765800006],
+ [88.45630944100003, 21.62400950700004],
+ [88.44190514400003, 21.616156317000048],
+ [88.42611738400007, 21.611029364000046],
+ [88.40967858200008, 21.599269924000055],
+ [88.39307701900003, 21.60024648600006],
+ [88.38355553500003, 21.631415106000077],
+ [88.38282311300003, 21.67133209800005],
+ [88.39258873800003, 21.698553778000075],
+ [88.38062584700003, 21.696193752000056],
+ [88.36451256600003, 21.68695709800005],
+ [88.35572350400008, 21.68496328300006],
+ [88.34620201900003, 21.688625393000052],
+ [88.34066816500007, 21.69749583500004],
+ [88.33643639400003, 21.708726304000038],
+ [88.33122806100005, 21.71906159100007],
+ [88.32634524800005, 21.711086330000057],
+ [88.32471764400003, 21.70136139500005],
+ [88.32740319100003, 21.691107489000046],
+ [88.34571373800003, 21.67059967700004],
+ [88.34945722700007, 21.660956122000073],
+ [88.34880618600005, 21.65029531500005],
+ [88.34546959700003, 21.636542059000078],
+ [88.33545983200008, 21.615790106000077],
+ [88.32178795700008, 21.60565827000005],
+ [88.30974368600005, 21.610174872000073],
+ [88.30445397200003, 21.63344961100006],
+ [88.30201256600003, 21.74518463700008],
+ [88.29818769600007, 21.764105536000045],
+ [88.28980553500003, 21.780218817000048],
+ [88.27312259200005, 21.79791901200008],
+ [88.26156660200007, 21.798651434000078],
+ [88.26417076900003, 21.77529531500005],
+ [88.29542076900003, 21.676581122000073],
+ [88.29704837300005, 21.65387604400007],
+ [88.29444420700008, 21.64280833500004],
+ [88.28419030000003, 21.621242580000057],
+ [88.28337649800005, 21.609198309000078],
+ [88.28760826900003, 21.60028717700004],
+ [88.30062910200007, 21.58934153900009],
+ [88.30445397200003, 21.581854559000078],
+ [88.30583743600005, 21.57168203300006],
+ [88.30372155000003, 21.568793036000045],
+ [88.29786217500003, 21.566555080000057],
+ [88.28711998800003, 21.558294989000046],
+ [88.27898196700005, 21.555161851000037],
+ [88.26612389400003, 21.553859768000052],
+ [88.25440514400003, 21.55467357000009],
+ [88.24927819100003, 21.558294989000046],
+ [88.24594160200007, 21.579901434000078],
+ [88.23747806100005, 21.601711330000057],
+ [88.22437584700003, 21.613023179000038],
+ [88.20826256600003, 21.60297272300005],
+ [88.18946373800003, 21.641791083000044],
+ [88.18189537900008, 21.665228583000044],
+ [88.18091881600003, 21.68496328300006],
+ [88.19044030000003, 21.70408763200004],
+ [88.20346113400007, 21.724351304000038],
+ [88.21045983200008, 21.747259833000044],
+ [88.20142662900008, 21.774318752000056],
+ [88.20972741000003, 21.78856028900009],
+ [88.20378665500004, 21.80540599200009],
+ [88.15406334700003, 21.88808828300006],
+ [88.15642337300005, 21.89785390800006],
+ [88.15943444100003, 21.90615469000005],
+ [88.14673912900008, 21.95921458500004],
+ [88.14991295700008, 21.976385809000078],
+ [88.15626061300003, 21.99087148600006],
+ [88.16431725400008, 22.003119208000044],
+ [88.20679772200003, 22.05337148600006],
+ [88.22242272200003, 22.077948309000078],
+ [88.21273847700007, 22.100043036000045],
+ [88.20337975400008, 22.15176015800006],
+ [88.19800866000003, 22.167792059000078],
+ [88.16529381600003, 22.18500397300005],
+ [88.11841881600003, 22.20018138200004],
+ [88.08130944100003, 22.217352606000077],
+ [88.07732181100005, 22.24042389500005],
+ [88.05974368600005, 22.22947825700004],
+ [88.04346764400003, 22.224758205000057],
+ [88.02702884200005, 22.227850653000075],
+ [88.00904381600003, 22.24042389500005],
+ [87.98511803500003, 22.26593659100007],
+ [87.97266686300003, 22.28318919500009],
+ [87.96745853000004, 22.298488674000055],
+ [87.96420332100007, 22.319281317000048],
+ [87.95069420700008, 22.35618724200009],
+ [87.94752037900008, 22.373846747000073],
+ [87.94613691500007, 22.394924221000053],
+ [87.94044030000003, 22.413031317000048],
+ [87.92798912900008, 22.424221096000053],
+ [87.90658613400007, 22.424750067000048],
+ [87.90658613400007, 22.41860586100006],
+ [87.92286217500003, 22.397772528000075],
+ [87.93580162900008, 22.355169989000046],
+ [87.94752037900008, 22.27765534100007],
+ [87.95281009200005, 22.26243724200009],
+ [87.96534264400003, 22.24481842700004],
+ [87.99195397200003, 22.21588776200008],
+ [88.00847415500004, 22.204901434000078],
+ [88.02540123800003, 22.200913804000038],
+ [88.05738366000003, 22.198879299000055],
+ [88.09546959700003, 22.191229559000078],
+ [88.13257897200003, 22.17914459800005],
+ [88.16098066500007, 22.15656159100007],
+ [88.17351321700005, 22.116888739000046],
+ [88.16431725400008, 22.089789130000042],
+ [88.14063561300003, 22.06012604400007],
+ [88.11117597700007, 22.034857489000046],
+ [88.08472741000003, 22.020697333000044],
+ [88.04859459700003, 22.020738023000035],
+ [88.04314212300005, 22.017279364000046],
+ [88.04517662900008, 22.00653717700004],
+ [88.04900149800005, 21.995428778000075],
+ [88.05079186300003, 21.98501211100006],
+ [88.04688561300003, 21.97601959800005],
+ [88.03239993600005, 21.957180080000057],
+ [87.98365319100003, 21.85419342700004],
+ [87.97046959700003, 21.836493231000077],
+ [87.95777428500003, 21.828924872000073],
+ [87.94800866000003, 21.825384833000044],
+ [87.90902754000007, 21.79881419500009],
+ [87.90219160200007, 21.796820380000042],
+ [87.89918053500003, 21.79482656500005],
+ [87.89568118600005, 21.78937409100007],
+ [87.89478600400008, 21.77875397300005],
+ [87.89291425900007, 21.774318752000056],
+ [87.86719811300003, 21.750799872000073],
+ [87.83399498800003, 21.729315497000073],
+ [87.75570722700007, 21.69171784100007],
+ [87.70378665500004, 21.655503648000035],
+ [87.68384850400008, 21.650132554000038],
+ [87.64210045700008, 21.652085679000038],
+ [87.62134850400008, 21.65062083500004],
+ [87.47738691500007, 21.61359284100007],
+ [87.46876061300003, 21.611395575000074],
+ [87.40495853000004, 21.58665599200009],
+ [87.34180748800003, 21.56240469000005],
+ [87.29346764400003, 21.553656317000048],
+ [87.25611412900008, 21.56199778900009],
+ [87.24594160200007, 21.556586005000042],
+ [87.23519941500007, 21.554510809000078],
+ [87.21143639400003, 21.55459219000005],
+ [87.20093834700003, 21.551988023000035],
+ [87.11304772200003, 21.507961330000057],
+ [87.06373131600003, 21.475002346000053],
+ [86.91765384200005, 21.327378648000035],
+ [86.86695397200003, 21.25604889500005],
+ [86.83725019600007, 21.174709377000056],
+ [86.84400475400008, 21.08222077000005],
+ [86.95215905000003, 20.84910716400009],
+ [86.96566816500007, 20.805975653000075],
+ [86.95386803500003, 20.780585028000075],
+ [86.93628991000003, 20.787502346000053],
+ [86.91651451900003, 20.78807200700004],
+ [86.87875410200007, 20.780585028000075],
+ [86.88933353000004, 20.764471747000073],
+ [86.91065514400003, 20.756415106000077],
+ [86.95720462300005, 20.753241278000075],
+ [86.97999108200008, 20.755560614000046],
+ [86.98658287900008, 20.75185781500005],
+ [86.99488366000003, 20.73895905200004],
+ [87.00001061300003, 20.728216864000046],
+ [87.00180097700007, 20.71898021000004],
+ [86.99870853000004, 20.71112702000005],
+ [86.98861738400007, 20.704250393000052],
+ [86.97575931100005, 20.710679429000038],
+ [86.96119225400008, 20.712836005000042],
+ [86.94825280000003, 20.709051825000074],
+ [86.94019616000003, 20.69798411700009],
+ [86.95191491000003, 20.697007554000038],
+ [86.96119225400008, 20.695054429000038],
+ [86.96851647200003, 20.691148179000038],
+ [86.97429446700005, 20.684393622000073],
+ [86.98170006600003, 20.685370184000078],
+ [86.98650149800005, 20.684393622000073],
+ [86.99024498800003, 20.67999909100007],
+ [86.99488366000003, 20.670721747000073],
+ [87.01937910200007, 20.68036530200004],
+ [87.03337649800005, 20.69017161700009],
+ [87.04322350400008, 20.69798411700009],
+ [87.02751712300005, 20.67967357000009],
+ [87.00359134200005, 20.657049872000073],
+ [86.97624759200005, 20.637884833000044],
+ [86.92318769600007, 20.62173086100006],
+ [86.77418053500003, 20.51194896000004],
+ [86.75147545700008, 20.489162502000056],
+ [86.73389733200008, 20.462225653000075],
+ [86.72461998800003, 20.43195221600007],
+ [86.72046959700003, 20.368475653000075],
+ [86.74195397200003, 20.37954336100006],
+ [86.75635826900003, 20.393744208000044],
+ [86.76978600400008, 20.40070221600007],
+ [86.78874759200005, 20.39012278900009],
+ [86.78825931100005, 20.402818101000037],
+ [86.78980553500003, 20.41469961100006],
+ [86.79615319100003, 20.437323309000078],
+ [86.80982506600003, 20.41510651200008],
+ [86.79420006600003, 20.378159898000035],
+ [86.76832116000003, 20.343451239000046],
+ [86.75147545700008, 20.328070380000042],
+ [86.73926842500003, 20.32420482000009],
+ [86.71973717500003, 20.31509023600006],
+ [86.70167076900003, 20.30377838700008],
+ [86.69369550900007, 20.29393138200004],
+ [86.70167076900003, 20.28465403900009],
+ [86.71973717500003, 20.29173411700009],
+ [86.75464928500003, 20.31443919500009],
+ [86.71745853000004, 20.286932684000078],
+ [86.62818444100003, 20.235256252000056],
+ [86.58383222700007, 20.21820709800005],
+ [86.53419030000003, 20.20612213700008],
+ [86.51148522200003, 20.19745514500005],
+ [86.49512780000003, 20.184068101000037],
+ [86.49040774800005, 20.17405833500004],
+ [86.47885175900007, 20.129339911000045],
+ [86.46851647200003, 20.10927969000005],
+ [86.46713300900007, 20.094671942000048],
+ [86.41504967500003, 20.036322333000044],
+ [86.39144941500007, 20.02020905200004],
+ [86.39673912900008, 20.00995514500005],
+ [86.40414472700007, 20.00263092700004],
+ [86.41407311300003, 19.998846747000073],
+ [86.42628014400003, 19.999172268000052],
+ [86.39722741000003, 19.982855536000045],
+ [86.34839928500003, 20.00885651200008],
+ [86.27540123800003, 20.06736888200004],
+ [86.23129316500007, 20.064886786000045],
+ [86.20915774800005, 20.06663646000004],
+ [86.19971764400003, 20.077948309000078],
+ [86.19597415500004, 20.08030833500004],
+ [86.17302493600005, 20.10219961100006],
+ [86.16846764400003, 20.11318594000005],
+ [86.16309655000003, 20.134833075000074],
+ [86.15870201900003, 20.143133856000077],
+ [86.15251712300005, 20.143133856000077],
+ [86.14503014400003, 20.122015692000048],
+ [86.15430748800003, 20.089992580000057],
+ [86.15870201900003, 20.08104075700004],
+ [86.16773522200003, 20.07294342700004],
+ [86.18775475400008, 20.063666083000044],
+ [86.21371504000007, 20.04242584800005],
+ [86.23023522200003, 20.035305080000057],
+ [86.26856530000003, 20.02643463700008],
+ [86.27344811300003, 20.026190497000073],
+ [86.28467858200008, 20.027492580000057],
+ [86.28907311300003, 20.02643463700008],
+ [86.29322350400008, 20.021429755000042],
+ [86.29411868600005, 20.015692450000074],
+ [86.29420006600003, 20.01040273600006],
+ [86.29590905000003, 20.00657786700009],
+ [86.30290774800005, 19.99909088700008],
+ [86.30811608200008, 19.99209219000005],
+ [86.31495201900003, 19.986883856000077],
+ [86.32667076900003, 19.984849351000037],
+ [86.34156334700003, 19.97988515800006],
+ [86.35645592500003, 19.970404364000046],
+ [86.37240644600007, 19.964992580000057],
+ [86.26856530000003, 19.91034577000005],
+ [86.11158287900008, 19.85569896000004],
+ [86.08904056100005, 19.844224351000037],
+ [86.07837975400008, 19.843573309000078],
+ [86.06674238400007, 19.851996161000045],
+ [86.05665123800003, 19.85687897300005],
+ [86.04656009200005, 19.85252513200004],
+ [86.03793379000007, 19.84528229400007],
+ [86.03207441500007, 19.841498114000046],
+ [86.01351972700007, 19.839056708000044],
+ [85.88884524800005, 19.80296458500004],
+ [85.84636478000004, 19.795843817000048],
+ [85.80860436300003, 19.773382880000042],
+ [85.78882897200003, 19.765692450000074],
+ [85.77808678500003, 19.76463450700004],
+ [85.74439537900008, 19.765692450000074],
+ [85.73438561300003, 19.763617255000042],
+ [85.71485436300003, 19.75421784100007],
+ [85.68458092500003, 19.747748114000046],
+ [85.62427819100003, 19.718573309000078],
+ [85.62598717500003, 19.72288646000004],
+ [85.63599694100003, 19.726629950000074],
+ [85.63795006600003, 19.731634833000044],
+ [85.61426842500003, 19.72793203300006],
+ [85.54916425900007, 19.690619208000044],
+ [85.48047936300003, 19.66632721600007],
+ [85.45679772200003, 19.663316148000035],
+ [85.44988040500004, 19.66669342700004],
+ [85.44752037900008, 19.674627997000073],
+ [85.44678795700008, 19.690619208000044],
+ [85.44312584700003, 19.69245026200008],
+ [85.43685957100007, 19.691351630000042],
+ [85.43043053500003, 19.69171784100007],
+ [85.42628014400003, 19.69745514500005],
+ [85.42701256600003, 19.70408763200004],
+ [85.43165123800003, 19.704901434000078],
+ [85.43685957100007, 19.70465729400007],
+ [85.43930097700007, 19.70799388200004],
+ [85.45085696700005, 19.71629466400009],
+ [85.47754967500003, 19.723863023000035],
+ [85.52198326900003, 19.739081122000073],
+ [85.52556399800005, 19.734035549000055],
+ [85.52344811300003, 19.72870514500005],
+ [85.51889082100007, 19.721584377000056],
+ [85.51498457100007, 19.71112702000005],
+ [85.55884850400008, 19.738104559000078],
+ [85.57650800900007, 19.745835679000038],
+ [85.56763756600003, 19.750799872000073],
+ [85.56324303500003, 19.75690338700008],
+ [85.56413821700005, 19.76439036700009],
+ [85.57032311300003, 19.773179429000038],
+ [85.56714928500003, 19.79165273600006],
+ [85.57032311300003, 19.87563711100006],
+ [85.55713951900003, 19.881781317000048],
+ [85.51498457100007, 19.88930898600006],
+ [85.47681725400008, 19.90102773600006],
+ [85.46355228000004, 19.902899481000077],
+ [85.44011478000004, 19.896226304000038],
+ [85.41627037900008, 19.879787502000056],
+ [85.37452233200008, 19.83779531500005],
+ [85.31959069100003, 19.79364655200004],
+ [85.30420983200008, 19.792669989000046],
+ [85.29029381600003, 19.789943752000056],
+ [85.27808678500003, 19.785589911000045],
+ [85.26807701900003, 19.78001536700009],
+ [85.24683678500003, 19.762640692000048],
+ [85.22095787900008, 19.736029364000046],
+ [85.20337975400008, 19.70726146000004],
+ [85.20655358200008, 19.68378327000005],
+ [85.18995201900003, 19.67096588700008],
+ [85.17514082100007, 19.63690827000005],
+ [85.16553795700008, 19.625799872000073],
+ [85.15015709700003, 19.61347077000005],
+ [85.14014733200008, 19.596584377000056],
+ [85.13933353000004, 19.579779364000046],
+ [85.15137780000003, 19.56777578300006],
+ [85.15137780000003, 19.560288804000038],
+ [85.13917076900003, 19.557074286000045],
+ [85.12289472700007, 19.54901764500005],
+ [85.10889733200008, 19.53896719000005],
+ [85.10287519600007, 19.52960846600007],
+ [85.10450280000003, 19.514878648000035],
+ [85.10873457100007, 19.506781317000048],
+ [85.11548912900008, 19.507473049000055],
+ [85.12403405000003, 19.519354559000078],
+ [85.12875410200007, 19.509507554000038],
+ [85.13021894600007, 19.49872467700004],
+ [85.12867272200003, 19.487982489000046],
+ [85.12403405000003, 19.478338934000078],
+ [85.13575280000003, 19.481594143000052],
+ [85.14177493600005, 19.487127997000073],
+ [85.14576256600003, 19.493475653000075],
+ [85.15137780000003, 19.498846747000073],
+ [85.16244550900007, 19.50348541900007],
+ [85.17115319100003, 19.504461981000077],
+ [85.17855879000007, 19.504299221000053],
+ [85.18555748800003, 19.505682684000078],
+ [85.20289147200003, 19.51715729400007],
+ [85.20191491000003, 19.527085679000038],
+ [85.19629967500003, 19.53847890800006],
+ [85.19922936300003, 19.55410390800006],
+ [85.20630944100003, 19.548000393000052],
+ [85.21452884200005, 19.547267971000053],
+ [85.22364342500003, 19.549953518000052],
+ [85.23324629000007, 19.55410390800006],
+ [85.20378665500004, 19.57050202000005],
+ [85.19304446700005, 19.573919989000046],
+ [85.19304446700005, 19.58079661700009],
+ [85.21290123800003, 19.58112213700008],
+ [85.22364342500003, 19.590236721000053],
+ [85.23259524800005, 19.60154857000009],
+ [85.24756920700008, 19.608710028000075],
+ [85.24756920700008, 19.614935614000046],
+ [85.24187259200005, 19.617010809000078],
+ [85.23731530000003, 19.62055084800005],
+ [85.23438561300003, 19.62567780200004],
+ [85.23324629000007, 19.632554429000038],
+ [85.23633873800003, 19.635321356000077],
+ [85.24781334700003, 19.653143622000073],
+ [85.24756920700008, 19.65648021000004],
+ [85.26075280000003, 19.656073309000078],
+ [85.30909264400003, 19.642238674000055],
+ [85.35059655000003, 19.67763906500005],
+ [85.36378014400003, 19.67804596600007],
+ [85.37435957100007, 19.674709377000056],
+ [85.38306725400008, 19.67609284100007],
+ [85.39144941500007, 19.690619208000044],
+ [85.39918053500003, 19.67914459800005],
+ [85.40316816500007, 19.67129140800006],
+ [85.40495853000004, 19.661932684000078],
+ [85.40528405000003, 19.64594147300005],
+ [85.40219160200007, 19.64398834800005],
+ [85.38868248800003, 19.63825104400007],
+ [85.38461347700007, 19.635972398000035],
+ [85.38217207100007, 19.63108958500004],
+ [85.38038170700008, 19.619614976000037],
+ [85.37794030000003, 19.614935614000046],
+ [85.36841881600003, 19.60809967700004],
+ [85.35230553500003, 19.599432684000078],
+ [85.33676191500007, 19.596096096000053],
+ [85.33008873800003, 19.60496653900009],
+ [85.32642662900008, 19.618801174000055],
+ [85.31836998800003, 19.619533596000053],
+ [85.31104576900003, 19.610500393000052],
+ [85.30909264400003, 19.595038153000075],
+ [85.30347741000003, 19.597479559000078],
+ [85.29379316500007, 19.599554755000042],
+ [85.28842207100007, 19.601263739000046],
+ [85.30250084700003, 19.58665599200009],
+ [85.30583743600005, 19.580145575000074],
+ [85.30290774800005, 19.573919989000046],
+ [85.33057701900003, 19.57640208500004],
+ [85.57650800900007, 19.690619208000044],
+ [85.54029381600003, 19.669582424000055],
+ [85.46338951900003, 19.63104889500005],
+ [85.38021894600007, 19.593817450000074],
+ [85.33668053500003, 19.57518138200004],
+ [85.28541100400008, 19.536281643000052],
+ [85.24057050900007, 19.518052476000037],
+ [85.18043053500003, 19.475002346000053],
+ [85.06950931100005, 19.37213776200008],
+ [84.99586022200003, 19.32330963700008],
+ [84.87208092500003, 19.219875393000052],
+ [84.79102623800003, 19.12059153900009],
+ [84.77776126400005, 19.11619700700004],
+ [84.77515709700003, 19.115301825000074],
+ [84.76441491000003, 19.123439846000053],
+ [84.75066165500004, 19.138373114000046],
+ [84.73878014400003, 19.147650458000044],
+ [84.73365319100003, 19.139146226000037],
+ [84.73121178500003, 19.12881094000005],
+ [84.72095787900008, 19.11424388200004],
+ [84.71998131600003, 19.101629950000074],
+ [84.72282962300005, 19.09601471600007],
+ [84.73536217500003, 19.083197333000044],
+ [84.74048912900008, 19.07367584800005],
+ [84.75684655000003, 19.09764232000009],
+ [84.76099694100003, 19.101629950000074],
+ [84.76783287900008, 19.10179271000004],
+ [84.77523847700007, 19.100490627000056],
+ [84.78003991000003, 19.09707265800006],
+ [84.77833092500003, 19.091009833000044],
+ [84.75114993600005, 19.053900458000044],
+ [84.74105879000007, 19.028143622000073],
+ [84.69947350400008, 18.977484442000048],
+ [84.67953535200007, 18.945705471000053],
+ [84.66504967500003, 18.930121161000045],
+ [84.63086998800003, 18.915716864000046],
+ [84.54786217500003, 18.796087958000044],
+ [84.54184004000007, 18.775783596000053],
+ [84.44825280000003, 18.68065013200004],
+ [84.43718509200005, 18.66278717700004],
+ [84.43262780000003, 18.645697333000044],
+ [84.42367597700007, 18.636460679000038],
+ [84.37045332100007, 18.601304429000038],
+ [84.34945722700007, 18.56981028900009],
+ [84.33285566500007, 18.55369700700004],
+ [84.31226647200003, 18.546698309000078],
+ [84.30632571700005, 18.54368724200009],
+ [84.28858483200008, 18.529771226000037],
+ [84.28174889400003, 18.52558014500005],
+ [84.27271569100003, 18.524318752000056],
+ [84.25001061300003, 18.524237372000073],
+ [84.24691816500007, 18.52558014500005],
+ [84.23764082100007, 18.510931708000044],
+ [84.24935957100007, 18.501654364000046],
+ [84.27100670700008, 18.50018952000005],
+ [84.29769941500007, 18.51630280200004],
+ [84.32618248800003, 18.53742096600007],
+ [84.34994550900007, 18.55292389500005],
+ [84.33122806100005, 18.53864166900007],
+ [84.28793379000007, 18.50576406500005],
+ [84.24008222700007, 18.460760809000078],
+ [84.23047936300003, 18.446234442000048],
+ [84.18832441500007, 18.418036200000074],
+ [84.17448978000004, 18.39984772300005],
+ [84.15284264400003, 18.383612372000073],
+ [84.14389082100007, 18.374823309000078],
+ [84.13892662900008, 18.364162502000056],
+ [84.13648522200003, 18.353583075000074],
+ [84.13282311300003, 18.343410549000055],
+ [84.12403405000003, 18.333807684000078],
+ [84.11312910200007, 18.29828522300005],
+ [84.07740319100003, 18.271551825000074],
+ [83.77515709700003, 18.139593817000048],
+ [83.61394290500004, 18.04515208500004],
+ [83.58228600400008, 18.01911041900007],
+ [83.57618248800003, 18.00975169500009],
+ [83.56283613400007, 17.98309967700004],
+ [83.55836022200003, 17.97752513200004],
+ [83.55665123800003, 17.973456122000073],
+ [83.53891035200007, 17.956284898000092],
+ [83.53443444100003, 17.95331452000005],
+ [83.52613366000003, 17.942531643000052],
+ [83.48658287900008, 17.916896877000056],
+ [83.47291100400008, 17.902492580000057],
+ [83.46558678500003, 17.902492580000057],
+ [83.46290123800003, 17.90851471600007],
+ [83.45191491000003, 17.92291901200008],
+ [83.44898522200003, 17.90688711100006],
+ [83.45240319100003, 17.88621653900009],
+ [83.45297285200007, 17.868475653000075],
+ [83.43116295700008, 17.85423411700009],
+ [83.42530358200008, 17.83860911700009],
+ [83.41773522200003, 17.80621979400007],
+ [83.40235436300003, 17.784491278000075],
+ [83.34131920700008, 17.71743398600006],
+ [83.31910241000003, 17.703192450000074],
+ [83.31324303500003, 17.70115794500009],
+ [83.30437259200005, 17.692206122000073],
+ [83.29859459700003, 17.69013092700004],
+ [83.29273522200003, 17.691148179000038],
+ [83.28956139400003, 17.69326406500005],
+ [83.28744550900007, 17.695379950000074],
+ [83.28467858200008, 17.69635651200008],
+ [83.28223717500003, 17.699286200000074],
+ [83.28028405000003, 17.705959377000056],
+ [83.27637780000003, 17.71308014500005],
+ [83.26823978000004, 17.71747467700004],
+ [83.24691816500007, 17.71625397300005],
+ [83.24203535200007, 17.70652903900009],
+ [83.24927819100003, 17.695379950000074],
+ [83.27198326900003, 17.68813711100006],
+ [83.29249108200008, 17.677476304000038],
+ [83.29859459700003, 17.672796942000048],
+ [83.29908287900008, 17.66429271000004],
+ [83.28923587300005, 17.65761953300006],
+ [83.26823978000004, 17.648586330000057],
+ [83.25513756600003, 17.63812897300005],
+ [83.24691816500007, 17.63422272300005],
+ [83.21290123800003, 17.634914455000057],
+ [83.23389733200008, 17.60773346600007],
+ [83.23894290500004, 17.592962958000044],
+ [83.22291100400008, 17.586493231000077],
+ [83.20923912900008, 17.583685614000046],
+ [83.19613691500007, 17.57680898600006],
+ [83.17139733200008, 17.559800523000092],
+ [83.08822675900007, 17.53070709800005],
+ [83.05323326900003, 17.50649648600006],
+ [83.01986738400007, 17.49091217700004],
+ [82.99642988400007, 17.473456122000073],
+ [82.97584069100003, 17.453680731000077],
+ [82.96957441500007, 17.450100002000056],
+ [82.95281009200005, 17.44594961100006],
+ [82.94548587300005, 17.443101304000038],
+ [82.89682050900007, 17.409328518000052],
+ [82.88868248800003, 17.41014232000009],
+ [82.88331139400003, 17.42206452000005],
+ [82.86915123800003, 17.414007880000042],
+ [82.85425866000008, 17.402818101000037],
+ [82.83765709700003, 17.39276764500005],
+ [82.79639733200008, 17.38304271000004],
+ [82.75814863400007, 17.359198309000078],
+ [82.71851647200003, 17.34861888200004],
+ [82.47486412900008, 17.205959377000056],
+ [82.45191491000008, 17.182440497000073],
+ [82.43506920700008, 17.15379466400009],
+ [82.42286217500003, 17.139960028000075],
+ [82.38770592500003, 17.12693919500009],
+ [82.37037194100003, 17.11009349200009],
+ [82.34205162900008, 17.073187567000048],
+ [82.31169681100005, 17.046616929000038],
+ [82.29932701900003, 17.03034088700008],
+ [82.29167728000004, 16.998439846000053],
+ [82.25269616000008, 16.92918528900009],
+ [82.25074303500008, 16.907863674000055],
+ [82.25513756600003, 16.885321356000077],
+ [82.26791425900007, 16.86749909100007],
+ [82.29835045700008, 16.85846588700008],
+ [82.30355879000007, 16.85419342700004],
+ [82.30811608200008, 16.849554755000042],
+ [82.31421959700003, 16.846625067000048],
+ [82.31959069100003, 16.84723541900007],
+ [82.32715905000003, 16.849432684000078],
+ [82.33334394600007, 16.852118231000077],
+ [82.33464603000004, 16.854071356000077],
+ [82.35206139400003, 16.845404364000046],
+ [82.36247806100005, 16.859076239000046],
+ [82.36117597700007, 16.89134349200009],
+ [82.35743248800003, 16.92487213700008],
+ [82.34888756600003, 16.95648834800005],
+ [82.36117597700007, 16.936021226000037],
+ [82.36654707100007, 16.908636786000045],
+ [82.36744225400008, 16.860296942000048],
+ [82.36557050900007, 16.81159088700008],
+ [82.35206139400003, 16.76129791900007],
+ [82.34595787900008, 16.70612213700008],
+ [82.33814537900008, 16.67841217700004],
+ [82.31421959700003, 16.628159898000092],
+ [82.31234785200007, 16.61985911700009],
+ [82.31381269600007, 16.612982489000046],
+ [82.31283613400007, 16.60814036700009],
+ [82.30396569100003, 16.60643138200004],
+ [82.29932701900003, 16.61009349200009],
+ [82.29379316500007, 16.62563711100006],
+ [82.28687584700003, 16.628159898000092],
+ [82.28093509200005, 16.620835679000038],
+ [82.28549238400007, 16.60651276200008],
+ [82.29607181100005, 16.591009833000044],
+ [82.30738366000008, 16.579779364000046],
+ [82.25904381600003, 16.56549713700008],
+ [82.20346113400007, 16.51268138200004],
+ [82.18824303500008, 16.504055080000057],
+ [82.17302493600005, 16.500921942000048],
+ [82.12289472700007, 16.477362372000073],
+ [82.09066816500007, 16.454779364000046],
+ [82.06861412900008, 16.444281317000048],
+ [82.03736412900008, 16.447658596000053],
+ [82.02271569100003, 16.43573639500005],
+ [82.00782311300003, 16.419582424000055],
+ [81.99268639400003, 16.40843333500004],
+ [81.98170006600003, 16.407863674000055],
+ [81.96794681100005, 16.40892161700009],
+ [81.95622806100005, 16.407171942000048],
+ [81.94809004000007, 16.391546942000048],
+ [81.94076582100007, 16.388373114000046],
+ [81.89991295700008, 16.38580963700008],
+ [81.88054446700005, 16.381659247000073],
+ [81.86166425900007, 16.375392971000053],
+ [81.78321373800003, 16.33856842700004],
+ [81.76295006600003, 16.32257721600007],
+ [81.71762129000007, 16.312201239000046],
+ [81.71159915500004, 16.312201239000046],
+ [81.69605553500008, 16.314927476000037],
+ [81.67693118600005, 16.327378648000092],
+ [81.65626061300003, 16.33734772300005],
+ [81.63640384200005, 16.33270905200004],
+ [81.62094160200007, 16.339504299000055],
+ [81.58497155000003, 16.34210846600007],
+ [81.56812584700003, 16.34638092700004],
+ [81.57390384200005, 16.358343817000048],
+ [81.56918379000007, 16.367580471000053],
+ [81.55697675900007, 16.37303294500009],
+ [81.54021243600005, 16.37368398600006],
+ [81.54908287900008, 16.352362372000073],
+ [81.53598066500007, 16.350043036000045],
+ [81.49586022200003, 16.360663153000075],
+ [81.47535241000008, 16.358628648000092],
+ [81.41667728000004, 16.34015534100007],
+ [81.42115319100003, 16.35097890800006],
+ [81.42611738400007, 16.358710028000075],
+ [81.42823326900003, 16.365668036000045],
+ [81.42408287900008, 16.37368398600006],
+ [81.41138756600003, 16.382513739000046],
+ [81.39893639400003, 16.382635809000078],
+ [81.38697350400008, 16.376776434000078],
+ [81.37574303500008, 16.36749909100007],
+ [81.35962975400008, 16.374335028000075],
+ [81.34522545700008, 16.373602606000077],
+ [81.33155358200008, 16.36977773600006],
+ [81.31739342500003, 16.36749909100007],
+ [81.25961347700007, 16.33270905200004],
+ [81.24854576900003, 16.320135809000078],
+ [81.24984785200007, 16.311021226000037],
+ [81.25603274800005, 16.30182526200008],
+ [81.25961347700007, 16.28864166900007],
+ [81.25416100400008, 16.271307684000078],
+ [81.23031660200007, 16.24359772300005],
+ [81.21851647200003, 16.19944896000004],
+ [81.19027754000007, 16.13886139500005],
+ [81.18002363400007, 16.086737372000073],
+ [81.16195722700007, 16.057074286000045],
+ [81.15601647200003, 16.03851959800005],
+ [81.15544681100005, 15.985500393000052],
+ [81.14975019600007, 15.969631252000056],
+ [81.13510175900007, 15.966498114000046],
+ [81.08822675900007, 15.921210028000075],
+ [81.04330488400007, 15.894110419000071],
+ [81.02686608200008, 15.88084544500009],
+ [80.99887129000007, 15.84674713700008],
+ [80.99838300900007, 15.83470286700009],
+ [81.00294030000003, 15.82526276200008],
+ [81.00879967500003, 15.81781647300005],
+ [81.01254316500007, 15.81195709800005],
+ [81.01921634200005, 15.792385158000059],
+ [81.01905358200008, 15.78416575700004],
+ [81.01254316500007, 15.777818101000037],
+ [81.00473066500007, 15.778509833000044],
+ [80.99586022200003, 15.784328518000052],
+ [80.98829186300003, 15.791205145000049],
+ [80.97901451900003, 15.803412177000041],
+ [80.94947350400008, 15.827866929000038],
+ [80.94068444100003, 15.83299388200004],
+ [80.92164147200003, 15.83860911700009],
+ [80.91000410200007, 15.852687893000052],
+ [80.90430748800003, 15.871283270000049],
+ [80.90267988400007, 15.890814520000049],
+ [80.91016686300003, 15.96588776200008],
+ [80.90894616000008, 15.98346588700008],
+ [80.90601647200003, 15.999823309000078],
+ [80.89649498800003, 16.031073309000078],
+ [80.89226321700005, 16.02094147300005],
+ [80.89649498800003, 16.010565497000073],
+ [80.88900800900007, 16.003729559000078],
+ [80.88575280000003, 16.008693752000056],
+ [80.88282311300003, 16.011460679000038],
+ [80.87533613400007, 16.017401434000078],
+ [80.89128665500004, 15.978257554000038],
+ [80.89576256600003, 15.936021226000037],
+ [80.89014733200008, 15.89524974200009],
+ [80.85572350400008, 15.822699286000045],
+ [80.83025149800005, 15.747626044000071],
+ [80.82007897200003, 15.72687409100007],
+ [80.80713951900003, 15.716376044000071],
+ [80.80836022200003, 15.803941148000092],
+ [80.80274498800003, 15.84243398600006],
+ [80.77613366000008, 15.884263414000088],
+ [80.76010175900007, 15.892971096000053],
+ [80.73633873800003, 15.897609768000052],
+ [80.69044030000003, 15.90070221600007],
+ [80.68246504000007, 15.903265692000048],
+ [80.67628014400003, 15.907171942000048],
+ [80.67017662900008, 15.907700914000088],
+ [80.66309655000003, 15.90070221600007],
+ [80.66041100400008, 15.893947658000059],
+ [80.66285241000008, 15.889349677000041],
+ [80.61841881600003, 15.88768138200004],
+ [80.60010826900003, 15.882228908000059],
+ [80.58432050900007, 15.872544664000088],
+ [80.57113691500007, 15.868719794000071],
+ [80.56072024800005, 15.88084544500009],
+ [80.55388431100005, 15.88084544500009],
+ [80.54167728000004, 15.868068752000056],
+ [80.52588951900003, 15.856919664000088],
+ [80.49187259200005, 15.839260158000059],
+ [80.48267662900008, 15.836411851000037],
+ [80.47559655000003, 15.83592357000009],
+ [80.46908613400007, 15.834662177000041],
+ [80.46143639400003, 15.829657294000071],
+ [80.44548587300005, 15.814398505000042],
+ [80.43628991000008, 15.808294989000046],
+ [80.39332116000008, 15.797023830000057],
+ [80.35962975400008, 15.775824286000045],
+ [80.27963300900007, 15.700669664000088],
+ [80.26319420700008, 15.67454661700009],
+ [80.21949303500008, 15.56745026200008],
+ [80.21745853000004, 15.548163153000075],
+ [80.20134524800005, 15.51829661700009],
+ [80.19760175900007, 15.503078518000052],
+ [80.21119225400008, 15.496649481000077],
+ [80.20045006600003, 15.482163804000038],
+ [80.18384850400008, 15.452297268000052],
+ [80.17286217500003, 15.438299872000073],
+ [80.14031009200005, 15.406398830000057],
+ [80.12680097700007, 15.38812897300005],
+ [80.12126712300005, 15.370021877000056],
+ [80.09058678500008, 15.304877020000049],
+ [80.09253991000008, 15.296576239000046],
+ [80.08236738400007, 15.20408763200004],
+ [80.05298912900008, 15.092596747000073],
+ [80.05453535200007, 15.014146226000037],
+ [80.06153405000003, 14.974676825000074],
+ [80.07341556100005, 14.94204336100006],
+ [80.07300866000008, 14.92055898600006],
+ [80.10515384200005, 14.763861395000049],
+ [80.10816491000008, 14.714341539000088],
+ [80.11068769600007, 14.704779364000046],
+ [80.11695397200003, 14.698146877000056],
+ [80.12818444100003, 14.68846263200004],
+ [80.15186608200008, 14.672796942000048],
+ [80.15984134200005, 14.662665106000077],
+ [80.16635175900007, 14.628159898000092],
+ [80.17359459700003, 14.616522528000075],
+ [80.17847741000008, 14.60578034100007],
+ [80.17595462300005, 14.592962958000044],
+ [80.16968834700003, 14.58584219000005],
+ [80.16089928500008, 14.579820054000038],
+ [80.14185631600003, 14.571234442000048],
+ [80.14918053500008, 14.565008856000077],
+ [80.15935306100005, 14.565741278000075],
+ [80.18327884200005, 14.571112372000073],
+ [80.19019616000008, 14.571234442000048],
+ [80.19695071700005, 14.565008856000077],
+ [80.19605553500008, 14.559027411000045],
+ [80.19239342500003, 14.553208726000037],
+ [80.19019616000008, 14.54759349200009],
+ [80.18824303500008, 14.52570221600007],
+ [80.17595462300005, 14.46873607000009],
+ [80.17872155000003, 14.38939036700009],
+ [80.17497806100005, 14.344549872000073],
+ [80.15943444100003, 14.324774481000077],
+ [80.13705488400007, 14.269924221000053],
+ [80.12818444100003, 14.256537177000041],
+ [80.09791100400008, 14.254299221000053],
+ [80.08716881600003, 14.25031159100007],
+ [80.07178795700008, 14.232245184000078],
+ [80.07007897200003, 14.229193427000041],
+ [80.05502363400007, 14.221584377000056],
+ [80.04664147200003, 14.206610419000071],
+ [80.05062910200007, 14.196112372000073],
+ [80.07349694100003, 14.201849677000041],
+ [80.09099368600005, 14.216742255000042],
+ [80.10661868600005, 14.234035549000055],
+ [80.12110436300003, 14.242010809000078],
+ [80.13559004000007, 14.229193427000041],
+ [80.12338300900007, 14.193508205000057],
+ [80.12582441500007, 14.148504950000074],
+ [80.14966881600003, 14.027736721000053],
+ [80.159605204927, 14]
+ ]
+ ]
+ },
+ "bangladesh": {
+ "stop": 0.897488737517874,
+ "anchor": [89.83003108960874, 23.720784795521794],
+ "border": [
+ [
+ [92.57587854000013, 21.977574362000027],
+ [92.59024458800008, 21.91716461200012],
+ [92.59303511600012, 21.886933899000027],
+ [92.57556848200005, 21.73397166000005],
+ [92.59024458800008, 21.49553660100007],
+ [92.59272505700005, 21.470163472000067],
+ [92.60326704900007, 21.42008901000007],
+ [92.63923384600008, 21.3186998500001],
+ [92.64103990600012, 21.30858591800002],
+ [92.64285119700003, 21.298442688000094],
+ [92.63375614400007, 21.28221628900009],
+ [92.61432580600007, 21.26314768500002],
+ [92.59086470600005, 21.248884990000036],
+ [92.57060754400004, 21.247283020000012],
+ [92.55872196500007, 21.259840393000033],
+ [92.55159061700004, 21.28051096600005],
+ [92.54394250500008, 21.320921937000023],
+ [92.52451216700007, 21.361126201000033],
+ [92.49867395000007, 21.366603902000023],
+ [92.46539432800012, 21.35983429],
+ [92.42312300700013, 21.363658345000132],
+ [92.40028202400003, 21.370996400000124],
+ [92.38963667800004, 21.37652577800013],
+ [92.38116174400005, 21.384794006000064],
+ [92.37423710100006, 21.40231231800003],
+ [92.37217004400003, 21.419055481000086],
+ [92.36793257700003, 21.435436910000035],
+ [92.35470341000007, 21.451818340000088],
+ [92.32266402200014, 21.46189524300003],
+ [92.2845268150001, 21.419055481000086],
+ [92.25290083800007, 21.419520569000028],
+ [92.23626102800006, 21.41709177700004],
+ [92.22509891700014, 21.3974547320001],
+ [92.21155969200004, 21.35487335200004],
+ [92.1836544190001, 21.317201233],
+ [92.17828007100013, 21.299734599000075],
+ [92.17807336400006, 21.28014923100004],
+ [92.18520471200003, 21.240410055000055],
+ [92.18396447700007, 21.220876364000034],
+ [92.17838342300007, 21.191265767000075],
+ [92.17497277900003, 21.175607809000027],
+ [92.18076053900012, 21.157882793000013],
+ [92.18830529800005, 21.144085185000066],
+ [92.21176639800012, 21.12351796500009],
+ [92.21838098200004, 21.108635152000133],
+ [92.22427209500012, 21.09318389900004],
+ [92.26514733200008, 21.061102606000077],
+ [92.25855553500003, 21.02252838700008],
+ [92.25709069100003, 20.98110586100006],
+ [92.26148522200003, 20.940252997000073],
+ [92.27198326900003, 20.903509833000044],
+ [92.30062910200007, 20.86237213700008],
+ [92.30543053500003, 20.851955471000053],
+ [92.30762780000003, 20.833197333000044],
+ [92.32593834700003, 20.780585028000075],
+ [92.33326256600003, 20.767726955000057],
+ [92.33627363400007, 20.757147528000075],
+ [92.33399498800003, 20.74640534100007],
+ [92.32553144600007, 20.738714911000045],
+ [92.31934655000003, 20.742010809000078],
+ [92.31421959700003, 20.749253648000035],
+ [92.30909264400003, 20.753241278000075],
+ [92.30103600400008, 20.762274481000077],
+ [92.27808678500003, 20.814113674000055],
+ [92.20972741000003, 20.930812893000052],
+ [92.19288170700008, 20.99567291900007],
+ [92.18628991000003, 21.00584544500009],
+ [92.13412519600007, 21.04751211100006],
+ [92.12435957100007, 21.06045156500005],
+ [92.10808353000004, 21.089911200000074],
+ [92.09685306100005, 21.105861721000053],
+ [92.05250084700003, 21.154771226000037],
+ [92.04542076900003, 21.17096588700008],
+ [92.04395592500003, 21.19204336100006],
+ [92.05225670700008, 21.256659247000073],
+ [92.05046634200005, 21.280462958000044],
+ [92.04525800900007, 21.29954661700009],
+ [91.98975670700008, 21.394232489000046],
+ [91.98047936300003, 21.40375397300005],
+ [91.96941165500004, 21.40961334800005],
+ [91.95972741000003, 21.423976955000057],
+ [91.95297285200007, 21.441839911000045],
+ [91.94971764400003, 21.45840078300006],
+ [91.95590254000007, 21.45840078300006],
+ [91.95801842500003, 21.455023505000042],
+ [91.95883222700007, 21.454413153000075],
+ [91.96013431100005, 21.454250393000052],
+ [91.96338951900003, 21.45213450700004],
+ [91.97087649800005, 21.470038153000075],
+ [91.98292076900003, 21.488836981000077],
+ [91.99903405000003, 21.49949778900009],
+ [92.01791425900007, 21.493109442000048],
+ [92.00538170700008, 21.504299221000053],
+ [91.99537194100003, 21.522609768000052],
+ [91.98975670700008, 21.543402411000045],
+ [91.99000084700003, 21.56199778900009],
+ [91.99854576900003, 21.573187567000048],
+ [92.01246178500003, 21.58539459800005],
+ [92.02214603000004, 21.599351304000038],
+ [92.01791425900007, 21.616034247000073],
+ [92.03296959700003, 21.63300202000005],
+ [92.03581790500004, 21.640448309000078],
+ [92.03174889400003, 21.650132554000038],
+ [92.03777103000004, 21.65957265800006],
+ [92.03589928500003, 21.66815827000005],
+ [92.02857506600003, 21.67479075700004],
+ [92.02279707100007, 21.67682526200008],
+ [92.02556399800005, 21.687241929000038],
+ [92.02930748800003, 21.696234442000048],
+ [92.02930748800003, 21.704901434000078],
+ [92.02540123800003, 21.712836005000042],
+ [92.02393639400003, 21.70465729400007],
+ [92.02214603000004, 21.701564846000053],
+ [92.01791425900007, 21.698553778000075],
+ [92.02540123800003, 21.698553778000075],
+ [92.01238040500004, 21.664211330000057],
+ [92.00074303500003, 21.64980703300006],
+ [91.98389733200008, 21.650132554000038],
+ [91.97608483200008, 21.662054755000042],
+ [91.97885175900007, 21.67772044500009],
+ [91.98422285200007, 21.693508205000057],
+ [91.98389733200008, 21.70538971600007],
+ [91.97706139400003, 21.70538971600007],
+ [91.97193444100003, 21.68821849200009],
+ [91.96265709700003, 21.689520575000074],
+ [91.95362389400003, 21.70140208500004],
+ [91.94971764400003, 21.715969143000052],
+ [91.95297285200007, 21.738348700000074],
+ [91.96192467500003, 21.743841864000046],
+ [91.97478274800005, 21.746486721000053],
+ [91.99000084700003, 21.75999583500004],
+ [91.98389733200008, 21.766831773000035],
+ [91.96729576900003, 21.75543854400007],
+ [91.96029707100007, 21.763820705000057],
+ [91.96656334700003, 21.77887604400007],
+ [91.99000084700003, 21.787909247000073],
+ [91.99000084700003, 21.79482656500005],
+ [91.94369550900007, 21.791408596000053],
+ [91.92408287900008, 21.785223700000074],
+ [91.90870201900003, 21.78115469000005],
+ [91.89926191500007, 21.789496161000045],
+ [91.90088951900003, 21.813299872000073],
+ [91.91138756600003, 21.83470286700009],
+ [91.92937259200005, 21.84316640800006],
+ [91.92164147200003, 21.85342031500005],
+ [91.92554772200003, 21.86286041900007],
+ [91.93628991000003, 21.870835679000038],
+ [91.94971764400003, 21.876695054000038],
+ [91.94971764400003, 21.88418203300006],
+ [91.93921959700003, 21.88304271000004],
+ [91.92994225400008, 21.878648179000038],
+ [91.92212975400008, 21.871568101000037],
+ [91.91570071700005, 21.862453518000052],
+ [91.91032962300005, 21.87490469000005],
+ [91.90560957100007, 21.89557526200008],
+ [91.90121504000007, 21.935370184000078],
+ [91.89820397200003, 21.94489166900007],
+ [91.88404381600003, 21.960150458000044],
+ [91.88086998800003, 21.969183661000045],
+ [91.88086998800003, 22.007025458000044],
+ [91.85523522200003, 22.109198309000078],
+ [91.85352623800003, 22.14362213700008],
+ [91.86394290500004, 22.139593817000048],
+ [91.86719811300003, 22.13739655200004],
+ [91.86207116000003, 22.15062083500004],
+ [91.85328209700003, 22.14874909100007],
+ [91.84603925900007, 22.135972398000035],
+ [91.84603925900007, 22.116888739000046],
+ [91.83985436300003, 22.116888739000046],
+ [91.82911217500003, 22.134100653000075],
+ [91.81934655000003, 22.155951239000046],
+ [91.81299889400003, 22.18032461100006],
+ [91.81202233200008, 22.205023505000042],
+ [91.81690514400003, 22.22028229400007],
+ [91.82585696700005, 22.23004791900007],
+ [91.83472741000003, 22.237616278000075],
+ [91.83985436300003, 22.246649481000077],
+ [91.83838951900003, 22.26308828300006],
+ [91.82984459700003, 22.271307684000078],
+ [91.81918379000007, 22.275824286000045],
+ [91.81202233200008, 22.281398830000057],
+ [91.80884850400008, 22.306341864000046],
+ [91.82650800900007, 22.31826406500005],
+ [91.85238691500007, 22.325344143000052],
+ [91.87403405000003, 22.336004950000074],
+ [91.88493899800005, 22.35382721600007],
+ [91.90805097700007, 22.424750067000048],
+ [91.90186608200008, 22.42405833500004],
+ [91.88770592500003, 22.424750067000048],
+ [91.88550866000003, 22.40965403900009],
+ [91.87574303500003, 22.37107982000009],
+ [91.87745201900003, 22.363348700000074],
+ [91.87045332100007, 22.35809967700004],
+ [91.85914147200003, 22.346625067000048],
+ [91.84400475400008, 22.33494700700004],
+ [91.82634524800005, 22.32916901200008],
+ [91.82325280000003, 22.324164130000042],
+ [91.79859459700003, 22.31191640800006],
+ [91.79135175900007, 22.301906643000052],
+ [91.79395592500003, 22.286037502000056],
+ [91.80453535200007, 22.278469143000052],
+ [91.81723066500007, 22.27407461100006],
+ [91.82634524800005, 22.26776764500005],
+ [91.82593834700003, 22.248480536000045],
+ [91.80892988400007, 22.236273505000042],
+ [91.78711998800003, 22.237941799000055],
+ [91.77165774800005, 22.260321356000077],
+ [91.75440514400003, 22.374660549000055],
+ [91.74366295700008, 22.411078192000048],
+ [91.67603600400008, 22.53461334800005],
+ [91.54810631600003, 22.700344143000052],
+ [91.51636803500003, 22.712225653000075],
+ [91.49870853000004, 22.72728099200009],
+ [91.48462975400008, 22.74551015800006],
+ [91.47681725400008, 22.76117584800005],
+ [91.46900475400008, 22.757066148000035],
+ [91.46241295700008, 22.76190827000005],
+ [91.45801842500003, 22.772284247000073],
+ [91.45630944100003, 22.784816799000055],
+ [91.45834394600007, 22.79706452000005],
+ [91.46778405000003, 22.80931224200009],
+ [91.47396894600007, 22.838324286000045],
+ [91.49000084700003, 22.880560614000046],
+ [91.49048912900008, 22.90452708500004],
+ [91.48308353000004, 22.90452708500004],
+ [91.47966556100005, 22.885891018000052],
+ [91.46241295700008, 22.83344147300005],
+ [91.45248457100007, 22.822658596000053],
+ [91.43043053500003, 22.81631094000005],
+ [91.41675866000003, 22.799994208000044],
+ [91.41163170700008, 22.777818101000037],
+ [91.41472415500004, 22.753729559000078],
+ [91.39966881600003, 22.76430898600006],
+ [91.38502037900008, 22.770697333000044],
+ [91.36833743600005, 22.773993231000077],
+ [91.34644616000003, 22.77484772300005],
+ [91.34644616000003, 22.767401434000078],
+ [91.36744225400008, 22.761664130000042],
+ [91.37012780000003, 22.75218333500004],
+ [91.36011803500003, 22.743394273000035],
+ [91.34262129000007, 22.739447333000044],
+ [91.29078209700003, 22.738430080000057],
+ [91.30884850400008, 22.73309967700004],
+ [91.32504316500007, 22.72614166900007],
+ [91.33277428500003, 22.72020091400009],
+ [91.32992597700007, 22.70571523600006],
+ [91.31739342500003, 22.697211005000042],
+ [91.30054772200003, 22.69326406500005],
+ [91.28443444100003, 22.692287502000056],
+ [91.28345787900008, 22.69334544500009],
+ [91.25277754000007, 22.699286200000074],
+ [91.24838300900007, 22.69822825700004],
+ [91.24480228000004, 22.698391018000052],
+ [91.24341881600003, 22.70221588700008],
+ [91.24390709700003, 22.71743398600006],
+ [91.24341881600003, 22.72020091400009],
+ [91.23121178500003, 22.724310614000046],
+ [91.21607506600003, 22.72606028900009],
+ [91.18189537900008, 22.72646719000005],
+ [91.18189537900008, 22.72020091400009],
+ [91.19459069100003, 22.70966217700004],
+ [91.19922936300003, 22.69879791900007],
+ [91.19214928500003, 22.69163646000004],
+ [91.16895592500003, 22.692287502000056],
+ [91.16895592500003, 22.684881903000075],
+ [91.22689863400007, 22.671087958000044],
+ [91.25342858200008, 22.660711981000077],
+ [91.26449629000007, 22.64081452000005],
+ [91.26107832100007, 22.627875067000048],
+ [91.25310306100005, 22.613836981000077],
+ [91.24156880000004, 22.575395765000053],
+ [91.22136457600004, 22.55719260500007],
+ [91.20274304600008, 22.543219639000085],
+ [91.17656568400008, 22.53641941400008],
+ [91.12734345800004, 22.527025948000073],
+ [91.08920058200005, 22.544430256000055],
+ [91.06957967100004, 22.571556869000062],
+ [91.05860436300003, 22.61432526200008],
+ [91.04867597700007, 22.626166083000044],
+ [91.03793379000007, 22.643866278000075],
+ [91.02670332100007, 22.674261786000045],
+ [91.01832116000003, 22.68309153900009],
+ [91.00375410200007, 22.678656317000048],
+ [91.01872806100005, 22.664455471000053],
+ [91.03223717500003, 22.636867580000057],
+ [91.04021243600005, 22.60773346600007],
+ [91.03793379000007, 22.58860911700009],
+ [91.01758873800003, 22.579291083000044],
+ [90.98511803500003, 22.574367580000057],
+ [90.95492597700007, 22.575832424000055],
+ [90.94174238400007, 22.585882880000042],
+ [90.93555748800003, 22.599676825000074],
+ [90.90821373800003, 22.61786530200004],
+ [90.90202884200005, 22.627101955000057],
+ [90.89877363400007, 22.63617584800005],
+ [90.88412519600007, 22.65448639500005],
+ [90.87647545700008, 22.682806708000044],
+ [90.86548912900008, 22.687160549000055],
+ [90.83594811300003, 22.684881903000075],
+ [90.83130944100003, 22.690578518000052],
+ [90.81950931100005, 22.72646719000005],
+ [90.81177819100003, 22.732367255000042],
+ [90.80258222700007, 22.736395575000074],
+ [90.79493248800003, 22.741359768000052],
+ [90.78834069100003, 22.75922272300005],
+ [90.77418053500003, 22.77806224200009],
+ [90.77100670700008, 22.784816799000055],
+ [90.76954186300003, 22.795355536000045],
+ [90.75733483200008, 22.822658596000053],
+ [90.75001061300003, 22.856756903000075],
+ [90.74195397200003, 22.874212958000044],
+ [90.73292076900003, 22.889064846000053],
+ [90.72559655000003, 22.90570709800005],
+ [90.72266686300003, 22.92845286700009],
+ [90.71745853000004, 22.940619208000044],
+ [90.64014733200008, 23.038031317000048],
+ [90.62940514400003, 23.064398505000042],
+ [90.62712649800005, 23.075873114000046],
+ [90.62720787900008, 23.08665599200009],
+ [90.63868248800003, 23.14789459800005],
+ [90.64014733200008, 23.18886953300006],
+ [90.64584394600007, 23.21092357000009],
+ [90.65707441500007, 23.23037344000005],
+ [90.66521243600005, 23.24876536700009],
+ [90.66114342500003, 23.267645575000074],
+ [90.66732832100007, 23.267645575000074],
+ [90.65088951900003, 23.30023834800005],
+ [90.65015709700003, 23.31354401200008],
+ [90.66114342500003, 23.32225169500009],
+ [90.65772545700008, 23.32322825700004],
+ [90.65479576900003, 23.32330963700008],
+ [90.65316816500007, 23.324652411000045],
+ [90.65365644600007, 23.329738674000055],
+ [90.62842858200008, 23.321519273000035],
+ [90.61133873800003, 23.34247467700004],
+ [90.60173587300005, 23.37246328300006],
+ [90.59913170700008, 23.391180731000077],
+ [90.60027103000004, 23.44993724200009],
+ [90.60873457100007, 23.472723700000074],
+ [90.63331139400003, 23.486761786000045],
+ [90.69157962300005, 23.486476955000057],
+ [90.71501712300005, 23.49835846600007],
+ [90.71583092500003, 23.53514232000009],
+ [90.71119225400008, 23.54881419500009],
+ [90.70557701900003, 23.554510809000078],
+ [90.69581139400003, 23.555487372000073],
+ [90.67823326900003, 23.555080471000053],
+ [90.67546634200005, 23.550930080000057],
+ [90.68433678500003, 23.54173411700009],
+ [90.70215905000003, 23.52838776200008],
+ [90.69532311300003, 23.507879950000074],
+ [90.67774498800003, 23.517279364000046],
+ [90.66675866000003, 23.51821523600006],
+ [90.64747155000003, 23.507879950000074],
+ [90.62208092500003, 23.500067450000074],
+ [90.60775800900007, 23.491115627000056],
+ [90.60336347700007, 23.494696356000077],
+ [90.58814537900008, 23.53416575700004],
+ [90.59205162900008, 23.56248607000009],
+ [90.60816491000003, 23.585760809000078],
+ [90.63331139400003, 23.596625067000048],
+ [90.62712649800005, 23.603461005000042],
+ [90.62533613400007, 23.599351304000038],
+ [90.62525475400008, 23.59833405200004],
+ [90.62403405000003, 23.598089911000045],
+ [90.61963951900003, 23.596625067000048],
+ [90.61198978000004, 23.60610586100006],
+ [90.59546959700003, 23.604396877000056],
+ [90.55876712300005, 23.590399481000077],
+ [90.56446373800003, 23.57640208500004],
+ [90.55941816500007, 23.56793854400007],
+ [90.54721113400007, 23.563788153000075],
+ [90.53150475400008, 23.56248607000009],
+ [90.51465905000003, 23.563788153000075],
+ [90.50171959700003, 23.56793854400007],
+ [90.47632897200003, 23.582953192000048],
+ [90.48438561300003, 23.56745026200008],
+ [90.49838300900007, 23.55727773600006],
+ [90.51498457100007, 23.55141836100006],
+ [90.53150475400008, 23.54881419500009],
+ [90.56869550900007, 23.54751211100006],
+ [90.57683353000004, 23.539496161000045],
+ [90.57894941500007, 23.44985586100006],
+ [90.57593834700003, 23.43895091400009],
+ [90.56812584700003, 23.432928778000075],
+ [90.55990644600007, 23.418402411000045],
+ [90.55372155000003, 23.40070221600007],
+ [90.55193118600005, 23.38495514500005],
+ [90.51832116000003, 23.398260809000078],
+ [90.32243899800005, 23.433294989000046],
+ [90.28443444100003, 23.446193752000056],
+ [90.25033613400007, 23.466945705000057],
+ [90.24935957100007, 23.45538971600007],
+ [90.25879967500003, 23.444566148000035],
+ [90.38851972700007, 23.372381903000075],
+ [90.40414472700007, 23.36041901200008],
+ [90.41342207100007, 23.34796784100007],
+ [90.41968834700003, 23.335598049000055],
+ [90.42847741000003, 23.326117255000042],
+ [90.46021569100003, 23.31972890800006],
+ [90.48796634200005, 23.30683014500005],
+ [90.50359134200005, 23.30174388200004],
+ [90.56910241000003, 23.294989325000074],
+ [90.57732181100005, 23.288397528000075],
+ [90.60661868600005, 23.247219143000052],
+ [90.61085045700008, 23.23078034100007],
+ [90.61451256600003, 23.195461330000057],
+ [90.61036217500003, 23.20115794500009],
+ [90.60271243600005, 23.211004950000074],
+ [90.59351647200003, 23.219875393000052],
+ [90.59839928500003, 23.200425523000035],
+ [90.60287519600007, 23.14130280200004],
+ [90.59913170700008, 23.11749909100007],
+ [90.57195071700005, 23.081732489000046],
+ [90.56560306100005, 23.075873114000046],
+ [90.55372155000003, 23.078558661000045],
+ [90.55128014400003, 23.08690013200004],
+ [90.55591881600003, 23.096828518000052],
+ [90.56560306100005, 23.10382721600007],
+ [90.56560306100005, 23.110663153000075],
+ [90.55876712300005, 23.110663153000075],
+ [90.54761803500003, 23.09674713700008],
+ [90.53663170700008, 23.086818752000056],
+ [90.52279707100007, 23.080145575000074],
+ [90.50359134200005, 23.075873114000046],
+ [90.46607506600003, 23.07684967700004],
+ [90.45362389400003, 23.072333075000074],
+ [90.44890384200005, 23.05573151200008],
+ [90.45012454500005, 23.049343166000085],
+ [90.45435631600003, 23.02753327000005],
+ [90.46827233200008, 22.99607982000009],
+ [90.48698978000004, 22.966131903000075],
+ [90.50700931100005, 22.94208405200004],
+ [90.50928795700008, 22.93699778900009],
+ [90.50757897200003, 22.92536041900007],
+ [90.51042728000004, 22.91819896000004],
+ [90.51295006600003, 22.91705963700008],
+ [90.51685631600003, 22.916815497000073],
+ [90.52100670700008, 22.915676174000055],
+ [90.52409915500004, 22.91201406500005],
+ [90.53598066500007, 22.90338776200008],
+ [90.54004967500003, 22.896551825000074],
+ [90.53492272200003, 22.887152411000045],
+ [90.52003014400003, 22.880194403000075],
+ [90.50513756600003, 22.881659247000073],
+ [90.49048912900008, 22.885199286000045],
+ [90.47632897200003, 22.884100653000075],
+ [90.45720462300005, 22.861761786000045],
+ [90.44809004000007, 22.82843659100007],
+ [90.43604576900003, 22.800604559000078],
+ [90.40796959700003, 22.794663804000038],
+ [90.42400149800005, 22.781683661000045],
+ [90.41993248800003, 22.76825592700004],
+ [90.40642337300005, 22.76308828300006],
+ [90.39429772200003, 22.77484772300005],
+ [90.37256920700008, 22.761419989000046],
+ [90.38721764400003, 22.751288153000075],
+ [90.41578209700003, 22.74249909100007],
+ [90.43523196700005, 22.733303127000056],
+ [90.44459069100003, 22.751654364000046],
+ [90.46168053500003, 22.748846747000073],
+ [90.47901451900003, 22.73501211100006],
+ [90.48991946700005, 22.72020091400009],
+ [90.49293053500003, 22.709906317000048],
+ [90.49675540500004, 22.678656317000048],
+ [90.50896243600005, 22.646429755000042],
+ [90.51270592500003, 22.611476955000057],
+ [90.51002037900008, 22.60423411700009],
+ [90.50017337300005, 22.592352606000077],
+ [90.49138431100005, 22.587836005000042],
+ [90.46859785200007, 22.58470286700009],
+ [90.45923912900008, 22.579291083000044],
+ [90.45346113400007, 22.564195054000038],
+ [90.44214928500003, 22.508734442000048],
+ [90.44206790500004, 22.49363841400009],
+ [90.44499759200005, 22.50413646000004],
+ [90.45118248800003, 22.510158596000053],
+ [90.45801842500003, 22.51463450700004],
+ [90.46265709700003, 22.52098216400009],
+ [90.46355228000004, 22.53143952000005],
+ [90.46045983200008, 22.551174221000053],
+ [90.46265709700003, 22.56195709800005],
+ [90.47250410200007, 22.57558828300006],
+ [90.48731530000003, 22.583726304000038],
+ [90.50513756600003, 22.58624909100007],
+ [90.52409915500004, 22.58307526200008],
+ [90.55974368600005, 22.562323309000078],
+ [90.57781009200005, 22.533677476000037],
+ [90.58969160200007, 22.500433661000045],
+ [90.60661868600005, 22.465765692000048],
+ [90.59131920700008, 22.470526434000078],
+ [90.58619225400008, 22.473211981000077],
+ [90.58643639400003, 22.45058828300006],
+ [90.59359785200007, 22.43231842700004],
+ [90.61345462300005, 22.396877346000053],
+ [90.61841881600003, 22.376654364000046],
+ [90.61931399800005, 22.355902411000045],
+ [90.61345462300005, 22.314886786000045],
+ [90.58155358200008, 22.238226630000042],
+ [90.55795332100007, 22.20335521000004],
+ [90.53834069100003, 22.198879299000055],
+ [90.51172936300003, 22.185288804000038],
+ [90.50114993600005, 22.176703192000048],
+ [90.49675540500004, 22.167792059000078],
+ [90.49439537900008, 22.154242255000042],
+ [90.48829186300003, 22.138617255000042],
+ [90.45964603000004, 22.091945705000057],
+ [90.45004316500007, 22.08079661700009],
+ [90.43864993600005, 22.075995184000078],
+ [90.42546634200005, 22.07884349200009],
+ [90.40845787900008, 22.08592357000009],
+ [90.39380944100003, 22.09471263200004],
+ [90.38746178500003, 22.10260651200008],
+ [90.39323978000004, 22.127386786000045],
+ [90.41749108200008, 22.175034898000035],
+ [90.42164147200003, 22.198879299000055],
+ [90.41000410200007, 22.22728099200009],
+ [90.40796959700003, 22.24042389500005],
+ [90.41407311300003, 22.27179596600007],
+ [90.41089928500003, 22.28424713700008],
+ [90.39429772200003, 22.288234768000052],
+ [90.39869225400008, 22.26748281500005],
+ [90.38868248800003, 22.223211981000077],
+ [90.39087975400008, 22.208807684000078],
+ [90.39909915500004, 22.20221588700008],
+ [90.40552819100003, 22.19953034100007],
+ [90.41049238400007, 22.195705471000053],
+ [90.41423587300005, 22.18577708500004],
+ [90.41285241000003, 22.17804596600007],
+ [90.40821373800003, 22.171210028000075],
+ [90.40056399800005, 22.16404857000009],
+ [90.39918053500003, 22.16233958500004],
+ [90.39714603000004, 22.160630601000037],
+ [90.39519290500004, 22.15721263200004],
+ [90.39258873800003, 22.143011786000045],
+ [90.38868248800003, 22.143459377000056],
+ [90.38379967500003, 22.145738023000035],
+ [90.38005618600005, 22.14362213700008],
+ [90.37712649800005, 22.133612372000073],
+ [90.37378991000003, 22.10260651200008],
+ [90.36988366000003, 22.08982982000009],
+ [90.36573326900003, 22.081203518000052],
+ [90.34742272200003, 22.05532461100006],
+ [90.33472741000003, 22.041815497000073],
+ [90.33220462300005, 22.03807200700004],
+ [90.32789147200003, 22.02049388200004],
+ [90.30860436300003, 21.984035549000055],
+ [90.30437259200005, 21.965765692000048],
+ [90.29997806100005, 21.927679755000042],
+ [90.29070071700005, 21.890326239000046],
+ [90.28288821700005, 21.870794989000046],
+ [90.27271569100003, 21.85740794500009],
+ [90.21762129000007, 21.81346263200004],
+ [90.20378665500004, 21.80459219000005],
+ [90.18482506600003, 21.80097077000005],
+ [90.16439863400007, 21.80426666900007],
+ [90.12680097700007, 21.818793036000045],
+ [90.10906009200005, 21.822088934000078],
+ [90.09294681100005, 21.83026764500005],
+ [90.08855228000004, 21.84674713700008],
+ [90.09538821700005, 21.859442450000074],
+ [90.11247806100005, 21.856268622000073],
+ [90.10499108200008, 21.870266018000052],
+ [90.11085045700008, 21.880113023000035],
+ [90.12086022200003, 21.88930898600006],
+ [90.12623131600003, 21.901190497000073],
+ [90.12452233200008, 21.90973541900007],
+ [90.12183678500003, 21.915350653000075],
+ [90.12134850400008, 21.921576239000046],
+ [90.12623131600003, 21.93195221600007],
+ [90.11622155000003, 21.91933828300006],
+ [90.09848066500007, 21.878607489000046],
+ [90.08887780000003, 21.86985911700009],
+ [90.07935631600003, 21.866929429000038],
+ [90.06690514400003, 21.85342031500005],
+ [90.05787194100003, 21.849351304000038],
+ [90.04932701900003, 21.85101959800005],
+ [90.03630618600005, 21.861151434000078],
+ [90.02442467500003, 21.862453518000052],
+ [90.03126061300003, 21.889227606000077],
+ [90.03394616000003, 21.94354889500005],
+ [90.04493248800003, 21.966131903000075],
+ [90.05420983200008, 21.97337474200009],
+ [90.06576582100007, 21.97988515800006],
+ [90.07715905000003, 21.987982489000046],
+ [90.08578535200007, 22.00023021000004],
+ [90.09058678500003, 22.015448309000078],
+ [90.09253991000003, 22.02798086100006],
+ [90.09595787900008, 22.04010651200008],
+ [90.10564212300005, 22.05426666900007],
+ [90.14673912900008, 22.089016018000052],
+ [90.15162194100003, 22.094875393000052],
+ [90.15886478000004, 22.10691966400009],
+ [90.16407311300003, 22.113226630000042],
+ [90.17286217500003, 22.117010809000078],
+ [90.18181399800005, 22.11481354400007],
+ [90.18970787900008, 22.11082591400009],
+ [90.19507897200003, 22.109523830000057],
+ [90.21615644600007, 22.12323639500005],
+ [90.23170006600003, 22.145656643000052],
+ [90.23910566500007, 22.172267971000053],
+ [90.23609459700003, 22.198879299000055],
+ [90.21827233200008, 22.15570709800005],
+ [90.20582116000003, 22.132961330000057],
+ [90.19166100400008, 22.123114325000074],
+ [90.16480553500003, 22.11981842700004],
+ [90.14828535200007, 22.11078522300005],
+ [90.08887780000003, 22.051174221000053],
+ [90.08179772200003, 22.04100169500009],
+ [90.07374108200008, 22.019232489000046],
+ [90.06104576900003, 22.000799872000073],
+ [90.05795332100007, 21.99371979400007],
+ [90.05241946700005, 21.98899974200009],
+ [90.03809655000003, 21.98655833500004],
+ [90.02816816500007, 21.988104559000078],
+ [89.99634850400008, 22.00023021000004],
+ [90.00212649800005, 22.014105536000045],
+ [90.00318444100003, 22.029364325000074],
+ [90.01075280000003, 22.04120514500005],
+ [90.02019290500004, 22.04881419500009],
+ [90.02898196700005, 22.05296458500004],
+ [90.03541100400008, 22.059800523000035],
+ [90.03809655000003, 22.075344143000052],
+ [90.03467858200008, 22.105169989000046],
+ [90.03907311300003, 22.11627838700008],
+ [90.04273522200003, 22.131252346000053],
+ [90.05209394600007, 22.141099351000037],
+ [90.06324303500003, 22.145738023000035],
+ [90.07260175900007, 22.152044989000046],
+ [90.07837975400008, 22.16404857000009],
+ [90.05258222700007, 22.155462958000044],
+ [90.04004967500003, 22.13808828300006],
+ [90.02442467500003, 22.089016018000052],
+ [90.01539147200003, 22.077866929000038],
+ [89.98853600400008, 22.05304596600007],
+ [89.98275800900007, 22.044623114000046],
+ [89.98519941500007, 21.99941640800006],
+ [89.98275800900007, 21.98655833500004],
+ [89.96778405000003, 21.974554755000042],
+ [89.94971764400003, 21.980902411000045],
+ [89.93441816500007, 21.997707424000055],
+ [89.92823326900003, 22.017279364000046],
+ [89.92628014400003, 22.027167059000078],
+ [89.91749108200008, 22.04987213700008],
+ [89.91456139400003, 22.061672268000052],
+ [89.91236412900008, 22.135565497000073],
+ [89.90308678500003, 22.176906643000052],
+ [89.90088951900003, 22.201971747000073],
+ [89.89828535200007, 22.21165599200009],
+ [89.88550866000003, 22.230617580000057],
+ [89.88038170700008, 22.24042389500005],
+ [89.87663821700005, 22.25348541900007],
+ [89.87533613400007, 22.26398346600007],
+ [89.87680097700007, 22.274725653000075],
+ [89.88038170700008, 22.288234768000052],
+ [89.90015709700003, 22.333929755000042],
+ [89.98275800900007, 22.445257880000042],
+ [89.98829186300003, 22.45774974200009],
+ [89.99195397200003, 22.469875393000052],
+ [89.99789472700007, 22.480861721000053],
+ [90.01010175900007, 22.49022044500009],
+ [89.98275800900007, 22.473211981000077],
+ [89.97950280000003, 22.470078843000067],
+ [89.94743899800005, 22.43968333500004],
+ [89.93360436300003, 22.423529364000046],
+ [89.92823326900003, 22.40770091400009],
+ [89.92042076900003, 22.391831773000035],
+ [89.90308678500003, 22.396429755000042],
+ [89.87289472700007, 22.41860586100006],
+ [89.87484785200007, 22.397650458000044],
+ [89.88054446700005, 22.380601304000038],
+ [89.88412519600007, 22.36351146000004],
+ [89.88038170700008, 22.342230536000045],
+ [89.83871504000007, 22.26776764500005],
+ [89.85084069100003, 22.246527411000045],
+ [89.86133873800003, 22.211004950000074],
+ [89.87289472700007, 22.14362213700008],
+ [89.87427819100003, 22.10883209800005],
+ [89.87134850400008, 22.091864325000074],
+ [89.86296634200005, 22.079046942000048],
+ [89.84620201900003, 22.07062409100007],
+ [89.83155358200008, 22.071966864000046],
+ [89.81617272200003, 22.075995184000078],
+ [89.79721113400007, 22.075995184000078],
+ [89.79721113400007, 22.068508205000057],
+ [89.81836998800003, 22.06004466400009],
+ [89.83594811300003, 22.04946523600006],
+ [89.84791100400008, 22.03388092700004],
+ [89.85238691500007, 22.01044342700004],
+ [89.85108483200008, 22.000881252000056],
+ [89.84595787900008, 21.982896226000037],
+ [89.84620201900003, 21.972316799000055],
+ [89.85027103000004, 21.96312083500004],
+ [89.86378014400003, 21.943304755000042],
+ [89.87183678500003, 21.924261786000045],
+ [89.88160241000003, 21.912990627000056],
+ [89.88721764400003, 21.900091864000046],
+ [89.88038170700008, 21.88418203300006],
+ [89.87322024800005, 21.88157786700009],
+ [89.85092207100007, 21.877508856000077],
+ [89.82520592500003, 21.856268622000073],
+ [89.81959069100003, 21.849554755000042],
+ [89.81763756600003, 21.844916083000044],
+ [89.81421959700003, 21.84080638200004],
+ [89.80469811300003, 21.835760809000078],
+ [89.78638756600003, 21.828924872000073],
+ [89.77572675900007, 21.82758209800005],
+ [89.77116946700005, 21.83234284100007],
+ [89.76587975400008, 21.84674713700008],
+ [89.75342858200008, 21.843898830000057],
+ [89.73845462300005, 21.834418036000045],
+ [89.72584069100003, 21.828924872000073],
+ [89.70915774800005, 21.83006419500009],
+ [89.69044030000003, 21.833726304000038],
+ [89.67335045700008, 21.84007396000004],
+ [89.66130618600005, 21.849351304000038],
+ [89.65691165500004, 21.857123114000046],
+ [89.65316816500007, 21.867743231000077],
+ [89.65259850400008, 21.878851630000042],
+ [89.66334069100003, 21.896307684000078],
+ [89.66130618600005, 21.90582916900007],
+ [89.64698326900003, 21.925116278000075],
+ [89.61898847700007, 21.86985911700009],
+ [89.63038170700008, 21.85146719000005],
+ [89.64975019600007, 21.82636139500005],
+ [89.67204837300005, 21.80426666900007],
+ [89.69206790500004, 21.79482656500005],
+ [89.70069420700008, 21.784857489000046],
+ [89.68995201900003, 21.76520416900007],
+ [89.66822350400008, 21.750881252000056],
+ [89.64356530000003, 21.75690338700008],
+ [89.63152103000004, 21.764064846000053],
+ [89.62037194100003, 21.76434967700004],
+ [89.59546959700003, 21.75999583500004],
+ [89.59278405000003, 21.754380601000037],
+ [89.60377037900008, 21.727687893000052],
+ [89.60596764400003, 21.71906159100007],
+ [89.58692467500003, 21.700832424000055],
+ [89.56568444100003, 21.713364976000037],
+ [89.53711998800003, 21.75381094000005],
+ [89.53891035200007, 21.77147044500009],
+ [89.52735436300003, 21.81281159100007],
+ [89.53028405000003, 21.835760809000078],
+ [89.53834069100003, 21.84861888200004],
+ [89.55689537900008, 21.868801174000055],
+ [89.56446373800003, 21.88418203300006],
+ [89.56763756600003, 21.90070221600007],
+ [89.56348717500003, 21.973130601000037],
+ [89.57129967500003, 22.03123607000009],
+ [89.57667076900003, 22.051703192000048],
+ [89.60059655000003, 22.09125397300005],
+ [89.60596764400003, 22.113226630000042],
+ [89.60254967500003, 22.134507554000038],
+ [89.59376061300003, 22.155422268000052],
+ [89.58139082100007, 22.17405833500004],
+ [89.56788170700008, 22.18891022300005],
+ [89.56723066500007, 22.202826239000046],
+ [89.59791100400008, 22.240301825000074],
+ [89.60596764400003, 22.25690338700008],
+ [89.60710696700005, 22.278265692000048],
+ [89.61060631600003, 22.298895575000074],
+ [89.61695397200003, 22.318426825000074],
+ [89.62647545700008, 22.336004950000074],
+ [89.61548912900008, 22.328273830000057],
+ [89.60621178500003, 22.315619208000044],
+ [89.59245853000004, 22.288234768000052],
+ [89.58082116000003, 22.27724844000005],
+ [89.57715905000003, 22.268500067000048],
+ [89.58619225400008, 22.245428778000075],
+ [89.58033287900008, 22.236761786000045],
+ [89.56104576900003, 22.223089911000045],
+ [89.54916425900007, 22.20526764500005],
+ [89.55030358200008, 22.19212474200009],
+ [89.57129967500003, 22.157904364000046],
+ [89.57634524800005, 22.14549388200004],
+ [89.57878665500004, 22.135891018000052],
+ [89.57935631600003, 22.113226630000042],
+ [89.57699629000007, 22.101263739000046],
+ [89.56674238400007, 22.082098700000074],
+ [89.56446373800003, 22.072211005000042],
+ [89.55648847700007, 22.00844961100006],
+ [89.55144290500004, 21.99404531500005],
+ [89.53288821700005, 21.98468659100007],
+ [89.52475019600007, 22.000148830000057],
+ [89.52344811300003, 22.044623114000046],
+ [89.52613366000003, 22.055121161000045],
+ [89.53646894600007, 22.075832424000055],
+ [89.53711998800003, 22.089016018000052],
+ [89.49203535200007, 22.188381252000056],
+ [89.48943118600005, 22.208807684000078],
+ [89.49415123800003, 22.253566799000055],
+ [89.49301191500007, 22.273504950000074],
+ [89.48316491000003, 22.295070705000057],
+ [89.47575931100005, 22.295070705000057],
+ [89.46745853000004, 22.228989976000037],
+ [89.47575931100005, 22.10260651200008],
+ [89.48316491000003, 22.10260651200008],
+ [89.48406009200005, 22.11668528900009],
+ [89.48878014400003, 22.12958405200004],
+ [89.49415123800003, 22.136867580000057],
+ [89.49683678500003, 22.133978583000044],
+ [89.49822024800005, 22.12531159100007],
+ [89.50171959700003, 22.113104559000078],
+ [89.50684655000003, 22.10101959800005],
+ [89.51295006600003, 22.09243398600006],
+ [89.51832116000003, 22.081000067000048],
+ [89.51742597700007, 22.066473700000074],
+ [89.50912519600007, 22.04120514500005],
+ [89.50416100400008, 22.03668854400007],
+ [89.49187259200005, 22.03457265800006],
+ [89.48943118600005, 22.03123607000009],
+ [89.49040774800005, 22.023993231000077],
+ [89.49268639400003, 22.019191799000055],
+ [89.49683678500003, 22.01386139500005],
+ [89.50049889400003, 22.00259023600006],
+ [89.51270592500003, 21.97809479400007],
+ [89.52003014400003, 21.969183661000045],
+ [89.52182050900007, 21.96230703300006],
+ [89.51254316500007, 21.909125067000048],
+ [89.50228925900007, 21.89752838700008],
+ [89.48910566500007, 21.888373114000046],
+ [89.47575931100005, 21.876695054000038],
+ [89.46461022200003, 21.859198309000078],
+ [89.46363366000003, 21.845038153000075],
+ [89.46705162900008, 21.828599351000037],
+ [89.46949303500003, 21.804388739000046],
+ [89.46583092500003, 21.781317450000074],
+ [89.45622806100005, 21.76239655200004],
+ [89.44271894600007, 21.746649481000077],
+ [89.40642337300005, 21.717352606000077],
+ [89.39519290500004, 21.71637604400007],
+ [89.36963951900003, 21.743312893000052],
+ [89.36426842500003, 21.758205471000053],
+ [89.36280358200008, 21.78384023600006],
+ [89.36589603000004, 21.828924872000073],
+ [89.37126712300005, 21.84715403900009],
+ [89.38428795700008, 21.877834377000056],
+ [89.38697350400008, 21.901190497000073],
+ [89.38266035200007, 21.92133209800005],
+ [89.36402428500003, 21.95506419500009],
+ [89.35962975400008, 21.972316799000055],
+ [89.35222415500004, 21.972316799000055],
+ [89.34595787900008, 21.95701732000009],
+ [89.34880618600005, 21.944159247000073],
+ [89.35523522200003, 21.93162669500009],
+ [89.35962975400008, 21.917669989000046],
+ [89.35962975400008, 21.901678778000075],
+ [89.35596764400003, 21.892523505000042],
+ [89.33912194100003, 21.876695054000038],
+ [89.32886803500003, 21.86465078300006],
+ [89.32260175900007, 21.854641018000052],
+ [89.30616295700008, 21.817613023000035],
+ [89.30128014400003, 21.809393622000073],
+ [89.29623457100007, 21.809068101000037],
+ [89.29070071700005, 21.822088934000078],
+ [89.28394616000003, 21.822088934000078],
+ [89.28443444100003, 21.796820380000042],
+ [89.29468834700003, 21.75779857000009],
+ [89.29070071700005, 21.733343817000048],
+ [89.27369225400008, 21.69879791900007],
+ [89.27662194100003, 21.687567450000074],
+ [89.29753665500004, 21.678127346000053],
+ [89.28589928500003, 21.66559479400007],
+ [89.26872806100005, 21.653998114000046],
+ [89.24870853000004, 21.64590078300006],
+ [89.22925866000003, 21.64394765800006],
+ [89.21045983200008, 21.654120184000078],
+ [89.20443769600007, 21.672674872000073],
+ [89.20826256600003, 21.690619208000044],
+ [89.21859785200007, 21.698553778000075],
+ [89.22071373800003, 21.709418036000045],
+ [89.18970787900008, 21.79124583500004],
+ [89.18824303500003, 21.799709377000056],
+ [89.18767337300005, 21.81150950700004],
+ [89.18336022200003, 21.815619208000044],
+ [89.17408287900008, 21.81004466400009],
+ [89.16456139400003, 21.80019765800006],
+ [89.16041100400008, 21.79132721600007],
+ [89.15455162900008, 21.786851304000038],
+ [89.14128665500004, 21.790228583000044],
+ [89.11939537900008, 21.80097077000005],
+ [89.10906009200005, 21.809515692000048],
+ [89.10466556100005, 21.81586334800005],
+ [89.07992597700007, 21.897406317000048],
+ [89.07781009200005, 21.91425202000005],
+ [89.08041425900007, 21.934881903000075],
+ [89.09107506600003, 21.97679271000004],
+ [89.09148196700005, 22.00023021000004],
+ [89.08423912900008, 22.021185614000046],
+ [89.06202233200008, 22.04950592700004],
+ [89.05738366000003, 22.06509023600006],
+ [89.06348717500003, 22.111029364000046],
+ [89.06039472700007, 22.12986888200004],
+ [89.06069258700006, 22.130484925000076],
+ [89.07815922000009, 22.150845439000122],
+ [89.07619551700009, 22.175030009000082],
+ [89.07071781400009, 22.194822083000062],
+ [89.06229455500011, 22.21156524700011],
+ [89.01862797100011, 22.26468861900004],
+ [89.00911950700004, 22.285617575000046],
+ [89.02353723100003, 22.294815979000035],
+ [89.00694909700013, 22.32142934200006],
+ [89.00152307100007, 22.333676656000094],
+ [88.98958581600004, 22.386903382000057],
+ [88.98948246300012, 22.396670227000115],
+ [88.99216963700013, 22.406953837000103],
+ [89.00074792500004, 22.420131328000068],
+ [89.00250492300006, 22.427986145000105],
+ [88.99837080900011, 22.45124053900004],
+ [88.979974, 22.490928039000025],
+ [88.97098230000006, 22.52792836500008],
+ [88.95904504400005, 22.53681671100007],
+ [88.9279875090001, 22.54813385000007],
+ [88.95031172700004, 22.561983134000016],
+ [88.95640954600003, 22.584979146000066],
+ [88.95201704900012, 22.611902568000076],
+ [88.9423535570001, 22.637482402000032],
+ [88.93000288900004, 22.658618063000077],
+ [88.92592045100014, 22.680838928000114],
+ [88.92250980600011, 22.69370636000012],
+ [88.91057255100009, 22.722593486000065],
+ [88.90814375800011, 22.74078359000002],
+ [88.91496504800006, 22.75440033000011],
+ [88.92623051000004, 22.767035218000032],
+ [88.9368758550001, 22.782331441000096],
+ [88.94121667500008, 22.795663961000017],
+ [88.94514408400005, 22.815094300000098],
+ [88.94679773000013, 22.834524638000076],
+ [88.94452396600008, 22.848012187000037],
+ [88.93310347500011, 22.85811492900008],
+ [88.90514652600007, 22.86643483500005],
+ [88.89346765200008, 22.879638164000127],
+ [88.87217696100004, 22.926767070000054],
+ [88.86173832200006, 22.942399190000074],
+ [88.84277307100012, 22.964568380000017],
+ [88.83879398700009, 22.975808004000058],
+ [88.83941410300014, 22.995367534000067],
+ [88.84871586100007, 23.02384124800001],
+ [88.85129968300004, 23.07513010700005],
+ [88.86478723200014, 23.10027069100009],
+ [88.91909916200007, 23.153859152000038],
+ [88.94586755400007, 23.174348857000027],
+ [88.95470422400007, 23.18380564400009],
+ [88.95982019100006, 23.19445098900006],
+ [88.9599752200001, 23.2026933800001],
+ [88.95423913600013, 23.207421773000092],
+ [88.92695398000012, 23.206517436000055],
+ [88.91806563300008, 23.208584493],
+ [88.90964237500003, 23.212434388000062],
+ [88.83962080900011, 23.234810283000044],
+ [88.82267093900009, 23.237962545000087],
+ [88.80954512500011, 23.236050517000066],
+ [88.80096683800008, 23.23075368300003],
+ [88.79419722500006, 23.224965922000067],
+ [88.78618737800008, 23.221529439000037],
+ [88.77569706300011, 23.22163279200005],
+ [88.71001631700005, 23.241218160000088],
+ [88.69658044500011, 23.252354432000104],
+ [88.68660689300003, 23.271603902000024],
+ [88.68593510000005, 23.293308004000025],
+ [88.69503015100008, 23.312609152000064],
+ [88.71926639800006, 23.348291728000063],
+ [88.76789392100011, 23.467276713],
+ [88.77016768400011, 23.48882578600005],
+ [88.7568351650001, 23.49879933700005],
+ [88.74370935100012, 23.489316711000086],
+ [88.73192712400004, 23.472625224000055],
+ [88.71942142800003, 23.468103536000015],
+ [88.70464196800003, 23.495181986000077],
+ [88.69378991700006, 23.499807028000035],
+ [88.66448938000008, 23.518307190000073],
+ [88.64764286400003, 23.535076193000023],
+ [88.62423344000007, 23.573859355000067],
+ [88.6092472740001, 23.588793844000023],
+ [88.60128910400005, 23.59034413700003],
+ [88.58154870600009, 23.58832875600008],
+ [88.57142012600013, 23.592333679000077],
+ [88.56170495600009, 23.602023010000025],
+ [88.5610848390001, 23.608611756000087],
+ [88.56439213100009, 23.61620819100007],
+ [88.56635583500014, 23.628739726000063],
+ [88.56123986800003, 23.632486268],
+ [88.55095625800004, 23.6344241340001],
+ [88.54155114800011, 23.63876495400008],
+ [88.54010420800012, 23.64995290100005],
+ [88.56118819200003, 23.74100677500006],
+ [88.55974125200004, 23.75028269500008],
+ [88.55250655100008, 23.765423890000093],
+ [88.55271325700005, 23.774984029],
+ [88.55767419400007, 23.785681051000026],
+ [88.57235030200007, 23.806894226000068],
+ [88.57751794500007, 23.818521424000025],
+ [88.57762129700012, 23.827616476000102],
+ [88.5754508870001, 23.836556499000025],
+ [88.57436568200012, 23.845625712000086],
+ [88.57762129700012, 23.855160014000077],
+ [88.59358931500003, 23.866916402000086],
+ [88.61317468300007, 23.867846578000027],
+ [88.63394860900007, 23.866141256000063],
+ [88.65312056500011, 23.869784445000064],
+ [88.66650476100006, 23.87949961400001],
+ [88.70443526200006, 23.913709412000102],
+ [88.71415043100006, 23.925155742000115],
+ [88.71714766500003, 23.9431391400001],
+ [88.71435713700004, 23.964403992000072],
+ [88.70836267100003, 23.98355011000008],
+ [88.70159305800007, 23.995280660000063],
+ [88.7138403730001, 24.01468516100003],
+ [88.72546757000009, 24.028896179000085],
+ [88.72500248200004, 24.03837880500008],
+ [88.70092126500009, 24.043649801000086],
+ [88.69782067900007, 24.05625885000002],
+ [88.67901045700006, 24.071219178],
+ [88.67410119700003, 24.082639669000102],
+ [88.67539310700005, 24.09183807400008],
+ [88.68180098500011, 24.112663676000054],
+ [88.68298954300013, 24.12429087300002],
+ [88.67828698800014, 24.144651388000042],
+ [88.67808028100006, 24.154289043000077],
+ [88.68376468900004, 24.166536356000094],
+ [88.69378991700006, 24.17532135100008],
+ [88.71590743000007, 24.182917786000033],
+ [88.73145573500011, 24.1897713150001],
+ [88.73161706600013, 24.18984242800012],
+ [88.73482100400008, 24.19842071500007],
+ [88.74639652500014, 24.21407867500001],
+ [88.74980717000005, 24.223251242000103],
+ [88.74748173000006, 24.226971945000017],
+ [88.74494958500009, 24.24337921200008],
+ [88.74303755700004, 24.24753916500002],
+ [88.73750817900003, 24.28709747300006],
+ [88.71456384300012, 24.315416158000048],
+ [88.68180098500011, 24.333890483000076],
+ [88.66014856000004, 24.338257141000057],
+ [88.64950321500004, 24.31536448200002],
+ [88.63451705000006, 24.294125468000047],
+ [88.61245121300004, 24.292885234000025],
+ [88.56310021900003, 24.308207296000077],
+ [88.49834965000008, 24.31097198500005],
+ [88.47540531400011, 24.315467835000064],
+ [88.40130131100011, 24.36941803000012],
+ [88.13878503400008, 24.495250143000092],
+ [88.10994958500004, 24.50098622700007],
+ [88.10793420400006, 24.50796254500007],
+ [88.0987874760001, 24.5224836230001],
+ [88.09000248300003, 24.532999777000057],
+ [88.08602339700013, 24.536720480000085],
+ [88.08498986800004, 24.541733093000047],
+ [88.08498986800004, 24.593874614000086],
+ [88.08183760600008, 24.599869080000033],
+ [88.06726485200005, 24.613666687000077],
+ [88.05723962400003, 24.63410471600004],
+ [88.04090987200004, 24.640435079000056],
+ [88.02178959200006, 24.64560272200005],
+ [88.02716394100014, 24.675730082000044],
+ [88.0354321690001, 24.69381683400006],
+ [88.04845463100014, 24.71120595300009],
+ [88.05320886200013, 24.754975891000086],
+ [88.06426761900013, 24.759161682000112],
+ [88.07698002200004, 24.761177063000062],
+ [88.0840080160001, 24.770452983000084],
+ [88.08535160400004, 24.78401804600007],
+ [88.08824548300004, 24.796136170000054],
+ [88.09480839000008, 24.803112488000053],
+ [88.10777917500013, 24.801097107000103],
+ [88.11739099100004, 24.81926137300003],
+ [88.13124027500004, 24.831767070000055],
+ [88.14095544500003, 24.844582825000103],
+ [88.13806156400005, 24.863496399000056],
+ [88.12493575100012, 24.89814544700006],
+ [88.12033654800007, 24.906775411000027],
+ [88.11491052200006, 24.912020569000035],
+ [88.11491052200006, 24.916413066000032],
+ [88.16451989700005, 24.941114400000046],
+ [88.1830200610001, 24.946979675000037],
+ [88.20245039900004, 24.945300191000072],
+ [88.21878015100009, 24.93514577200004],
+ [88.23283614100012, 24.918273417000037],
+ [88.24187951700009, 24.898765564000044],
+ [88.24275801600004, 24.880601299000105],
+ [88.25485030100009, 24.87995534300005],
+ [88.29681156400011, 24.86969757100006],
+ [88.31360640500009, 24.868302307000064],
+ [88.32275313400004, 24.8746843470001],
+ [88.34089156100009, 24.904139913],
+ [88.37566980000014, 24.945610251000076],
+ [88.38786543800006, 24.968761292000053],
+ [88.39101770100007, 24.99509043400012],
+ [88.41411706500008, 25.021522929000085],
+ [88.42579593900007, 25.051056010000124],
+ [88.43416752100012, 25.11665924100005],
+ [88.4314803470001, 25.173038229000056],
+ [88.44129886900004, 25.189729716],
+ [88.47540531400011, 25.195104065000052],
+ [88.49183842000008, 25.191124980000083],
+ [88.5231543380001, 25.179807841000112],
+ [88.5500260820001, 25.1731415820001],
+ [88.55467696100004, 25.171126201000035],
+ [88.55937951600004, 25.17076446600005],
+ [88.57069665500012, 25.173244935000028],
+ [88.57772465000005, 25.177482401000063],
+ [88.59012699400012, 25.190143127000013],
+ [88.59911869300004, 25.193140361000033],
+ [88.6342586670001, 25.19226186200008],
+ [88.66459273300012, 25.18688751200004],
+ [88.72453739400004, 25.166475322000068],
+ [88.78422367300004, 25.16094594400009],
+ [88.79233687400006, 25.166578675000025],
+ [88.80251713100012, 25.188127747000053],
+ [88.8091317140001, 25.195259094],
+ [88.81708988500009, 25.19680938700013],
+ [88.82360111500003, 25.194845683],
+ [88.83021569900012, 25.191331686000026],
+ [88.89863529500013, 25.169317526000057],
+ [88.92416345200007, 25.167870585000074],
+ [88.90964237500003, 25.189161275000046],
+ [88.92788415600006, 25.192726949000118],
+ [88.93077803600005, 25.202648825000026],
+ [88.9279875090001, 25.215929667000026],
+ [88.9290727130001, 25.229417216000073],
+ [88.93775435400005, 25.240165914],
+ [88.97532312000004, 25.265228984000103],
+ [88.98235111500009, 25.27489247700005],
+ [88.98493493700005, 25.284969381000067],
+ [88.98271285000004, 25.29447784400007],
+ [88.97532312000004, 25.302642721000083],
+ [88.92648889200007, 25.300472310000075],
+ [88.90287276200007, 25.30341786700008],
+ [88.88612959800014, 25.31907582600006],
+ [88.88018680800008, 25.32346832300003],
+ [88.85925785400013, 25.32470855700008],
+ [88.84902592000003, 25.327189026000056],
+ [88.84199792500004, 25.332821757000076],
+ [88.81833011900011, 25.35964182600007],
+ [88.81404097600006, 25.370390524000086],
+ [88.81326582800011, 25.380054016000102],
+ [88.81037194800012, 25.388425598000097],
+ [88.79962325000014, 25.39560862300003],
+ [88.79931319200006, 25.401706442000105],
+ [88.81631473800007, 25.437208151000036],
+ [88.81491947500007, 25.45860219300006],
+ [88.80582442200011, 25.471676331000097],
+ [88.79311202000014, 25.481959941000085],
+ [88.78096805800004, 25.495189108000105],
+ [88.77233809500012, 25.501958720000047],
+ [88.74195235200006, 25.51275909400006],
+ [88.74257246900004, 25.495189108000105],
+ [88.73265059500011, 25.49100331700005],
+ [88.72314213100003, 25.49141672800006],
+ [88.71415043100006, 25.492811992000057],
+ [88.70619226100013, 25.49167511000003],
+ [88.69565026900005, 25.48361358600006],
+ [88.68707198100003, 25.47389841700003],
+ [88.67808028100006, 25.465888570000047],
+ [88.66634973200013, 25.46289133800012],
+ [88.64542077600004, 25.46733551000004],
+ [88.61317468300007, 25.486404114000024],
+ [88.59358931500003, 25.495085755000062],
+ [88.55095625800004, 25.49648101800004],
+ [88.53028568600013, 25.500201721000067],
+ [88.52046716400008, 25.50929677400002],
+ [88.51276737500007, 25.523714498000047],
+ [88.48558557100012, 25.542628072000085],
+ [88.47540531400011, 25.56257517600001],
+ [88.43778487200012, 25.579835104],
+ [88.42378055900008, 25.592237447000073],
+ [88.41943973800011, 25.653784078000072],
+ [88.39298140400012, 25.680759176000024],
+ [88.32027266500006, 25.725252584000103],
+ [88.25991459200009, 25.789021301000034],
+ [88.22746179300003, 25.80426584900006],
+ [88.18271000200008, 25.792431946000065],
+ [88.16622522000011, 25.78364695300006],
+ [88.14643314600005, 25.77574045800013],
+ [88.12772627800007, 25.77491363500009],
+ [88.11491052200006, 25.787264303000043],
+ [88.1080375570001, 25.806281230000124],
+ [88.10333500200005, 25.814807841000047],
+ [88.08757369000006, 25.830982564000024],
+ [88.08757369000006, 25.839974264000077],
+ [88.08896895400005, 25.84865590400004],
+ [88.08204431200005, 25.86384877600007],
+ [88.07439620000008, 25.90813547800009],
+ [88.07739343300005, 25.91278635700006],
+ [88.08266442900003, 25.9159386190001],
+ [88.08803877800005, 25.923224996],
+ [88.10653894000012, 25.97996571900002],
+ [88.12586592600007, 26.013400371],
+ [88.1510323490001, 26.031332093000074],
+ [88.15790531400006, 26.050452373000056],
+ [88.15640669800007, 26.061407776000053],
+ [88.15098067200006, 26.066988830000057],
+ [88.14477950000008, 26.0705028280001],
+ [88.14116215000013, 26.075463766000055],
+ [88.13992191600005, 26.085333964000043],
+ [88.14136885600004, 26.090501607000036],
+ [88.14446944200012, 26.095875957000104],
+ [88.15563155100006, 26.128483785000057],
+ [88.16379642800007, 26.140472717000122],
+ [88.19692102100004, 26.159644674000035],
+ [88.20565433800004, 26.16641428700008],
+ [88.21195886300006, 26.173752340000064],
+ [88.21888350500012, 26.180160217000022],
+ [88.22978723200009, 26.18403595000005],
+ [88.25030277600007, 26.18801503500005],
+ [88.30869714400012, 26.206101787000065],
+ [88.32626713100012, 26.215920309000026],
+ [88.33453536000013, 26.23080312100008],
+ [88.33293339100004, 26.267235006000064],
+ [88.33660241700011, 26.281807760000035],
+ [88.35169193600012, 26.300979717000033],
+ [88.36678145400003, 26.31343373600002],
+ [88.41380700700006, 26.340202129000076],
+ [88.42119673700012, 26.348728740000112],
+ [88.4260026450001, 26.35792714500009],
+ [88.43168705300013, 26.362216289000074],
+ [88.44202233900006, 26.356118470000112],
+ [88.44863692200005, 26.353431295000078],
+ [88.4579903560001, 26.353017883000078],
+ [88.46791223200006, 26.35405141200006],
+ [88.47540531400011, 26.35580841100004],
+ [88.49762618100004, 26.352707825],
+ [88.49545577000009, 26.378080953000094],
+ [88.47540531400011, 26.432031148000036],
+ [88.46114261900004, 26.453890280000067],
+ [88.43458093200013, 26.465155741000032],
+ [88.37691003500004, 26.475335999000023],
+ [88.35355228700013, 26.484586080000028],
+ [88.34652429200008, 26.484017639000072],
+ [88.34301029400007, 26.477196351000103],
+ [88.34021976700006, 26.454148662000065],
+ [88.33562056500006, 26.44820587200003],
+ [88.32254642700008, 26.451771546000103],
+ [88.31510502100008, 26.465052389],
+ [88.31386478700006, 26.481537170000095],
+ [88.31934248900012, 26.494921367000032],
+ [88.33236495000006, 26.514661764],
+ [88.35282881700005, 26.578688864000085],
+ [88.36027022300004, 26.59310658800011],
+ [88.37251753700008, 26.611606751000025],
+ [88.38528161700003, 26.623544007000064],
+ [88.39437666800012, 26.61801462800007],
+ [88.39592696100004, 26.599566142000057],
+ [88.39499678600009, 26.578378805000014],
+ [88.39789066600008, 26.558690084000048],
+ [88.41101648000011, 26.545099182000072],
+ [88.44646651200009, 26.53553904300007],
+ [88.46238285300007, 26.528821106000052],
+ [88.47540531400011, 26.514971823000067],
+ [88.48791101100011, 26.50577341800009],
+ [88.49865970900004, 26.4948696900001],
+ [88.50682458500006, 26.487634989000057],
+ [88.52682336400011, 26.475387676000125],
+ [88.54976770000013, 26.466654358000042],
+ [88.55798425300009, 26.465724182000102],
+ [88.57917159000004, 26.466034241000088],
+ [88.59116052200005, 26.46122833300008],
+ [88.59787845900007, 26.451461487000117],
+ [88.60356286700005, 26.44019602500005],
+ [88.6115210370001, 26.43084259100003],
+ [88.62237308800007, 26.424538066000096],
+ [88.63301843300013, 26.4200938930001],
+ [88.65627282700007, 26.41513295500006],
+ [88.65193200700008, 26.407071432000052],
+ [88.64986495000005, 26.3983897910001],
+ [88.6522420660001, 26.39151682600003],
+ [88.66107873600009, 26.388881328000124],
+ [88.66852014200009, 26.385729065000064],
+ [88.66743493700011, 26.36815907800009],
+ [88.67337772700012, 26.360717672000064],
+ [88.69627038600004, 26.350279032000046],
+ [88.70970625900009, 26.34061554],
+ [88.71223840300007, 26.328264872000048],
+ [88.70298832200007, 26.309661357],
+ [88.69012089100005, 26.299842835000035],
+ [88.65327559400004, 26.283099671000073],
+ [88.64583418800004, 26.27601999900004],
+ [88.6634041750001, 26.26444447900009],
+ [88.74794681800006, 26.292504782000023],
+ [88.78401696800006, 26.27994740900003],
+ [88.79202681500004, 26.264599508000046],
+ [88.7984863690001, 26.247649638000055],
+ [88.80799483200008, 26.23343861900007],
+ [88.82484134900005, 26.22656565400011],
+ [88.84065433800009, 26.2320433550001],
+ [88.85564050400012, 26.2651162720001],
+ [88.8757943110001, 26.27736358600002],
+ [88.90271773300003, 26.272919414000015],
+ [88.94684940600013, 26.232921855000043],
+ [88.97532312000004, 26.22434356700002],
+ [89.01945479300014, 26.23447214800005],
+ [89.03971195500003, 26.24718455000003],
+ [89.03433760600007, 26.26578806600007],
+ [89.02353723100003, 26.2688369750001],
+ [89.01159997600013, 26.2691987110001],
+ [89.00436527500005, 26.275709941000073],
+ [89.00798262600011, 26.29715566],
+ [88.99862919200007, 26.291522929000067],
+ [88.98968916900009, 26.289404195000074],
+ [88.9817309980001, 26.291832987000063],
+ [88.97532312000004, 26.29994618800005],
+ [88.96602136200005, 26.328471578000105],
+ [88.94121667500008, 26.340098775000072],
+ [88.91243290200009, 26.348935445000066],
+ [88.89186568200006, 26.368779196000062],
+ [88.89124556500013, 26.38578074100006],
+ [88.89946211800003, 26.40448761000006],
+ [88.91196781400004, 26.421230774000023],
+ [88.92457686400007, 26.43213450100008],
+ [88.94100996900005, 26.439420878000064],
+ [88.95015669700012, 26.436940410000076],
+ [88.95930342700012, 26.428568828],
+ [88.97532312000004, 26.417871806000093],
+ [88.98653690600008, 26.4127041630001],
+ [89.00178145400014, 26.397149557000077],
+ [89.01087650500011, 26.390173239000077],
+ [89.02178023300007, 26.38624582900009],
+ [89.04374271700004, 26.381078186000096],
+ [89.05263106300004, 26.374618632000036],
+ [89.05728194200003, 26.362629700000085],
+ [89.05407800300003, 26.353948059000018],
+ [89.05521488500005, 26.347023417000045],
+ [89.07185469600006, 26.34061554],
+ [89.09572920800008, 26.33451772100004],
+ [89.10291223200011, 26.327334696],
+ [89.10353234900009, 26.313692118000077],
+ [89.09479903200014, 26.30950632700005],
+ [89.0803296310001, 26.315604146000013],
+ [89.0688574620001, 26.314260559000033],
+ [89.06942590300014, 26.287388815000057],
+ [89.07588545700008, 26.271059062000106],
+ [89.09588423700012, 26.24103505500004],
+ [89.10337732000005, 26.22517039000003],
+ [89.11169722500011, 26.16450225900006],
+ [89.11919030800004, 26.1466222130001],
+ [89.13159265100012, 26.133754781],
+ [89.19784183700011, 26.107709859000025],
+ [89.21262129800004, 26.098976543000063],
+ [89.22305993600008, 26.086574198000065],
+ [89.22926110800006, 26.067195537000103],
+ [89.23763269000011, 26.058100484000036],
+ [89.27297937100013, 26.043476054000067],
+ [89.29690555800005, 26.0181546030001],
+ [89.31514733900008, 26.006785787000084],
+ [89.33530114700005, 25.998569235000062],
+ [89.35147587100005, 25.996863912000023],
+ [89.3677539470001, 26.005442200000047],
+ [89.37974287900005, 26.015312399000024],
+ [89.39142175300003, 26.015467428000065],
+ [89.40661462500003, 25.995055237000102],
+ [89.4112655030001, 25.993194885000023],
+ [89.41612308700013, 25.992626444000066],
+ [89.42118737800007, 25.993194885000023],
+ [89.42635502100012, 25.994951884000088],
+ [89.42640669700012, 25.995055237000102],
+ [89.48061527500005, 25.999241028000043],
+ [89.4856278900001, 25.998724263000028],
+ [89.49064050300007, 25.997329],
+ [89.49534305900005, 25.995055237000102],
+ [89.50945072500008, 25.97262766500002],
+ [89.51818404200003, 25.96208567400005],
+ [89.52841597500003, 25.957124735000022],
+ [89.54169681900004, 25.959708558],
+ [89.54908654800005, 25.96885528600008],
+ [89.55182539900011, 25.98151601200003],
+ [89.55068851700008, 25.995055237000102],
+ [89.55916345200006, 26.02223704],
+ [89.60288171400009, 26.055258280000075],
+ [89.61135664900007, 26.072208150000066],
+ [89.60386356700013, 26.084662171000062],
+ [89.5907894290001, 26.085023906000046],
+ [89.57694014500004, 26.082646790000112],
+ [89.56701827000012, 26.087090963000023],
+ [89.56691491700008, 26.098976543000063],
+ [89.57787032100009, 26.107244771000083],
+ [89.59254642800005, 26.113962708000102],
+ [89.60422530100004, 26.120732320000073],
+ [89.58577681500003, 26.122902731000053],
+ [89.56939538600005, 26.130085754],
+ [89.56278080300007, 26.142591452000104],
+ [89.57342614800007, 26.16072987900013],
+ [89.57993737800012, 26.166104228000094],
+ [89.58675866700008, 26.169204814000025],
+ [89.59399336800004, 26.16972157800008],
+ [89.6144055580001, 26.164192200000073],
+ [89.61528405800004, 26.169101461000096],
+ [89.60846276900008, 26.180676982000037],
+ [89.60639571100012, 26.2110110470001],
+ [89.61332035300012, 26.219382629000066],
+ [89.63492110200008, 26.22584218300001],
+ [89.65300785400007, 26.222689921000054],
+ [89.65838220200004, 26.207858785000028],
+ [89.6578286080001, 26.18717448300005],
+ [89.65724532100006, 26.165380758000097],
+ [89.65579838100007, 26.161298320000085],
+ [89.65817549700012, 26.159231262000034],
+ [89.6703711340001, 26.15411529600003],
+ [89.67770918800011, 26.153133443000073],
+ [89.69765629100004, 26.154787089000095],
+ [89.70654463700004, 26.154166972000056],
+ [89.7184818930001, 26.14553700800009],
+ [89.72432133000007, 26.130654195000048],
+ [89.72876550300009, 26.114169413000084],
+ [89.73672367300003, 26.100578511],
+ [89.74984948700012, 26.08388702400005],
+ [89.75114139900006, 26.071536357000085],
+ [89.74871260600008, 26.05903066000009],
+ [89.75021122300012, 26.041564026000046],
+ [89.75584395400011, 26.032417297000066],
+ [89.77641117400003, 26.008232727000077],
+ [89.78395593200008, 25.99510691300013],
+ [89.78943363500014, 25.9879755650001],
+ [89.79553145400013, 25.985960185000053],
+ [89.80204268400007, 25.98864736000006],
+ [89.80886397300003, 25.99510691300013],
+ [89.80917403100011, 25.99510691300013],
+ [89.80932906100008, 25.995210266000058],
+ [89.81103438300005, 25.99603708900007],
+ [89.81268802900007, 25.996347148000055],
+ [89.81413496900007, 25.99614044200011],
+ [89.8152718500001, 25.99510691300013],
+ [89.82865604700004, 25.979397278000064],
+ [89.82560713700008, 25.965703024000035],
+ [89.81155114700005, 25.955212708000076],
+ [89.79201745600005, 25.94911488900003],
+ [89.81072432500014, 25.938779603000015],
+ [89.82643396000003, 25.937487691000072],
+ [89.83439213000008, 25.931751608000113],
+ [89.83005131100009, 25.90798044900005],
+ [89.7869531660001, 25.839147441000065],
+ [89.78312911000006, 25.81444610700005],
+ [89.80152592000013, 25.72468414400005],
+ [89.82421187300008, 25.674092916000106],
+ [89.83439213000008, 25.63476715100002],
+ [89.82509037300014, 25.56448720300004],
+ [89.82323002100003, 25.489142965000056],
+ [89.80856794000005, 25.439507112000015],
+ [89.80069909700012, 25.41286855100013],
+ [89.79923403500004, 25.402892809000022],
+ [89.79501469000007, 25.374162903000112],
+ [89.79852868700004, 25.340056458000035],
+ [89.80736535600005, 25.304503073],
+ [89.81904423000009, 25.284969381000067],
+ [89.83459883600011, 25.282437236000092],
+ [89.87020389800011, 25.29556305000007],
+ [89.90813440000011, 25.29690663700002],
+ [90.13008467700013, 25.211588847000044],
+ [90.28692264800003, 25.180066223000082],
+ [90.36464400300014, 25.149990540000104],
+ [90.39978397700008, 25.149008687000034],
+ [90.50137984200012, 25.168800761000014],
+ [90.58333866400005, 25.16203114900007],
+ [90.62343957500008, 25.171436259000032],
+ [90.6375989180001, 25.171074524000048],
+ [90.64896773300012, 25.167818909000047],
+ [90.67056848100009, 25.158775533],
+ [90.70767216000013, 25.15298777300002],
+ [90.71635380000009, 25.153556214000062],
+ [90.72203820800007, 25.15660512300009],
+ [90.73268355400006, 25.16688873300008],
+ [90.73795454900005, 25.16942087900007],
+ [90.75397424300013, 25.167560527000077],
+ [90.76689335100014, 25.16053253200006],
+ [90.77939904800013, 25.151954244000038],
+ [90.7939718020001, 25.14539133700005],
+ [90.82198042800007, 25.142290752000108],
+ [90.93482138600007, 25.156359858000044],
+ [90.9434200450001, 25.15743194600013],
+ [90.97514937400013, 25.167818909000047],
+ [91.13534631400006, 25.191228333000097],
+ [91.19084680200012, 25.189471334000032],
+ [91.20314579300009, 25.191331686000026],
+ [91.22495324700009, 25.201615296000043],
+ [91.23570194500013, 25.201925354000096],
+ [91.28396773300005, 25.178981018000073],
+ [91.43186568300013, 25.137949931000023],
+ [91.47103641800004, 25.133919170000027],
+ [91.4807515870001, 25.135262757000092],
+ [91.50090539600006, 25.14115387],
+ [91.51165409400011, 25.14249745700006],
+ [91.52343632100008, 25.145184632000095],
+ [91.54017948400013, 25.157638652000074],
+ [91.5487577720001, 25.161100973000103],
+ [91.56612105300007, 25.15996409100002],
+ [91.57345910700008, 25.152264302000034],
+ [91.5801770430001, 25.140895488000027],
+ [91.59619673700007, 25.128906555000086],
+ [91.61314660700009, 25.12513417600006],
+ [91.63867476400003, 25.12404897100005],
+ [91.66203251100006, 25.127201233],
+ [91.67226444500005, 25.13650299100003],
+ [91.67743208800005, 25.152626038000037],
+ [91.68890425700005, 25.15298777300002],
+ [91.70182336400006, 25.14714833600003],
+ [91.7107117110001, 25.14466786800007],
+ [91.71773970600009, 25.149835511000063],
+ [91.72373417200004, 25.161927796000057],
+ [91.73014204900005, 25.167457174000063],
+ [91.74533492100011, 25.169369202000055],
+ [91.79370406100003, 25.16533844000007],
+ [91.90057092300009, 25.177585754000106],
+ [91.95627811700012, 25.169782613000066],
+ [91.97508833800003, 25.175363668],
+ [92.00175337700006, 25.18296010400006],
+ [92.03399947100013, 25.181668193000107],
+ [92.06603886000005, 25.174536845000077],
+ [92.09291060400011, 25.164718323],
+ [92.1004553630001, 25.159085592000068],
+ [92.11037723800007, 25.144874573000024],
+ [92.11616499900003, 25.139448548000033],
+ [92.12412316900003, 25.136968079000056],
+ [92.13859257000013, 25.136399638000015],
+ [92.14551721200013, 25.13169708200003],
+ [92.15099491400008, 25.129733379000086],
+ [92.16474084500004, 25.133557434000053],
+ [92.17269901600008, 25.131955465000104],
+ [92.17921024600008, 25.126684469000068],
+ [92.19409305900012, 25.109166159000026],
+ [92.20804569500012, 25.098107401],
+ [92.22013798000012, 25.090381775000097],
+ [92.2336772060001, 25.08495575000005],
+ [92.25155725100012, 25.080795797000107],
+ [92.30354374200004, 25.07428456600003],
+ [92.31212203000007, 25.0686001590001],
+ [92.32814172400003, 25.048007101000096],
+ [92.35625370300005, 25.037000021],
+ [92.38105839100012, 25.02343495700002],
+ [92.38493703500006, 25.004773236000048],
+ [92.38687592400004, 24.9954444560001],
+ [92.38692635100006, 24.99520183],
+ [92.38694950400003, 24.99509043400012],
+ [92.39470096900004, 24.993230082000096],
+ [92.41186000600004, 24.987527227000058],
+ [92.41213950000014, 24.987434336],
+ [92.4122709560001, 24.987390646000037],
+ [92.41246032100014, 24.98436081700008],
+ [92.41247766200007, 24.98408335400002],
+ [92.44444627300004, 24.962427197000082],
+ [92.44451704900007, 24.96237925200002],
+ [92.45376877000012, 24.9582310630001],
+ [92.45402551300003, 24.95811594700008],
+ [92.45782812800007, 24.953557685000035],
+ [92.45805627500005, 24.953284201000045],
+ [92.45002848600006, 24.94663618700004],
+ [92.4497880460001, 24.946437073000098],
+ [92.4742723330001, 24.936715371000062],
+ [92.4743860270001, 24.93667022800004],
+ [92.48379113800013, 24.92822113000004],
+ [92.49126714800008, 24.912424218000055],
+ [92.49133589700006, 24.91227895100012],
+ [92.49453983600006, 24.894863993000072],
+ [92.49154260200004, 24.883727722000046],
+ [92.47769331900008, 24.863909810000067],
+ [92.44203658000009, 24.855409037000058],
+ [92.38074833200005, 24.836702169000077],
+ [92.37092980900007, 24.837916565000015],
+ [92.36359175600006, 24.84101715100006],
+ [92.36350740900014, 24.841120014000026],
+ [92.35935428900012, 24.846184794000052],
+ [92.35932057700006, 24.84642836600004],
+ [92.35832076000014, 24.853652039000096],
+ [92.35814605200005, 24.853748899000024],
+ [92.29041792900011, 24.891298320000104],
+ [92.29024450000003, 24.891351286000045],
+ [92.2521773680001, 24.902977194000087],
+ [92.2230318610001, 24.89137583400013],
+ [92.21765751100003, 24.874580994000084],
+ [92.22175905800003, 24.857046883000052],
+ [92.22179162600014, 24.856907654000068],
+ [92.23492786100007, 24.82499071000008],
+ [92.23502079300005, 24.824764914000028],
+ [92.23688114400005, 24.808590190000032],
+ [92.23646773300004, 24.793035584],
+ [92.23378055900008, 24.777532654000098],
+ [92.18293094900008, 24.647256368000015],
+ [92.1734224860001, 24.60839569200006],
+ [92.16887496000004, 24.574315084000077],
+ [92.16360396300013, 24.55919972800008],
+ [92.1531653240001, 24.54454945900001],
+ [92.14997986200007, 24.54218295400004],
+ [92.13859257000013, 24.533723246000065],
+ [92.12319299300003, 24.525377503000087],
+ [92.11089400300011, 24.514292908000087],
+ [92.10593306500004, 24.495250143000092],
+ [92.11120406100008, 24.43429779100005],
+ [92.10758671100012, 24.40597910600006],
+ [92.08825972500006, 24.38163950700003],
+ [92.06273156800012, 24.37102],
+ [92.03337935400003, 24.368849590000067],
+ [91.9499735920001, 24.37538665800004],
+ [91.94883671100007, 24.363526917000016],
+ [91.97136763500009, 24.329678853000118],
+ [91.97219445900004, 24.316062114000104],
+ [91.95307417800012, 24.322986755],
+ [91.93095666500011, 24.336965231000093],
+ [91.92186161300003, 24.34450999000005],
+ [91.89984745300006, 24.338050435000085],
+ [91.89643680900014, 24.32011871400003],
+ [91.90687544800005, 24.28035369900003],
+ [91.90594527200011, 24.260639140000066],
+ [91.88434452300004, 24.17555389500005],
+ [91.87710982300007, 24.158035584000075],
+ [91.86450077300009, 24.15059417700006],
+ [91.84424361200007, 24.155322571000042],
+ [91.81375451700006, 24.183124492],
+ [91.81137740100013, 24.192038676000024],
+ [91.8097237550001, 24.214543763000037],
+ [91.80703658100003, 24.221132507000036],
+ [91.79659794100013, 24.221597595000063],
+ [91.73293257600011, 24.234284159000097],
+ [91.72301070200012, 24.22097747800008],
+ [91.72580122900007, 24.202063904000042],
+ [91.73200240000006, 24.181677551000107],
+ [91.73262251800003, 24.164314270000077],
+ [91.72115035100012, 24.148992208000024],
+ [91.70368371600006, 24.14294606500009],
+ [91.68415002500006, 24.145478211000082],
+ [91.66616662600006, 24.155916850000025],
+ [91.65717492700003, 24.17136810400011],
+ [91.63950158700004, 24.211701559000076],
+ [91.62906294800007, 24.21531890900006],
+ [91.62451542100007, 24.203459168000037],
+ [91.61376672300014, 24.140103862],
+ [91.60601525900012, 24.11886484800003],
+ [91.59650679500004, 24.104989726000056],
+ [91.58183068900007, 24.096101380000064],
+ [91.55867964700008, 24.089667663000014],
+ [91.51754520700007, 24.085197652000076],
+ [91.48044152900013, 24.088014018000067],
+ [91.40458052600007, 24.103129374000062],
+ [91.36303267500011, 24.099847921000062],
+ [91.35083703600009, 24.074242249000022],
+ [91.34928674300005, 24.036053366000132],
+ [91.3390548100001, 23.995228984000036],
+ [91.32706587800004, 23.987865092000035],
+ [91.31621382700007, 23.989467062000088],
+ [91.30843257700013, 23.992501035000103],
+ [91.30494836400004, 23.993859558000068],
+ [91.29161584500008, 23.994815573000025],
+ [91.27414921100006, 23.988226827000048],
+ [91.26092004400004, 23.97727142400008],
+ [91.25037805200003, 23.96404225700006],
+ [91.21627160700012, 23.90838673900005],
+ [91.21193078600004, 23.89445994100008],
+ [91.2127576090001, 23.880739848000033],
+ [91.22402307100003, 23.857485453000024],
+ [91.22815718600009, 23.844979757000104],
+ [91.2252633060001, 23.82614369800011],
+ [91.20521285000012, 23.77157338500008],
+ [91.19498091600013, 23.755166118000105],
+ [91.17658410700005, 23.746536154000083],
+ [91.15756717900007, 23.744985861000046],
+ [91.14175419100008, 23.73989573200008],
+ [91.13234908000004, 23.720646261000056],
+ [91.13658654800008, 23.698890483000028],
+ [91.15239953700006, 23.691009827000087],
+ [91.16893599500008, 23.685377096000067],
+ [91.1752405200001, 23.67031341600007],
+ [91.1664555260001, 23.654087016000048],
+ [91.15229618400014, 23.655094707000032],
+ [91.13968713400004, 23.65357025100012],
+ [91.13627648900012, 23.629514872000087],
+ [91.14082401500013, 23.61209991500006],
+ [91.16986617000003, 23.561973776000045],
+ [91.17751428300011, 23.544274597000125],
+ [91.1858858650001, 23.511563416000044],
+ [91.19508426900006, 23.495181986000077],
+ [91.20335249900012, 23.487921448000108],
+ [91.22081913300008, 23.47789622000009],
+ [91.22733036300014, 23.4687753300001],
+ [91.22970747900007, 23.461178894000042],
+ [91.23446171100005, 23.436270854000085],
+ [91.24789758300005, 23.393766989000127],
+ [91.2581295170001, 23.37363901800005],
+ [91.27094527200006, 23.3645956430001],
+ [91.28396773300005, 23.36144338000004],
+ [91.28727502500004, 23.35555226700005],
+ [91.28293420400007, 23.34764577300008],
+ [91.27290897700004, 23.338499044000017],
+ [91.26577762900007, 23.329352315000037],
+ [91.26753462700009, 23.321549174],
+ [91.27290897700004, 23.313487651000017],
+ [91.27724979600009, 23.303255717000027],
+ [91.30050419200012, 23.14230946900001],
+ [91.31352665200006, 23.101045838000076],
+ [91.33740116400003, 23.071073507000037],
+ [91.37088749200007, 23.06277944],
+ [91.37460819500006, 23.095723165000052],
+ [91.35590132700008, 23.17964569100006],
+ [91.35569462100011, 23.224139099000027],
+ [91.36096561700003, 23.247522685],
+ [91.37212772600009, 23.261888733000077],
+ [91.39434859200003, 23.2626638790001],
+ [91.41357222500005, 23.248633728000087],
+ [91.42814498000013, 23.229513449000095],
+ [91.43651656100008, 23.214863180000023],
+ [91.43620650200012, 23.215715841000062],
+ [91.43961714700004, 23.22264048200013],
+ [91.43992720500012, 23.223518983000062],
+ [91.44643843600005, 23.215534973],
+ [91.44674849500007, 23.20879119900006],
+ [91.44540490800011, 23.203029277],
+ [91.44643843600005, 23.1978874710001],
+ [91.46121789600011, 23.184425761000043],
+ [91.46359501200004, 23.184115702000057],
+ [91.47041630100011, 23.153290711000082],
+ [91.47506717900006, 23.14308461500012],
+ [91.49811486900012, 23.069962464000056],
+ [91.50328251200011, 23.0444084680001],
+ [91.50607303900006, 23.041178691000127],
+ [91.51558150200009, 23.03880157500008],
+ [91.51816532400005, 23.03508087200008],
+ [91.51940555800007, 23.005625305000066],
+ [91.52364302600006, 22.995212504000037],
+ [91.53656213400006, 22.981854146],
+ [91.54979130000004, 22.977229106000053],
+ [91.5631238200001, 22.974981181000132],
+ [91.57676639900006, 22.96880584800006],
+ [91.5830709230001, 22.957798767000057],
+ [91.58296757000005, 22.94790273100007],
+ [91.58606815600012, 22.94446624800004],
+ [91.60239790900005, 22.95296702100005],
+ [91.60828902200006, 22.96033091300005],
+ [91.61200972500006, 22.969839376000053],
+ [91.61666060400012, 22.978055929000064],
+ [91.62575565600008, 22.98154408800012],
+ [91.63278365100012, 22.98030385300008],
+ [91.63991499800005, 22.978004253000066],
+ [91.64694299300004, 22.97658315000008],
+ [91.65407434100007, 22.978055929000064],
+ [91.66761356600006, 22.982629293000016],
+ [91.69469201700014, 22.98813283300011],
+ [91.70699100800005, 22.995367534000067],
+ [91.7144324140001, 23.00311899800009],
+ [91.73127893100008, 23.017330018000038],
+ [91.73830692600006, 23.02466807100005],
+ [91.75505009000011, 23.048232524000056],
+ [91.75629032400008, 23.052159933000027],
+ [91.75556685400005, 23.05683665000008],
+ [91.75598026500006, 23.061539206000063],
+ [91.76094120300013, 23.065492453000033],
+ [91.76424849400013, 23.065647481000084],
+ [91.77375695800004, 23.06489817300006],
+ [91.77623742700007, 23.065259909000062],
+ [91.7913269450001, 23.080375265000086],
+ [91.79556441200003, 23.08949615500005],
+ [91.79194706200013, 23.101149190000015],
+ [91.77902795400013, 23.131767476000036],
+ [91.76393843600005, 23.200626323000037],
+ [91.74915897700004, 23.232407329000083],
+ [91.74368127400004, 23.27232737300004],
+ [91.7625948490001, 23.321549174],
+ [91.79163700400005, 23.368342183000024],
+ [91.81768192600003, 23.40092417400008],
+ [91.83380497300004, 23.413894959000103],
+ [91.88909875500013, 23.43593495800009],
+ [91.9051184490001, 23.446631979000088],
+ [91.91814091000003, 23.459938660000105],
+ [91.94077518800009, 23.495181986000077],
+ [91.94232548000008, 23.534430237000052],
+ [91.91597050000007, 23.650159607000077],
+ [91.91442020700003, 23.68832265300007],
+ [91.91648726400007, 23.7098717250001],
+ [91.9226884360001, 23.72297170000006],
+ [91.93664107300009, 23.723540141000043],
+ [91.94914677000008, 23.709768372000084],
+ [91.96165246600009, 23.691139018000015],
+ [92.00351037700005, 23.647420757000035],
+ [92.01901330600003, 23.640056865000034],
+ [92.04237105300007, 23.64556040500004],
+ [92.05963098100005, 23.659487203000126],
+ [92.09218713400003, 23.701345114],
+ [92.10841353400014, 23.718243307000094],
+ [92.15078820800005, 23.731653341000126],
+ [92.17063195800006, 23.70364471400002],
+ [92.18076053900012, 23.665378317000105],
+ [92.19429976400005, 23.648144226000042],
+ [92.20938928200007, 23.661605937],
+ [92.22210168500004, 23.70777882900005],
+ [92.23874149600005, 23.7168480430001],
+ [92.25930871600013, 23.706486918000095],
+ [92.25973660500011, 23.702640572000078],
+ [92.26168583200007, 23.68511871300008],
+ [92.25000695800003, 23.642614848000036],
+ [92.25279748500009, 23.609309388],
+ [92.29103804500005, 23.49528534000011],
+ [92.29682580600013, 23.446580302000072],
+ [92.30147668500007, 23.431800842000072],
+ [92.30674768100005, 23.423868510000105],
+ [92.31977014200004, 23.412163798000037],
+ [92.32535119700009, 23.403507995000083],
+ [92.32690149000013, 23.39601491300003],
+ [92.32535119700009, 23.382165629000085],
+ [92.32669478400004, 23.375266825],
+ [92.33165572100012, 23.368652243],
+ [92.34488488800008, 23.359117940000104],
+ [92.34860559100008, 23.354105326000038],
+ [92.34953576700013, 23.344958598000076],
+ [92.34674523900009, 23.325295715000024],
+ [92.3470552980001, 23.315425517000037],
+ [92.3522229410001, 23.29883738200003],
+ [92.35687382000003, 23.289122213],
+ [92.35749393700013, 23.278941956000025],
+ [92.35067264900005, 23.26098439500005],
+ [92.3326892500001, 23.226257833000105],
+ [92.32855513500004, 23.211194153000022],
+ [92.3276249590001, 23.171429138000022],
+ [92.3530497650001, 23.02991322800007],
+ [92.3522229410001, 22.96033091300005],
+ [92.35987105300006, 22.92661204000008],
+ [92.37868127500008, 22.900437928000073],
+ [92.4118575440001, 22.887932231],
+ [92.42632694500003, 22.871059876000103],
+ [92.4350085860001, 22.793286846000072],
+ [92.44203658000009, 22.762926941000032],
+ [92.45371545400008, 22.74796661400005],
+ [92.48069055200011, 22.726159159000034],
+ [92.49154260200004, 22.711069641000037],
+ [92.49588342300012, 22.695618388000028],
+ [92.50291141800011, 22.618620504000106],
+ [92.50084436000009, 22.560536194000022],
+ [92.50456506400008, 22.54379303000009],
+ [92.51738081900004, 22.512580465],
+ [92.51893111200008, 22.49537221300004],
+ [92.57701542200004, 22.168673808000065],
+ [92.57556848200005, 22.143300680000053],
+ [92.56419966700008, 22.1383397420001],
+ [92.54931685400004, 22.138494772000072],
+ [92.5373279210001, 22.128624573000067],
+ [92.55996219900004, 22.061341859],
+ [92.57308801300007, 21.995402731000084],
+ [92.57515507000005, 21.98656606100009],
+ [92.57587854000013, 21.977574362000027]
+ ]
+ ]
+ }
+}
diff --git a/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/assets/sample-data/yarlung-flow.json b/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/assets/sample-data/yarlung-flow.json
new file mode 100644
index 0000000..e5923b9
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/assets/sample-data/yarlung-flow.json
@@ -0,0 +1,605 @@
+[
+ [84.144, 29.565],
+ [84.171, 29.577],
+ [84.22500000000001, 29.559],
+ [84.246, 29.541],
+ [84.297, 29.544],
+ [84.321, 29.532],
+ [84.411, 29.544],
+ [84.426, 29.529],
+ [84.45, 29.535],
+ [84.468, 29.523],
+ [84.492, 29.523],
+ [84.531, 29.490000000000002],
+ [84.507, 29.466],
+ [84.501, 29.445],
+ [84.513, 29.385],
+ [84.495, 29.379],
+ [84.483, 29.361],
+ [84.486, 29.34],
+ [84.519, 29.316],
+ [84.51, 29.292],
+ [84.522, 29.286],
+ [84.525, 29.265],
+ [84.57600000000001, 29.253],
+ [84.58800000000001, 29.259],
+ [84.60300000000001, 29.247],
+ [84.615, 29.265],
+ [84.63, 29.268],
+ [84.624, 29.283],
+ [84.651, 29.286],
+ [84.669, 29.259],
+ [84.732, 29.25],
+ [84.741, 29.235],
+ [84.771, 29.25],
+ [84.777, 29.241],
+ [84.843, 29.223],
+ [84.864, 29.232],
+ [84.879, 29.202],
+ [84.9, 29.199],
+ [84.909, 29.181],
+ [84.933, 29.184],
+ [84.96900000000001, 29.163],
+ [85.023, 29.187],
+ [85.071, 29.259],
+ [85.122, 29.274],
+ [85.167, 29.322],
+ [85.185, 29.310000000000002],
+ [85.26, 29.319],
+ [85.284, 29.301000000000002],
+ [85.34400000000001, 29.289],
+ [85.35600000000001, 29.265],
+ [85.413, 29.262],
+ [85.431, 29.271],
+ [85.449, 29.247],
+ [85.464, 29.244],
+ [85.521, 29.25],
+ [85.551, 29.265],
+ [85.611, 29.235],
+ [85.617, 29.193],
+ [85.662, 29.172],
+ [85.686, 29.172],
+ [85.69500000000001, 29.184],
+ [85.71600000000001, 29.172],
+ [85.72800000000001, 29.187],
+ [85.764, 29.181],
+ [85.761, 29.193],
+ [85.776, 29.202],
+ [85.788, 29.196],
+ [85.797, 29.22],
+ [85.809, 29.211000000000002],
+ [85.848, 29.211000000000002],
+ [85.863, 29.193],
+ [85.881, 29.193],
+ [85.917, 29.172],
+ [85.968, 29.175],
+ [86.004, 29.163],
+ [86.09400000000001, 29.175],
+ [86.10000000000001, 29.166],
+ [86.133, 29.172],
+ [86.148, 29.166],
+ [86.193, 29.178],
+ [86.223, 29.202],
+ [86.268, 29.193],
+ [86.295, 29.208000000000002],
+ [86.34, 29.205000000000002],
+ [86.412, 29.217000000000002],
+ [86.427, 29.211000000000002],
+ [86.43, 29.199],
+ [86.47800000000001, 29.196],
+ [86.496, 29.22],
+ [86.514, 29.211000000000002],
+ [86.52, 29.235],
+ [86.529, 29.238],
+ [86.535, 29.217000000000002],
+ [86.559, 29.196],
+ [86.607, 29.202],
+ [86.616, 29.184],
+ [86.658, 29.193],
+ [86.67, 29.205000000000002],
+ [86.682, 29.199],
+ [86.7, 29.208000000000002],
+ [86.736, 29.205000000000002],
+ [86.778, 29.187],
+ [86.805, 29.196],
+ [86.82300000000001, 29.184],
+ [86.84100000000001, 29.19],
+ [86.901, 29.181],
+ [86.949, 29.163],
+ [87.027, 29.172],
+ [87.039, 29.148],
+ [87.063, 29.136],
+ [87.084, 29.142],
+ [87.12, 29.175],
+ [87.162, 29.142],
+ [87.21000000000001, 29.142],
+ [87.237, 29.157],
+ [87.249, 29.136],
+ [87.297, 29.127],
+ [87.303, 29.115000000000002],
+ [87.366, 29.121000000000002],
+ [87.459, 29.097],
+ [87.486, 29.115000000000002],
+ [87.546, 29.109],
+ [87.56700000000001, 29.121000000000002],
+ [87.59400000000001, 29.121000000000002],
+ [87.60600000000001, 29.133],
+ [87.654, 29.139],
+ [87.666, 29.13],
+ [87.684, 29.133],
+ [87.687, 29.157],
+ [87.669, 29.181],
+ [87.675, 29.205000000000002],
+ [87.705, 29.217000000000002],
+ [87.714, 29.235],
+ [87.732, 29.238],
+ [87.732, 29.253],
+ [87.756, 29.283],
+ [87.753, 29.301000000000002],
+ [87.789, 29.304000000000002],
+ [87.795, 29.328],
+ [87.81, 29.337],
+ [87.849, 29.331],
+ [87.87, 29.349],
+ [87.906, 29.343],
+ [87.924, 29.349],
+ [87.97800000000001, 29.388],
+ [87.996, 29.376],
+ [88.014, 29.379],
+ [88.017, 29.37],
+ [88.125, 29.367],
+ [88.137, 29.337],
+ [88.161, 29.331],
+ [88.176, 29.337],
+ [88.188, 29.325],
+ [88.2, 29.328],
+ [88.221, 29.367],
+ [88.245, 29.367],
+ [88.287, 29.349],
+ [88.299, 29.358],
+ [88.365, 29.316],
+ [88.41, 29.322],
+ [88.422, 29.316],
+ [88.443, 29.325],
+ [88.458, 29.349],
+ [88.503, 29.361],
+ [88.536, 29.334],
+ [88.563, 29.328],
+ [88.596, 29.349],
+ [88.629, 29.346],
+ [88.641, 29.334],
+ [88.671, 29.34],
+ [88.71000000000001, 29.331],
+ [88.72800000000001, 29.343],
+ [88.791, 29.337],
+ [88.818, 29.352],
+ [88.86, 29.319],
+ [88.884, 29.334],
+ [88.908, 29.316],
+ [88.923, 29.331],
+ [88.962, 29.328],
+ [88.971, 29.349],
+ [89.007, 29.361],
+ [89.019, 29.352],
+ [89.034, 29.358],
+ [89.08500000000001, 29.322],
+ [89.136, 29.316],
+ [89.16, 29.343],
+ [89.181, 29.337],
+ [89.211, 29.349],
+ [89.235, 29.379],
+ [89.253, 29.373],
+ [89.265, 29.385],
+ [89.289, 29.385],
+ [89.307, 29.376],
+ [89.349, 29.379],
+ [89.397, 29.358],
+ [89.45100000000001, 29.355],
+ [89.46000000000001, 29.334],
+ [89.58, 29.358],
+ [89.595, 29.346],
+ [89.61, 29.355],
+ [89.631, 29.346],
+ [89.661, 29.349],
+ [89.679, 29.364],
+ [89.757, 29.295],
+ [89.787, 29.292],
+ [89.808, 29.310000000000002],
+ [89.85300000000001, 29.322],
+ [89.931, 29.319],
+ [89.985, 29.343],
+ [90.015, 29.337],
+ [90.072, 29.352],
+ [90.156, 29.355],
+ [90.168, 29.346],
+ [90.20100000000001, 29.349],
+ [90.22500000000001, 29.331],
+ [90.273, 29.337],
+ [90.276, 29.328],
+ [90.342, 29.313],
+ [90.378, 29.295],
+ [90.435, 29.241],
+ [90.477, 29.256],
+ [90.492, 29.25],
+ [90.51, 29.256],
+ [90.522, 29.247],
+ [90.54, 29.262],
+ [90.621, 29.277],
+ [90.642, 29.301000000000002],
+ [90.663, 29.298000000000002],
+ [90.681, 29.313],
+ [90.684, 29.328],
+ [90.705, 29.34],
+ [90.729, 29.328],
+ [90.747, 29.337],
+ [90.765, 29.328],
+ [90.768, 29.310000000000002],
+ [90.756, 29.295],
+ [90.771, 29.277],
+ [90.855, 29.283],
+ [90.897, 29.319],
+ [90.933, 29.310000000000002],
+ [90.95100000000001, 29.295],
+ [90.993, 29.322],
+ [91.035, 29.295],
+ [91.065, 29.316],
+ [91.116, 29.325],
+ [91.131, 29.313],
+ [91.173, 29.325],
+ [91.194, 29.286],
+ [91.233, 29.274],
+ [91.296, 29.289],
+ [91.308, 29.277],
+ [91.34700000000001, 29.28],
+ [91.374, 29.292],
+ [91.395, 29.28],
+ [91.449, 29.286],
+ [91.479, 29.268],
+ [91.512, 29.28],
+ [91.533, 29.271],
+ [91.554, 29.289],
+ [91.587, 29.292],
+ [91.602, 29.271],
+ [91.62, 29.265],
+ [91.659, 29.271],
+ [91.674, 29.259],
+ [91.71000000000001, 29.268],
+ [91.74, 29.259],
+ [91.782, 29.274],
+ [91.839, 29.268],
+ [91.869, 29.283],
+ [91.98, 29.262],
+ [92.007, 29.232],
+ [92.07000000000001, 29.289],
+ [92.115, 29.283],
+ [92.154, 29.289],
+ [92.196, 29.244],
+ [92.22, 29.253],
+ [92.235, 29.244],
+ [92.277, 29.244],
+ [92.295, 29.229],
+ [92.319, 29.226],
+ [92.376, 29.226],
+ [92.397, 29.241],
+ [92.406, 29.262],
+ [92.433, 29.25],
+ [92.46600000000001, 29.253],
+ [92.529, 29.172],
+ [92.529, 29.133],
+ [92.553, 29.148],
+ [92.598, 29.145],
+ [92.589, 29.121000000000002],
+ [92.61, 29.097],
+ [92.619, 29.115000000000002],
+ [92.658, 29.121000000000002],
+ [92.685, 29.139],
+ [92.697, 29.127],
+ [92.676, 29.112000000000002],
+ [92.679, 29.103],
+ [92.709, 29.109],
+ [92.739, 29.067],
+ [92.772, 29.091],
+ [92.775, 29.073],
+ [92.796, 29.082],
+ [92.808, 29.061],
+ [92.82000000000001, 29.067],
+ [92.82300000000001, 29.082],
+ [92.82900000000001, 29.076],
+ [92.85300000000001, 29.082],
+ [92.85600000000001, 29.073],
+ [92.88, 29.073],
+ [92.904, 29.058],
+ [92.934, 29.067],
+ [92.952, 29.049],
+ [92.973, 29.061],
+ [92.988, 29.043],
+ [92.997, 29.049],
+ [93.066, 29.043],
+ [93.081, 29.094],
+ [93.117, 29.115000000000002],
+ [93.123, 29.136],
+ [93.138, 29.139],
+ [93.15, 29.127],
+ [93.147, 29.094],
+ [93.165, 29.064],
+ [93.165, 29.043],
+ [93.153, 29.037],
+ [93.153, 29.025000000000002],
+ [93.162, 29.016000000000002],
+ [93.21300000000001, 29.025000000000002],
+ [93.22800000000001, 29.019000000000002],
+ [93.23100000000001, 29.001],
+ [93.261, 28.992],
+ [93.285, 29.001],
+ [93.312, 28.998],
+ [93.315, 29.016000000000002],
+ [93.348, 29.046],
+ [93.375, 29.052],
+ [93.393, 29.094],
+ [93.429, 29.109],
+ [93.447, 29.106],
+ [93.438, 29.13],
+ [93.48, 29.175],
+ [93.492, 29.163],
+ [93.54, 29.178],
+ [93.57000000000001, 29.166],
+ [93.627, 29.172],
+ [93.63, 29.151],
+ [93.645, 29.145],
+ [93.675, 29.151],
+ [93.681, 29.163],
+ [93.699, 29.16],
+ [93.702, 29.142],
+ [93.735, 29.127],
+ [93.75, 29.136],
+ [93.75, 29.148],
+ [93.78, 29.154],
+ [93.789, 29.124000000000002],
+ [93.825, 29.118000000000002],
+ [93.834, 29.124000000000002],
+ [93.831, 29.142],
+ [93.894, 29.13],
+ [93.912, 29.145],
+ [93.903, 29.166],
+ [93.909, 29.178],
+ [93.94500000000001, 29.184],
+ [93.95400000000001, 29.196],
+ [94.017, 29.193],
+ [94.035, 29.205000000000002],
+ [94.176, 29.196],
+ [94.251, 29.262],
+ [94.305, 29.271],
+ [94.302, 29.292],
+ [94.33200000000001, 29.316],
+ [94.35000000000001, 29.316],
+ [94.389, 29.337],
+ [94.401, 29.361],
+ [94.419, 29.37],
+ [94.434, 29.406000000000002],
+ [94.542, 29.448],
+ [94.581, 29.481],
+ [94.656, 29.490000000000002],
+ [94.70700000000001, 29.463],
+ [94.818, 29.493000000000002],
+ [94.875, 29.541],
+ [94.923, 29.61],
+ [94.926, 29.622],
+ [94.887, 29.634],
+ [94.917, 29.67],
+ [94.893, 29.697],
+ [94.905, 29.715],
+ [94.956, 29.757],
+ [95.124, 29.763],
+ [95.124, 29.781000000000002],
+ [95.09100000000001, 29.814],
+ [95.11200000000001, 29.868000000000002],
+ [95.13, 29.88],
+ [95.175, 29.895],
+ [95.196, 29.892],
+ [95.223, 29.868000000000002],
+ [95.286, 29.868000000000002],
+ [95.304, 29.856],
+ [95.307, 29.838],
+ [95.283, 29.82],
+ [95.289, 29.811],
+ [95.385, 29.772000000000002],
+ [95.379, 29.718],
+ [95.397, 29.688000000000002],
+ [95.388, 29.595],
+ [95.403, 29.562],
+ [95.427, 29.538],
+ [95.43900000000001, 29.478],
+ [95.43, 29.451],
+ [95.313, 29.331],
+ [95.256, 29.289],
+ [95.202, 29.28],
+ [95.04, 29.175],
+ [95.001, 29.169],
+ [95.004, 29.139],
+ [94.908, 29.052],
+ [94.902, 29.016000000000002],
+ [94.869, 28.998],
+ [94.839, 28.956],
+ [94.788, 28.935000000000002],
+ [94.773, 28.854],
+ [94.794, 28.824],
+ [94.914, 28.821],
+ [94.923, 28.812],
+ [94.911, 28.794],
+ [94.92, 28.752],
+ [94.977, 28.713],
+ [94.983, 28.674],
+ [94.998, 28.683],
+ [95.031, 28.617],
+ [95.09700000000001, 28.539],
+ [95.10300000000001, 28.506],
+ [95.09100000000001, 28.455000000000002],
+ [95.09700000000001, 28.419],
+ [95.013, 28.326],
+ [94.992, 28.287],
+ [94.992, 28.242],
+ [95.019, 28.215],
+ [95.031, 28.173000000000002],
+ [95.06700000000001, 28.155],
+ [95.145, 28.149],
+ [95.211, 28.179000000000002],
+ [95.277, 28.155],
+ [95.292, 28.116],
+ [95.316, 28.089000000000002],
+ [95.355, 28.071],
+ [95.379, 28.071],
+ [95.385, 28.059],
+ [95.382, 27.951],
+ [95.4, 27.936],
+ [95.412, 27.882],
+ [95.379, 27.843],
+ [95.349, 27.837],
+ [95.325, 27.810000000000002],
+ [95.325, 27.78],
+ [95.298, 27.762],
+ [95.289, 27.717000000000002],
+ [95.253, 27.657],
+ [95.211, 27.666],
+ [95.151, 27.624000000000002],
+ [95.139, 27.63],
+ [95.10300000000001, 27.609],
+ [94.992, 27.6],
+ [94.944, 27.57],
+ [94.917, 27.573],
+ [94.869, 27.504],
+ [94.803, 27.495],
+ [94.803, 27.48],
+ [94.785, 27.471],
+ [94.794, 27.456],
+ [94.767, 27.435000000000002],
+ [94.767, 27.414],
+ [94.73100000000001, 27.402],
+ [94.71900000000001, 27.372],
+ [94.69800000000001, 27.36],
+ [94.69800000000001, 27.333000000000002],
+ [94.683, 27.324],
+ [94.677, 27.294],
+ [94.635, 27.291],
+ [94.629, 27.273],
+ [94.602, 27.255],
+ [94.596, 27.231],
+ [94.584, 27.228],
+ [94.587, 27.177],
+ [94.596, 27.162],
+ [94.584, 27.147000000000002],
+ [94.566, 27.150000000000002],
+ [94.554, 27.102],
+ [94.518, 27.105],
+ [94.449, 27.060000000000002],
+ [94.44, 27.018],
+ [94.407, 26.985],
+ [94.35900000000001, 26.97],
+ [94.287, 26.919],
+ [94.197, 26.925],
+ [94.164, 26.898],
+ [94.146, 26.865000000000002],
+ [94.125, 26.856],
+ [94.113, 26.868000000000002],
+ [94.134, 26.907],
+ [94.113, 26.913],
+ [94.077, 26.886],
+ [93.927, 26.832],
+ [93.864, 26.766000000000002],
+ [93.753, 26.733],
+ [93.657, 26.715],
+ [93.618, 26.724],
+ [93.56700000000001, 26.751],
+ [93.441, 26.769000000000002],
+ [93.411, 26.76],
+ [93.369, 26.718],
+ [93.288, 26.742],
+ [93.249, 26.724],
+ [93.183, 26.673000000000002],
+ [93.12, 26.646],
+ [93.087, 26.655],
+ [93.018, 26.646],
+ [92.898, 26.655],
+ [92.883, 26.652],
+ [92.874, 26.625],
+ [92.83500000000001, 26.607],
+ [92.733, 26.613],
+ [92.676, 26.601],
+ [92.658, 26.592000000000002],
+ [92.616, 26.523],
+ [92.595, 26.517],
+ [92.508, 26.517],
+ [92.43, 26.535],
+ [92.391, 26.532],
+ [92.244, 26.472],
+ [92.229, 26.442],
+ [92.202, 26.454],
+ [92.172, 26.442],
+ [92.124, 26.403000000000002],
+ [92.06700000000001, 26.373],
+ [92.07000000000001, 26.325],
+ [92.058, 26.304000000000002],
+ [91.971, 26.271],
+ [91.932, 26.271],
+ [91.899, 26.241],
+ [91.878, 26.235],
+ [91.854, 26.241],
+ [91.665, 26.166],
+ [91.608, 26.172],
+ [91.542, 26.145],
+ [91.497, 26.139],
+ [91.377, 26.172],
+ [91.287, 26.166],
+ [91.197, 26.202],
+ [91.134, 26.214000000000002],
+ [91.062, 26.187],
+ [90.96300000000001, 26.175],
+ [90.888, 26.136],
+ [90.849, 26.13],
+ [90.807, 26.154],
+ [90.741, 26.163],
+ [90.681, 26.19],
+ [90.58200000000001, 26.205000000000002],
+ [90.507, 26.229],
+ [90.474, 26.226],
+ [90.435, 26.178],
+ [90.402, 26.16],
+ [90.345, 26.148],
+ [90.309, 26.124],
+ [90.22500000000001, 26.106],
+ [90.177, 26.076],
+ [89.955, 26.01],
+ [89.904, 25.941],
+ [89.84700000000001, 25.89],
+ [89.81400000000001, 25.815],
+ [89.736, 25.692],
+ [89.724, 25.632],
+ [89.697, 25.572],
+ [89.709, 25.482],
+ [89.697, 25.398],
+ [89.67, 25.323],
+ [89.7, 25.266000000000002],
+ [89.703, 25.242],
+ [89.685, 25.2],
+ [89.661, 25.173000000000002],
+ [89.625, 25.074],
+ [89.613, 24.96],
+ [89.613, 24.936],
+ [89.658, 24.87],
+ [89.673, 24.792],
+ [89.706, 24.75],
+ [89.769, 24.549],
+ [89.748, 24.372],
+ [89.754, 24.282],
+ [89.733, 24.225],
+ [89.742, 24.201],
+ [89.739, 24.123],
+ [89.697, 24.015],
+ [89.7, 23.958000000000002],
+ [89.727, 23.883],
+ [89.787, 23.796],
+ [89.85600000000001, 23.748],
+ [89.919, 23.664],
+ [89.985, 23.643],
+ [90.144, 23.544],
+ [90.249, 23.463]
+]
diff --git a/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/assets/tokens.ts b/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/assets/tokens.ts
new file mode 100644
index 0000000..31505e3
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/assets/tokens.ts
@@ -0,0 +1,34 @@
+// Example tokens only. Replace every visual value with production-local tokens.
+export const COLORS = {
+ bg: '#101315',
+ // Electric water — a near-white icy core with a blue glow and a white-hot draw-head (the "electricity"
+ // travels along the river as it draws on). No dark casing.
+ river: '#E8F7FF', // bright icy core
+ riverGlow: 'rgba(73,198,255,0.5)', // electric-blue glow
+ riverHead: '#FFFFFF', // white-hot leading head
+ riverHeadGlow: 'rgba(120,225,255,0.95)',
+ border: '#f5f2ed', // neutral cream country borders/labels over the colored fills
+ cream: '#f5f0eb',
+} as const;
+
+// Example progressive fill tokens. Rename these keys and replace values for each production.
+export const COUNTRY = {
+ china: '#D4A853',
+ india: '#5B8A8A',
+ bangladesh: '#C07B57',
+} as const;
+// Darker shade of each country colour — the settled border line (the bright COUNTRY colour is the
+// glowing draw-head that leads the animation).
+export const COUNTRY_DARK = {
+ china: '#9A7530',
+ india: '#3C5C5C',
+ bangladesh: '#855239',
+} as const;
+export const FILL_OPACITY = 0.5;
+
+export const VIDEO = {width: 1920, height: 1080, fps: 30} as const;
+
+// Beat durations (seconds → frames at VIDEO.fps)
+export const DUR = {
+ mapExplainer: 12 * VIDEO.fps,
+} as const;
diff --git a/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/references/map-data-sources.md b/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/references/map-data-sources.md
new file mode 100644
index 0000000..d93a8c2
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/references/map-data-sources.md
@@ -0,0 +1,91 @@
+# Map element data sources
+
+Choose the source independently for every story element. A single map can—and often should—mix
+provider vectors with custom geodata.
+
+## Decision rule
+
+Use a MapTiler Planet vector layer when the feature already exists there, its attributes support an
+editorially precise filter, and provider geometry is acceptable for the claim. Use custom GeoJSON when
+the feature is absent, proposed, historical, disputed, corrected, privately sourced, or needs ordered
+geometry for a deterministic draw.
+
+| Requirement | MapTiler vector layer | Custom GeoJSON |
+| --------------------------------------------------------------------------- | --------------------- | ------------------------------------------- |
+| Roads, waterways, water, boundaries, land cover, or other standard context | Prefer | Use only when provider data is insufficient |
+| Basemap-consistent geometry without a duplicate local dataset | Prefer | No |
+| Proposed, historical, classified, corrected, or production-specific element | No | Prefer |
+| Fade, colour, width, radius, blur, or fill-opacity animation | Yes | Yes |
+| Feature-state highlight when a stable feature ID exists | Yes | Yes |
+| Deterministic source-to-end line draw or perimeter draw | Bake first | Prefer |
+| Geometry editing, morphing, clipping, or exact sequencing | No | Prefer |
+
+Provider alignment is not proof of correctness. Inspect the attributes and geometry against the
+editorial source before presenting a provider feature as evidence.
+
+## MapTiler vector mode
+
+MapTiler Planet is a vector tile source. Add it once, then build story layers with a
+`source-layer` and an exact attribute filter. Read the current MapTiler Planet schema before choosing
+layer names or fields.
+
+Common layer categories include `waterway`, `water`, `transportation`, `boundary`, `landcover`, and
+`poi`; availability, fields, and zoom ranges vary by schema version.
+
+```ts
+import {addMapTilerVectorElement, setVectorElementPaint} from "./MapTilerVectorElement";
+
+addMapTilerVectorElement(map, process.env.REMOTION_MAPTILER_KEY!, {
+ id: "story-river",
+ sourceLayer: "waterway",
+ type: "line",
+ filter: [
+ "all",
+ ["==", ["get", "class"], "river"],
+ ["==", ["coalesce", ["get", "name_en"], ["get", "name"]], "Yarlung Tsangpo"],
+ ],
+ layout: {"line-cap": "round", "line-join": "round"},
+ paint: {
+ "line-color": "#E8F7FF",
+ "line-width": 3,
+ "line-opacity": 0,
+ },
+});
+
+setVectorElementPaint(map, "story-river", {
+ "line-opacity": reveal,
+ "line-width": 2 + reveal * 2,
+});
+```
+
+Animate provider features by changing paint properties from the Remotion frame: opacity, colour,
+width, blur, fill opacity, circle radius, or symbol opacity. Use feature state only when the source
+provides stable IDs and the selection remains deterministic across tiles.
+
+Do not treat a tiled line as one ordered path. Vector tiles split features at tile boundaries, so a
+source-to-mouth or start-to-end draw has no reliable global order. If that motion carries meaning,
+extract and verify the complete feature, order it once, save it as GeoJSON, and use the custom mode.
+
+## Custom geodata mode
+
+Use the bundled `../assets/RiverReveal.tsx` and `../scripts/prep-geo.mjs` pattern for custom GeoJSON. This mode owns
+the exact geometry and can slice it by distance, calculate entry triggers, draw complete borders, and
+produce deterministic sequences.
+
+Custom mode is mandatory when:
+
+- the feature is not in the provider dataset;
+- the story uses a proposed route, planned tunnel, historical boundary, disputed interpretation, or
+ non-public dataset;
+- provider geometry was editorially corrected;
+- motion must travel through the geometry in a verified order;
+- a complete off-screen boundary matters and a viewport query would silently crop it.
+
+## Hybrid mode
+
+Use provider vectors for ordinary contextual features and custom GeoJSON for the specific claim. For
+example: MapTiler waterways and roads as aligned context; a custom proposed tunnel, dam site, disputed
+boundary, or verified evacuation area as the highlighted evidence.
+
+Keep provider and custom layers visually distinct when they carry different evidentiary weight. Record
+the source and effective date of every custom layer in the production notes.
diff --git a/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/references/map-explainer-architecture.md b/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/references/map-explainer-architecture.md
new file mode 100644
index 0000000..77e98aa
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/references/map-explainer-architecture.md
@@ -0,0 +1,129 @@
+# Map Explainer — architecture reference
+
+Deep detail behind `TECHNIQUE.md`: the timing model, the river reveal + electric head, the per-country
+sequence, and label projection. The supplied values are examples, not a production style system.
+The custom-geometry example is `../assets/RiverReveal.tsx` +
+`../assets/CountryLabel.tsx` +
+`../assets/tokens.ts`. Provider-vector setup is in
+`../assets/MapTilerVectorElement.ts`; choose between
+the two modes with `data-sources.md`.
+
+## 1. The render harness (per frame)
+
+Init the MapTiler map once (ref guard). On `load`: strip clutter (see `geo-prep.md`), add sources/layers,
+wait for `once('idle') → continueRender`. Per frame:
+
+```
+delayRender → setData/setPaintProperty → map.once('idle', continueRender) → triggerRepaint
+```
+
+`preserveDrawingBuffer:true` so Remotion's screenshot captures the canvas. Render `--gl=angle`.
+For an animated camera, read `render-stability.md`: the MapTiler renderer remains static and a CSS plate
+transform supplies the camera choreography.
+
+## 2. Timing model — time-based; beat length derived from the sequences
+
+Everything keys off **seconds** (`t = frame / fps`), not reveal-units. The river draws over a window;
+each country **triggers when the river reaches it** and runs a fixed sequence. The beat is exactly as
+long as the sequences need.
+
+```ts
+const RIVER_START = 0.3, RIVER_END = 8.0; // river draws over this window
+const BORDER_S = 2.5, FILL_S = 1.0, LABEL_S = 0.7; // per-country sequence (constant durations)
+const trigger = (c) => RIVER_START + META[c].stop * (RIVER_END - RIVER_START); // river-arrival time
+// beat length = max over c of (trigger(c) + BORDER_S + FILL_S + LABEL_S) + tail
+const reveal = interpolate(t, [RIVER_START, RIVER_END], [0,1], { ...clamp, easing: Easing.bezier(0.645, 0.045, 0.355, 1) });
+```
+
+**Constant durations matter:** drive the border draw by _time since trigger_, not a slice of the reveal —
+otherwise complex or long borders flash by in a fraction of a second.
+
+## 3. Provider-vector animation
+
+MapTiler Planet elements can be animated directly in place. Filter an exact `source-layer` feature,
+initialize its paint in the hidden or neutral state, then update paint properties from the Remotion frame.
+This works for line, fill, circle, and symbol layers without copying provider geometry into the project.
+
+Do not assume tiled geometry has a global order. Provider features are split at tile boundaries: opacity,
+colour, width, blur, radius, fill, and feature-state changes are reliable; semantic start-to-end line
+draws are not. Bake ordered GeoJSON when the direction of the draw carries meaning.
+
+## 4. Custom line animation — reveal + electric draw-head
+
+The "electricity" is a **white-hot head** leading the draw — the last few % of the drawn line in its own
+bright + glow layers, faded out once the river completes.
+
+```ts
+const riverDrawnKm = lineKm * reveal;
+map.getSource("river").setData(turf.lineSliceAlong(line, 0, Math.max(0.001, riverDrawnKm)));
+const headKm = lineKm * 0.03;
+map.getSource("river-head").setData(turf.lineSliceAlong(line, Math.max(0, riverDrawnKm - headKm), Math.max(0.001, riverDrawnKm)));
+let headFade = 0;
+if (reveal > 0.002 && reveal < 0.999) headFade = 1;
+else if (reveal >= 0.999) headFade = 1 - clamp01((t - RIVER_END) / 0.5); // fade out at the mouth
+map.setPaintProperty("river-headglow", "line-opacity", 0.85 * headFade);
+map.setPaintProperty("river-head", "line-opacity", headFade);
+```
+
+Layers, bottom→top: `river-glow` (electric blue `#49C6FF`, w11, op0.32, blur6) → `river-line`
+(icy core `#E8F7FF`, w3) → `river-headglow` (`rgba(120,225,255,.95)`, w16, blur9) → `river-head`
+(white `#FFFFFF`, w4.5). **No dark casing** — the bright icy core reads over every fill on its own.
+
+## 5. Country animation — border draws → fill blooms → label rises
+
+Triggered by river arrival, each country runs three sequential phases. The border is a **darker shade**
+of the country colour (the electricity is on the river, not here).
+
+```ts
+const lt = t - trigger(c); // local seconds since trigger
+// 1) complete source border draws on over a constant BORDER_S, multi-segment-safe
+const bp = interpolate(clamp01(lt / BORDER_S), [0,1], [0,1], { easing: Easing.bezier(0.645, 0.045, 0.355, 1) });
+map.getSource(`trail-${c}`).setData(sliceBorder(DRAW[c], 0, DRAW[c].total * bp)); // COUNTRY_DARK line
+// 2) fill blooms in (opacity overshoots, then settles) after the border completes
+const fp = clamp01((lt - BORDER_S) / FILL_S);
+const fo = interpolate(fp, [0, 0.6, 1], [0, FILL_OPACITY * 1.25, FILL_OPACITY], { ...clamp, easing: Easing.bezier(0.3333333333333333, 1, 0.6666666666666666, 1) });
+map.setPaintProperty(`fill-${c}`, "fill-opacity", fp <= 0 ? 0 : fo);
+// 3) label rises in after the fill
+const lp = clamp01((lt - BORDER_S - FILL_S) / LABEL_S);
+```
+
+`sliceBorder(d, fromKm, toKm)` reveals a portion of a complete (possibly multi-segment) border as a
+MultiLineString, slicing each segment by cumulative length — no joins across gaps and no viewport crop:
+
+```ts
+const sliceBorder = (d, fromKm, toKm) => {
+ const out = [];
+ for (let i = 0; i < d.segLines.length; i++) {
+ const start = d.cum[i], end = start + d.segLen[i];
+ const a = Math.max(fromKm, start), b = Math.min(toKm, end);
+ if (b - a <= 0.0008) continue;
+ out.push(turf.lineSliceAlong(d.segLines[i], a - start, b - start).geometry.coordinates);
+ }
+ return { type:"Feature", properties:{}, geometry:{ type:"MultiLineString", coordinates: out } };
+};
+```
+
+Choose fill, border, and river colours in the production's local token file. The bundled token values are
+examples only; do not carry a source project's palette into another production.
+
+## 6. Labels — HTML overlay, projected each frame
+
+Labels are React, not map symbols (full typography control). `CountryLabel` is an example accent-rule,
+rise-and-fade treatment; select the typeface and final values in the production.
+Positioned by projecting the anchor to screen pixels **every frame**, stored in state:
+
+```ts
+const p = map.project(META[c].anchor); // lngLat → screen px (respects the live camera)
+pos[c] = { x: p.x, y: p.y, reveal: lp };
+setLabels(pos); // re-render the overlay; effect deps exclude `labels`
+```
+
+`CountryLabel` shows the mechanics: uppercase region name, short accent divider, rise/fade entrance,
+and `pointerEvents:none`. Select font, weight, size, spacing, contrast, and colour from the production's
+own type and palette system.
+
+## 7. Camera — fixed map plate for any movement
+
+Read `render-stability.md`. Do not use per-frame `map.jumpTo()` for a moving 2D shot; it can shimmer in
+headless renders even on satellite imagery. Interpolate the intended camera for the CSS plate transform,
+while keeping the MapTiler renderer static.
diff --git a/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/references/map-geo-prep.md b/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/references/map-geo-prep.md
new file mode 100644
index 0000000..0e79a2b
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/references/map-geo-prep.md
@@ -0,0 +1,85 @@
+# Map Explainer — basemap & geo prep
+
+How the basemap is cleaned and how `../scripts/prep-geo.mjs` bakes the per-country data the component reads.
+
+## Basemap styling — strip the clutter
+
+On `load`, remove the basemap's labels and inner admin borders so only your geography reads:
+
+```ts
+for (const l of m.getStyle().layers as any[])
+ if (l.type === "symbol" || /other border/i.test(l.id)) m.removeLayer(l.id);
+```
+
+- `type === "symbol"` → every place/water/road **label** (the "MapTiler labels"). Gone.
+- Inner admin-border layer IDs vary by style. Inspect the loaded style, remove state/province/district
+ layers as needed, and retain only the context borders the production requires.
+- Logo/attribution: `maptilerLogo:false` + `attributionControl:false` aren't always enough — also hide
+ via CSS in the component:
+ ```tsx
+
+ ```
+
+## `../scripts/prep-geo.mjs` → outputs
+
+Reads a routed river GeoJSON + country polygon GeoJSONs; writes:
+
+- **River line** — simplified for a smooth draw. For a braided river, route one source→mouth path through
+ the network first: greedy endpoint-chaining bounces between parallel channels. → `src/geo/river-flow.json`.
+- **`public/geo/borders.geojson`** — each country's polygon tagged `{country: name}` (one source,
+ filtered per country for the fills).
+- **`src/geo/country-meta.json`** — per country `{ stop, anchor, border }`.
+
+### `stop` — when a country lights up
+
+Walk the river points; first point inside a country (`turf.booleanPointInPolygon`) = the arc-length
+fraction where the river **enters** it. Drives the trigger time. The headwaters country = 0.
+
+### `anchor` — label centre via pole of inaccessibility
+
+The most-interior point of the country (clipped to a per-country **story bbox** so a big country
+centres in the relevant region, not its far bulge), then a small operator **nudge**. Pole = grid-sample
+inside the polygon, keep the point with max distance to the boundary. **Centroids get pulled to edges —
+don't use them.**
+
+```js
+const pole = (poly) => {
+ const bb = turf.bbox(poly), edge = turf.polygonToLine(poly), N = 46;
+ let best = null, bestD = -1;
+ for (let i = 0; i <= N; i++) for (let j = 0; j <= N; j++) {
+ const p = turf.point([bb[0]+(bb[2]-bb[0])*i/N, bb[1]+(bb[3]-bb[1])*j/N]);
+ if (!turf.booleanPointInPolygon(p, poly)) continue;
+ const d = turf.pointToLineDistance(p, edge);
+ if (d > bestD) { bestD = d; best = p.geometry.coordinates; }
+ }
+ return best;
+};
+const ANCHOR_BBOX = { china:[82,27,96,32], india:[76,14,99,31], bangladesh:[86,20,93,27] }; // story regions
+const NUDGE = { china:[0,0.6], india:[-1.0,0], bangladesh:[0,-0.6] }; // operator-directed
+```
+
+### `border` — complete source geometry
+
+Preserve every exterior ring from the named country source. Never clip a country or bilateral border to
+the framed bbox and never discard an off-screen segment: the geometry may leave the frame naturally.
+The renderer handles a MultiLineString by cumulative length, so it remains one timed reveal without
+inventing joins across gaps.
+
+## Tuning the geo prep for a new scenario
+
+| Want | Knob |
+| --------------------------------- | -------------------------------------------------------------------- |
+| Which countries | the country list in `prep-geo.mjs` (+ supply their polygon GeoJSONs) |
+| Label centred in the right region | `ANCHOR_BBOX[country]` (the story bbox) |
+| Nudge a label | `NUDGE[country]` (lng, lat offset) |
+| What border is drawn | the complete named source geometry; never the visible extent |
+| When each lights up | derived from `stop` — depends on the river geometry |
diff --git a/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/references/render-stability.md b/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/references/render-stability.md
new file mode 100644
index 0000000..fc40033
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/references/render-stability.md
@@ -0,0 +1,64 @@
+# Moving Map Render Stability
+
+Read this reference before building a moving 2D MapTiler scene or diagnosing a wavering Remotion render.
+
+## Symptom and cause
+
+If basemap detail shimmers or jitters during a pan/zoom, the likely cause is per-frame `map.jumpTo()`.
+Headless MapTiler capture can resample both vector hillshade and satellite imagery differently frame to
+frame. Tile retries, easing changes, and label changes do not solve that renderer effect.
+
+## Required pattern: fixed map plate
+
+For any 2D pan/zoom:
+
+1. Render the MapTiler canvas once at the largest required zoom in an oversized container. Size it from the camera route and keep each dimension below the browser's reliable WebGL render-buffer limit (commonly 4096 px). Do **not** blindly use 3×: a 1920×1080 composition becomes 5760 px wide and Chromium may silently downsample it, causing visible pixelation during the CSS zoom.
+2. Keep the map's camera static.
+3. For each frame, calculate the approved target centre/zoom, then move the canvas with CSS `translate` + `scale`.
+4. Apply the same transform to every projected HTML overlay.
+5. Continue to animate GeoJSON data and paint properties imperatively; only the renderer camera is frozen.
+
+Keep pitch and bearing constant. Use a 3D engine such as Cesium for genuine changing pitch/bearing or a terrain flythrough.
+
+```ts
+const baseZoom = Math.max(start.zoom, end.zoom);
+const map = new maptilersdk.Map({
+ container,
+ style,
+ center: end.center,
+ zoom: baseZoom,
+ pitch: end.pitch ?? 0,
+ bearing: end.bearing ?? 0,
+ interactive: false,
+ fadeDuration: 0,
+ canvasContextAttributes: {preserveDrawingBuffer: true},
+});
+
+// Per Remotion frame. `camera` is the approved centre/zoom interpolation.
+const projected = map.project(camera.center);
+const scale = 2 ** (camera.zoom - baseZoom);
+const plate = {
+ transform: `translate(${width / 2 - projected.x * scale}px, ${height / 2 - projected.y * scale}px) scale(${scale})`,
+ transformOrigin: "0 0",
+};
+
+// Convert label projection with exactly the same plate transform.
+const labelX = labelPoint.x * scale + width / 2 - projected.x * scale;
+const labelY = labelPoint.y * scale + height / 2 - projected.y * scale;
+```
+
+### Plate sizing and sharpness
+
+- Render at the maximum zoom reached by **any** camera waypoint, including intermediate or hold cameras. The CSS scale should never exceed `1`; otherwise the plate is being enlarged.
+- Centre the frozen map on the midpoint of the camera route's geographic extent, not automatically on the final camera. This minimizes required overscan.
+- Keep the largest canvas dimension at or below 4096 px unless the actual render environment has been tested with a larger `MAX_RENDERBUFFER_SIZE`.
+- For 1920×1080, a 3840×2160 plate is a safe default. For 1080×1920, use approximately 2700×3840 when the route needs extra horizontal pan room.
+- If the route cannot fit within that plate at the required zoom, split the shot into two fixed plates with a deliberate editorial transition. Do not trade sharpness for one enormous canvas.
+- Distinguish failure modes: repeating shimmer means the live renderer is moving; steadily soft tiles during a CSS push means the fixed plate is underspecified, internally downsampled, or being scaled above `1`.
+
+## Verification
+
+- Render a short MP4, not only a Studio preview.
+- Inspect static terrain texture and satellite detail while the camera moves.
+- If any underlying map detail wavers, use the fixed map plate. Do not approve it as a minor preview artefact.
+- Render WebGL with `--gl=angle`, `preserveDrawingBuffer:true`, and conservative concurrency (`1`) while validating.
diff --git a/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/scripts/prep-geo.mjs b/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/scripts/prep-geo.mjs
new file mode 100644
index 0000000..af8e19e
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/scripts/prep-geo.mjs
@@ -0,0 +1,202 @@
+// Geo prep for the map-explainer. Bakes the data the component reads:
+// out/river-flow.json -> the river draw-on line (→ copy to your Remotion project's src/geo/)
+// out/country-meta.json -> per-country { stop, anchor, border } (→ src/geo/)
+// out/borders.geojson -> country polygons, each tagged {country} (→ public/geo/ — loaded via staticFile)
+//
+// RUN: node prep-geo.mjs (needs YOUR geodata — see CONFIG; the source polygons are too large to ship,
+// so the skill ships the OUTPUTS in assets/sample-data/ instead.)
+//
+// RIVER INPUT MUST BE ONE CLEAN LINESTRING, source → mouth (features[0].geometry is a LineString). If your
+// OSM river comes as many ways / braided channels, ROUTE it into a single line FIRST — a graph
+// shortest-path from source node to mouth node. Do NOT greedily chain by nearest endpoint: it bounces
+// between parallel channels. (That routing step is a prerequisite, not part of this script.)
+
+import {readFileSync, writeFileSync, mkdirSync} from 'fs';
+import {dirname, resolve} from 'path';
+import {fileURLToPath} from 'url';
+
+if (process.argv.includes('--help')) {
+ console.log(
+ 'Configure COUNTRIES, RIVER, BORDER, label bounds, and output paths in this script, then run: bun scripts/prep-geo.mjs',
+ );
+ process.exit(0);
+}
+
+const turf = await import('@turf/turf');
+
+const __dir = dirname(fileURLToPath(import.meta.url));
+const root = resolve(__dir, '..');
+const geo = resolve(root, '../geodata'); // ADAPT: where your input GeoJSON lives
+const read = (p) => JSON.parse(readFileSync(p, 'utf8'));
+
+// ===== CONFIG — edit for your river + countries =====
+const COUNTRIES = ['china', 'india', 'bangladesh']; // ORDERED headwaters → mouth; first = source (stop 0)
+const RIVER = resolve(geo, 'focus-rivers/yarlung-brahmaputra-full-osm.geojson'); // a single clean source→mouth LineString
+const BORDER = (name) => resolve(geo, `project-borders/${name}.geojson`); // one polygon file per country, named .geojson
+const FRAME_BBOX = [76, 14, 104, 33.5]; // [W,S,E,N] visible extent — fallback for label anchoring only
+const ANCHOR_BBOX = {
+ china: [82, 27, 96, 32],
+ india: [76, 14, 99, 31],
+ bangladesh: [86, 20, 93, 27],
+}; // [W,S,E,N] per-country label "story region"
+const NUDGE = {china: [0, 0.6], india: [-1.0, 0], bangladesh: [0, -0.6]}; // [lng,lat] label nudge
+const RIVER_SIMPLIFY_TOL = 0.006; // degrees — smooths the draw-on (bigger = simpler)
+const OUT_RIVER = resolve(root, 'out/river-flow.json');
+const OUT_META = resolve(root, 'out/country-meta.json');
+const OUT_BORDERS = resolve(root, 'out/borders.geojson');
+// =====================================================
+
+const havKm = (a, b) => {
+ const R = 6371,
+ r = Math.PI / 180;
+ const dLat = (b[1] - a[1]) * r,
+ dLng = (b[0] - a[0]) * r;
+ const h =
+ Math.sin(dLat / 2) ** 2 +
+ Math.cos(a[1] * r) * Math.cos(b[1] * r) * Math.sin(dLng / 2) ** 2;
+ return 2 * R * Math.asin(Math.sqrt(h));
+};
+
+// --- River draw-on line: take the clean routed LineString, strip a dangling final hop, simplify so the
+// wide-zoom draw-on reads as one smooth thread (no bezier — meander overshoot on a long river). ---
+const routed = read(RIVER).features[0].geometry.coordinates;
+let end = routed.length;
+while (end > 2 && havKm(routed[end - 2], routed[end - 1]) > 15) end--; // drop a final cross-braid jump if present
+const flow = turf.simplify(turf.lineString(routed.slice(0, end)), {
+ tolerance: RIVER_SIMPLIFY_TOL,
+ highQuality: true,
+}).geometry.coordinates;
+
+// --- Borders + country fills (one source, filtered per country in the component) ---
+const borders = {type: 'FeatureCollection', features: []};
+const polys = {};
+for (const name of COUNTRIES) {
+ const fc = read(BORDER(name));
+ polys[name] = fc;
+ for (const f of fc.features) {
+ f.properties = {...(f.properties || {}), country: name};
+ borders.features.push(f);
+ }
+}
+
+// --- Reveal stops: arc-length fraction of `flow` where the river first ENTERS each country. The first
+// country (headwaters) is the source, so its stop is 0; the rest are computed. ---
+const flowKm = turf.length(turf.lineString(flow));
+const insideCountry = (pt, name) =>
+ polys[name].features.some((f) => turf.booleanPointInPolygon(pt, f));
+const stops = {};
+COUNTRIES.forEach((c, i) => {
+ stops[c] = i === 0 ? 0 : 1;
+}); // 0 = headwaters; 1 = sentinel until entered
+let acc = 0;
+for (let i = 0; i < flow.length; i++) {
+ if (i > 0) acc += havKm(flow[i - 1], flow[i]);
+ const frac = acc / (flowKm || 1);
+ const pt = turf.point(flow[i]);
+ for (const c of COUNTRIES)
+ if (stops[c] === 1 && insideCountry(pt, c)) stops[c] = frac;
+}
+
+// --- Per-country meta: anchor = pole of inaccessibility of the visible landmass (centred, away from
+// borders/edges) within the country's story region + a NUDGE; border = every exterior ring from the
+// complete named source. Never crop a country or bilateral boundary to the viewport. ---
+const biggestPoly = (geom) => {
+ const rings =
+ geom.type === 'MultiPolygon' ? geom.coordinates : [geom.coordinates];
+ let best = null,
+ bestA = -1;
+ for (const c of rings) {
+ const p = turf.polygon(c);
+ const a = turf.area(p);
+ if (a > bestA) {
+ bestA = a;
+ best = p;
+ }
+ }
+ return best;
+};
+const largestPolygon = (fc) => {
+ let best = null,
+ bestA = -1;
+ for (const f of fc.features) {
+ const p = biggestPoly(f.geometry),
+ a = turf.area(p);
+ if (a > bestA) {
+ bestA = a;
+ best = p;
+ }
+ }
+ return best;
+};
+const completeExteriorSegments = (fc) => {
+ const segments = [];
+ for (const feature of fc.features) {
+ const polygons =
+ feature.geometry.type === 'MultiPolygon'
+ ? feature.geometry.coordinates
+ : [feature.geometry.coordinates];
+ for (const polygon of polygons)
+ if (polygon[0]?.length > 1) segments.push(polygon[0]);
+ }
+ return segments;
+};
+const poleOfInaccessibility = (poly) => {
+ const bb = turf.bbox(poly),
+ boundary = turf.polygonToLine(poly),
+ N = 46;
+ let best = null,
+ bestD = -1;
+ for (let i = 0; i <= N; i++)
+ for (let j = 0; j <= N; j++) {
+ const lng = bb[0] + ((bb[2] - bb[0]) * i) / N,
+ lat = bb[1] + ((bb[3] - bb[1]) * j) / N;
+ const pt = turf.point([lng, lat]);
+ if (!turf.booleanPointInPolygon(pt, poly)) continue;
+ const d = turf.pointToLineDistance(pt, boundary);
+ if (d > bestD) {
+ bestD = d;
+ best = [lng, lat];
+ }
+ }
+ return best;
+};
+const countryMeta = {};
+for (const name of COUNTRIES) {
+ const poly = largestPolygon(polys[name]);
+ const storyRegion = biggestPoly(
+ turf.bboxClip(poly, ANCHOR_BBOX[name] || FRAME_BBOX).geometry,
+ );
+ const pole = poleOfInaccessibility(storyRegion);
+ const segs = completeExteriorSegments(polys[name]);
+ const nudge = NUDGE[name] || [0, 0];
+ countryMeta[name] = {
+ stop: stops[name],
+ anchor: [pole[0] + nudge[0], pole[1] + nudge[1]],
+ border: segs,
+ };
+}
+
+mkdirSync(dirname(OUT_RIVER), {recursive: true});
+writeFileSync(OUT_RIVER, JSON.stringify(flow));
+writeFileSync(OUT_META, JSON.stringify(countryMeta));
+writeFileSync(OUT_BORDERS, JSON.stringify(borders));
+console.log(
+ 'river:',
+ flow.length,
+ 'pts ·',
+ flowKm.toFixed(0),
+ 'km · entry stops',
+ JSON.stringify(stops),
+);
+for (const n of COUNTRIES) {
+ const km = countryMeta[n].border.reduce(
+ (s, seg) => s + turf.length(turf.lineString(seg)),
+ 0,
+ );
+ console.log(
+ ` ${n}: anchor ${countryMeta[n].anchor.map((v) => v.toFixed(2)).join(',')} · border ${km.toFixed(0)} km`,
+ );
+}
+console.log(
+ "\nNext: copy out/river-flow.json + out/country-meta.json → your project's src/geo/ ; out/borders.geojson → public/geo/",
+);
diff --git a/remotion-best-practices/remotion-markup/remotion-maps/techniques/static-map/TECHNIQUE.md b/remotion-best-practices/remotion-markup/remotion-maps/techniques/static-map/TECHNIQUE.md
new file mode 100644
index 0000000..5f23bbc
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/remotion-maps/techniques/static-map/TECHNIQUE.md
@@ -0,0 +1,37 @@
+---
+name: remotion-maps-static
+description: Create a deterministic static locator map in Remotion when neither the camera nor geographic data animates.
+---
+
+# Static map
+
+Use a static image when the map only provides location context. This is the smallest, fastest, and
+most deterministic map technique.
+
+## Build
+
+1. Export or request a map image at the composition's final aspect ratio and at least its rendered
+ pixel dimensions.
+2. Store the image in the Remotion project's `public/` directory.
+3. Render it with `CanvasImage` and `staticFile()`.
+4. Add labels or markers as ordinary Remotion elements if they remain fixed.
+
+```tsx
+import React from 'react';
+import {AbsoluteFill, CanvasImage, staticFile} from 'remotion';
+
+export const StaticMap: React.FC = () => {
+ return (
+ <>
+
+ >
+ );
+};
+```
+
+## Overlays and Interactivity
+
+Follow [Remotion Interactivity](../../../../remotion-interactivity/REFERENCE.md) best practices and [Remotion Markup Best practices](../../../REFERENCE.md) for elements.
diff --git a/remotion-best-practices/remotion-markup/sequencing.md b/remotion-best-practices/remotion-markup/sequencing.md
new file mode 100644
index 0000000..83c7ea0
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/sequencing.md
@@ -0,0 +1,169 @@
+---
+name: sequencing
+description: Sequencing patterns for Remotion - delay, trim, limit duration of items
+metadata:
+ tags: sequence, series, timing, delay, trim
+---
+
+Use `` to delay when an element appears in the timeline.
+
+```tsx
+const Main = () => {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export const Title = () => {
+ const frame = useCurrentFrame();
+
+ return (
+
+ Title
+
+ );
+};
+
+export const Subtitle = () => {
+ const frame = useCurrentFrame();
+
+ return (
+
+ Subtitle
+
+ );
+};
+```
+
+This will by default wrap the component in an absolute fill element.
+If the items should not be wrapped, use the `layout` prop:
+
+```tsx
+
+
+
+```
+
+## Premounting
+
+This loads the component in the timeline before it is actually played.
+Always premount any ``!
+
+```tsx
+
+
+
+```
+
+## Series
+
+Use `` when elements should play one after another without overlap.
+
+```tsx
+import { Series } from "remotion";
+
+
+
+
+
+
+
+
+
+
+
+ ;
+```
+
+Same as with ``, the items will be wrapped in an absolute fill element by default when using ``, unless the `layout` prop is set to `none`.
+
+### Series with overlaps
+
+Use negative offset for overlapping sequences:
+
+```tsx
+
+
+
+
+
+ {/* Starts 15 frames before SceneA ends */}
+
+
+
+```
+
+## Frame References Inside Sequences
+
+Inside a Sequence, `useCurrentFrame()` returns the local frame (starting from 0):
+
+```tsx
+
+
+ {/* Inside MyComponent, useCurrentFrame() returns 0-29, not 60-89 */}
+
+```
+
+## Nested Sequences
+
+Sequences can be nested for complex timing:
+
+```tsx
+
+
+
+
+
+
+
+
+
+```
+
+## Nesting compositions within another
+
+To add a composition within another composition, you can use the `` component with a `width`, `height`, `durationInFrames` prop to specify the size of the composition.
+This will override the values of `useVideoConfig()` when calling inside that component.
+
+```tsx
+
+
+
+
+
+```
diff --git a/remotion-best-practices/remotion-markup/sfx.md b/remotion-best-practices/remotion-markup/sfx.md
new file mode 100644
index 0000000..ba2dd83
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/sfx.md
@@ -0,0 +1,51 @@
+---
+name: sfx
+description: Including sound effects
+metadata:
+ tags: sfx, sound, effect, audio
+---
+
+To include a sound effect, use the `` tag:
+
+```tsx
+import { Audio } from "@remotion/sfx";
+
+ ;
+```
+
+The following sound effects are available:
+
+- `https://remotion.media/whoosh.wav`
+- `https://remotion.media/whip.wav`
+- `https://remotion.media/page-turn.wav`
+- `https://remotion.media/switch.wav`
+- `https://remotion.media/mouse-click.wav`
+- `https://remotion.media/shutter-modern.wav`
+- `https://remotion.media/shutter-old.wav`
+- `https://remotion.media/ding.wav`
+- `https://remotion.media/bruh.wav`
+- `https://remotion.media/vine-boom.wav`
+- `https://remotion.media/windows-xp-error.wav`
+- `https://remotion.media/fah.wav`
+- `https://remotion.media/spongebob-fail.wav`
+- `https://remotion.media/omg-hell-nah.wav`
+- `https://remotion.media/price-is-right-fail.wav`
+- `https://remotion.media/romance-meme.wav`
+- `https://remotion.media/bone-crack.wav`
+- `https://remotion.media/anime-wow.wav`
+- `https://remotion.media/yippee.wav`
+- `https://remotion.media/loading-lag.wav`
+- `https://remotion.media/wilhelm-scream.wav`
+- `https://remotion.media/mac-quack.wav`
+- `https://remotion.media/skedaddle.wav`
+- `https://remotion.media/snapchat-notification.wav`
+- `https://remotion.media/nelly-ahh.wav`
+- `https://remotion.media/sanctuary-guardian-what.wav`
+- `https://remotion.media/minecraft-hurt.wav`
+- `https://remotion.media/oh-my-god-vine.wav`
+- `https://remotion.media/illuminati-confirmed.wav`
+- `https://remotion.media/dramatic-boomer.wav`
+- `https://remotion.media/triggered.wav`
+- `https://remotion.media/record-scratch.wav`
+
+For more sound effects, search the internet. A good resource is https://github.com/kapishdima/soundcn/tree/main/assets.
diff --git a/remotion-best-practices/remotion-markup/silence-detection.md b/remotion-best-practices/remotion-markup/silence-detection.md
new file mode 100644
index 0000000..33d2098
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/silence-detection.md
@@ -0,0 +1,71 @@
+---
+name: silence-detection
+description: Adaptive silence detection for video/audio files using FFmpeg loudnorm and silencedetect
+metadata:
+ tags: silence, detection, trimming, ffmpeg, loudnorm, audio
+---
+
+# Adaptive Silence Detection
+
+Detect silent segments in video or audio files.
+
+Requires FFmpeg — see [ffmpeg.md](./ffmpeg.md) for how to invoke it in Remotion projects.
+
+## Step 1: Measure loudness with `loudnorm`
+
+Use the `loudnorm` filter in JSON mode to get the EBU R128 integrated loudness and gating threshold for each file:
+
+```bash
+npx remotion ffmpeg -i public/video.mov -map 0:a -af loudnorm=print_format=json -f null /dev/null
+```
+
+As output you will get:
+- `input_i`: Integrated loudness (dB) — the overall perceived volume
+- `input_thresh`: EBU R128 gating threshold (dB) — the level below which audio is considered too quiet to count toward loudness measurement
+
+## Step 2: Detect silences using adaptive threshold
+
+Pass the `input_thresh` value from step 1 as the `noise` parameter to `silencedetect`:
+
+```bash
+npx remotion ffmpeg -i public/video.mov -map 0:a -af "silencedetect=noise=${THRESH}dB:d=0.5" -f null /dev/null
+```
+
+Parameters:
+- `noise`: The threshold below which audio is considered silent. Use `input_thresh` from step 1.
+- `d`: Minimum silence duration in seconds. `0.5` is a good default.
+
+## Interpreting the output
+
+The filter outputs pairs of `silence_start` and `silence_end` timestamps:
+
+```
+[silencedetect] silence_start: 0
+[silencedetect] silence_end: 2.241021 | silence_duration: 2.241021
+[silencedetect] silence_start: 38.77425
+[silencedetect] silence_end: 39.619604 | silence_duration: 0.845354
+```
+
+## Identifying leading and trailing silence
+
+- **Leading silence**: Consecutive silence segments starting at or near 0. If the first `silence_start` is > 0.5s, there is no leading silence.
+- **Trailing silence**: The last silence segment that extends to (or near) the end of the file. Compare the last `silence_end` with the file's total duration.
+
+When multiple silences are nearly contiguous at the start or end (gap < 0.2s), treat them as a single leading/trailing silence block.
+
+## Using with Remotion's `` component
+
+Apply the detected trim points using `trimBefore` and `trimAfter` (values are in frames):
+
+```tsx
+import { Video } from "@remotion/media";
+import { staticFile, useVideoConfig } from "remotion";
+
+const { fps } = useVideoConfig();
+
+
+```
diff --git a/remotion-best-practices/remotion-markup/text-highlights.md b/remotion-best-practices/remotion-markup/text-highlights.md
new file mode 100644
index 0000000..a39b42c
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/text-highlights.md
@@ -0,0 +1,56 @@
+---
+name: text-highlights
+description: Animated text highlights and hand-drawn annotations using @remotion/rough-notation.
+metadata:
+ tags: text, highlights, annotations, circles, rough-notation
+---
+
+# Text highlights
+
+Use `@remotion/rough-notation` to draw animated annotations around or behind text. It supports highlights, circles, underlines, strike-throughs, crossed-off text, boxes, and brackets.
+
+Docs: https://www.remotion.dev/docs/text-highlights
+
+Install the package using the same Remotion version as the project:
+
+```bash
+bunx remotion add @remotion/rough-notation
+```
+
+Choose the component that describes the annotation: ``, ``, ``, ``, ``, ``, or ``. The component determines both the annotation style and whether it renders behind or on top of the text.
+
+Drive `progress` from `useCurrentFrame()` so the annotation is deterministic and synchronized with the video:
+
+```tsx
+import {Circle, Highlight} from '@remotion/rough-notation';
+import {interpolate, useCurrentFrame} from 'remotion';
+
+export const TextAnnotations: React.FC = () => {
+ const frame = useCurrentFrame();
+
+ return (
+
+ This is{' '}
+
+ important
+
+ , and this is{' '}
+
+ connected
+
+ .
+
+ );
+};
+```
+
+Keep `progress` inline, hardcoded and use `interpolate` for maximum [Studio interactivity](../remotion-interactivity/REFERENCE.md).
diff --git a/remotion-best-practices/remotion-markup/timing.md b/remotion-best-practices/remotion-markup/timing.md
new file mode 100644
index 0000000..4c224f8
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/timing.md
@@ -0,0 +1,111 @@
+Drive motion with `interpolate()` over an explicit frame range.
+To customize timing, use **`Easing.bezier`** or `Easing.spring`.
+
+A simple linear interpolation is done using the `interpolate` function.
+
+```ts title="Going from 0 to 1 over 0.3 seconds"
+import { interpolate } from "remotion";
+
+const opacity = interpolate(frame, [0, 0.3 * fps], [0, 1]);
+```
+
+By default, the values are not clamped, so the value can go outside the range [0, 1].
+Here is how they can be clamped:
+
+```ts title="Going from 0 to 1 over 0.3 seconds with extrapolation"
+const opacity = interpolate(frame, [0, 0.3 * fps], [0, 1], {
+ extrapolateRight: "clamp",
+ extrapolateLeft: "clamp",
+});
+```
+
+## Studio-editable animation patterns
+
+When an animation should be editable in Remotion Studio, keep the `interpolate()` call directly in the `style` prop and prefer individual CSS transform properties:
+
+```tsx
+// 👍 Inline editable keyframes and transform shorthands
+style={{
+ scale: interpolate(frame, [0, 100], [0, 1]),
+ translate: interpolate(frame, [0, 100], ["0px 0px", "100px 100px"]),
+ rotate: interpolate(frame, [0, 100], ["20deg", "90deg"]),
+}}
+
+// 👎 Hidden values and transform strings become computed in Studio
+const translateY = interpolate(frame, [0, 100], [0, 120]);
+const rotation = interpolate(frame, [0, 100], [0, 20]);
+
+style={{
+ transform: `translateY(${translateY}px) rotate(${rotation}deg)`,
+}}
+```
+
+Use `transform` strings only when individual CSS transform properties do not cover the effect, such as `skew()`, `perspective()`, or order-sensitive multi-transform chains.
+
+## Spring easing
+
+A nice push movement with no bounce:
+
+```ts
+import { interpolate, Easing } from "remotion";
+
+const opacity = interpolate(frame, [0, 0.3 * fps], [0, 1], {
+ easing: Easing.spring({damping: 200}),
+ extrapolateLeft: "clamp",
+ extrapolateRight: "clamp",
+});
+```
+
+## Bézier easing
+
+Pass values like you would to a CSS cubic-bezier function.
+
+```ts
+import { interpolate, Easing } from "remotion";
+
+const opacity = interpolate(frame, [0, 0.3 * fps], [0, 1], {
+ easing: Easing.bezier(0.16, 1, 0.3, 1),
+ extrapolateLeft: "clamp",
+ extrapolateRight: "clamp",
+});
+```
+
+## Animating scale
+
+When animating scale, if the output is linear, the perceived scale would be smaller the larger the scale gets.
+Use this option to compensate:
+
+```ts
+const scale = interpolate(frame, [0, 0.3 * fps], [0, 1], {
+ easing: Easing.bezier(0.16, 1, 0.3, 1),
+ extrapolateLeft: "clamp",
+ extrapolateRight: "clamp",
+ output: 'perceptual-scale' // <- Add this to scale animations
+});
+```
+
+## Multiple keyframes
+
+Add as many keyframes as you want. For multiple easings, pass an array with `n - 1` items:
+
+```ts
+const scale = interpolate(frame, [0, 1 * fps, 9 * fps, 10 * fps], [0, 1, 1, 0], {
+ easing: [Easing.bezier(0.16, 1, 0.3, 1), Easing.linear, Easing.spring({damping: 200})],
+ extrapolateLeft: "clamp",
+ extrapolateRight: "clamp",
+ output: 'perceptual-scale' // <- Add this to scale animations
+});
+```
+
+## Posterization
+
+You can intentionally reduce the frame rate for artistic reason. Use if it makes sense.
+
+```ts
+const scale = interpolate(frame, [0, 1 * fps], [0, 1], {
+ easing: Easing.bezier(0.16, 1, 0.3, 1),
+ extrapolateLeft: "clamp",
+ extrapolateRight: "clamp",
+ posterize: 3 // Only every 3rd frame is sampled
+});
+```
diff --git a/remotion-best-practices/remotion-markup/transitions.md b/remotion-best-practices/remotion-markup/transitions.md
new file mode 100644
index 0000000..a2630d3
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/transitions.md
@@ -0,0 +1,239 @@
+---
+name: transitions
+description: Scene transitions and overlays for Remotion using TransitionSeries.
+metadata:
+ tags: transitions, overlays, fade, slide, wipe, scenes
+---
+
+## TransitionSeries
+
+`` arranges scenes and supports two ways to enhance the cut point between them:
+
+- **Transitions** (``) — crossfade, slide, wipe, etc. between two scenes. Shortens the timeline because both scenes play simultaneously during the transition.
+- **Overlays** (``) — render an effect (e.g. a light leak) on top of the cut point without shortening the timeline.
+
+Children are absolutely positioned.
+
+## Prerequisites
+
+```bash
+npx remotion add @remotion/transitions
+```
+
+## Transition example
+
+```tsx
+import { TransitionSeries, linearTiming } from "@remotion/transitions";
+import { fade } from "@remotion/transitions/fade";
+
+
+
+
+
+
+
+
+
+ ;
+```
+
+## Overlay example
+
+Any React component can be used as an overlay. For a ready-made effect, see the **light-leaks** rule.
+
+```tsx
+import {lightLeak} from '@remotion/effects/light-leak';
+import {TransitionSeries} from '@remotion/transitions';
+import {interpolate, Solid, useCurrentFrame, useVideoConfig} from 'remotion';
+
+const LightLeakOverlay: React.FC = () => {
+ const frame = useCurrentFrame();
+ const {durationInFrames, height, width} = useVideoConfig();
+
+ return (
+
+ );
+};
+
+
+
+
+
+
+
+
+
+
+
+ ;
+```
+
+## Mixing transitions and overlays
+
+Transitions and overlays can coexist in the same ``, but an overlay cannot be adjacent to a transition or another overlay.
+
+```tsx
+import {lightLeak} from '@remotion/effects/light-leak';
+import {TransitionSeries, linearTiming} from '@remotion/transitions';
+import {fade} from '@remotion/transitions/fade';
+import {interpolate, Solid, useCurrentFrame, useVideoConfig} from 'remotion';
+
+const LightLeakOverlay: React.FC = () => {
+ const frame = useCurrentFrame();
+ const {durationInFrames, height, width} = useVideoConfig();
+
+ return (
+
+ );
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ;
+```
+
+## Transition props
+
+`` requires:
+
+- `presentation` — the visual effect (e.g. `fade()`, `slide()`, `wipe()`).
+- `timing` — controls speed and easing (e.g. `linearTiming()`, `springTiming()`).
+
+## Overlay props
+
+`` accepts:
+
+- `durationInFrames` — how long the overlay is visible (positive integer).
+- `offset?` — shifts the overlay relative to the cut point center. Positive = later, negative = earlier. Default: `0`.
+
+## Available transition types
+
+Import transitions from their respective modules:
+
+```tsx
+import { fade } from "@remotion/transitions/fade";
+import { slide } from "@remotion/transitions/slide";
+import { wipe } from "@remotion/transitions/wipe";
+import { flip } from "@remotion/transitions/flip";
+import { clockWipe } from "@remotion/transitions/clock-wipe";
+```
+
+## Slide transition with direction
+
+```tsx
+import { slide } from "@remotion/transitions/slide";
+
+ ;
+```
+
+Directions: `"from-left"`, `"from-right"`, `"from-top"`, `"from-bottom"`
+
+## Timing options
+
+```tsx
+import { linearTiming, springTiming } from "@remotion/transitions";
+
+// Linear timing - constant speed
+linearTiming({ durationInFrames: 20 });
+
+// Spring timing - organic motion
+springTiming({ config: { damping: 200 }, durationInFrames: 25 });
+```
+
+## Duration calculation
+
+Transitions overlap adjacent scenes, so the total composition length is **shorter** than the sum of all sequence durations. Overlays do **not** affect the total duration.
+
+For example, with two 60-frame sequences and a 15-frame transition:
+
+- Without transitions: `60 + 60 = 120` frames
+- With transition: `60 + 60 - 15 = 105` frames
+
+Adding an overlay between two other sequences does not change the total.
+
+### Getting the duration of a transition
+
+Use the `getDurationInFrames()` method on the timing object:
+
+```tsx
+import { linearTiming, springTiming } from "@remotion/transitions";
+
+const linearDuration = linearTiming({
+ durationInFrames: 20,
+}).getDurationInFrames({ fps: 30 });
+// Returns 20
+
+const springDuration = springTiming({
+ config: { damping: 200 },
+}).getDurationInFrames({ fps: 30 });
+// Returns calculated duration based on spring physics
+```
+
+For `springTiming` without an explicit `durationInFrames`, the duration depends on `fps` because it calculates when the spring animation settles.
+
+### Calculating total composition duration
+
+```tsx
+import { linearTiming } from "@remotion/transitions";
+
+const scene1Duration = 60;
+const scene2Duration = 60;
+const scene3Duration = 60;
+
+const timing1 = linearTiming({ durationInFrames: 15 });
+const timing2 = linearTiming({ durationInFrames: 20 });
+
+const transition1Duration = timing1.getDurationInFrames({ fps: 30 });
+const transition2Duration = timing2.getDurationInFrames({ fps: 30 });
+
+const totalDuration =
+ scene1Duration +
+ scene2Duration +
+ scene3Duration -
+ transition1Duration -
+ transition2Duration;
+// 60 + 60 + 60 - 15 - 20 = 145 frames
+```
diff --git a/remotion-best-practices/remotion-markup/video-editing.md b/remotion-best-practices/remotion-markup/video-editing.md
new file mode 100644
index 0000000..a13b70d
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/video-editing.md
@@ -0,0 +1,90 @@
+Remotion can be used for bare-bones video editing in the Studio. Choose the source structure based on the editing behavior you want:
+
+- Use independently positioned clips when moving or resizing one clip should not affect any other clip.
+- Use ripple editing when changing one clip's duration should reposition every clip after it.
+
+Keep every editable clip as its own authored JSX node. Do not generate editable clips with `.map()` or another programmatic loop.
+
+## Independently positioned clips
+
+Place every `` directly in the composition and hardcode its timing props. `from={0}` may be omitted:
+
+```tsx
+
+
+
+
+
+```
+
+- `from` is the clip's absolute start frame in its parent timeline.
+- `durationInFrames` is how many frames the clip remains visible.
+- `trimBefore` is how many source frames are skipped before playback begins.
+- Each `` must be a separate JSX node. Add a descriptive `name` when useful in the Studio timeline.
+- `from`, `durationInFrames`, and `trimBefore` must be hardcoded frame values. Do not compute them.
+- Import `` from `@remotion/media`.
+
+Moving or resizing one of these clips does not reposition later clips. Gaps and overlaps are therefore allowed.
+
+## Ripple editing with `TransitionSeries`
+
+“Ripple editing” is the standard video-editing term for changing one clip and automatically shifting everything after it.
+In Remotion, a `` provides this sequential, cascading timing model while also allowing transitions between clips.
+
+Read [transitions.md](transitions.md) for transition types, timing options, installation instructions, and composition-duration calculation.
+
+Keep the markup like this:
+
+```tsx
+
+
+
+
+
+
+
+
+
+
+
+```
+
+- The `` is the editable clip row in the Studio timeline.
+- Dragging its right edge changes `durationInFrames` and repositions every later sequence.
+- Do not set `from` on ``; the series calculates each start frame.
+- Hardcode all numeric values.
+- Do not programmatically create multiple `` (no `.map`). Each instance must be hard-coded.
+- Import `` from `@remotion/media`. Import `` from `@remotion/transitions`. If needing to install: `npx remotion add @remotion/media @remotion/transitions`
diff --git a/remotion-best-practices/remotion-markup/voiceover.md b/remotion-best-practices/remotion-markup/voiceover.md
new file mode 100644
index 0000000..f4b022c
--- /dev/null
+++ b/remotion-best-practices/remotion-markup/voiceover.md
@@ -0,0 +1,99 @@
+---
+name: voiceover
+description: Adding AI-generated voiceover to Remotion compositions using TTS
+metadata:
+ tags: voiceover, audio, elevenlabs, tts, speech, calculateMetadata, dynamic duration
+---
+
+# Adding AI voiceover to a Remotion composition
+
+Use ElevenLabs TTS to generate speech audio per scene, then use [`calculateMetadata`](./calculate-metadata.md) to dynamically size the composition to match the audio.
+
+## Prerequisites
+
+By default this guide uses **ElevenLabs** as the TTS provider (`ELEVENLABS_API_KEY` environment variable). Users may substitute any TTS service that can produce an audio file.
+
+If the user has not specified a TTS provider, recommend ElevenLabs and ask for their API key.
+
+Ensure the environment variable is available when running the generation script:
+
+```bash
+node --strip-types generate-voiceover.ts
+```
+
+## Generating audio with ElevenLabs
+
+Create a script that reads the config, calls the ElevenLabs API for each scene, and writes MP3 files to the `public/` directory so Remotion can access them via `staticFile()`.
+
+The core API call for a single scene:
+
+```ts title="generate-voiceover.ts"
+const response = await fetch(
+ `https://api.elevenlabs.io/v1/text-to-speech/${voiceId}`,
+ {
+ method: "POST",
+ headers: {
+ "xi-api-key": process.env.ELEVENLABS_API_KEY!,
+ "Content-Type": "application/json",
+ Accept: "audio/mpeg",
+ },
+ body: JSON.stringify({
+ text: "Welcome to the show.",
+ model_id: "eleven_multilingual_v2",
+ voice_settings: {
+ stability: 0.5,
+ similarity_boost: 0.75,
+ style: 0.3,
+ },
+ }),
+ },
+);
+
+const audioBuffer = Buffer.from(await response.arrayBuffer());
+writeFileSync(`public/voiceover/${compositionId}/${scene.id}.mp3`, audioBuffer);
+```
+
+## Dynamic composition duration with calculateMetadata
+
+Use [`calculateMetadata`](./calculate-metadata.md) to measure the [audio durations](../remotion-multimedia/get-audio-duration.md) and set the composition length accordingly.
+
+```tsx
+import { CalculateMetadataFunction, staticFile } from "remotion";
+import { getAudioDuration } from "./get-audio-duration";
+
+const FPS = 30;
+
+const SCENE_AUDIO_FILES = [
+ "voiceover/my-comp/scene-01-intro.mp3",
+ "voiceover/my-comp/scene-02-main.mp3",
+ "voiceover/my-comp/scene-03-outro.mp3",
+];
+
+export const calculateMetadata: CalculateMetadataFunction = async ({
+ props,
+}) => {
+ const durations = await Promise.all(
+ SCENE_AUDIO_FILES.map((file) => getAudioDuration(staticFile(file))),
+ );
+
+ const sceneDurations = durations.map((durationInSeconds) => {
+ return durationInSeconds * FPS;
+ });
+
+ return {
+ durationInFrames: Math.ceil(sceneDurations.reduce((sum, d) => sum + d, 0)),
+ };
+};
+```
+
+The computed `sceneDurations` are passed into the component via a `voiceover` prop so the component knows how long each scene should be.
+
+If the composition uses [``](./transitions.md), subtract the overlap from total duration: [./transitions.md#calculating-total-composition-duration](./transitions.md#calculating-total-composition-duration)
+
+## Rendering audio in the component
+
+See [audio.md](./audio.md) for more information on how to render audio in the component.
+
+## Delaying audio start
+
+See [audio.md#delaying](./audio.md#delaying) for more information on how to delay the audio start.
diff --git a/remotion-best-practices/remotion-multimedia/REFERENCE.md b/remotion-best-practices/remotion-multimedia/REFERENCE.md
new file mode 100644
index 0000000..09ab75f
--- /dev/null
+++ b/remotion-best-practices/remotion-multimedia/REFERENCE.md
@@ -0,0 +1,20 @@
+---
+name: remotion-multimedia
+description: Interacting with Mediabunny
+version: 4.0.526
+---
+
+Mediabunny is a multimedia library for dealing with audio and video in the browser.
+Here is a compact overview of its capabilities: https://mediabunny.dev/llms.txt
+
+## Getting audio duration
+
+See [get-audio-duration.md](get-audio-duration.md) for getting the duration of an audio file in seconds with Mediabunny.
+
+## Getting video dimensions
+
+See [get-video-dimensions.md](get-video-dimensions.md) for getting the width and height of a video file with Mediabunny.
+
+## Getting video duration
+
+See [get-video-duration.md](get-video-duration.md) for getting the duration of a video file in seconds with Mediabunny.
diff --git a/remotion-best-practices/remotion-multimedia/agents/openai.yaml b/remotion-best-practices/remotion-multimedia/agents/openai.yaml
new file mode 100644
index 0000000..fbb5246
--- /dev/null
+++ b/remotion-best-practices/remotion-multimedia/agents/openai.yaml
@@ -0,0 +1,7 @@
+interface:
+ display_name: '/remotion-multimedia'
+ short_description: 'Inspect browser-based audio and video media'
+ icon_small: './assets/remotion-icon.svg'
+ icon_large: './assets/remotion-icon.svg'
+ brand_color: '#0B84F3'
+ default_prompt: '$remotion-multimedia: Make my video the same duration as the footage'
diff --git a/remotion-best-practices/remotion-multimedia/assets/remotion-icon.svg b/remotion-best-practices/remotion-multimedia/assets/remotion-icon.svg
new file mode 100644
index 0000000..420dbc7
--- /dev/null
+++ b/remotion-best-practices/remotion-multimedia/assets/remotion-icon.svg
@@ -0,0 +1,4 @@
+
+Remotion
+
+
diff --git a/remotion-best-practices/remotion-multimedia/get-audio-duration.md b/remotion-best-practices/remotion-multimedia/get-audio-duration.md
new file mode 100644
index 0000000..e2336c7
--- /dev/null
+++ b/remotion-best-practices/remotion-multimedia/get-audio-duration.md
@@ -0,0 +1,56 @@
+---
+name: get-audio-duration
+description: Getting the duration of an audio file in seconds with Mediabunny
+metadata:
+ tags: duration, audio, length, time, seconds, mp3, wav
+---
+
+# Getting audio duration with Mediabunny
+
+Mediabunny can extract the duration of an audio file. It works in browser, Node.js, and Bun environments.
+
+## Getting audio duration
+
+```tsx title="get-audio-duration.ts"
+import { Input, ALL_FORMATS, UrlSource } from "mediabunny";
+
+export const getAudioDuration = async (src: string) => {
+ const input = new Input({
+ formats: ALL_FORMATS,
+ source: new UrlSource(src),
+ });
+
+ const durationInSeconds = await input.computeDuration();
+ return durationInSeconds;
+};
+```
+
+## Usage
+
+```tsx
+const duration = await getAudioDuration("https://remotion.media/audio.mp3");
+console.log(duration); // e.g. 180.5 (seconds)
+```
+
+## Using with staticFile in Remotion
+
+Make sure to wrap the file path in `staticFile()`:
+
+```tsx
+import { staticFile } from "remotion";
+
+const duration = await getAudioDuration(staticFile("audio.mp3"));
+```
+
+## In Node.js and Bun
+
+Use `FileSource` instead of `UrlSource`:
+
+```tsx
+import { Input, ALL_FORMATS, FileSource } from "mediabunny";
+
+const input = new Input({
+ formats: ALL_FORMATS,
+ source: new FileSource(file), // File object from input or drag-drop
+});
+```
diff --git a/remotion-best-practices/remotion-multimedia/get-video-dimensions.md b/remotion-best-practices/remotion-multimedia/get-video-dimensions.md
new file mode 100644
index 0000000..e73014e
--- /dev/null
+++ b/remotion-best-practices/remotion-multimedia/get-video-dimensions.md
@@ -0,0 +1,66 @@
+---
+name: get-video-dimensions
+description: Getting the width and height of a video file with Mediabunny
+metadata:
+ tags: dimensions, width, height, resolution, size, video
+---
+
+# Getting video dimensions with Mediabunny
+
+Mediabunny can extract the width and height of a video file. It works in browser, Node.js, and Bun environments.
+
+## Getting video dimensions
+
+```tsx
+import { Input, ALL_FORMATS, UrlSource } from "mediabunny";
+
+export const getVideoDimensions = async (src: string) => {
+ const input = new Input({
+ formats: ALL_FORMATS,
+ source: new UrlSource(src),
+ });
+
+ const videoTrack = await input.getPrimaryVideoTrack();
+ if (!videoTrack) {
+ throw new Error("No video track found");
+ }
+
+ return {
+ width: videoTrack.displayWidth,
+ height: videoTrack.displayHeight,
+ };
+};
+```
+
+## Usage
+
+```tsx
+const dimensions = await getVideoDimensions("https://remotion.media/video.mp4");
+console.log(dimensions.width); // e.g. 1920
+console.log(dimensions.height); // e.g. 1080
+```
+
+## Using with local files
+
+For local files, use `FileSource` instead of `UrlSource`:
+
+```tsx
+import { Input, ALL_FORMATS, FileSource } from "mediabunny";
+
+const input = new Input({
+ formats: ALL_FORMATS,
+ source: new FileSource(file), // File object from input or drag-drop
+});
+
+const videoTrack = await input.getPrimaryVideoTrack();
+const width = videoTrack.displayWidth;
+const height = videoTrack.displayHeight;
+```
+
+## Using with staticFile in Remotion
+
+```tsx
+import { staticFile } from "remotion";
+
+const dimensions = await getVideoDimensions(staticFile("video.mp4"));
+```
diff --git a/remotion-best-practices/remotion-multimedia/get-video-duration.md b/remotion-best-practices/remotion-multimedia/get-video-duration.md
new file mode 100644
index 0000000..9fd125f
--- /dev/null
+++ b/remotion-best-practices/remotion-multimedia/get-video-duration.md
@@ -0,0 +1,58 @@
+---
+name: get-video-duration
+description: Getting the duration of a video file in seconds with Mediabunny
+metadata:
+ tags: duration, video, length, time, seconds
+---
+
+# Getting video duration with Mediabunny
+
+Mediabunny can extract the duration of a video file. It works in browser, Node.js, and Bun environments.
+
+## Getting video duration
+
+```tsx
+import { Input, ALL_FORMATS, UrlSource } from "mediabunny";
+
+export const getVideoDuration = async (src: string) => {
+ const input = new Input({
+ formats: ALL_FORMATS,
+ source: new UrlSource(src),
+ });
+
+ const durationInSeconds = await input.computeDuration();
+ return durationInSeconds;
+};
+```
+
+## Usage
+
+```tsx
+const duration = await getVideoDuration("https://remotion.media/video.mp4");
+console.log(duration); // e.g. 10.5 (seconds)
+```
+
+## Video files from the public/ directory
+
+Make sure to wrap the file path in `staticFile()`:
+
+```tsx
+import { staticFile } from "remotion";
+
+const duration = await getVideoDuration(staticFile("video.mp4"));
+```
+
+## In Node.js and Bun
+
+Use `FileSource` instead of `UrlSource`:
+
+```tsx
+import { Input, ALL_FORMATS, FileSource } from "mediabunny";
+
+const input = new Input({
+ formats: ALL_FORMATS,
+ source: new FileSource(file), // File object from input or drag-drop
+});
+
+const durationInSeconds = await input.computeDuration();
+```
diff --git a/remotion-best-practices/remotion-render/REFERENCE.md b/remotion-best-practices/remotion-render/REFERENCE.md
new file mode 100644
index 0000000..6e60afb
--- /dev/null
+++ b/remotion-best-practices/remotion-render/REFERENCE.md
@@ -0,0 +1,27 @@
+---
+name: remotion-render
+description: Export a Remotion video
+version: 4.0.526
+---
+
+## General rendering strategy
+
+Render a video using:
+
+```
+npx remotion render
+```
+
+Full list of options: https://www.remotion.dev/docs/cli/render.md
+
+Render a still using:
+
+```
+npx remotion still
+```
+
+Full list of options: https://www.remotion.dev/docs/cli/still.md
+
+## Transparent videos
+
+See [Transparent videos](./transparent-videos.md) for rendering out a video with transparency.
diff --git a/remotion-best-practices/remotion-render/agents/openai.yaml b/remotion-best-practices/remotion-render/agents/openai.yaml
new file mode 100644
index 0000000..da473ab
--- /dev/null
+++ b/remotion-best-practices/remotion-render/agents/openai.yaml
@@ -0,0 +1,7 @@
+interface:
+ display_name: '/remotion-render'
+ short_description: 'Export Remotion videos and stills'
+ icon_small: './assets/remotion-icon.svg'
+ icon_large: './assets/remotion-icon.svg'
+ brand_color: '#0B84F3'
+ default_prompt: '$remotion-render: Render this as transparent ProRes'
diff --git a/remotion-best-practices/remotion-render/assets/remotion-icon.svg b/remotion-best-practices/remotion-render/assets/remotion-icon.svg
new file mode 100644
index 0000000..420dbc7
--- /dev/null
+++ b/remotion-best-practices/remotion-render/assets/remotion-icon.svg
@@ -0,0 +1,4 @@
+
+Remotion
+
+
diff --git a/remotion-best-practices/remotion-render/transparent-videos.md b/remotion-best-practices/remotion-render/transparent-videos.md
new file mode 100644
index 0000000..dce5de5
--- /dev/null
+++ b/remotion-best-practices/remotion-render/transparent-videos.md
@@ -0,0 +1,106 @@
+---
+name: transparent-videos
+description: Rendering transparent videos in Remotion
+metadata:
+ tags: transparent, alpha, codec, vp9, prores, webm
+---
+
+# Rendering Transparent Videos
+
+Remotion can render transparent videos in two ways: as a ProRes video or as a WebM video.
+
+## Transparent ProRes
+
+Ideal for when importing into video editing software.
+
+**CLI:**
+
+```bash
+npx remotion render --image-format=png --pixel-format=yuva444p10le --codec=prores --prores-profile=4444 MyComp out.mov
+```
+
+**Default in Studio** (restart Studio after changing):
+
+```ts
+// remotion.config.ts
+import { Config } from "@remotion/cli/config";
+
+Config.setVideoImageFormat("png");
+Config.setPixelFormat("yuva444p10le");
+Config.setCodec("prores");
+Config.setProResProfile("4444");
+```
+
+**Setting it as the default export settings for a composition** (using `calculateMetadata`):
+
+```tsx
+import { CalculateMetadataFunction } from "remotion";
+
+const calculateMetadata: CalculateMetadataFunction = async ({
+ props,
+}) => {
+ return {
+ defaultCodec: "prores",
+ defaultVideoImageFormat: "png",
+ defaultPixelFormat: "yuva444p10le",
+ defaultProResProfile: "4444",
+ };
+};
+
+ ;
+```
+
+## Transparent WebM (VP9)
+
+Ideal for when playing in a browser.
+
+**CLI:**
+
+```bash
+npx remotion render --image-format=png --pixel-format=yuva420p --codec=vp9 MyComp out.webm
+```
+
+**Default in Studio** (restart Studio after changing):
+
+```ts
+// remotion.config.ts
+import { Config } from "@remotion/cli/config";
+
+Config.setVideoImageFormat("png");
+Config.setPixelFormat("yuva420p");
+Config.setCodec("vp9");
+```
+
+**Setting it as the default export settings for a composition** (using `calculateMetadata`):
+
+```tsx
+import { CalculateMetadataFunction } from "remotion";
+
+const calculateMetadata: CalculateMetadataFunction = async ({
+ props,
+}) => {
+ return {
+ defaultCodec: "vp8",
+ defaultVideoImageFormat: "png",
+ defaultPixelFormat: "yuva420p",
+ };
+};
+
+ ;
+```
diff --git a/remotion-best-practices/remotion-saas/REFERENCE.md b/remotion-best-practices/remotion-saas/REFERENCE.md
new file mode 100644
index 0000000..1a23465
--- /dev/null
+++ b/remotion-best-practices/remotion-saas/REFERENCE.md
@@ -0,0 +1,33 @@
+---
+name: remotion-saas
+description: Build an app with Remotion
+version: 4.0.526
+---
+
+One can build apps with Remotion.
+It is possible to have a simple form and hook it up to a render, or have a complex video editor.
+
+## Choosing a template or a framework
+
+We have several templates for SaaS which can be cloned or used as a reference.
+See [Choosing a framework](framework.md) for help choosing a template or framework.
+
+## The ``
+
+This component allows embedding a Remotion preview in a React app. See [Player](player.md) for more information about the Player.
+
+## Rendering
+
+There are client-side and server-side rendering options available. See [Rendering](rendering.md) for advice on how to choose, and about the Lambda, Vercel, Node.js and Cloudflare options.
+
+## With Vue
+
+See https://www.remotion.dev/docs/vue.md for how to use Remotion with Vue.
+
+## Angular
+
+See https://www.remotion.dev/docs/angular.md for how to use Remotion with Angular.
+
+## Svelte
+
+See https://www.remotion.dev/docs/svelte.md for how to use Remotion with Svelte.
diff --git a/remotion-best-practices/remotion-saas/agents/openai.yaml b/remotion-best-practices/remotion-saas/agents/openai.yaml
new file mode 100644
index 0000000..e9507e5
--- /dev/null
+++ b/remotion-best-practices/remotion-saas/agents/openai.yaml
@@ -0,0 +1,7 @@
+interface:
+ display_name: '/remotion-saas'
+ short_description: 'Build apps that preview and render videos'
+ icon_small: './assets/remotion-icon.svg'
+ icon_large: './assets/remotion-icon.svg'
+ brand_color: '#0B84F3'
+ default_prompt: '$remotion-saas: Turn my video into an app.'
diff --git a/remotion-best-practices/remotion-saas/assets/remotion-icon.svg b/remotion-best-practices/remotion-saas/assets/remotion-icon.svg
new file mode 100644
index 0000000..420dbc7
--- /dev/null
+++ b/remotion-best-practices/remotion-saas/assets/remotion-icon.svg
@@ -0,0 +1,4 @@
+
+Remotion
+
+
diff --git a/remotion-best-practices/remotion-saas/framework.md b/remotion-best-practices/remotion-saas/framework.md
new file mode 100644
index 0000000..afb3b77
--- /dev/null
+++ b/remotion-best-practices/remotion-saas/framework.md
@@ -0,0 +1,21 @@
+---
+name: framework
+description: Choose a framework for a Remotion-based app.
+metadata:
+ tags: remotion, saas, templates, nextjs, react-router, vercel, lambda, cloudflare
+---
+
+Remotion can be used with any React framework.
+
+We offer the following templates:
+
+- Next.js App Router with Tailwind: https://github.com/remotion-dev/template-next-app-dir-tailwind. Uses Lambda as default rendering choice.
+- Next.js App Router without Tailwind: https://www.remotion.dev/templates/next-no-tailwind. Uses Lambda as default rendering choice.
+- Next.js Pages Router: https://github.com/remotion-dev/template-next-pages-dir. Uses Lambda as default rendering choice.
+- Vercel Sandbox rendering: https://github.com/remotion-dev/template-vercel. Uses Vercel as default rendering choice.
+- React Router 7: https://github.com/remotion-dev/template-react-router. Uses Lambda as default rendering choice.
+- Express.js render server: `packages/template-render-server`: https://github.com/remotion-dev/template-render-server. Uses Node.js as default rendering choice.
+
+These can be cloned directly, or used as a reference.
+
+For an existing app, see https://www.remotion.dev/docs/brownfield-installation.md.
diff --git a/remotion-best-practices/remotion-saas/player.md b/remotion-best-practices/remotion-saas/player.md
new file mode 100644
index 0000000..7cc9185
--- /dev/null
+++ b/remotion-best-practices/remotion-saas/player.md
@@ -0,0 +1,33 @@
+---
+name: player
+description: Embed a Remotion preview in a React app with @remotion/player.
+metadata:
+ tags: remotion, player, preview, react
+---
+
+Use `@remotion/player` when the user wants an interactive preview in React.
+
+```tsx
+import {Player} from '@remotion/player';
+import {MyVideo} from './remotion/MyVideo';
+
+export const App: React.FC = () => {
+ return (
+
+ );
+};
+```
+
+If metadata is dynamic, sync the Player props manually or reuse the composition's `calculateMetadata()` logic.
+Link https://www.remotion.dev/docs/dynamic-metadata.md#with-the-player.
+
+Full API for the Player: https://www.remotion.dev/docs/player/player.md.
+
+For a SaaS app that also needs output files, combine the Player preview with [framework.md](framework.md) or [rendering.md](rendering.md).
diff --git a/remotion-best-practices/remotion-saas/rendering.md b/remotion-best-practices/remotion-saas/rendering.md
new file mode 100644
index 0000000..70e0688
--- /dev/null
+++ b/remotion-best-practices/remotion-saas/rendering.md
@@ -0,0 +1,69 @@
+---
+name: rendering
+description: Advice on programmatic rendering with Remotion.
+metadata:
+ tags: remotion, saas, ssr, renderer, node, bun, render-server
+---
+
+This is about rendering videos programmatically with Remotion.
+For one-off renders, `npx remotion render` or the Studio is better suited.
+
+## Comparison of SSR methods
+
+See https://www.remotion.dev/docs/compare-ssr.md for the tradeoffs between server-side rendering options.
+
+## Plain Node.js APIs
+
+Can be used on traditional long-running servers that can spawn a headless browser.
+
+- SSR overview: https://www.remotion.dev/docs/ssr.md
+- Renderer package: https://www.remotion.dev/docs/renderer.md
+- Node SSR: https://www.remotion.dev/docs/ssr-node.md
+
+For a reference server with render, progress, and cancel endpoints, see https://github.com/remotion-dev/template-render-server.
+
+## Remotion Lambda
+
+Render Remotion videos on AWS Lambda. This is the fastest and most scalable way to render Remotion videos.
+
+- Overview: https://www.remotion.dev/docs/lambda.md
+- API: https://www.remotion.dev/docs/lambda/api.md
+
+### Steps to set up Lambda
+
+
+When recommending Lambda, offer the user to guide through the setup flow and keep the docs page open as the canonical checklist: https://www.remotion.dev/docs/lambda/setup.md.
+
+Cover these steps at a high level and link the exact docs page for the detailed AWS console clicks:
+
+1. Confirm the user has an AWS account, a target region, and a Remotion project or SaaS template.
+2. Install `@remotion/lambda` using `npx remotion add @remotion/lambda`.
+3. Create the Lambda role policy, Lambda role, IAM user, user access key, and user policy from the generated Remotion policy commands.
+4. Store credentials in `.env` using `REMOTION_AWS_ACCESS_KEY_ID` and `REMOTION_AWS_SECRET_ACCESS_KEY`; never ask the user to paste secrets into chat.
+5. Run the Lambda policy validator if the user wants to verify permissions before deploying; use the user's package manager or the command shown in the docs (`npx remotion lambda policies validate`).
+6. Deploy the Lambda function. Mention that functions are bound to the Remotion version and must be redeployed after Remotion upgrades.
+7. Deploy the Remotion site with a stable site name. Mention that the site must be redeployed after changing the Remotion source.
+8. Check Lambda quotas using the user's package manager or the command shown in the docs (`npx remotion lambda quotas`); new AWS accounts may need a concurrency limit increase.
+9. Trigger a first render, then wire render and progress endpoints using the chosen SaaS template or Node APIs.
+
+Before production, remind the user to handle rate limiting, authentication, cost controls, output privacy, render cleanup, and progress/error reporting.
+
+## Vercel
+
+Ideal if planning to deploy the app to Vercel.
+
+See https://www.remotion.dev/docs/vercel-sandbox.md for more info.
+
+## GitHub Actions
+
+See https://www.remotion.dev/docs/ssr.md#render-using-github-actions for how to render on GitHub Actions.
+Don't recommend unless asked for.
+
+## Azure Container Apps
+
+See https://www.remotion.dev/docs/azure-container-apps.md if rendering on Azure Container Apps is requested.
+Don't recommend unless asked for.
+
+## Cloudflare Containers
+
+See https://www.remotion.dev/docs/cloudflare-containers.md if rendering on Cloudflare Containers is requested.
diff --git a/remotion-best-practices/remotion-studio/REFERENCE.md b/remotion-best-practices/remotion-studio/REFERENCE.md
new file mode 100644
index 0000000..e3b6749
--- /dev/null
+++ b/remotion-best-practices/remotion-studio/REFERENCE.md
@@ -0,0 +1,24 @@
+---
+name: remotion-studio
+description: Preview a Remotion video
+version: 4.0.526
+---
+
+Execute the following command:
+
+```bash
+npx remotion studio --no-open
+```
+
+If the Studio is already opened, the URL will be printed and the command will exit.
+Otherwise, a long-running process will start, and the URL will be printed.
+
+Open the URL in the browser.
+
+## Useful flags
+
+| Argument | Purpose |
+| ----------------- | --------------------------------------------------------------------------------------------- |
+| `--log=` | Set `error`, `warn`, `info` (default), or `verbose` logging. |
+| `--port=` | Request a Studio server port; otherwise Remotion finds a free port. |
+| `--force-new` | Start another Studio instance even when one is already running for the same project and port. |
diff --git a/remotion-best-practices/remotion-studio/agents/openai.yaml b/remotion-best-practices/remotion-studio/agents/openai.yaml
new file mode 100644
index 0000000..dd0ff18
--- /dev/null
+++ b/remotion-best-practices/remotion-studio/agents/openai.yaml
@@ -0,0 +1,7 @@
+interface:
+ display_name: '/remotion-studio'
+ short_description: 'Preview your video'
+ icon_small: './assets/remotion-icon.svg'
+ icon_large: './assets/remotion-icon.svg'
+ brand_color: '#0B84F3'
+ default_prompt: '$remotion-studio.'
diff --git a/remotion-best-practices/remotion-studio/assets/remotion-icon.svg b/remotion-best-practices/remotion-studio/assets/remotion-icon.svg
new file mode 100644
index 0000000..420dbc7
--- /dev/null
+++ b/remotion-best-practices/remotion-studio/assets/remotion-icon.svg
@@ -0,0 +1,4 @@
+
+Remotion
+
+
diff --git a/remotion-best-practices/remotion-upgrade/REFERENCE.md b/remotion-best-practices/remotion-upgrade/REFERENCE.md
new file mode 100644
index 0000000..e1e16db
--- /dev/null
+++ b/remotion-best-practices/remotion-upgrade/REFERENCE.md
@@ -0,0 +1,31 @@
+---
+name: remotion-upgrade
+description: Upgrade Remotion, and related packages
+version: 4.0.526
+---
+
+# Upgrade Remotion
+
+1. Inspect the project manifests and lockfile to identify the package manager and workspaces. Preserve unrelated changes.
+2. Determine whether `@remotion/cli` is locally available. If it is, run:
+
+ ```bash
+ npx remotion upgrade
+ ```
+
+ This also updates project-local Remotion skills. Skip the manual upgrade below.
+
+3. If `@remotion/cli` is not available, upgrade manually:
+ - Get the latest stable Remotion version with `npm view remotion version`.
+ - Find every installed `remotion` and `@remotion/*` dependency across the project and upgrade them all to that exact version. Preserve their dependency sections and the project's workspace or catalog conventions.
+ - Read the `@remotion/studio` dependencies for the target Remotion version using `npm view @remotion/studio@ dependencies --json`. Align installed auxiliary packages such as `zod`, `mediabunny`, and `@huggingface/transformers` with the versions listed there. Use the `mediabunny` version for installed `@mediabunny/*` packages.
+ - Run the project's package manager to update its lockfile.
+4. If `@remotion/cli` is not available, update the installed Remotion skills:
+
+ ```bash
+ npx skills update remotion-best-practices remotion-captions remotion-create remotion-docs remotion-interactivity remotion-maps remotion-markup remotion-multimedia remotion-render remotion-saas remotion-studio remotion-upgrade --yes
+ ```
+
+5. Review the manifest and lockfile diff. Ensure all Remotion packages use one version and installed auxiliary packages use their recommended versions. If the CLI is available, run `npx remotion versions` as an additional check.
+
+The [Remotion releases](https://github.com/remotion-dev/remotion/releases) contain the changelog and may be useful for summarizing relevant changes after the upgrade.
diff --git a/remotion-best-practices/remotion-upgrade/agents/openai.yaml b/remotion-best-practices/remotion-upgrade/agents/openai.yaml
new file mode 100644
index 0000000..b8b1905
--- /dev/null
+++ b/remotion-best-practices/remotion-upgrade/agents/openai.yaml
@@ -0,0 +1,7 @@
+interface:
+ display_name: '/remotion-upgrade'
+ short_description: 'Upgrade Remotion and related dependencies'
+ icon_small: './assets/remotion-icon.svg'
+ icon_large: './assets/remotion-icon.svg'
+ brand_color: '#0B84F3'
+ default_prompt: '$remotion-upgrade: Upgrade my project.'
diff --git a/remotion-best-practices/remotion-upgrade/assets/remotion-icon.svg b/remotion-best-practices/remotion-upgrade/assets/remotion-icon.svg
new file mode 100644
index 0000000..420dbc7
--- /dev/null
+++ b/remotion-best-practices/remotion-upgrade/assets/remotion-icon.svg
@@ -0,0 +1,4 @@
+
+Remotion
+
+
diff --git a/resilient-forms-validation/SKILL.md b/resilient-forms-validation/SKILL.md
new file mode 100644
index 0000000..c06be25
--- /dev/null
+++ b/resilient-forms-validation/SKILL.md
@@ -0,0 +1,164 @@
+---
+name: resilient-forms-validation
+description: >-
+ Build high-resilience, accessible web forms with unified schema validation (Zod / Valibot),
+ React 19 Actions / React Hook Form, optimistic UX, draft auto-save persistence, and strict WCAG error announcements.
+---
+
+# Resilient Forms & Accessible Schema Validation
+
+Ce skill encadre la création de formulaires web de niveau entreprise. Il élimine les formulaires artisanaux fragiles (multiples `useState` non validés, perte de données lors du rechargement, spinners bloquants) au profit d'un contrat de validation de schéma unifié, d'une résilience hors-ligne et d'une accessibilité irréprochable.
+
+---
+
+## 🎯 Déclencheurs d'Activation
+
+Activez ce skill dès que :
+1. Vous créez ou refactorisez un formulaire (inscription, authentification, paiement, paramètres utilisateur, formulaires multi-étapes).
+2. Vous validez des entrées utilisateur côté client et côté serveur avec **Zod** ou **Valibot**.
+3. Vous implémentez des mutations asynchrones avec **React 19 Actions** (`useActionState`) ou **React Hook Form**.
+4. Vous devez garantir la persistance des brouillons (*draft auto-save*) face aux rafraîchissements intempestifs.
+5. Vous auditez l'accessibilité des erreurs de saisie selon le critère WCAG 3.3 (Identification des erreurs et suggestions).
+
+---
+
+## 📐 1. Les 4 Piliers d'un Formulaire Résilient
+
+1. **Schéma Unique Partagé (Zod)** : Le même schéma TypeScript valide la saisie en temps réel côté client et protège l'endpoint API côté serveur.
+2. **Accessibilité des Erreurs (WCAG 3.3)** :
+ - Chaque champ en erreur porte `aria-invalid="true"`.
+ - Les messages d'erreur sont reliés au champ via `aria-describedby="field-error-id"`.
+ - Un conteneur avec `role="alert"` ou `aria-live="polite"` annonce les erreurs aux lecteurs d'écran sans déplacer brutalement le curseur.
+3. **Persistance Locale Automatique des Brouillons** : Pour les formulaires longs (> 3 champs), les valeurs sont sauvegardées dans `sessionStorage` ou `localStorage` pour éviter la perte de données en cas de crash d'onglet.
+4. **Mutations Non Bloquantes** : Ne jamais afficher d'overlay gris qui fige l'écran entier. Seul le bouton d'action affiche un état en cours, tout en restant désactivé pour empêcher la double soumission.
+
+---
+
+## 💻 2. Exemple d'Implémentation de Référence (Zod + React 19 Action)
+
+```tsx
+'use client';
+
+import React, { useActionState } from 'react';
+import { z } from 'zod';
+
+// 1. Schéma Zod Partagé
+export const ContactSchema = z.object({
+ name: z.string().min(2, 'Le nom doit comporter au moins 2 caractères'),
+ email: z.string().email('Adresse email invalide'),
+ message: z.string().min(10, 'Votre message doit comporter au moins 10 caractères'),
+});
+
+type FormState = {
+ success?: boolean;
+ errors?: Record;
+ values?: { name: string; email: string; message: string };
+};
+
+// 2. Action Serveur / Handler Typé
+async function submitContactAction(prevState: FormState, formData: FormData): Promise {
+ const rawData = {
+ name: formData.get('name') as string,
+ email: formData.get('email') as string,
+ message: formData.get('message') as string,
+ };
+
+ const validated = ContactSchema.safeParse(rawData);
+ if (!validated.success) {
+ return {
+ success: false,
+ errors: validated.error.flatten().fieldErrors,
+ values: rawData,
+ };
+ }
+
+ // Traitement backend sécurisé...
+ return { success: true };
+}
+
+// 3. Composant Formulaire Accessible
+export const ResilientContactForm = () => {
+ const [state, formAction, isPending] = useActionState(submitContactAction, {});
+
+ return (
+
+ );
+};
+```
+
+---
+
+## 📋 Checklist de Conformité Formulaires
+
+- [ ] Un schéma Zod ou Valibot est défini et partagé entre validation UI et API.
+- [ ] L'attribut `noValidate` est présent sur `