From b37ec97bd321d2855bc14649f97a857575ab0ac4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Apr 2024 18:02:35 +0000 Subject: [PATCH] deploy: b30badc8f4af811587538732ece609c98f4a5b8b --- 404.html | 4 ++-- assets/js/20881552.c16bbe59.js | 1 + assets/js/20881552.e2c7c338.js | 1 - assets/js/28d467d5.2babacce.js | 1 + assets/js/28d467d5.4669a07e.js | 1 - assets/js/2a6f4879.b4ffe72c.js | 1 - assets/js/2a6f4879.ee663a4e.js | 1 + assets/js/5aa65751.45fd12ef.js | 1 - assets/js/5aa65751.9eb2e443.js | 1 + assets/js/935f2afb.44d76863.js | 1 + assets/js/935f2afb.713d9b7b.js | 1 - assets/js/982ac012.102d8be9.js | 1 - assets/js/982ac012.9dc873c6.js | 1 + assets/js/fd7e5383.1078015c.js | 1 - assets/js/fd7e5383.1894dc18.js | 1 + assets/js/main.7e844e23.js | 2 -- assets/js/main.ee17b0ea.js | 2 ++ ....js.LICENSE.txt => main.ee17b0ea.js.LICENSE.txt} | 0 ...me~main.c975e49c.js => runtime~main.b033149e.js} | 2 +- blog/2023/02/17/version-100/index.html | 4 ++-- blog/archive/index.html | 4 ++-- blog/index.html | 4 ++-- blog/tags/announcement/index.html | 4 ++-- blog/tags/index.html | 4 ++-- blog/tags/release/index.html | 4 ++-- docs/amiga_quick_start/amiga-quick-start/index.html | 6 +++--- docs/api/index.html | 8 ++++---- docs/apps/autoplot_app/index.html | 6 +++--- docs/apps/camera_app/index.html | 6 +++--- docs/apps/file_manager_app/index.html | 6 +++--- docs/apps/filter_app/index.html | 6 +++--- docs/apps/recorder_app/index.html | 6 +++--- docs/brain/app-ownership/index.html | 6 +++--- docs/brain/brain-apps-kivy/index.html | 6 +++--- docs/brain/brain-apps-manifest/index.html | 6 +++--- docs/brain/brain-apps/index.html | 8 ++++---- docs/brain/brain-install/index.html | 6 +++--- docs/brain/custom-troubleshooting/index.html | 6 +++--- docs/brain/index.html | 4 ++-- docs/brain/next-steps/index.html | 6 +++--- docs/brain/ros-bridge/index.html | 6 +++--- docs/brain/sdk-barley-migration/index.html | 6 +++--- docs/concepts/canbus_service/index.html | 6 +++--- docs/concepts/filter_service/index.html | 6 +++--- docs/concepts/gps_service/index.html | 6 +++--- docs/concepts/index.html | 6 +++--- docs/concepts/oak_service/index.html | 8 ++++---- docs/concepts/recorder_service/index.html | 6 +++--- docs/concepts/system_overview/index.html | 6 +++--- docs/concepts/track_follower_service/index.html | 8 ++++---- docs/concepts/tracks_and_waypoints/index.html | 6 +++--- docs/concepts/transforms_and_poses/index.html | 6 +++--- docs/contribute/contribute-website/index.html | 4 ++-- docs/dashboard/control-states/index.html | 6 +++--- docs/dashboard/dashboard-debugging/index.html | 6 +++--- docs/dashboard/dashboard-fw/index.html | 6 +++--- docs/dashboard/dashboard-overview/index.html | 8 ++++---- docs/dashboard/dashboard-user-guide/index.html | 6 +++--- docs/debug_cable/index.html | 8 ++++---- docs/debug_cable/service-cable/index.html | 8 ++++---- docs/examples/FPV/index.html | 4 ++-- docs/examples/camera_aruco_detector/index.html | 4 ++-- docs/examples/camera_calibration/index.html | 4 ++-- docs/examples/camera_client/index.html | 4 ++-- docs/examples/camera_pointcloud/index.html | 4 ++-- docs/examples/camera_settings/index.html | 4 ++-- docs/examples/cansniffer/index.html | 4 ++-- docs/examples/dashboard_settings/index.html | 4 ++-- docs/examples/events_recorder/index.html | 4 ++-- docs/examples/examples-index/index.html | 4 ++-- docs/examples/file_converter/index.html | 4 ++-- docs/examples/file_reader/index.html | 4 ++-- docs/examples/file_reader_can/index.html | 4 ++-- docs/examples/file_reader_gps/index.html | 4 ++-- docs/examples/file_reader_headers/index.html | 4 ++-- docs/examples/filter_client/index.html | 4 ++-- docs/examples/gps_client/index.html | 4 ++-- docs/examples/hello_main_loop/index.html | 4 ++-- docs/examples/monitor_app/index.html | 4 ++-- docs/examples/motor_state/index.html | 4 ++-- docs/examples/multi_client_geoimage/index.html | 4 ++-- docs/examples/multi_client_subscriber/index.html | 4 ++-- docs/examples/pendant_state/index.html | 4 ++-- docs/examples/service_client/index.html | 4 ++-- docs/examples/service_counter/index.html | 4 ++-- docs/examples/service_propagation/index.html | 4 ++-- docs/examples/square_track/index.html | 4 ++-- docs/examples/tool_control/index.html | 4 ++-- docs/examples/track_follower/index.html | 4 ++-- docs/examples/track_planner/index.html | 4 ++-- docs/examples/track_plotter/index.html | 4 ++-- docs/examples/track_recorder/index.html | 4 ++-- docs/examples/vehicle_twist/index.html | 4 ++-- docs/examples/vnc_viewer/index.html | 6 +++--- docs/farm-tools/three-point/index.html | 8 ++++---- docs/getting-started/index.html | 4 ++-- docs/hardware-tools/etools/index.html | 4 ++-- docs/hardware-tools/recommended-tools/index.html | 4 ++-- docs/intelligence-kit/brain/brain-v2/index.html | 6 +++--- docs/intelligence-kit/overview-intel/index.html | 6 +++--- docs/mcu_kit/index.html | 13 ++++++++----- docs/pendant/index.html | 6 +++--- docs/reference/brain/canbus/packet/index.html | 6 +++--- docs/reference/brain/track/utils/index.html | 4 ++-- docs/reference/circuitpy/utils/can/index.html | 6 +++--- docs/reference/circuitpy/utils/cobid/index.html | 6 +++--- .../circuitpy/utils/debug_packet/index.html | 6 +++--- .../reference/circuitpy/utils/farmng_sdo/index.html | 6 +++--- docs/reference/circuitpy/utils/general/index.html | 6 +++--- docs/reference/circuitpy/utils/io/index.html | 6 +++--- docs/reference/circuitpy/utils/main_loop/index.html | 6 +++--- docs/reference/circuitpy/utils/nvm/index.html | 6 +++--- docs/reference/circuitpy/utils/packet/index.html | 6 +++--- docs/reference/circuitpy/utils/ticks/index.html | 6 +++--- docs/reference/circuitpy/utils/version/index.html | 6 +++--- docs/reference/faq/index.html | 4 ++-- docs/release-notes/release-01/index.html | 4 ++-- docs/release-notes/release-02/index.html | 4 ++-- docs/release-notes/release-021/index.html | 4 ++-- docs/release-notes/release-022/index.html | 4 ++-- docs/ssh/index.html | 6 +++--- docs/support/github-101/index.html | 4 ++-- docs/support/index.html | 4 ++-- docs/tags/announcement/index.html | 4 ++-- docs/tags/index.html | 4 ++-- docs/tags/release/index.html | 4 ++-- .../camera_streamer/camera-stream/index.html | 4 ++-- .../camera-streamer-overview/index.html | 4 ++-- .../camera_streamer/kivy-definition/index.html | 4 ++-- .../introduction/getting-started-kivy/index.html | 4 ++-- .../introduction/template-overview/index.html | 4 ++-- .../introduction/tutorial-introduction/index.html | 4 ++-- .../virtual_joystick/device-streams/index.html | 4 ++-- .../virtual_joystick/further-exercises/index.html | 4 ++-- .../virtual-joystick-overview/index.html | 4 ++-- .../virtual-joystick-widget/index.html | 4 ++-- index.html | 4 ++-- markdown-page/index.html | 4 ++-- search/index.html | 4 ++-- 139 files changed, 317 insertions(+), 314 deletions(-) create mode 100644 assets/js/20881552.c16bbe59.js delete mode 100644 assets/js/20881552.e2c7c338.js create mode 100644 assets/js/28d467d5.2babacce.js delete mode 100644 assets/js/28d467d5.4669a07e.js delete mode 100644 assets/js/2a6f4879.b4ffe72c.js create mode 100644 assets/js/2a6f4879.ee663a4e.js delete mode 100644 assets/js/5aa65751.45fd12ef.js create mode 100644 assets/js/5aa65751.9eb2e443.js create mode 100644 assets/js/935f2afb.44d76863.js delete mode 100644 assets/js/935f2afb.713d9b7b.js delete mode 100644 assets/js/982ac012.102d8be9.js create mode 100644 assets/js/982ac012.9dc873c6.js delete mode 100644 assets/js/fd7e5383.1078015c.js create mode 100644 assets/js/fd7e5383.1894dc18.js delete mode 100644 assets/js/main.7e844e23.js create mode 100644 assets/js/main.ee17b0ea.js rename assets/js/{main.7e844e23.js.LICENSE.txt => main.ee17b0ea.js.LICENSE.txt} (100%) rename assets/js/{runtime~main.c975e49c.js => runtime~main.b033149e.js} (96%) diff --git a/404.html b/404.html index 6053c92d0..c6d078dd9 100644 --- a/404.html +++ b/404.html @@ -12,8 +12,8 @@ - - + +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

diff --git a/assets/js/20881552.c16bbe59.js b/assets/js/20881552.c16bbe59.js new file mode 100644 index 000000000..07b4a3358 --- /dev/null +++ b/assets/js/20881552.c16bbe59.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkamiga_developers_website=self.webpackChunkamiga_developers_website||[]).push([[136],{5902:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>s,default:()=>d,frontMatter:()=>o,metadata:()=>a,toc:()=>c});var r=t(5893),i=t(1151);const o={id:"track-follower-overview",title:"Track Follower"},s="Track Follower Service Overview",a={id:"concepts/track_follower_service/track-follower-overview",title:"Track Follower",description:"The Track Follower is the autonomy hub of the Amiga.",source:"@site/docs/concepts/track_follower_service/README.md",sourceDirName:"concepts/track_follower_service",slug:"/concepts/track_follower_service/",permalink:"/docs/concepts/track_follower_service/",draft:!1,unlisted:!1,editUrl:"https://github.com/farm-ng/amiga-dev-kit/tree/main/website/docs/concepts/track_follower_service/README.md",tags:[],version:"current",frontMatter:{id:"track-follower-overview",title:"Track Follower"},sidebar:"Developer",previous:{title:"Filter",permalink:"/docs/concepts/filter_service/"},next:{title:"Microcontroller Kit",permalink:"/docs/mcu_kit/"}},l={},c=[{value:"Subscriptions",id:"subscriptions",level:2},{value:"API",id:"api",level:2},{value:"Requirements",id:"requirements",level:2},{value:"The Track Follower in practice",id:"the-track-follower-in-practice",level:2},{value:"Features",id:"features",level:3},{value:"Requirements for Following a Track",id:"requirements-for-following-a-track",level:3},{value:"Tracks",id:"tracks",level:2},{value:"Define a Track",id:"define-a-track",level:3},{value:"Examples",id:"examples",level:3}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"track-follower-service-overview",children:"Track Follower Service Overview"}),"\n",(0,r.jsx)(n.p,{children:"The Track Follower is the autonomy hub of the Amiga.\nIt takes in user commands and turns them into actions the robot can perform."}),"\n",(0,r.jsx)(n.p,{children:"The main goal of the Track Follower is to act as a bridge between what you want the Amiga to\ndo and how the robot actually does it. It hides the complicated details, letting users focus\non their main tasks without needing to know the complex workings underneath."}),"\n",(0,r.jsx)(n.p,{children:"In short, the Track Follower does the heavy lifting, allowing users to easily command the Amiga without\ndeep technical knowledge."}),"\n",(0,r.jsx)(n.h2,{id:"subscriptions",children:"Subscriptions"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"track_follower"})," is a client of the following services:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"/docs/concepts/canbus_service/",children:(0,r.jsx)(n.strong,{children:"Canbus"})})}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"/docs/concepts/filter_service/",children:(0,r.jsx)(n.strong,{children:"Filter"})})," (state estimation)"]}),"\n"]}),"\n",(0,r.jsxs)(n.admonition,{title:"remember",type:"tip",children:[(0,r.jsx)(n.p,{children:"The State estimation filter service is also client of the following services:"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"/docs/concepts/canbus_service/",children:(0,r.jsx)(n.strong,{children:"Canbus"})})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"/docs/concepts/gps_service/",children:(0,r.jsx)(n.strong,{children:"GPS"})})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"/docs/concepts/oak_service/",children:(0,r.jsx)(n.strong,{children:"Oak (oak0)"})})}),"\n"]})]}),"\n",(0,r.jsxs)(n.p,{children:["For this reason, all of the above-mentioned services must be up and running for the ",(0,r.jsx)(n.code,{children:"track_follower"}),"\nto work."]}),"\n",(0,r.jsx)(n.h1,{id:"data-streams",children:"Data Streams"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"/state"}),": The ",(0,r.jsx)(n.code,{children:"TrackFollowerState"})," is a combination of information from the various tasks\nperformed by the Track Follower.\nIt cannot be defined by a single protobuf definition, but instead, a combination of them.\nCheck out the protobuf definitions for the Track Follower service for more details at\n",(0,r.jsx)(n.a,{href:"https://github.com/farm-ng/farm-ng-amiga/blob/main/protos/farm_ng/track/track.proto",children:(0,r.jsx)(n.strong,{children:"track.proto"})})]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"api",children:"API"}),"\n",(0,r.jsxs)(n.p,{children:["These are the commands you can use to interact with the track follower service with\nan ",(0,r.jsx)(n.code,{children:"EventClient"})," of the track follower service."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"/set_track"})}),": Provide a specific ",(0,r.jsx)(n.code,{children:"Track"})," (series of waypoints) for the Amiga to follow."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"/start"})}),": Instruct the Amiga to start following the recently set `Track``."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"/pause"})}),": Pause following the track, but maintain knowledge of the progress along the ",(0,r.jsx)(n.code,{children:"Track"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"/resume"})}),": Continue following the track from where a ",(0,r.jsx)(n.code,{children:"/pause"})," was called."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"/cancel"})}),": Instruct the Amiga to halt all movements immediately and clear the set Track."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"/get_track"})}),": Return the ",(0,r.jsx)(n.code,{children:"Track"})," that was set with ",(0,r.jsx)(n.code,{children:"/set_track"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"/get_state"})}),": Return a single instance of the ",(0,r.jsx)(n.code,{children:"TrackFollowerState"})," streamed on the ",(0,r.jsx)(n.code,{children:"/state"})," topic."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"/go_to_goal"})}),": Send a single ",(0,r.jsx)(n.code,{children:"Pose"})," as a waypoint for the Track Follower to drive to.","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Must be within a few meters and 180 degrees of the robot's current pose and orientation."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"requirements",children:"Requirements"}),"\n",(0,r.jsxs)(n.p,{children:["There are a few requirements on the ",(0,r.jsx)(n.code,{children:"/state"})," output of the state estimation filter\n(see ",(0,r.jsx)(n.a,{href:"https://github.com/farm-ng/farm-ng-amiga/blob/main/protos/farm_ng/filter/filter.proto",children:(0,r.jsx)(n.code,{children:"FilterState"})}),")\nfor the track follower service to consider the results valid and allow for following a track.\nThese include:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"GPS service is connected to an RTK base station"}),"\n",(0,r.jsx)(n.li,{children:"State estimation is receiving all required sensor data"}),"\n",(0,r.jsxs)(n.li,{children:["State estimation results have converged","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Requires a few seconds of driving around after starting the filter service"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"the-track-follower-in-practice",children:"The Track Follower in practice"}),"\n",(0,r.jsxs)(n.p,{children:["Before the track follower can drive the Amiga autonomously, users must set a predefined track\nfor the robot to follow using the ",(0,r.jsx)(n.code,{children:"/set_track"})," API."]}),"\n",(0,r.jsxs)(n.p,{children:["Once a track is set, the next step is to command the track follower to make the robot follow it.\nThis is done using the ",(0,r.jsx)(n.code,{children:"/start"})," request.\nThe track follower will then navigate the robot through each waypoint in the sequence, ensuring it follows\nthe predefined path."]}),"\n",(0,r.jsx)(n.admonition,{title:"Remember",type:"info",children:(0,r.jsx)(n.p,{children:"It's crucial first to set the track before asking the robot to follow it.\nThe track follower expects the sequence of waypoints in the order they should be traversed.\nWithout a set track, the track follower wouldn't know where to direct the robot."})}),"\n",(0,r.jsx)(n.h3,{id:"features",children:"Features"}),"\n",(0,r.jsx)(n.p,{children:"The track follower offers a level of flexibility and intelligence that goes beyond simply following\na predefined path.\nOnce a track is set, the robot can also traverse it in a few unique ways:"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Reversing the Track"}),":\nAfter the Amiga has learned a track, it's not restricted to following it in just the direction\nit was taught.\nThe end point of the learned track can seamlessly become the starting point, provided the robot is\noriented towards its recorded initial position.\nThis allows the robot to navigate environments bidirectionally, offering greater autonomy and\nadaptability in dynamic settings."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Initiating from Intermediate Points"}),":\nYou don't always have to start the robot from the beginning of a track.\nThe track follower is smart enough to allow track following from any intermediate point within the path.\nThis is especially useful if the robot needs to start its journey from a point that's not the\ntraditional beginning or end."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"requirements-for-following-a-track",children:"Requirements for Following a Track"}),"\n",(0,r.jsx)(n.p,{children:"For the track follower to begin guiding the robot along a track, certain conditions must be met to\nensure accurate and safe navigation:"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Proximity to the Track"}),": The robot must be situated closely to an existing point on the track.\nThis ensures it's close enough to align itself correctly and follow the track."]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Orientation or Heading"}),": The robot's heading needs to align closely with the heading of the nearest\npoint on the track.\nSpecifically, it should be within 30 degrees of the track point's heading.\nThis condition ensures the robot is oriented correctly and can safely navigate along the desired\npath without sudden, unexpected maneuvers."]}),"\n",(0,r.jsx)(n.h2,{id:"tracks",children:"Tracks"}),"\n",(0,r.jsx)(n.p,{children:"A track is essentially a sequence of waypoints, guiding the robot from its starting point,\nthrough various intermediary points, to its destination.\nEach waypoint in this track provides specific spatial information about where the robot should\nbe and how it should be oriented at that point."}),"\n",(0,r.jsx)(n.h3,{id:"define-a-track",children:"Define a Track"}),"\n",(0,r.jsx)(n.p,{children:"A track is represented as a JSON file, where each waypoint is defined by a pose.\nA pose captures the robot's position and orientation in the world.\nHere's an example of what a single pose looks like:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\n "pose": {\n "aFromB": {\n "rotation": {\n "unitQuaternion": {\n "imag": {\n "z": -0.9932486190247055\n },\n "real": 0.11600508956729176\n }\n },\n "translation": {\n "x": 2674.593868581748,\n "y": 4297.325262829638\n }\n },\n "frameA": "world",\n "frameB": "robot",\n "tangentOfBInA": {\n "linearVelocity": {\n "x": 0.4467579546503179\n },\n "angularVelocity": {\n "z": 0.00475509022854358\n }\n }\n },\n "heading": -2.909058930621276\n},\n'})}),"\n",(0,r.jsx)(n.h3,{id:"examples",children:"Examples"}),"\n",(0,r.jsx)(n.p,{children:"Now that you have a good understanding of how the track follower works, try some of the\ntrack follower examples:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"/docs/examples/track_recorder",children:"Record a Track"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"/docs/examples/track_follower",children:"Follow a Track"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"/docs/examples/square_track",children:"Drive a Square"})}),"\n"]}),"\n",(0,r.jsxs)(n.admonition,{title:"Warning",type:"caution",children:[(0,r.jsx)(n.p,{children:"The track follower examples will cause the Amiga to drive when the dashboard is in auto mode.\nMake sure the area is clear before running examples."}),(0,r.jsxs)(n.p,{children:["You can also run the examples when the Amiga dashboard is not in ",(0,r.jsx)(n.code,{children:"AUTO READY"})," or ",(0,r.jsx)(n.code,{children:"AUTO ACTIVE"}),"\nand see the commands being sent with the red needle on the auto page without the Amiga actually moving."]})]})]})}function d(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>a,a:()=>s});var r=t(7294);const i={},o=r.createContext(i);function s(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/20881552.e2c7c338.js b/assets/js/20881552.e2c7c338.js deleted file mode 100644 index 4411ac54b..000000000 --- a/assets/js/20881552.e2c7c338.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkamiga_developers_website=self.webpackChunkamiga_developers_website||[]).push([[136],{5902:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>s,default:()=>d,frontMatter:()=>o,metadata:()=>a,toc:()=>c});var r=t(5893),i=t(1151);const o={id:"track-follower-overview",title:"Track Follower"},s="Track Follower Service Overview",a={id:"concepts/track_follower_service/track-follower-overview",title:"Track Follower",description:"The Track Follower is the autonomy hub of the Amiga.",source:"@site/docs/concepts/track_follower_service/README.md",sourceDirName:"concepts/track_follower_service",slug:"/concepts/track_follower_service/",permalink:"/docs/concepts/track_follower_service/",draft:!1,unlisted:!1,editUrl:"https://github.com/farm-ng/amiga-dev-kit/tree/main/website/docs/concepts/track_follower_service/README.md",tags:[],version:"current",frontMatter:{id:"track-follower-overview",title:"Track Follower"},sidebar:"Developer",previous:{title:"Filter",permalink:"/docs/concepts/filter_service/"},next:{title:"Microcontroller Kit Overview",permalink:"/docs/mcu_kit/"}},l={},c=[{value:"Subscriptions",id:"subscriptions",level:2},{value:"API",id:"api",level:2},{value:"Requirements",id:"requirements",level:2},{value:"The Track Follower in practice",id:"the-track-follower-in-practice",level:2},{value:"Features",id:"features",level:3},{value:"Requirements for Following a Track",id:"requirements-for-following-a-track",level:3},{value:"Tracks",id:"tracks",level:2},{value:"Define a Track",id:"define-a-track",level:3},{value:"Examples",id:"examples",level:3}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"track-follower-service-overview",children:"Track Follower Service Overview"}),"\n",(0,r.jsx)(n.p,{children:"The Track Follower is the autonomy hub of the Amiga.\nIt takes in user commands and turns them into actions the robot can perform."}),"\n",(0,r.jsx)(n.p,{children:"The main goal of the Track Follower is to act as a bridge between what you want the Amiga to\ndo and how the robot actually does it. It hides the complicated details, letting users focus\non their main tasks without needing to know the complex workings underneath."}),"\n",(0,r.jsx)(n.p,{children:"In short, the Track Follower does the heavy lifting, allowing users to easily command the Amiga without\ndeep technical knowledge."}),"\n",(0,r.jsx)(n.h2,{id:"subscriptions",children:"Subscriptions"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"track_follower"})," is a client of the following services:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"/docs/concepts/canbus_service/",children:(0,r.jsx)(n.strong,{children:"Canbus"})})}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"/docs/concepts/filter_service/",children:(0,r.jsx)(n.strong,{children:"Filter"})})," (state estimation)"]}),"\n"]}),"\n",(0,r.jsxs)(n.admonition,{title:"remember",type:"tip",children:[(0,r.jsx)(n.p,{children:"The State estimation filter service is also client of the following services:"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"/docs/concepts/canbus_service/",children:(0,r.jsx)(n.strong,{children:"Canbus"})})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"/docs/concepts/gps_service/",children:(0,r.jsx)(n.strong,{children:"GPS"})})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"/docs/concepts/oak_service/",children:(0,r.jsx)(n.strong,{children:"Oak (oak0)"})})}),"\n"]})]}),"\n",(0,r.jsxs)(n.p,{children:["For this reason, all of the above-mentioned services must be up and running for the ",(0,r.jsx)(n.code,{children:"track_follower"}),"\nto work."]}),"\n",(0,r.jsx)(n.h1,{id:"data-streams",children:"Data Streams"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"/state"}),": The ",(0,r.jsx)(n.code,{children:"TrackFollowerState"})," is a combination of information from the various tasks\nperformed by the Track Follower.\nIt cannot be defined by a single protobuf definition, but instead, a combination of them.\nCheck out the protobuf definitions for the Track Follower service for more details at\n",(0,r.jsx)(n.a,{href:"https://github.com/farm-ng/farm-ng-amiga/blob/main/protos/farm_ng/track/track.proto",children:(0,r.jsx)(n.strong,{children:"track.proto"})})]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"api",children:"API"}),"\n",(0,r.jsxs)(n.p,{children:["These are the commands you can use to interact with the track follower service with\nan ",(0,r.jsx)(n.code,{children:"EventClient"})," of the track follower service."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"/set_track"})}),": Provide a specific ",(0,r.jsx)(n.code,{children:"Track"})," (series of waypoints) for the Amiga to follow."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"/start"})}),": Instruct the Amiga to start following the recently set `Track``."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"/pause"})}),": Pause following the track, but maintain knowledge of the progress along the ",(0,r.jsx)(n.code,{children:"Track"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"/resume"})}),": Continue following the track from where a ",(0,r.jsx)(n.code,{children:"/pause"})," was called."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"/cancel"})}),": Instruct the Amiga to halt all movements immediately and clear the set Track."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"/get_track"})}),": Return the ",(0,r.jsx)(n.code,{children:"Track"})," that was set with ",(0,r.jsx)(n.code,{children:"/set_track"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"/get_state"})}),": Return a single instance of the ",(0,r.jsx)(n.code,{children:"TrackFollowerState"})," streamed on the ",(0,r.jsx)(n.code,{children:"/state"})," topic."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"/go_to_goal"})}),": Send a single ",(0,r.jsx)(n.code,{children:"Pose"})," as a waypoint for the Track Follower to drive to.","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Must be within a few meters and 180 degrees of the robot's current pose and orientation."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"requirements",children:"Requirements"}),"\n",(0,r.jsxs)(n.p,{children:["There are a few requirements on the ",(0,r.jsx)(n.code,{children:"/state"})," output of the state estimation filter\n(see ",(0,r.jsx)(n.a,{href:"https://github.com/farm-ng/farm-ng-amiga/blob/main/protos/farm_ng/filter/filter.proto",children:(0,r.jsx)(n.code,{children:"FilterState"})}),")\nfor the track follower service to consider the results valid and allow for following a track.\nThese include:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"GPS service is connected to an RTK base station"}),"\n",(0,r.jsx)(n.li,{children:"State estimation is receiving all required sensor data"}),"\n",(0,r.jsxs)(n.li,{children:["State estimation results have converged","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Requires a few seconds of driving around after starting the filter service"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"the-track-follower-in-practice",children:"The Track Follower in practice"}),"\n",(0,r.jsxs)(n.p,{children:["Before the track follower can drive the Amiga autonomously, users must set a predefined track\nfor the robot to follow using the ",(0,r.jsx)(n.code,{children:"/set_track"})," API."]}),"\n",(0,r.jsxs)(n.p,{children:["Once a track is set, the next step is to command the track follower to make the robot follow it.\nThis is done using the ",(0,r.jsx)(n.code,{children:"/start"})," request.\nThe track follower will then navigate the robot through each waypoint in the sequence, ensuring it follows\nthe predefined path."]}),"\n",(0,r.jsx)(n.admonition,{title:"Remember",type:"info",children:(0,r.jsx)(n.p,{children:"It's crucial first to set the track before asking the robot to follow it.\nThe track follower expects the sequence of waypoints in the order they should be traversed.\nWithout a set track, the track follower wouldn't know where to direct the robot."})}),"\n",(0,r.jsx)(n.h3,{id:"features",children:"Features"}),"\n",(0,r.jsx)(n.p,{children:"The track follower offers a level of flexibility and intelligence that goes beyond simply following\na predefined path.\nOnce a track is set, the robot can also traverse it in a few unique ways:"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Reversing the Track"}),":\nAfter the Amiga has learned a track, it's not restricted to following it in just the direction\nit was taught.\nThe end point of the learned track can seamlessly become the starting point, provided the robot is\noriented towards its recorded initial position.\nThis allows the robot to navigate environments bidirectionally, offering greater autonomy and\nadaptability in dynamic settings."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Initiating from Intermediate Points"}),":\nYou don't always have to start the robot from the beginning of a track.\nThe track follower is smart enough to allow track following from any intermediate point within the path.\nThis is especially useful if the robot needs to start its journey from a point that's not the\ntraditional beginning or end."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"requirements-for-following-a-track",children:"Requirements for Following a Track"}),"\n",(0,r.jsx)(n.p,{children:"For the track follower to begin guiding the robot along a track, certain conditions must be met to\nensure accurate and safe navigation:"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Proximity to the Track"}),": The robot must be situated closely to an existing point on the track.\nThis ensures it's close enough to align itself correctly and follow the track."]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Orientation or Heading"}),": The robot's heading needs to align closely with the heading of the nearest\npoint on the track.\nSpecifically, it should be within 30 degrees of the track point's heading.\nThis condition ensures the robot is oriented correctly and can safely navigate along the desired\npath without sudden, unexpected maneuvers."]}),"\n",(0,r.jsx)(n.h2,{id:"tracks",children:"Tracks"}),"\n",(0,r.jsx)(n.p,{children:"A track is essentially a sequence of waypoints, guiding the robot from its starting point,\nthrough various intermediary points, to its destination.\nEach waypoint in this track provides specific spatial information about where the robot should\nbe and how it should be oriented at that point."}),"\n",(0,r.jsx)(n.h3,{id:"define-a-track",children:"Define a Track"}),"\n",(0,r.jsx)(n.p,{children:"A track is represented as a JSON file, where each waypoint is defined by a pose.\nA pose captures the robot's position and orientation in the world.\nHere's an example of what a single pose looks like:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\n "pose": {\n "aFromB": {\n "rotation": {\n "unitQuaternion": {\n "imag": {\n "z": -0.9932486190247055\n },\n "real": 0.11600508956729176\n }\n },\n "translation": {\n "x": 2674.593868581748,\n "y": 4297.325262829638\n }\n },\n "frameA": "world",\n "frameB": "robot",\n "tangentOfBInA": {\n "linearVelocity": {\n "x": 0.4467579546503179\n },\n "angularVelocity": {\n "z": 0.00475509022854358\n }\n }\n },\n "heading": -2.909058930621276\n},\n'})}),"\n",(0,r.jsx)(n.h3,{id:"examples",children:"Examples"}),"\n",(0,r.jsx)(n.p,{children:"Now that you have a good understanding of how the track follower works, try some of the\ntrack follower examples:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"/docs/examples/track_recorder",children:"Record a Track"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"/docs/examples/track_follower",children:"Follow a Track"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"/docs/examples/square_track",children:"Drive a Square"})}),"\n"]}),"\n",(0,r.jsxs)(n.admonition,{title:"Warning",type:"caution",children:[(0,r.jsx)(n.p,{children:"The track follower examples will cause the Amiga to drive when the dashboard is in auto mode.\nMake sure the area is clear before running examples."}),(0,r.jsxs)(n.p,{children:["You can also run the examples when the Amiga dashboard is not in ",(0,r.jsx)(n.code,{children:"AUTO READY"})," or ",(0,r.jsx)(n.code,{children:"AUTO ACTIVE"}),"\nand see the commands being sent with the red needle on the auto page without the Amiga actually moving."]})]})]})}function d(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>a,a:()=>s});var r=t(7294);const i={},o=r.createContext(i);function s(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/28d467d5.2babacce.js b/assets/js/28d467d5.2babacce.js new file mode 100644 index 000000000..a2792f452 --- /dev/null +++ b/assets/js/28d467d5.2babacce.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkamiga_developers_website=self.webpackChunkamiga_developers_website||[]).push([[3542],{7190:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>h,contentTitle:()=>s,default:()=>m,frontMatter:()=>c,metadata:()=>l,toc:()=>d});var r=t(5893),i=t(1151),o=t(4866),a=t(5162);const c={id:"microcontroller-kit",title:"Microcontroller Kit"},s="Microcontroller Kit Overview",l={id:"mcu_kit/microcontroller-kit",title:"Microcontroller Kit",description:"We sell a complete kit containing all necessary components on the Amiga shop website: farm-ng microcontroller kit",source:"@site/docs/mcu_kit/README.mdx",sourceDirName:"mcu_kit",slug:"/mcu_kit/",permalink:"/docs/mcu_kit/",draft:!1,unlisted:!1,editUrl:"https://github.com/farm-ng/amiga-dev-kit/tree/main/website/docs/mcu_kit/README.mdx",tags:[],version:"current",frontMatter:{id:"microcontroller-kit",title:"Microcontroller Kit"},sidebar:"Developer",previous:{title:"Track Follower",permalink:"/docs/concepts/track_follower_service/"},next:{title:"API Index",permalink:"/docs/api/"}},h={},d=[{value:"Feather M4 Can device setup",id:"feather-m4-can-device-setup",level:2},{value:"Flashing the UF2 firmware on the M4 device",id:"flashing-the-uf2-firmware-on-the-m4-device",level:2},{value:"On first connection",id:"on-first-connection",level:3},{value:"Flash by drag & drop",id:"flash-by-drag--drop",level:4},{value:"Flash UF2 by command line",id:"flash-uf2-by-command-line",level:4},{value:"On subsequent connection",id:"on-subsequent-connection",level:3},{value:"Loading code on the Feather",id:"loading-code-on-the-feather",level:2}];function u(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"microcontroller-kit-overview",children:"Microcontroller Kit Overview"}),"\n","\n","\n",(0,r.jsxs)(n.p,{children:["We sell a complete kit containing all necessary components on the Amiga shop website: ",(0,r.jsx)(n.a,{href:"https://farm-ng.com/products/microcontroller-kit",children:(0,r.jsx)(n.strong,{children:"farm-ng microcontroller kit"})})]}),"\n",(0,r.jsx)(n.h2,{id:"feather-m4-can-device-setup",children:"Feather M4 Can device setup"}),"\n",(0,r.jsx)(n.p,{children:"This device can be used for rapid prototyping of applications that interact with farm-ng's Amiga platform."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"The Feather M4 board front and back, where to solder the connector, and the resistor that must be cut:"})}),"\n",(0,r.jsx)("p",{align:"center",children:(0,r.jsx)("img",{width:"773",title:"Feather M4 board front and back",alt:"Screen Shot 2022-08-16 at 7 34 34 PM",src:"https://user-images.githubusercontent.com/810997/185022043-bf6f20b6-f332-4e63-a050-be5f4248462c.png"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"The connected Feather M4 and which wire to screw into high and low sides and where the reset button is:"})}),"\n",(0,r.jsx)("p",{align:"center",children:(0,r.jsx)("img",{width:"702",title:"Connected Feather M4",alt:"Screen Shot 2022-08-16 at 7 24 54 PM",src:"https://user-images.githubusercontent.com/810997/185021388-b290fd2b-f721-4e59-843b-c30ee245c51b.png"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"The male M12 CAN bus connector whose white (high) and blue (low) connectors are screwed into the Feather M4 and the male CAN bus connector is attached to the CAN bus:"})}),"\n",(0,r.jsx)("p",{align:"center",children:(0,r.jsx)("img",{width:"650",title:"Male M12 CAN bus connector",alt:"Screen Shot 2022-08-16 at 7 41 38 PM",src:"https://user-images.githubusercontent.com/810997/185022824-593e543f-7899-4a65-93b0-9f07e97f8572.png"})}),"\n",(0,r.jsx)(n.h2,{id:"flashing-the-uf2-firmware-on-the-m4-device",children:"Flashing the UF2 firmware on the M4 device"}),"\n",(0,r.jsxs)(n.p,{children:["We run ",(0,r.jsx)(n.a,{href:"https://circuitpython.org/",children:(0,r.jsx)(n.strong,{children:"CircuitPython"})})," on the microcontrollers,\nas it is well supported, well documented, and recommended by Adafruit for their microcontrollers."]}),"\n",(0,r.jsxs)(n.p,{children:["CircuitPython is installed by flashing the microcontroller with the correct UF2 file, and you can tell if CircuitPython is installed if the microcontroller is mounted as a directory called ",(0,r.jsx)(n.code,{children:"CIRCUITPY"})," whenever you connect it."]}),"\n",(0,r.jsx)(n.h3,{id:"on-first-connection",children:"On first connection"}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:["The following instructions summarize the\n",(0,r.jsx)(n.a,{href:"https://learn.adafruit.com/adafruit-feather-m4-can-express/circuitpython-on-feather-m4-can",children:(0,r.jsx)(n.strong,{children:"CircuitPython on Feather M4 CAN"})}),"\ninstructions.\nYou can also check out the more generic\n",(0,r.jsx)(n.a,{href:"https://learn.adafruit.com/welcome-to-circuitpython/installing-circuitpython",children:(0,r.jsx)(n.strong,{children:"Adafruit Installing CircuitPython"})})," instructions."]})}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsx)(n.li,{children:"Connect your feather to your computer through the USB-C port on the feather"}),"\n"]}),"\n",(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsx)(n.p,{children:"Check that the large LED is green or randomly varying colored. If it is red, you are most likely using a charge only USB-C cable."})}),"\n",(0,r.jsxs)(n.ol,{start:"2",children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Double click the reset button to enter ",(0,r.jsx)(n.code,{children:"BOOTLOADER"})," mode, allowing you to flash the microcontroller with a Microsoft standard flash format uf2 file. The Feather should automatically remount and show up as ",(0,r.jsx)(n.code,{children:"FTHRCANBOOT"})," or ",(0,r.jsx)(n.code,{children:"FEATHERBOOT"})]}),"\n",(0,r.jsxs)(n.admonition,{type:"tip",children:[(0,r.jsxs)(n.p,{children:["The timing of the double click can be a little tricky, so if it mounts as ",(0,r.jsx)(n.code,{children:"CIRCUITPY"}),", just try again until it mounts as ",(0,r.jsx)(n.code,{children:"AMIGA"}),".\nIf you cannot get the double click timing correct, you can enter BOOTLOADER mode with the following advanced user steps:"]}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Open a serial console connected to the dashboard (see: ",(0,r.jsx)(n.a,{href:"https://learn.adafruit.com/welcome-to-circuitpython/kattni-connecting-to-the-serial-console",children:(0,r.jsx)(n.strong,{children:"Adafruit connecting to the serial console"})}),")"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Pause the program with ",(0,r.jsx)(n.code,{children:"ctrl+C"})]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Enter the following commands in the REPL"}),"\n"]}),"\n"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"import microcontroller\nmicrocontroller.on_next_reset(microcontroller.RunMode.BOOTLOADER)\nmicrocontroller.reset()\n"})})]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"You can now flash the drive with the correct CircuitPython version, with either the drag & drop or the command line method."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["After the flashing, feather should automatically update, reboot with the newly loaded firmware, and remount as ",(0,r.jsx)(n.code,{children:"CIRCUITPY"})]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h4,{id:"flash-by-drag--drop",children:"Flash by drag & drop"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Download the correct UF2 file"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["From our repo: ",(0,r.jsx)(n.a,{href:"https://github.com/farm-ng/amiga-dev-kit/raw/main/circuitpy/feather_m4_can/uf2s/adafruit-circuitpython-feather_m4_can-en_US-7.3.2.uf2",children:(0,r.jsx)(n.strong,{children:"Download CircuitPython 7.3.2 - Feather M4 CAN"})})]}),"\n",(0,r.jsxs)(n.li,{children:["Directly from Adafruit: ",(0,r.jsx)(n.a,{href:"https://downloads.circuitpython.org/bin/feather_m4_can/en_US/adafruit-circuitpython-feather_m4_can-en_US-7.3.3.uf2",children:(0,r.jsx)(n.strong,{children:"Download CircuitPython 7.3.3 - Feather M4 CAN"})})]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Copy (drag & drop) the UF2 file onto the feather mounted in ",(0,r.jsx)(n.code,{children:"BOOTLOADER"})," mode."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["It should automatically update and remount as ",(0,r.jsx)(n.code,{children:"CIRCUITPY"})]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h4,{id:"flash-uf2-by-command-line",children:"Flash UF2 by command line"}),"\n",(0,r.jsxs)(n.p,{children:["These instructions show how to copy (flash) the UF2 file onto the Feather\nfrom the cloned ",(0,r.jsx)(n.code,{children:"amiga-dev-kit"})," repo, for each OS."]}),"\n",(0,r.jsxs)(o.Z,{children:[(0,r.jsxs)(a.Z,{value:"linux",label:"Linux",default:!0,children:[(0,r.jsx)(n.p,{children:"From a terminal, use the command line:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"cd ~//amiga-dev-kit\ncp circuitpy/feather_m4_can/uf2s/adafruit-circuitpython-feather_m4_can-en_US-7.3.2.uf2 \\\n/media/$USERNAME/FTHRCANBOOT/\n"})})]}),(0,r.jsxs)(a.Z,{value:"macos",label:"MacOs",children:[(0,r.jsx)(n.p,{children:"In your system (or PyCharm) terminal, use the command line:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"cd ~//amiga-dev-kit\ncp circuitpy/feather_m4_can/uf2s/adafruit-circuitpython-feather_m4_can-en_US-7.3.2.uf2 \\\n/Volumes/FTHRCANBOOT\n"})})]}),(0,r.jsxs)(a.Z,{value:"wsl",label:"WSL",children:[(0,r.jsx)(n.p,{children:"From a terminal, use the command line:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"cd ~//amiga-dev-kit\n# mount the feather in wsl with 'd', assuming the feather is presenting as the D: drive on windows.\n# Use the corresponding letter to the mounted drive.\nsudo ./mnt_feather_wsl.sh d\ncp circuitpy/feather_m4_can/uf2s/adafruit-circuitpython-feather_m4_can-en_US-7.3.2.uf2 /mnt/d/\n"})})]})]}),"\n",(0,r.jsx)(n.h3,{id:"on-subsequent-connection",children:"On subsequent connection"}),"\n",(0,r.jsxs)(n.p,{children:["When attaching a previously flashed Feather M4 device, it should automatically mount as ",(0,r.jsx)(n.code,{children:"CIRCUITPY"}),".\nYou can always check the our ",(0,r.jsx)(n.a,{href:"https://github.com/farm-ng/amiga-dev-kit/tree/main/circuitpy/feather_m4_can/uf2s",children:(0,r.jsx)(n.strong,{children:"farm-ng adk uf2 dir"})})," or the ",(0,r.jsx)(n.a,{href:"https://circuitpython.org/board/feather_m4_can/",children:"Feather M4 CAN UF2 page"})," for future stable & experimental releases."]}),"\n",(0,r.jsx)(n.h2,{id:"loading-code-on-the-feather",children:"Loading code on the Feather"}),"\n",(0,r.jsx)(n.p,{children:"Now that you have a flashed Feather, time to load some code:"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Copy the ",(0,r.jsx)(n.code,{children:"lib/"})," folder from ",(0,r.jsx)(n.a,{href:"https://github.com/farm-ng/amiga-dev-kit/tree/main/circuitpy",children:(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"amiga-dev-kit/circuitpy/"})})})," to the root of the Feather. The contents of ",(0,r.jsx)(n.code,{children:"lib/"})," are automatically added to your python path on the microcontroller."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Attach a serial terminal to the feather, so you can see std out."}),"\n",(0,r.jsxs)(o.Z,{children:[(0,r.jsx)(a.Z,{value:"linux",label:"Linux",default:!0,children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"screen /dev/ttyACM0\n"})})}),(0,r.jsxs)(a.Z,{value:"macos",label:"MacOs",children:[(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsxs)(n.p,{children:["Use autocomplete to get the correct usb modem ",(0,r.jsx)(n.code,{children:".../tty.usb[tab_for_autocomplete]"})]})}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"screen /dev/tty./dev/tty.usbmodem14201\n"})})]})]}),"\n",(0,r.jsxs)(n.admonition,{type:"tip",children:[(0,r.jsxs)(n.p,{children:["Mu is the recommended serial console program by adafruit on their ",(0,r.jsx)(n.a,{href:"https://learn.adafruit.com/welcome-to-circuitpython/kattni-connecting-to-the-serial-console",children:(0,r.jsx)(n.strong,{children:"CircuitPython serial console page"})}),".\nMu has a built in plotter for tuples printed to the serial console (print statements in the python code on your microcontroller)."]}),(0,r.jsx)(n.p,{children:"However, we've found that Mu can be a little unstable and freezes occasionally,\nso we'd recommend checking out their links for the \"advanced\" serial console:"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://learn.adafruit.com/welcome-to-circuitpython/advanced-serial-console-on-windows",children:(0,r.jsx)(n.strong,{children:"Windows serial console"})})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://learn.adafruit.com/welcome-to-circuitpython/advanced-serial-console-on-linux",children:(0,r.jsx)(n.strong,{children:"Linux serial console"})})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://learn.adafruit.com/welcome-to-circuitpython/advanced-serial-console-on-mac-and-linux",children:(0,r.jsx)(n.strong,{children:"Mac serial console"})})}),"\n"]})]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Now add a ",(0,r.jsx)(n.code,{children:"code.py"})," file to the root of the Feather drive. Try one of the examples found in the ",(0,r.jsx)(n.a,{href:"/docs/examples/examples-index",children:(0,r.jsx)(n.strong,{children:"Examples index"})}),", such as the ",(0,r.jsx)(n.a,{href:"./../examples/hello_main_loop/",children:(0,r.jsx)(n.strong,{children:"Hello Main Loop example"})}),"."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.admonition,{type:"note",children:[(0,r.jsx)(n.p,{children:"The feather should automatically reload when you drop any new code onto it."}),(0,r.jsxs)(n.p,{children:["The feather automatically runs the file named ",(0,r.jsx)(n.code,{children:"code.py"}),"\nand adds the contents of the ",(0,r.jsx)(n.code,{children:"lib/"})," directory to the python path."]})]}),"\n",(0,r.jsx)(n.p,{children:"You can also reload through the serial console by:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Cancelling the current execution with ",(0,r.jsx)(n.code,{children:"crtl+C"})]}),"\n",(0,r.jsxs)(n.li,{children:["Reloading with ",(0,r.jsx)(n.code,{children:"ctrl+D"})]}),"\n"]}),"\n",(0,r.jsx)(n.h1,{id:"feather-m4-references",children:"Feather M4 references"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://learn.adafruit.com/circuitpython-essentials/circuitpython-essentials",children:(0,r.jsx)(n.strong,{children:"Adafruit CircuitPython programming guide"})})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://learn.adafruit.com/adafruit-feather-m4-can-express",children:(0,r.jsx)(n.strong,{children:"Adafruit Feather M4 CAN Express"})})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://learn.adafruit.com/adafruit-feather-m4-can-express/circuitpython-on-feather-m4-can",children:(0,r.jsx)(n.strong,{children:"CircuitPython on Feather M4 CAN"})})}),"\n"]})]})}function m(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}},5162:(e,n,t)=>{t.d(n,{Z:()=>a});t(7294);var r=t(6010);const i={tabItem:"tabItem_Ymn6"};var o=t(5893);function a(e){let{children:n,hidden:t,className:a}=e;return(0,o.jsx)("div",{role:"tabpanel",className:(0,r.Z)(i.tabItem,a),hidden:t,children:n})}},4866:(e,n,t)=>{t.d(n,{Z:()=>w});var r=t(7294),i=t(6010),o=t(2466),a=t(6550),c=t(469),s=t(1980),l=t(7392),h=t(12);function d(e){return r.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function u(e){const{values:n,children:t}=e;return(0,r.useMemo)((()=>{const e=n??function(e){return d(e).map((e=>{let{props:{value:n,label:t,attributes:r,default:i}}=e;return{value:n,label:t,attributes:r,default:i}}))}(t);return function(e){const n=(0,l.l)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function m(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function p(e){let{queryString:n=!1,groupId:t}=e;const i=(0,a.k6)(),o=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,s._X)(o),(0,r.useCallback)((e=>{if(!o)return;const n=new URLSearchParams(i.location.search);n.set(o,e),i.replace({...i.location,search:n.toString()})}),[o,i])]}function f(e){const{defaultValue:n,queryString:t=!1,groupId:i}=e,o=u(e),[a,s]=(0,r.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!m({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const r=t.find((e=>e.default))??t[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:o}))),[l,d]=p({queryString:t,groupId:i}),[f,x]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[i,o]=(0,h.Nk)(t);return[i,(0,r.useCallback)((e=>{t&&o.set(e)}),[t,o])]}({groupId:i}),j=(()=>{const e=l??f;return m({value:e,tabValues:o})?e:null})();(0,c.Z)((()=>{j&&s(j)}),[j]);return{selectedValue:a,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);s(e),d(e),x(e)}),[d,x,o]),tabValues:o}}var x=t(2389);const j={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var g=t(5893);function b(e){let{className:n,block:t,selectedValue:r,selectValue:a,tabValues:c}=e;const s=[],{blockElementScrollPositionUntilNextRender:l}=(0,o.o5)(),h=e=>{const n=e.currentTarget,t=s.indexOf(n),i=c[t].value;i!==r&&(l(n),a(i))},d=e=>{let n=null;switch(e.key){case"Enter":h(e);break;case"ArrowRight":{const t=s.indexOf(e.currentTarget)+1;n=s[t]??s[0];break}case"ArrowLeft":{const t=s.indexOf(e.currentTarget)-1;n=s[t]??s[s.length-1];break}}n?.focus()};return(0,g.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,i.Z)("tabs",{"tabs--block":t},n),children:c.map((e=>{let{value:n,label:t,attributes:o}=e;return(0,g.jsx)("li",{role:"tab",tabIndex:r===n?0:-1,"aria-selected":r===n,ref:e=>s.push(e),onKeyDown:d,onClick:h,...o,className:(0,i.Z)("tabs__item",j.tabItem,o?.className,{"tabs__item--active":r===n}),children:t??n},n)}))})}function y(e){let{lazy:n,children:t,selectedValue:i}=e;const o=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=o.find((e=>e.props.value===i));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return(0,g.jsx)("div",{className:"margin-top--md",children:o.map(((e,n)=>(0,r.cloneElement)(e,{key:n,hidden:e.props.value!==i})))})}function v(e){const n=f(e);return(0,g.jsxs)("div",{className:(0,i.Z)("tabs-container",j.tabList),children:[(0,g.jsx)(b,{...e,...n}),(0,g.jsx)(y,{...e,...n})]})}function w(e){const n=(0,x.Z)();return(0,g.jsx)(v,{...e,children:d(e.children)},String(n))}},1151:(e,n,t)=>{t.d(n,{Z:()=>c,a:()=>a});var r=t(7294);const i={},o=r.createContext(i);function a(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/28d467d5.4669a07e.js b/assets/js/28d467d5.4669a07e.js deleted file mode 100644 index 225b400a3..000000000 --- a/assets/js/28d467d5.4669a07e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkamiga_developers_website=self.webpackChunkamiga_developers_website||[]).push([[3542],{7190:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>h,contentTitle:()=>c,default:()=>m,frontMatter:()=>s,metadata:()=>l,toc:()=>d});var r=t(5893),i=t(1151),o=t(4866),a=t(5162);const s={id:"microcontroller-kit",title:"Microcontroller Kit Overview"},c=void 0,l={id:"mcu_kit/microcontroller-kit",title:"Microcontroller Kit Overview",description:"We sell a complete kit containing all necessary components on the Amiga shop website: farm-ng microcontroller kit",source:"@site/docs/mcu_kit/README.mdx",sourceDirName:"mcu_kit",slug:"/mcu_kit/",permalink:"/docs/mcu_kit/",draft:!1,unlisted:!1,editUrl:"https://github.com/farm-ng/amiga-dev-kit/tree/main/website/docs/mcu_kit/README.mdx",tags:[],version:"current",frontMatter:{id:"microcontroller-kit",title:"Microcontroller Kit Overview"},sidebar:"Developer",previous:{title:"Track Follower",permalink:"/docs/concepts/track_follower_service/"},next:{title:"Debug Cable Overview",permalink:"/docs/debug_cable/"}},h={},d=[{value:"Feather M4 Can device setup",id:"feather-m4-can-device-setup",level:2},{value:"Flashing the UF2 firmware on the M4 device",id:"flashing-the-uf2-firmware-on-the-m4-device",level:2},{value:"On first connection",id:"on-first-connection",level:3},{value:"Flash by drag & drop",id:"flash-by-drag--drop",level:4},{value:"Flash UF2 by command line",id:"flash-uf2-by-command-line",level:4},{value:"On subsequent connection",id:"on-subsequent-connection",level:3},{value:"Loading code on the Feather",id:"loading-code-on-the-feather",level:2}];function u(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.p,{children:["We sell a complete kit containing all necessary components on the Amiga shop website: ",(0,r.jsx)(n.a,{href:"https://farm-ng.com/products/microcontroller-kit",children:(0,r.jsx)(n.strong,{children:"farm-ng microcontroller kit"})})]}),"\n",(0,r.jsx)(n.h2,{id:"feather-m4-can-device-setup",children:"Feather M4 Can device setup"}),"\n",(0,r.jsx)(n.p,{children:"This device can be used for rapid prototyping of applications that interact with farm-ng's Amiga platform."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"The Feather M4 board front and back, where to solder the connector, and the resistor that must be cut:"})}),"\n",(0,r.jsx)("p",{align:"center",children:(0,r.jsx)("img",{width:"773",title:"Feather M4 board front and back",alt:"Screen Shot 2022-08-16 at 7 34 34 PM",src:"https://user-images.githubusercontent.com/810997/185022043-bf6f20b6-f332-4e63-a050-be5f4248462c.png"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"The connected Feather M4 and which wire to screw into high and low sides and where the reset button is:"})}),"\n",(0,r.jsx)("p",{align:"center",children:(0,r.jsx)("img",{width:"702",title:"Connected Feather M4",alt:"Screen Shot 2022-08-16 at 7 24 54 PM",src:"https://user-images.githubusercontent.com/810997/185021388-b290fd2b-f721-4e59-843b-c30ee245c51b.png"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"The male M12 CAN bus connector whose white (high) and blue (low) connectors are screwed into the Feather M4 and the male CAN bus connector is attached to the CAN bus:"})}),"\n",(0,r.jsx)("p",{align:"center",children:(0,r.jsx)("img",{width:"650",title:"Male M12 CAN bus connector",alt:"Screen Shot 2022-08-16 at 7 41 38 PM",src:"https://user-images.githubusercontent.com/810997/185022824-593e543f-7899-4a65-93b0-9f07e97f8572.png"})}),"\n",(0,r.jsx)(n.h2,{id:"flashing-the-uf2-firmware-on-the-m4-device",children:"Flashing the UF2 firmware on the M4 device"}),"\n",(0,r.jsxs)(n.p,{children:["We run ",(0,r.jsx)(n.a,{href:"https://circuitpython.org/",children:(0,r.jsx)(n.strong,{children:"CircuitPython"})})," on the microcontrollers,\nas it is well supported, well documented, and recommended by Adafruit for their microcontrollers."]}),"\n",(0,r.jsxs)(n.p,{children:["CircuitPython is installed by flashing the microcontroller with the correct UF2 file, and you can tell if CircuitPython is installed if the microcontroller is mounted as a directory called ",(0,r.jsx)(n.code,{children:"CIRCUITPY"})," whenever you connect it."]}),"\n",(0,r.jsx)(n.h3,{id:"on-first-connection",children:"On first connection"}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:["The following instructions summarize the\n",(0,r.jsx)(n.a,{href:"https://learn.adafruit.com/adafruit-feather-m4-can-express/circuitpython-on-feather-m4-can",children:(0,r.jsx)(n.strong,{children:"CircuitPython on Feather M4 CAN"})}),"\ninstructions.\nYou can also check out the more generic\n",(0,r.jsx)(n.a,{href:"https://learn.adafruit.com/welcome-to-circuitpython/installing-circuitpython",children:(0,r.jsx)(n.strong,{children:"Adafruit Installing CircuitPython"})})," instructions."]})}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsx)(n.li,{children:"Connect your feather to your computer through the USB-C port on the feather"}),"\n"]}),"\n",(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsx)(n.p,{children:"Check that the large LED is green or randomly varying colored. If it is red, you are most likely using a charge only USB-C cable."})}),"\n",(0,r.jsxs)(n.ol,{start:"2",children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Double click the reset button to enter ",(0,r.jsx)(n.code,{children:"BOOTLOADER"})," mode, allowing you to flash the microcontroller with a Microsoft standard flash format uf2 file. The Feather should automatically remount and show up as ",(0,r.jsx)(n.code,{children:"FTHRCANBOOT"})," or ",(0,r.jsx)(n.code,{children:"FEATHERBOOT"})]}),"\n",(0,r.jsxs)(n.admonition,{type:"tip",children:[(0,r.jsxs)(n.p,{children:["The timing of the double click can be a little tricky, so if it mounts as ",(0,r.jsx)(n.code,{children:"CIRCUITPY"}),", just try again until it mounts as ",(0,r.jsx)(n.code,{children:"AMIGA"}),".\nIf you cannot get the double click timing correct, you can enter BOOTLOADER mode with the following advanced user steps:"]}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Open a serial console connected to the dashboard (see: ",(0,r.jsx)(n.a,{href:"https://learn.adafruit.com/welcome-to-circuitpython/kattni-connecting-to-the-serial-console",children:(0,r.jsx)(n.strong,{children:"Adafruit connecting to the serial console"})}),")"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Pause the program with ",(0,r.jsx)(n.code,{children:"ctrl+C"})]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Enter the following commands in the REPL"}),"\n"]}),"\n"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"import microcontroller\nmicrocontroller.on_next_reset(microcontroller.RunMode.BOOTLOADER)\nmicrocontroller.reset()\n"})})]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"You can now flash the drive with the correct CircuitPython version, with either the drag & drop or the command line method."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["After the flashing, feather should automatically update, reboot with the newly loaded firmware, and remount as ",(0,r.jsx)(n.code,{children:"CIRCUITPY"})]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h4,{id:"flash-by-drag--drop",children:"Flash by drag & drop"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Download the correct UF2 file"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["From our repo: ",(0,r.jsx)(n.a,{href:"https://github.com/farm-ng/amiga-dev-kit/raw/main/circuitpy/feather_m4_can/uf2s/adafruit-circuitpython-feather_m4_can-en_US-7.3.2.uf2",children:(0,r.jsx)(n.strong,{children:"Download CircuitPython 7.3.2 - Feather M4 CAN"})})]}),"\n",(0,r.jsxs)(n.li,{children:["Directly from Adafruit: ",(0,r.jsx)(n.a,{href:"https://downloads.circuitpython.org/bin/feather_m4_can/en_US/adafruit-circuitpython-feather_m4_can-en_US-7.3.3.uf2",children:(0,r.jsx)(n.strong,{children:"Download CircuitPython 7.3.3 - Feather M4 CAN"})})]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Copy (drag & drop) the UF2 file onto the feather mounted in ",(0,r.jsx)(n.code,{children:"BOOTLOADER"})," mode."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["It should automatically update and remount as ",(0,r.jsx)(n.code,{children:"CIRCUITPY"})]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h4,{id:"flash-uf2-by-command-line",children:"Flash UF2 by command line"}),"\n",(0,r.jsxs)(n.p,{children:["These instructions show how to copy (flash) the UF2 file onto the Feather\nfrom the cloned ",(0,r.jsx)(n.code,{children:"amiga-dev-kit"})," repo, for each OS."]}),"\n",(0,r.jsxs)(o.Z,{children:[(0,r.jsxs)(a.Z,{value:"linux",label:"Linux",default:!0,children:[(0,r.jsx)(n.p,{children:"From a terminal, use the command line:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"cd ~//amiga-dev-kit\ncp circuitpy/feather_m4_can/uf2s/adafruit-circuitpython-feather_m4_can-en_US-7.3.2.uf2 \\\n/media/$USERNAME/FTHRCANBOOT/\n"})})]}),(0,r.jsxs)(a.Z,{value:"macos",label:"MacOs",children:[(0,r.jsx)(n.p,{children:"In your system (or PyCharm) terminal, use the command line:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"cd ~//amiga-dev-kit\ncp circuitpy/feather_m4_can/uf2s/adafruit-circuitpython-feather_m4_can-en_US-7.3.2.uf2 \\\n/Volumes/FTHRCANBOOT\n"})})]}),(0,r.jsxs)(a.Z,{value:"wsl",label:"WSL",children:[(0,r.jsx)(n.p,{children:"From a terminal, use the command line:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"cd ~//amiga-dev-kit\n# mount the feather in wsl with 'd', assuming the feather is presenting as the D: drive on windows.\n# Use the corresponding letter to the mounted drive.\nsudo ./mnt_feather_wsl.sh d\ncp circuitpy/feather_m4_can/uf2s/adafruit-circuitpython-feather_m4_can-en_US-7.3.2.uf2 /mnt/d/\n"})})]})]}),"\n",(0,r.jsx)(n.h3,{id:"on-subsequent-connection",children:"On subsequent connection"}),"\n",(0,r.jsxs)(n.p,{children:["When attaching a previously flashed Feather M4 device, it should automatically mount as ",(0,r.jsx)(n.code,{children:"CIRCUITPY"}),".\nYou can always check the our ",(0,r.jsx)(n.a,{href:"https://github.com/farm-ng/amiga-dev-kit/tree/main/circuitpy/feather_m4_can/uf2s",children:(0,r.jsx)(n.strong,{children:"farm-ng adk uf2 dir"})})," or the ",(0,r.jsx)(n.a,{href:"https://circuitpython.org/board/feather_m4_can/",children:"Feather M4 CAN UF2 page"})," for future stable & experimental releases."]}),"\n",(0,r.jsx)(n.h2,{id:"loading-code-on-the-feather",children:"Loading code on the Feather"}),"\n",(0,r.jsx)(n.p,{children:"Now that you have a flashed Feather, time to load some code:"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Copy the ",(0,r.jsx)(n.code,{children:"lib/"})," folder from ",(0,r.jsx)(n.a,{href:"https://github.com/farm-ng/amiga-dev-kit/tree/main/circuitpy",children:(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"amiga-dev-kit/circuitpy/"})})})," to the root of the Feather. The contents of ",(0,r.jsx)(n.code,{children:"lib/"})," are automatically added to your python path on the microcontroller."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Attach a serial terminal to the feather, so you can see std out."}),"\n",(0,r.jsxs)(o.Z,{children:[(0,r.jsx)(a.Z,{value:"linux",label:"Linux",default:!0,children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"screen /dev/ttyACM0\n"})})}),(0,r.jsxs)(a.Z,{value:"macos",label:"MacOs",children:[(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsxs)(n.p,{children:["Use autocomplete to get the correct usb modem ",(0,r.jsx)(n.code,{children:".../tty.usb[tab_for_autocomplete]"})]})}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"screen /dev/tty./dev/tty.usbmodem14201\n"})})]})]}),"\n",(0,r.jsxs)(n.admonition,{type:"tip",children:[(0,r.jsxs)(n.p,{children:["Mu is the recommended serial console program by adafruit on their ",(0,r.jsx)(n.a,{href:"https://learn.adafruit.com/welcome-to-circuitpython/kattni-connecting-to-the-serial-console",children:(0,r.jsx)(n.strong,{children:"CircuitPython serial console page"})}),".\nMu has a built in plotter for tuples printed to the serial console (print statements in the python code on your microcontroller)."]}),(0,r.jsx)(n.p,{children:"However, we've found that Mu can be a little unstable and freezes occasionally,\nso we'd recommend checking out their links for the \"advanced\" serial console:"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://learn.adafruit.com/welcome-to-circuitpython/advanced-serial-console-on-windows",children:(0,r.jsx)(n.strong,{children:"Windows serial console"})})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://learn.adafruit.com/welcome-to-circuitpython/advanced-serial-console-on-linux",children:(0,r.jsx)(n.strong,{children:"Linux serial console"})})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://learn.adafruit.com/welcome-to-circuitpython/advanced-serial-console-on-mac-and-linux",children:(0,r.jsx)(n.strong,{children:"Mac serial console"})})}),"\n"]})]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Now add a ",(0,r.jsx)(n.code,{children:"code.py"})," file to the root of the Feather drive. Try one of the examples found in the ",(0,r.jsx)(n.a,{href:"/docs/examples/examples-index",children:(0,r.jsx)(n.strong,{children:"Examples index"})}),", such as the ",(0,r.jsx)(n.a,{href:"./../examples/hello_main_loop/",children:(0,r.jsx)(n.strong,{children:"Hello Main Loop example"})}),"."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.admonition,{type:"note",children:[(0,r.jsx)(n.p,{children:"The feather should automatically reload when you drop any new code onto it."}),(0,r.jsxs)(n.p,{children:["The feather automatically runs the file named ",(0,r.jsx)(n.code,{children:"code.py"}),"\nand adds the contents of the ",(0,r.jsx)(n.code,{children:"lib/"})," directory to the python path."]})]}),"\n",(0,r.jsx)(n.p,{children:"You can also reload through the serial console by:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Cancelling the current execution with ",(0,r.jsx)(n.code,{children:"crtl+C"})]}),"\n",(0,r.jsxs)(n.li,{children:["Reloading with ",(0,r.jsx)(n.code,{children:"ctrl+D"})]}),"\n"]}),"\n",(0,r.jsx)(n.h1,{id:"feather-m4-references",children:"Feather M4 references"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://learn.adafruit.com/circuitpython-essentials/circuitpython-essentials",children:(0,r.jsx)(n.strong,{children:"Adafruit CircuitPython programming guide"})})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://learn.adafruit.com/adafruit-feather-m4-can-express",children:(0,r.jsx)(n.strong,{children:"Adafruit Feather M4 CAN Express"})})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://learn.adafruit.com/adafruit-feather-m4-can-express/circuitpython-on-feather-m4-can",children:(0,r.jsx)(n.strong,{children:"CircuitPython on Feather M4 CAN"})})}),"\n"]})]})}function m(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}},5162:(e,n,t)=>{t.d(n,{Z:()=>a});t(7294);var r=t(6010);const i={tabItem:"tabItem_Ymn6"};var o=t(5893);function a(e){let{children:n,hidden:t,className:a}=e;return(0,o.jsx)("div",{role:"tabpanel",className:(0,r.Z)(i.tabItem,a),hidden:t,children:n})}},4866:(e,n,t)=>{t.d(n,{Z:()=>w});var r=t(7294),i=t(6010),o=t(2466),a=t(6550),s=t(469),c=t(1980),l=t(7392),h=t(12);function d(e){return r.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function u(e){const{values:n,children:t}=e;return(0,r.useMemo)((()=>{const e=n??function(e){return d(e).map((e=>{let{props:{value:n,label:t,attributes:r,default:i}}=e;return{value:n,label:t,attributes:r,default:i}}))}(t);return function(e){const n=(0,l.l)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function m(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function p(e){let{queryString:n=!1,groupId:t}=e;const i=(0,a.k6)(),o=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,c._X)(o),(0,r.useCallback)((e=>{if(!o)return;const n=new URLSearchParams(i.location.search);n.set(o,e),i.replace({...i.location,search:n.toString()})}),[o,i])]}function f(e){const{defaultValue:n,queryString:t=!1,groupId:i}=e,o=u(e),[a,c]=(0,r.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!m({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const r=t.find((e=>e.default))??t[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:o}))),[l,d]=p({queryString:t,groupId:i}),[f,x]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[i,o]=(0,h.Nk)(t);return[i,(0,r.useCallback)((e=>{t&&o.set(e)}),[t,o])]}({groupId:i}),j=(()=>{const e=l??f;return m({value:e,tabValues:o})?e:null})();(0,s.Z)((()=>{j&&c(j)}),[j]);return{selectedValue:a,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);c(e),d(e),x(e)}),[d,x,o]),tabValues:o}}var x=t(2389);const j={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var g=t(5893);function b(e){let{className:n,block:t,selectedValue:r,selectValue:a,tabValues:s}=e;const c=[],{blockElementScrollPositionUntilNextRender:l}=(0,o.o5)(),h=e=>{const n=e.currentTarget,t=c.indexOf(n),i=s[t].value;i!==r&&(l(n),a(i))},d=e=>{let n=null;switch(e.key){case"Enter":h(e);break;case"ArrowRight":{const t=c.indexOf(e.currentTarget)+1;n=c[t]??c[0];break}case"ArrowLeft":{const t=c.indexOf(e.currentTarget)-1;n=c[t]??c[c.length-1];break}}n?.focus()};return(0,g.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,i.Z)("tabs",{"tabs--block":t},n),children:s.map((e=>{let{value:n,label:t,attributes:o}=e;return(0,g.jsx)("li",{role:"tab",tabIndex:r===n?0:-1,"aria-selected":r===n,ref:e=>c.push(e),onKeyDown:d,onClick:h,...o,className:(0,i.Z)("tabs__item",j.tabItem,o?.className,{"tabs__item--active":r===n}),children:t??n},n)}))})}function y(e){let{lazy:n,children:t,selectedValue:i}=e;const o=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=o.find((e=>e.props.value===i));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return(0,g.jsx)("div",{className:"margin-top--md",children:o.map(((e,n)=>(0,r.cloneElement)(e,{key:n,hidden:e.props.value!==i})))})}function v(e){const n=f(e);return(0,g.jsxs)("div",{className:(0,i.Z)("tabs-container",j.tabList),children:[(0,g.jsx)(b,{...e,...n}),(0,g.jsx)(y,{...e,...n})]})}function w(e){const n=(0,x.Z)();return(0,g.jsx)(v,{...e,children:d(e.children)},String(n))}},1151:(e,n,t)=>{t.d(n,{Z:()=>s,a:()=>a});var r=t(7294);const i={},o=r.createContext(i);function a(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2a6f4879.b4ffe72c.js b/assets/js/2a6f4879.b4ffe72c.js deleted file mode 100644 index 7e6baa29a..000000000 --- a/assets/js/2a6f4879.b4ffe72c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkamiga_developers_website=self.webpackChunkamiga_developers_website||[]).push([[4149],{770:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>d,default:()=>h,frontMatter:()=>s,metadata:()=>c,toc:()=>l});var i=t(5893),r=t(1151);const s={id:"debug-cable",title:"Debug Cable Overview"},d="farm-ng Debug Cable",c={id:"debug_cable/debug-cable",title:"Debug Cable Overview",description:"image",source:"@site/docs/debug_cable/README.md",sourceDirName:"debug_cable",slug:"/debug_cable/",permalink:"/docs/debug_cable/",draft:!1,unlisted:!1,editUrl:"https://github.com/farm-ng/amiga-dev-kit/tree/main/website/docs/debug_cable/README.md",tags:[],version:"current",frontMatter:{id:"debug-cable",title:"Debug Cable Overview"},sidebar:"Developer",previous:{title:"Microcontroller Kit Overview",permalink:"/docs/mcu_kit/"},next:{title:"Service Cable Overview",permalink:"/docs/debug_cable/service-cable"}},o={},l=[{value:"Overview",id:"overview",level:2},{value:"Product specific uses",id:"product-specific-uses",level:3},{value:"How to Connect",id:"how-to-connect",level:4},{value:"Dash",id:"dash",level:4},{value:"Brain",id:"brain",level:4},{value:"Pinout",id:"pinout",level:2}];function a(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"farm-ng-debug-cable",children:"farm-ng Debug Cable"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://user-images.githubusercontent.com/64480560/236905673-456671a1-9930-416b-af00-9c489addc206.png",alt:"image"})}),"\n",(0,i.jsx)(n.h2,{id:"overview",children:"Overview"}),"\n",(0,i.jsx)(n.p,{children:"Cable is used to update and debug farm-ng products.\nIt includes reset functionality along with USB and serial communication."}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"debug cable"})," has a single circuit board with two ports connected to it.\nOn the left is the USB / debug breakout, and on the right is the serial interface."]}),"\n",(0,i.jsx)(n.admonition,{type:"caution",children:(0,i.jsx)(n.p,{children:"It is required to have a data USB-C cable and not a charge only USB-C cable\nwhen connecting to the debug or service cable."})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://user-images.githubusercontent.com/64480560/205400599-f79e0cae-35f3-4610-bbcf-9a4e50857fac.jpg",alt:"IMG_9578"})}),"\n",(0,i.jsx)(n.h3,{id:"product-specific-uses",children:"Product specific uses"}),"\n",(0,i.jsx)(n.h4,{id:"how-to-connect",children:"How to Connect"}),"\n",(0,i.jsx)(n.p,{children:"Connect cable to the debug port on the back of the dashboard"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://user-images.githubusercontent.com/64480560/206007745-b36c59c7-22dd-4435-9cae-8503956174f3.png",alt:"187535995-d4ad8c7c-05a0-482b-8be9-6b6fb6b87ac3"})}),"\n",(0,i.jsx)(n.h4,{id:"dash",children:"Dash"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"USB interface is for REPL, filesystem access as well as\nupdating firmware and applications,"}),"\n",(0,i.jsx)(n.li,{children:"Serial interface is not used at the moment"}),"\n",(0,i.jsx)(n.li,{children:"A reset button is connected to the Microcontroller and used for\nhard reset. It also can be double pressed to force bootloader\nmode."}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsxs)(n.strong,{children:["See update process documentation for more information ",(0,i.jsx)(n.a,{href:"/docs/dashboard/dashboard-fw",children:"here"})]})}),"\n",(0,i.jsx)(n.h4,{id:"brain",children:"Brain"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"USB interface is used for connecting for lashing images"}),"\n",(0,i.jsx)(n.li,{children:"Serial interface is used for operating system terminal"}),"\n",(0,i.jsx)(n.li,{children:"Reset / Flash button is used for enabling the firmware update\nmode (press on boot)"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsxs)(n.strong,{children:["For more flashing and operating system documentation go ",(0,i.jsx)(n.a,{href:"/docs/intelligence-kit/brain/brain-v2/",children:"here"})]})}),"\n",(0,i.jsx)(n.h2,{id:"pinout",children:"Pinout"}),"\n",(0,i.jsx)(n.p,{children:"Connector M12-8 A code female used to connect to farm-ng products.\nThe debug cable connects the IO to two MicroUSB connectors and a reset button."}),"\n",(0,i.jsx)(n.p,{children:"Debug wire colors based on common cable with flying leads used on\nfarm-ng built debug kits."}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"PIN"}),(0,i.jsx)(n.th,{children:"Description"}),(0,i.jsx)(n.th,{children:"Typical Wire Color"}),(0,i.jsx)(n.th,{children:"Notes"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"1"}),(0,i.jsx)(n.td,{children:"RESET"}),(0,i.jsx)(n.td,{children:"Black"}),(0,i.jsx)(n.td,{})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"2"}),(0,i.jsx)(n.td,{children:"TTL RX (3.3v)"}),(0,i.jsx)(n.td,{children:"Brown"}),(0,i.jsx)(n.td,{children:"Connect to TX of interface"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"3"}),(0,i.jsx)(n.td,{children:"TTL TX (3.3v)"}),(0,i.jsx)(n.td,{children:"Red"}),(0,i.jsx)(n.td,{children:"Connect to RX of interface"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"4"}),(0,i.jsx)(n.td,{children:"USB D-"}),(0,i.jsx)(n.td,{children:"Yellow"}),(0,i.jsx)(n.td,{})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"5"}),(0,i.jsx)(n.td,{children:"UDB D+"}),(0,i.jsx)(n.td,{children:"Green"}),(0,i.jsx)(n.td,{})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"6"}),(0,i.jsx)(n.td,{children:"USB VBUS"}),(0,i.jsx)(n.td,{children:"Blue"}),(0,i.jsx)(n.td,{})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"7"}),(0,i.jsx)(n.td,{children:"NC"}),(0,i.jsx)(n.td,{children:"Gray"}),(0,i.jsx)(n.td,{})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"8"}),(0,i.jsx)(n.td,{children:"GND"}),(0,i.jsx)(n.td,{children:"White"}),(0,i.jsx)(n.td,{})]})]})]})]})}function h(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>c,a:()=>d});var i=t(7294);const r={},s=i.createContext(r);function d(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:d(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2a6f4879.ee663a4e.js b/assets/js/2a6f4879.ee663a4e.js new file mode 100644 index 000000000..b690db00e --- /dev/null +++ b/assets/js/2a6f4879.ee663a4e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkamiga_developers_website=self.webpackChunkamiga_developers_website||[]).push([[4149],{770:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>d,default:()=>h,frontMatter:()=>r,metadata:()=>c,toc:()=>o});var i=t(5893),s=t(1151);const r={id:"debug-cable",title:"Debug Cable Overview"},d="farm-ng Debug Cable",c={id:"debug_cable/debug-cable",title:"Debug Cable Overview",description:"image",source:"@site/docs/debug_cable/README.md",sourceDirName:"debug_cable",slug:"/debug_cable/",permalink:"/docs/debug_cable/",draft:!1,unlisted:!1,editUrl:"https://github.com/farm-ng/amiga-dev-kit/tree/main/website/docs/debug_cable/README.md",tags:[],version:"current",frontMatter:{id:"debug-cable",title:"Debug Cable Overview"},sidebar:"User Manual",previous:{title:"Service Cable Overview",permalink:"/docs/debug_cable/service-cable"}},l={},o=[{value:"Overview",id:"overview",level:2},{value:"Product specific uses",id:"product-specific-uses",level:3},{value:"How to Connect",id:"how-to-connect",level:4},{value:"Dash",id:"dash",level:4},{value:"Brain",id:"brain",level:4},{value:"Pinout",id:"pinout",level:2}];function a(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"farm-ng-debug-cable",children:"farm-ng Debug Cable"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://user-images.githubusercontent.com/64480560/236905673-456671a1-9930-416b-af00-9c489addc206.png",alt:"image"})}),"\n",(0,i.jsx)(n.h2,{id:"overview",children:"Overview"}),"\n",(0,i.jsx)(n.p,{children:"Cable is used to update and debug farm-ng products.\nIt includes reset functionality along with USB and serial communication."}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"debug cable"})," has a single circuit board with two ports connected to it.\nOn the left is the USB / debug breakout, and on the right is the serial interface."]}),"\n",(0,i.jsx)(n.admonition,{type:"caution",children:(0,i.jsx)(n.p,{children:"It is required to have a data USB-C cable and not a charge only USB-C cable\nwhen connecting to the debug or service cable."})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://user-images.githubusercontent.com/64480560/205400599-f79e0cae-35f3-4610-bbcf-9a4e50857fac.jpg",alt:"IMG_9578"})}),"\n",(0,i.jsx)(n.h3,{id:"product-specific-uses",children:"Product specific uses"}),"\n",(0,i.jsx)(n.h4,{id:"how-to-connect",children:"How to Connect"}),"\n",(0,i.jsx)(n.p,{children:"Connect cable to the debug port on the back of the dashboard"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://user-images.githubusercontent.com/64480560/206007745-b36c59c7-22dd-4435-9cae-8503956174f3.png",alt:"187535995-d4ad8c7c-05a0-482b-8be9-6b6fb6b87ac3"})}),"\n",(0,i.jsx)(n.h4,{id:"dash",children:"Dash"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"USB interface is for REPL, filesystem access as well as\nupdating firmware and applications,"}),"\n",(0,i.jsx)(n.li,{children:"Serial interface is not used at the moment"}),"\n",(0,i.jsx)(n.li,{children:"A reset button is connected to the Microcontroller and used for\nhard reset. It also can be double pressed to force bootloader\nmode."}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsxs)(n.strong,{children:["See update process documentation for more information ",(0,i.jsx)(n.a,{href:"/docs/dashboard/dashboard-fw",children:"here"})]})}),"\n",(0,i.jsx)(n.h4,{id:"brain",children:"Brain"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"USB interface is used for connecting for lashing images"}),"\n",(0,i.jsx)(n.li,{children:"Serial interface is used for operating system terminal"}),"\n",(0,i.jsx)(n.li,{children:"Reset / Flash button is used for enabling the firmware update\nmode (press on boot)"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsxs)(n.strong,{children:["For more flashing and operating system documentation go ",(0,i.jsx)(n.a,{href:"/docs/intelligence-kit/brain/brain-v2/",children:"here"})]})}),"\n",(0,i.jsx)(n.h2,{id:"pinout",children:"Pinout"}),"\n",(0,i.jsx)(n.p,{children:"Connector M12-8 A code female used to connect to farm-ng products.\nThe debug cable connects the IO to two MicroUSB connectors and a reset button."}),"\n",(0,i.jsx)(n.p,{children:"Debug wire colors based on common cable with flying leads used on\nfarm-ng built debug kits."}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"PIN"}),(0,i.jsx)(n.th,{children:"Description"}),(0,i.jsx)(n.th,{children:"Typical Wire Color"}),(0,i.jsx)(n.th,{children:"Notes"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"1"}),(0,i.jsx)(n.td,{children:"RESET"}),(0,i.jsx)(n.td,{children:"Black"}),(0,i.jsx)(n.td,{})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"2"}),(0,i.jsx)(n.td,{children:"TTL RX (3.3v)"}),(0,i.jsx)(n.td,{children:"Brown"}),(0,i.jsx)(n.td,{children:"Connect to TX of interface"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"3"}),(0,i.jsx)(n.td,{children:"TTL TX (3.3v)"}),(0,i.jsx)(n.td,{children:"Red"}),(0,i.jsx)(n.td,{children:"Connect to RX of interface"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"4"}),(0,i.jsx)(n.td,{children:"USB D-"}),(0,i.jsx)(n.td,{children:"Yellow"}),(0,i.jsx)(n.td,{})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"5"}),(0,i.jsx)(n.td,{children:"UDB D+"}),(0,i.jsx)(n.td,{children:"Green"}),(0,i.jsx)(n.td,{})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"6"}),(0,i.jsx)(n.td,{children:"USB VBUS"}),(0,i.jsx)(n.td,{children:"Blue"}),(0,i.jsx)(n.td,{})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"7"}),(0,i.jsx)(n.td,{children:"NC"}),(0,i.jsx)(n.td,{children:"Gray"}),(0,i.jsx)(n.td,{})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"8"}),(0,i.jsx)(n.td,{children:"GND"}),(0,i.jsx)(n.td,{children:"White"}),(0,i.jsx)(n.td,{})]})]})]})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>c,a:()=>d});var i=t(7294);const s={},r=i.createContext(s);function d(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:d(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5aa65751.45fd12ef.js b/assets/js/5aa65751.45fd12ef.js deleted file mode 100644 index bd5ed690b..000000000 --- a/assets/js/5aa65751.45fd12ef.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkamiga_developers_website=self.webpackChunkamiga_developers_website||[]).push([[5666],{6488:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>l,frontMatter:()=>a,metadata:()=>h,toc:()=>d});var i=n(5893),s=n(1151);const a={id:"three-point",title:"Installation Guide"},r="Three Point Lift Installation Guide",h={id:"farm-tools/three-point",title:"Installation Guide",description:"This guide is a step by step instruction on how to assemble the farm-ng three",source:"@site/docs/farm-tools/three-point.md",sourceDirName:"farm-tools",slug:"/farm-tools/three-point",permalink:"/docs/farm-tools/three-point",draft:!1,unlisted:!1,editUrl:"https://github.com/farm-ng/amiga-dev-kit/tree/main/website/docs/farm-tools/three-point.md",tags:[],version:"current",frontMatter:{id:"three-point",title:"Installation Guide"},sidebar:"User Manual",previous:{title:"Camera App",permalink:"/docs/apps/camera_app/"}},c={},d=[{value:"Included Hardware",id:"included-hardware",level:2},{value:"Tools needed",id:"tools-needed",level:2},{value:"Assembly",id:"assembly",level:2}];function o(e){const t={a:"a",admonition:"admonition",h1:"h1",h2:"h2",li:"li",ol:"ol",p:"p",strong:"strong",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h1,{id:"three-point-lift-installation-guide",children:"Three Point Lift Installation Guide"}),"\n",(0,i.jsx)(t.p,{children:"This guide is a step by step instruction on how to assemble the farm-ng three\npoint lift."}),"\n",(0,i.jsx)(t.admonition,{type:"caution",children:(0,i.jsxs)(t.p,{children:["If you are missing any necessary pieces, please contact ",(0,i.jsx)(t.a,{href:"https://amiga.farm-ng.com/docs/support/",children:"farm-ng"}),"\nimmediately."]})}),"\n",(0,i.jsx)(t.h2,{id:"included-hardware",children:"Included Hardware"}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"24"}),' Carriage bolts 3/8" by 1 1/4"']}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"24"}),' Flat Washers 3/8"']}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"24"}),' Nylon Insert Locknut 3/8"']}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"4"}),' Hex Cap Screw 5/8" x 3"']}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"12"}),' Flat Washers 5/8"']}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"2"}),' Hex Cap Screw 5/8 x 2 1/4"']}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"6"}),' Hex Nut 5/8"']}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"tools-needed",children:"Tools needed"}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsx)(t.li,{children:"Socket wrenches"}),"\n",(0,i.jsx)(t.li,{children:"Socket sizes above"}),"\n",(0,i.jsx)(t.li,{children:"Needle nose pliers for bending the cotter pins on the top cylinder connection."}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"assembly",children:"Assembly"}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"Mount the 3 point brackets centered on the Amiga cross bars using universal clamps and related hardware."}),"\n",(0,i.jsx)("img",{src:"https://github.com/farm-ng/amiga-dev-kit/assets/64480560/b5911e9b-98e1-4b2a-ba67-e01fe1f77422",width:"500",height:"300"}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"Mount to the 3 point backplate to the brackets in the following way."}),"\n",(0,i.jsx)("img",{src:"https://github.com/farm-ng/amiga-dev-kit/assets/64480560/17460082-5160-40f3-ad39-97a8044e5a7e",width:"600",height:"200"}),"\n",(0,i.jsx)("img",{src:"https://github.com/farm-ng/amiga-dev-kit/assets/64480560/e051765c-3b6d-4058-8cbf-69742ecf35ba",width:"200",height:"190"}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"Mount the upper 3 point linkage to the 3point back plate."}),"\n",(0,i.jsx)("img",{src:"https://github.com/farm-ng/amiga-dev-kit/assets/64480560/0d96efa8-735d-4670-a19a-8efb99629a05",width:"510",height:"200"}),"\n",(0,i.jsx)("img",{src:"https://github.com/farm-ng/amiga-dev-kit/assets/64480560/6df75a7a-d632-46e8-92c0-2c852139068d",width:"200",height:"200"}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"Secure the arm brackets to the 3 point backplate."}),"\n",(0,i.jsx)("img",{src:"https://github.com/farm-ng/amiga-dev-kit/assets/64480560/079fd062-3fc6-4840-97af-34ca0d2e03e6",width:"500",height:"300"}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"Connect the upper 3 point linkage to the arm brackets with the adjustable lift arms."}),"\n",(0,i.jsx)("img",{src:"https://github.com/farm-ng/amiga-dev-kit/assets/64480560/9a17f13c-6550-4ecc-918c-db76a4364955",width:"474",height:"200"}),"\n",(0,i.jsx)("img",{src:"https://github.com/farm-ng/amiga-dev-kit/assets/64480560/bc830964-4b00-49d9-93ab-343732594661",width:"200",height:"200"}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"Connect the turnbuckles to the arm links and the 3 point backplate."}),"\n",(0,i.jsx)("img",{src:"https://github.com/farm-ng/amiga-dev-kit/assets/64480560/8282a4b6-6976-4fca-a39d-a7e040acaed9",width:"320",height:"200"}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"Connect the 3point cylinder actuator to back plate and the upper 3point linkage."}),"\n",(0,i.jsx)("img",{src:"https://github.com/farm-ng/amiga-dev-kit/assets/64480560/451e1e25-c493-400f-9d7b-5c0009677ed3",width:"280",height:"200"}),"\n",(0,i.jsx)("img",{src:"https://github.com/farm-ng/amiga-dev-kit/assets/64480560/f091ba54-53f7-45df-b9d1-3eff3fbdbed5",width:"280",height:"200"}),"\n",(0,i.jsx)("img",{src:"https://github.com/farm-ng/amiga-dev-kit/assets/64480560/25db5975-db23-472d-8359-db72afbdb3eb",width:"280",height:"200"}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"Attach the adjustable top link to the 3 point backplate."}),"\n",(0,i.jsx)("img",{src:"https://github.com/farm-ng/amiga-dev-kit/assets/64480560/277f2a9d-bdd1-4648-8061-231c078561fa",width:"320",height:"200"}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"In the fork closest to the dashboard, add T to the existing E-stop connection."}),"\n",(0,i.jsx)("img",{src:"https://github.com/farm-ng/amiga-dev-kit/assets/64480560/b87996ac-8934-416b-a2ad-e506e92f1224",width:"280",height:"200"}),"\n",(0,i.jsx)("img",{src:"https://github.com/farm-ng/amiga-dev-kit/assets/64480560/aae1e52c-e267-420c-b49c-03c273893354",width:"280",height:"200"}),"\n",(0,i.jsx)("img",{src:"https://github.com/farm-ng/amiga-dev-kit/assets/64480560/82249dd7-bde9-45d4-855c-c78f890ea964",width:"320",height:"320"}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"Attach a CAN cable to the CAN hub."}),"\n",(0,i.jsx)("img",{src:"https://github.com/farm-ng/amiga-dev-kit/assets/64480560/3e652b3a-9456-4ae1-a032-57fab9f0b86b",width:"320",height:"200"}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"Connect E-stop and CAN cables to H-bridge bringing power to it from the main harness."}),"\n",(0,i.jsx)("img",{src:"https://github.com/farm-ng/amiga-dev-kit/assets/64480560/f511a27b-5d08-427e-bcf4-e42fc5444ba8",width:"500",height:"200"}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"Connect power to the 3point cylinder ( please note lower connection)."}),"\n",(0,i.jsx)("img",{src:"https://github.com/farm-ng/amiga-dev-kit/assets/64480560/545fb266-4bd9-4138-93b8-450a327061be",width:"500",height:"200"}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"Your result should represent the image below."}),"\n",(0,i.jsx)("img",{src:"https://github.com/farm-ng/amiga-dev-kit/assets/64480560/b483ace5-9836-43b0-9b5e-8597bf8e8fc6",width:"500",height:"200"}),"\n"]}),"\n"]})]})}function l(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(o,{...e})}):o(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>h,a:()=>r});var i=n(7294);const s={},a=i.createContext(s);function r(e){const t=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function h(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5aa65751.9eb2e443.js b/assets/js/5aa65751.9eb2e443.js new file mode 100644 index 000000000..7de4513d8 --- /dev/null +++ b/assets/js/5aa65751.9eb2e443.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkamiga_developers_website=self.webpackChunkamiga_developers_website||[]).push([[5666],{6488:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>l,frontMatter:()=>a,metadata:()=>h,toc:()=>d});var i=n(5893),s=n(1151);const a={id:"three-point",title:"Installation Guide"},r="Three Point Lift Installation Guide",h={id:"farm-tools/three-point",title:"Installation Guide",description:"This guide is a step by step instruction on how to assemble the farm-ng three",source:"@site/docs/farm-tools/three-point.md",sourceDirName:"farm-tools",slug:"/farm-tools/three-point",permalink:"/docs/farm-tools/three-point",draft:!1,unlisted:!1,editUrl:"https://github.com/farm-ng/amiga-dev-kit/tree/main/website/docs/farm-tools/three-point.md",tags:[],version:"current",frontMatter:{id:"three-point",title:"Installation Guide"},sidebar:"User Manual",previous:{title:"Camera App",permalink:"/docs/apps/camera_app/"},next:{title:"Service Cable Overview",permalink:"/docs/debug_cable/service-cable"}},c={},d=[{value:"Included Hardware",id:"included-hardware",level:2},{value:"Tools needed",id:"tools-needed",level:2},{value:"Assembly",id:"assembly",level:2}];function o(e){const t={a:"a",admonition:"admonition",h1:"h1",h2:"h2",li:"li",ol:"ol",p:"p",strong:"strong",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h1,{id:"three-point-lift-installation-guide",children:"Three Point Lift Installation Guide"}),"\n",(0,i.jsx)(t.p,{children:"This guide is a step by step instruction on how to assemble the farm-ng three\npoint lift."}),"\n",(0,i.jsx)(t.admonition,{type:"caution",children:(0,i.jsxs)(t.p,{children:["If you are missing any necessary pieces, please contact ",(0,i.jsx)(t.a,{href:"https://amiga.farm-ng.com/docs/support/",children:"farm-ng"}),"\nimmediately."]})}),"\n",(0,i.jsx)(t.h2,{id:"included-hardware",children:"Included Hardware"}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"24"}),' Carriage bolts 3/8" by 1 1/4"']}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"24"}),' Flat Washers 3/8"']}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"24"}),' Nylon Insert Locknut 3/8"']}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"4"}),' Hex Cap Screw 5/8" x 3"']}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"12"}),' Flat Washers 5/8"']}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"2"}),' Hex Cap Screw 5/8 x 2 1/4"']}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"6"}),' Hex Nut 5/8"']}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"tools-needed",children:"Tools needed"}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsx)(t.li,{children:"Socket wrenches"}),"\n",(0,i.jsx)(t.li,{children:"Socket sizes above"}),"\n",(0,i.jsx)(t.li,{children:"Needle nose pliers for bending the cotter pins on the top cylinder connection."}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"assembly",children:"Assembly"}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"Mount the 3 point brackets centered on the Amiga cross bars using universal clamps and related hardware."}),"\n",(0,i.jsx)("img",{src:"https://github.com/farm-ng/amiga-dev-kit/assets/64480560/b5911e9b-98e1-4b2a-ba67-e01fe1f77422",width:"500",height:"300"}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"Mount to the 3 point backplate to the brackets in the following way."}),"\n",(0,i.jsx)("img",{src:"https://github.com/farm-ng/amiga-dev-kit/assets/64480560/17460082-5160-40f3-ad39-97a8044e5a7e",width:"600",height:"200"}),"\n",(0,i.jsx)("img",{src:"https://github.com/farm-ng/amiga-dev-kit/assets/64480560/e051765c-3b6d-4058-8cbf-69742ecf35ba",width:"200",height:"190"}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"Mount the upper 3 point linkage to the 3point back plate."}),"\n",(0,i.jsx)("img",{src:"https://github.com/farm-ng/amiga-dev-kit/assets/64480560/0d96efa8-735d-4670-a19a-8efb99629a05",width:"510",height:"200"}),"\n",(0,i.jsx)("img",{src:"https://github.com/farm-ng/amiga-dev-kit/assets/64480560/6df75a7a-d632-46e8-92c0-2c852139068d",width:"200",height:"200"}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"Secure the arm brackets to the 3 point backplate."}),"\n",(0,i.jsx)("img",{src:"https://github.com/farm-ng/amiga-dev-kit/assets/64480560/079fd062-3fc6-4840-97af-34ca0d2e03e6",width:"500",height:"300"}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"Connect the upper 3 point linkage to the arm brackets with the adjustable lift arms."}),"\n",(0,i.jsx)("img",{src:"https://github.com/farm-ng/amiga-dev-kit/assets/64480560/9a17f13c-6550-4ecc-918c-db76a4364955",width:"474",height:"200"}),"\n",(0,i.jsx)("img",{src:"https://github.com/farm-ng/amiga-dev-kit/assets/64480560/bc830964-4b00-49d9-93ab-343732594661",width:"200",height:"200"}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"Connect the turnbuckles to the arm links and the 3 point backplate."}),"\n",(0,i.jsx)("img",{src:"https://github.com/farm-ng/amiga-dev-kit/assets/64480560/8282a4b6-6976-4fca-a39d-a7e040acaed9",width:"320",height:"200"}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"Connect the 3point cylinder actuator to back plate and the upper 3point linkage."}),"\n",(0,i.jsx)("img",{src:"https://github.com/farm-ng/amiga-dev-kit/assets/64480560/451e1e25-c493-400f-9d7b-5c0009677ed3",width:"280",height:"200"}),"\n",(0,i.jsx)("img",{src:"https://github.com/farm-ng/amiga-dev-kit/assets/64480560/f091ba54-53f7-45df-b9d1-3eff3fbdbed5",width:"280",height:"200"}),"\n",(0,i.jsx)("img",{src:"https://github.com/farm-ng/amiga-dev-kit/assets/64480560/25db5975-db23-472d-8359-db72afbdb3eb",width:"280",height:"200"}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"Attach the adjustable top link to the 3 point backplate."}),"\n",(0,i.jsx)("img",{src:"https://github.com/farm-ng/amiga-dev-kit/assets/64480560/277f2a9d-bdd1-4648-8061-231c078561fa",width:"320",height:"200"}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"In the fork closest to the dashboard, add T to the existing E-stop connection."}),"\n",(0,i.jsx)("img",{src:"https://github.com/farm-ng/amiga-dev-kit/assets/64480560/b87996ac-8934-416b-a2ad-e506e92f1224",width:"280",height:"200"}),"\n",(0,i.jsx)("img",{src:"https://github.com/farm-ng/amiga-dev-kit/assets/64480560/aae1e52c-e267-420c-b49c-03c273893354",width:"280",height:"200"}),"\n",(0,i.jsx)("img",{src:"https://github.com/farm-ng/amiga-dev-kit/assets/64480560/82249dd7-bde9-45d4-855c-c78f890ea964",width:"320",height:"320"}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"Attach a CAN cable to the CAN hub."}),"\n",(0,i.jsx)("img",{src:"https://github.com/farm-ng/amiga-dev-kit/assets/64480560/3e652b3a-9456-4ae1-a032-57fab9f0b86b",width:"320",height:"200"}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"Connect E-stop and CAN cables to H-bridge bringing power to it from the main harness."}),"\n",(0,i.jsx)("img",{src:"https://github.com/farm-ng/amiga-dev-kit/assets/64480560/f511a27b-5d08-427e-bcf4-e42fc5444ba8",width:"500",height:"200"}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"Connect power to the 3point cylinder ( please note lower connection)."}),"\n",(0,i.jsx)("img",{src:"https://github.com/farm-ng/amiga-dev-kit/assets/64480560/545fb266-4bd9-4138-93b8-450a327061be",width:"500",height:"200"}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"Your result should represent the image below."}),"\n",(0,i.jsx)("img",{src:"https://github.com/farm-ng/amiga-dev-kit/assets/64480560/b483ace5-9836-43b0-9b5e-8597bf8e8fc6",width:"500",height:"200"}),"\n"]}),"\n"]})]})}function l(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(o,{...e})}):o(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>h,a:()=>r});var i=n(7294);const s={},a=i.createContext(s);function r(e){const t=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function h(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.44d76863.js b/assets/js/935f2afb.44d76863.js new file mode 100644 index 000000000..5fd69e81a --- /dev/null +++ b/assets/js/935f2afb.44d76863.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkamiga_developers_website=self.webpackChunkamiga_developers_website||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"User Manual":[{"type":"link","label":"Quick Start Guide","href":"/docs/amiga_quick_start/amiga-quick-start","docId":"amiga_quick_start/amiga-quick-start","unlisted":false},{"items":[{"type":"link","label":"Dashboard Overview","href":"/docs/dashboard/dashboard-overview","docId":"dashboard/dashboard-overview","unlisted":false},{"type":"link","label":"Dashboard User Guide","href":"/docs/dashboard/dashboard-user-guide","docId":"dashboard/dashboard-user-guide","unlisted":false},{"type":"link","label":"Amiga Control States","href":"/docs/dashboard/control-states","docId":"dashboard/control-states","unlisted":false},{"type":"link","label":"Dashboard Firmware Updates","href":"/docs/dashboard/dashboard-fw","docId":"dashboard/dashboard-fw","unlisted":false},{"type":"link","label":"Debugging error codes","href":"/docs/dashboard/dashboard-debugging","docId":"dashboard/dashboard-debugging","unlisted":false}],"label":"Dashboard","type":"category","collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"Pendant Overview","href":"/docs/pendant/","docId":"pendant/pendant","unlisted":false}],"label":"Pendant","type":"category","collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"Intelligence Kit Overview","href":"/docs/intelligence-kit/overview-intel","docId":"intelligence-kit/overview-intel","unlisted":false},{"type":"link","label":"Brain v2.0","href":"/docs/intelligence-kit/brain/brain-v2","docId":"intelligence-kit/brain/brain-v2","unlisted":false}],"label":"Intelligence Kit","type":"category","collapsed":true,"collapsible":true},{"type":"category","label":"App Overviews","items":[{"type":"link","label":"Filter App","href":"/docs/apps/filter_app/","docId":"apps/filter_app/filter-app","unlisted":false},{"type":"link","label":"Autoplot App","href":"/docs/apps/autoplot_app/","docId":"apps/autoplot_app/autoplot-app","unlisted":false},{"type":"link","label":"Recorder App","href":"/docs/apps/recorder_app/","docId":"apps/recorder_app/recorder-app","unlisted":false},{"type":"link","label":"File Manager App","href":"/docs/apps/file_manager_app/","docId":"apps/file_manager_app/file-manager-app","unlisted":false},{"type":"link","label":"Camera App","href":"/docs/apps/camera_app/","docId":"apps/camera_app/camera-app","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Farm Tools","items":[{"items":[{"type":"link","label":"Installation Guide","href":"/docs/farm-tools/three-point","docId":"farm-tools/three-point","unlisted":false}],"label":"Three Point Hitch","type":"category","collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"Service Cable Overview","href":"/docs/debug_cable/service-cable","docId":"debug_cable/service-cable","unlisted":false},{"type":"link","label":"Debug Cable Overview","href":"/docs/debug_cable/","docId":"debug_cable/debug-cable","unlisted":false}],"label":"Service Cables","type":"category","collapsed":true,"collapsible":true}],"Developer":[{"type":"link","label":"Concepts Index","href":"/docs/concepts/","docId":"concepts/concepts-index","unlisted":false},{"type":"category","label":"Getting Started","items":[{"type":"link","label":"Access and Develop on the Brain","href":"/docs/ssh/","docId":"ssh/ssh","unlisted":false},{"type":"link","label":"Brain ADK Install","href":"/docs/brain/brain-install","docId":"brain/brain-install","unlisted":false},{"type":"link","label":"Next Steps","href":"/docs/brain/next-steps","docId":"brain/next-steps","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Fundamental Concepts","items":[{"type":"link","label":"Amiga Development 101","href":"/docs/concepts/system_overview/","docId":"concepts/system_overview/amiga-dev","unlisted":false},{"type":"link","label":"Transforms & Poses","href":"/docs/concepts/transforms_and_poses/","docId":"concepts/transforms_and_poses/transforms-and-poses","unlisted":false},{"type":"link","label":"Tracks & Waypoints","href":"/docs/concepts/tracks_and_waypoints/","docId":"concepts/tracks_and_waypoints/tracks-and-waypoints","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Custom Applications","items":[{"type":"link","label":"Custom Applications (ReactJS)","href":"/docs/brain/brain-apps","docId":"brain/brain-apps","unlisted":false},{"type":"link","label":"Custom Applications (Kivy)","href":"/docs/brain/brain-apps-kivy","docId":"brain/brain-apps-kivy","unlisted":false},{"type":"link","label":"Custom Applications Manifest","href":"/docs/brain/brain-apps-manifest","docId":"brain/brain-apps-manifest","unlisted":false},{"type":"link","label":"Custom Apps / Services Ownership","href":"/docs/brain/app-ownership","docId":"brain/app-ownership","unlisted":false},{"type":"link","label":"Custom Apps / Services Troubleshooting","href":"/docs/brain/custom-troubleshooting","docId":"brain/custom-troubleshooting","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"link","label":"Migration Guide to Amiga OS 2.0","href":"/docs/brain/sdk-barley-migration","docId":"brain/sdk-barley-migration","unlisted":false},{"type":"link","label":"Amiga ROS Bridge","href":"/docs/brain/ros-bridge","docId":"brain/ros-bridge","unlisted":false},{"type":"link","label":"Using a VNC Viewer","href":"/docs/examples/vnc_viewer/","docId":"examples/vnc_viewer/vnc-viewer","unlisted":false},{"type":"category","label":"Service Overviews","items":[{"type":"link","label":"Canbus","href":"/docs/concepts/canbus_service/","docId":"concepts/canbus_service/canbus-overview","unlisted":false},{"type":"link","label":"Oak","href":"/docs/concepts/oak_service/","docId":"concepts/oak_service/oak-overview","unlisted":false},{"type":"link","label":"GPS","href":"/docs/concepts/gps_service/","docId":"concepts/gps_service/gps-overview","unlisted":false},{"type":"link","label":"Recorder","href":"/docs/concepts/recorder_service/","docId":"concepts/recorder_service/recorder-overview","unlisted":false},{"type":"link","label":"Filter","href":"/docs/concepts/filter_service/","docId":"concepts/filter_service/filter-overview","unlisted":false},{"type":"link","label":"Track Follower","href":"/docs/concepts/track_follower_service/","docId":"concepts/track_follower_service/track-follower-overview","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"link","label":"Microcontroller Kit","href":"/docs/mcu_kit/","docId":"mcu_kit/microcontroller-kit","unlisted":false},{"items":[{"type":"link","label":"API Index","href":"/docs/api/","docId":"api/api-index","unlisted":false},{"type":"category","label":"Microcontroller API","items":[{"items":[{"type":"link","label":"can","href":"/docs/reference/circuitpy/utils/can","docId":"reference/circuitpy/utils/can","unlisted":false},{"type":"link","label":"cobid","href":"/docs/reference/circuitpy/utils/cobid","docId":"reference/circuitpy/utils/cobid","unlisted":false},{"type":"link","label":"debug_packet","href":"/docs/reference/circuitpy/utils/debug_packet","docId":"reference/circuitpy/utils/debug_packet","unlisted":false},{"type":"link","label":"farmng_sdo","href":"/docs/reference/circuitpy/utils/farmng_sdo","docId":"reference/circuitpy/utils/farmng_sdo","unlisted":false},{"type":"link","label":"general","href":"/docs/reference/circuitpy/utils/general","docId":"reference/circuitpy/utils/general","unlisted":false},{"type":"link","label":"io","href":"/docs/reference/circuitpy/utils/io","docId":"reference/circuitpy/utils/io","unlisted":false},{"type":"link","label":"main_loop","href":"/docs/reference/circuitpy/utils/main_loop","docId":"reference/circuitpy/utils/main_loop","unlisted":false},{"type":"link","label":"nvm","href":"/docs/reference/circuitpy/utils/nvm","docId":"reference/circuitpy/utils/nvm","unlisted":false},{"type":"link","label":"packet","href":"/docs/reference/circuitpy/utils/packet","docId":"reference/circuitpy/utils/packet","unlisted":false},{"type":"link","label":"ticks","href":"/docs/reference/circuitpy/utils/ticks","docId":"reference/circuitpy/utils/ticks","unlisted":false},{"type":"link","label":"version","href":"/docs/reference/circuitpy/utils/version","docId":"reference/circuitpy/utils/version","unlisted":false}],"label":"utils","type":"category","collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"type":"category","label":"Brain API","items":[{"items":[{"type":"link","label":"packet","href":"/docs/reference/brain/canbus/packet","docId":"reference/brain/canbus/packet","unlisted":false}],"label":"canbus","type":"category","collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true}],"label":"APIs","type":"category","collapsed":true,"collapsible":true}],"Resources/Support":[{"type":"link","label":"Recommended Tools","href":"/docs/hardware-tools/recommended-tools","docId":"hardware-tools/recommended-tools","unlisted":false},{"type":"link","label":"Frequently Asked Questions","href":"/docs/reference/faq","docId":"reference/faq","unlisted":false},{"type":"link","label":"GitHub 101","href":"/docs/support/github-101","docId":"support/github-101","unlisted":false},{"type":"link","label":"Brain v1.0","href":"/docs/brain/","docId":"brain/brain","unlisted":false},{"items":[{"type":"link","label":"AmigaOS 2.2 Dragon Fruit Release Notes","href":"/docs/release-notes/release-022","docId":"release-notes/release-022","unlisted":false},{"type":"link","label":"AmigaOS 2.1 Clementine Release Notes","href":"/docs/release-notes/release-021","docId":"release-notes/release-021","unlisted":false},{"type":"link","label":"AmigaOS 2.0 Barley Release Notes","href":"/docs/release-notes/release-02","docId":"release-notes/release-02","unlisted":false},{"type":"link","label":"AmigaOS 1.0 Artichoke Release Notes","href":"/docs/release-notes/release-01","docId":"release-notes/release-01","unlisted":false}],"label":"Release Notes","type":"category","collapsed":true,"collapsible":true}],"examples":[{"type":"link","label":"Examples Index","href":"/docs/examples/examples-index","docId":"examples/examples-index","unlisted":false},{"type":"category","label":"Microcontroller Examples","items":[{"type":"link","label":"Hello Main Loop Example","href":"/docs/examples/hello_main_loop/","docId":"examples/hello_main_loop/hello-world","unlisted":false},{"type":"link","label":"Cansniffer Example","href":"/docs/examples/cansniffer/","docId":"examples/cansniffer/cansniffer","unlisted":false},{"type":"link","label":"FPV Example","href":"/docs/examples/FPV/","docId":"examples/FPV/fpv","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Brain Examples","items":[{"items":[{"type":"link","label":"Events Recorder","href":"/docs/examples/events_recorder/","docId":"examples/events_recorder/events-recorder","unlisted":false}],"label":"Data Recording Examples","type":"category","collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"File Reader","href":"/docs/examples/file_reader/","docId":"examples/file_reader/file-reader","unlisted":false},{"type":"link","label":"File Converter","href":"/docs/examples/file_converter/","docId":"examples/file_converter/file-converter","unlisted":false},{"type":"link","label":"File Reader CAN","href":"/docs/examples/file_reader_can/","docId":"examples/file_reader_can/file-reader-can","unlisted":false},{"type":"link","label":"File Reader GPS","href":"/docs/examples/file_reader_gps/","docId":"examples/file_reader_gps/file-reader-gps","unlisted":false},{"type":"link","label":"File Reader Headers","href":"/docs/examples/file_reader_headers/","docId":"examples/file_reader_headers/file-reader-headers","unlisted":false}],"label":"Playback Examples","type":"category","collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"Camera Client","href":"/docs/examples/camera_client/","docId":"examples/camera_client/camera-client","unlisted":false},{"type":"link","label":"Camera Settings","href":"/docs/examples/camera_settings/","docId":"examples/camera_settings/camera-settings","unlisted":false},{"type":"link","label":"Camera Calibration","href":"/docs/examples/camera_calibration/","docId":"examples/camera_calibration/camera-calibration","unlisted":false},{"type":"link","label":"Camera Aruco Detector","href":"/docs/examples/camera_aruco_detector/","docId":"examples/camera_aruco_detector/camera-aruco-detector","unlisted":false},{"type":"link","label":"Camera Pointcloud","href":"/docs/examples/camera_pointcloud/","docId":"examples/camera_pointcloud/camera-pointcloud","unlisted":false}],"label":"Camera Examples","type":"category","collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"Motor State","href":"/docs/examples/motor_state/","docId":"examples/motor_state/motor-state","unlisted":false},{"type":"link","label":"Pendant State","href":"/docs/examples/pendant_state/","docId":"examples/pendant_state/pendant-state","unlisted":false},{"type":"link","label":"Vehicle Twist","href":"/docs/examples/vehicle_twist/","docId":"examples/vehicle_twist/vehicle-twist","unlisted":false},{"type":"link","label":"Tool Control","href":"/docs/examples/tool_control/","docId":"examples/tool_control/tool-control","unlisted":false},{"type":"link","label":"Dashboard Settings","href":"/docs/examples/dashboard_settings/","docId":"examples/dashboard_settings/dashboard-settings","unlisted":false},{"type":"link","label":"File Reader CAN","href":"/docs/examples/file_reader_can/","docId":"examples/file_reader_can/file-reader-can","unlisted":false}],"label":"CAN Bus Examples","type":"category","collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"GPS Client","href":"/docs/examples/gps_client/","docId":"examples/gps_client/gps-client","unlisted":false},{"type":"link","label":"File Reader GPS","href":"/docs/examples/file_reader_gps/","docId":"examples/file_reader_gps/file-reader-gps","unlisted":false}],"label":"GPS Examples","type":"category","collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"Filter Client","href":"/docs/examples/filter_client/","docId":"examples/filter_client/filter-client","unlisted":false}],"label":"State Estimation Examples","type":"category","collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"Record a Track","href":"/docs/examples/track_recorder/","docId":"examples/track_recorder/track-recorder","unlisted":false},{"type":"link","label":"Plot a Track","href":"/docs/examples/track_plotter/","docId":"examples/track_plotter/track-plotter","unlisted":false},{"type":"link","label":"Follow a Track","href":"/docs/examples/track_follower/","docId":"examples/track_follower/track-follower","unlisted":false},{"type":"link","label":"Track Planner","href":"/docs/examples/track_planner/","docId":"examples/track_planner/track-planner","unlisted":false},{"type":"link","label":"Drive a Square","href":"/docs/examples/square_track/","docId":"examples/square_track/square-track","unlisted":false}],"label":"Track Follower Examples","type":"category","collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"Multi Client Subscriber","href":"/docs/examples/multi_client_subscriber/","docId":"examples/multi_client_subscriber/multi-client-subscriber","unlisted":false},{"type":"link","label":"Multi Client GeoImage","href":"/docs/examples/multi_client_geoimage/","docId":"examples/multi_client_geoimage/multi-client-geoimage","unlisted":false}],"label":"Multi Client Examples","type":"category","collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"Service Client","href":"/docs/examples/service_client/","docId":"examples/service_client/service-client","unlisted":false},{"type":"link","label":"Service Counter","href":"/docs/examples/service_counter/","docId":"examples/service_counter/service-counter","unlisted":false},{"type":"link","label":"Service Propagation","href":"/docs/examples/service_propagation/","docId":"examples/service_propagation/service-propagation","unlisted":false}],"label":"Custom Service Examples","type":"category","collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"Monitor App","href":"/docs/examples/monitor_app/","docId":"examples/monitor_app/monitor-app","unlisted":false}],"label":"App Examples","type":"category","collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"type":"category","label":"Kivy App Examples","items":[{"type":"category","label":"00 -Introduction","items":[{"type":"link","label":"00 - Introduction","href":"/docs/tutorials/introduction/tutorial-introduction","docId":"tutorials/introduction/tutorial-introduction","unlisted":false},{"type":"link","label":"01 - Installing Templates","href":"/docs/tutorials/introduction/getting-started-kivy","docId":"tutorials/introduction/getting-started-kivy","unlisted":false},{"type":"link","label":"02 - Template Overview","href":"/docs/tutorials/introduction/template-overview","docId":"tutorials/introduction/template-overview","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"01 - Camera Streamer Example","items":[{"type":"link","label":"00 - Camera Streamer Overview","href":"/docs/tutorials/camera_streamer/camera-streamer-overview","docId":"tutorials/camera_streamer/camera-streamer-overview","unlisted":false},{"type":"link","label":"01 - Kivy Definition","href":"/docs/tutorials/camera_streamer/kivy-definition","docId":"tutorials/camera_streamer/kivy-definition","unlisted":false},{"type":"link","label":"02 - Python Implementation","href":"/docs/tutorials/camera_streamer/camera-stream","docId":"tutorials/camera_streamer/camera-stream","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"02 - Virtual Joystick Example","items":[{"type":"link","label":"00 - Virtual Joystick Overview","href":"/docs/tutorials/virtual_joystick/virtual-joystick-overview","docId":"tutorials/virtual_joystick/virtual-joystick-overview","unlisted":false},{"type":"link","label":"01 - Widget","href":"/docs/tutorials/virtual_joystick/virtual-joystick-widget","docId":"tutorials/virtual_joystick/virtual-joystick-widget","unlisted":false},{"type":"link","label":"02 - Main Implementation","href":"/docs/tutorials/virtual_joystick/device-streams","docId":"tutorials/virtual_joystick/device-streams","unlisted":false},{"type":"link","label":"03 - Further Exercises","href":"/docs/tutorials/virtual_joystick/further-exercises","docId":"tutorials/virtual_joystick/further-exercises","unlisted":false}],"collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true}]},"docs":{"amiga_quick_start/amiga-quick-start":{"id":"amiga_quick_start/amiga-quick-start","title":"Quick Start Guide","description":"Welcome to the Amiga Quick Start Guide","sidebar":"User Manual"},"api/api-index":{"id":"api/api-index","title":"API Index","description":"There are two distinct, yet compatible, APIs.","sidebar":"Developer"},"apps/autoplot_app/autoplot-app":{"id":"apps/autoplot_app/autoplot-app","title":"Autoplot App","description":"The Autoplot app is an advanced control interface for your Amiga, offering multiple modes of","sidebar":"User Manual"},"apps/camera_app/camera-app":{"id":"apps/camera_app/camera-app","title":"Camera App","description":"The Camera App is your centralized solution for configuring oak cameras and monitoring real-time","sidebar":"User Manual"},"apps/file_manager_app/file-manager-app":{"id":"apps/file_manager_app/file-manager-app","title":"File Manager App","description":"The File Manager app is an essential utility for the effective management of log files on your Amiga.","sidebar":"User Manual"},"apps/filter_app/filter-app":{"id":"apps/filter_app/filter-app","title":"Filter App","description":"Calibration","sidebar":"User Manual"},"apps/recorder_app/recorder-app":{"id":"apps/recorder_app/recorder-app","title":"Recorder App","description":"This guide will walk you through how to record field data and","sidebar":"User Manual"},"brain/app-ownership":{"id":"brain/app-ownership","title":"Custom Apps / Services Ownership","description":"\x3c!-- NOTE: Name kept as app-ownership to not break the link","sidebar":"Developer"},"brain/brain":{"id":"brain/brain","title":"Brain v1.0","description":"The Brain v1.0 tag here refers to the hardware version of the brain","sidebar":"Resources/Support"},"brain/brain-apps":{"id":"brain/brain-apps","title":"Custom Applications (ReactJS)","description":"Create an app","sidebar":"Developer"},"brain/brain-apps-kivy":{"id":"brain/brain-apps-kivy","title":"Custom Applications (Kivy)","description":"In this tutorial we will show you how to develop a custom Kivy application for the Amiga Brain.","sidebar":"Developer"},"brain/brain-apps-manifest":{"id":"brain/brain-apps-manifest","title":"Custom Applications Manifest","description":"As explained in the brain apps section, the brain apps and services are a way to extend the functionality of the brain.","sidebar":"Developer"},"brain/brain-install":{"id":"brain/brain-install","title":"Brain ADK Install","description":"PyPI version","sidebar":"Developer"},"brain/custom-troubleshooting":{"id":"brain/custom-troubleshooting","title":"Custom Apps / Services Troubleshooting","description":"Single Owner Limitation: When a custom app or service is registered via the manifest.json,","sidebar":"Developer"},"brain/next-steps":{"id":"brain/next-steps","title":"Next Steps","description":"You will not be able to follow the examples and tutorials listed","sidebar":"Developer"},"brain/ros-bridge":{"id":"brain/ros-bridge","title":"Amiga ROS Bridge","description":"This is out-of-date for brains running v2.x Amiga OS software.","sidebar":"Developer"},"brain/sdk-barley-migration":{"id":"brain/sdk-barley-migration","title":"Migration Guide to Amiga OS 2.0","description":"Preamble","sidebar":"Developer"},"concepts/canbus_service/canbus-overview":{"id":"concepts/canbus_service/canbus-overview","title":"Canbus","description":"The Canbus service is an integral component of the Amiga platform.","sidebar":"Developer"},"concepts/concepts-index":{"id":"concepts/concepts-index","title":"Concepts Index","description":"Fundamental Concepts","sidebar":"Developer"},"concepts/filter_service/filter-overview":{"id":"concepts/filter_service/filter-overview","title":"Filter","description":"The Filter service is the state estimation core of the Amiga, crucial for understanding the robot\'s","sidebar":"Developer"},"concepts/gps_service/gps-overview":{"id":"concepts/gps_service/gps-overview","title":"GPS","description":"The GPS service is an integral component of the Amiga\'s navigation system, utilizing a","sidebar":"Developer"},"concepts/oak_service/oak-overview":{"id":"concepts/oak_service/oak-overview","title":"Oak","description":"The OAK service is a versatile component in the Amiga ecosystem, providing valuable data streams","sidebar":"Developer"},"concepts/recorder_service/recorder-overview":{"id":"concepts/recorder_service/recorder-overview","title":"Recorder","description":"The Recorder App/Service is the backbone of the Amiga\'s data logging and playback functionality.","sidebar":"Developer"},"concepts/system_overview/amiga-dev":{"id":"concepts/system_overview/amiga-dev","title":"Amiga Development 101","description":"Welcome to the world of Amiga robot development!","sidebar":"Developer"},"concepts/track_follower_service/track-follower-overview":{"id":"concepts/track_follower_service/track-follower-overview","title":"Track Follower","description":"The Track Follower is the autonomy hub of the Amiga.","sidebar":"Developer"},"concepts/tracks_and_waypoints/tracks-and-waypoints":{"id":"concepts/tracks_and_waypoints/tracks-and-waypoints","title":"Tracks & Waypoints","description":"Understanding Transforms & Poses","sidebar":"Developer"},"concepts/transforms_and_poses/transforms-and-poses":{"id":"concepts/transforms_and_poses/transforms-and-poses","title":"Transforms & Poses","description":"Fundamental Concepts","sidebar":"Developer"},"contribute/contribute-website":{"id":"contribute/contribute-website","title":"Documentation","description":"This page contains instructions for developers who want to contribute to the Amiga Development Kit documentation."},"dashboard/control-states":{"id":"dashboard/control-states","title":"Amiga Control States","description":"Amiga control states","sidebar":"User Manual"},"dashboard/dashboard-debugging":{"id":"dashboard/dashboard-debugging","title":"Debugging error codes","description":"This section is intended for the dashboard firmware v0.3.0 and older.","sidebar":"User Manual"},"dashboard/dashboard-fw":{"id":"dashboard/dashboard-fw","title":"Dashboard Firmware Updates","description":"Dashboard firmware updates","sidebar":"User Manual"},"dashboard/dashboard-overview":{"id":"dashboard/dashboard-overview","title":"Dashboard Overview","description":"DSCF6570-2-16x9-aspect-reduced","sidebar":"User Manual"},"dashboard/dashboard-user-guide":{"id":"dashboard/dashboard-user-guide","title":"Dashboard User Guide","description":"This guide is subject to change with each new update to the Dashboard.","sidebar":"User Manual"},"debug_cable/debug-cable":{"id":"debug_cable/debug-cable","title":"Debug Cable Overview","description":"image","sidebar":"User Manual"},"debug_cable/service-cable":{"id":"debug_cable/service-cable","title":"Service Cable Overview","description":"IMG-9583","sidebar":"User Manual"},"examples/camera_aruco_detector/camera-aruco-detector":{"id":"examples/camera_aruco_detector/camera-aruco-detector","title":"Camera Aruco Detector","description":"Before diving into this code, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/camera_calibration/camera-calibration":{"id":"examples/camera_calibration/camera-calibration","title":"Camera Calibration","description":"Before diving into this code, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/camera_client/camera-client":{"id":"examples/camera_client/camera-client","title":"Camera Client","description":"Before diving into this code, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/camera_pointcloud/camera-pointcloud":{"id":"examples/camera_pointcloud/camera-pointcloud","title":"Camera Pointcloud","description":"Before diving into this code, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/camera_settings/camera-settings":{"id":"examples/camera_settings/camera-settings","title":"Camera Settings","description":"Before diving into this code, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/cansniffer/cansniffer":{"id":"examples/cansniffer/cansniffer","title":"Cansniffer Example","description":"Link to cansniffer/code.py","sidebar":"examples"},"examples/dashboard_settings/dashboard-settings":{"id":"examples/dashboard_settings/dashboard-settings","title":"Dashboard Settings","description":"Before diving into this code, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/events_recorder/events-recorder":{"id":"examples/events_recorder/events-recorder","title":"Events Recorder","description":"Before diving into this example, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/examples-index":{"id":"examples/examples-index","title":"Examples Index","description":"Microcontroller Examples","sidebar":"examples"},"examples/file_converter/file-converter":{"id":"examples/file_converter/file-converter","title":"File Converter","description":"Before diving into this example, here\'s a quick overview of what you\'ll need to be familiar with:","sidebar":"examples"},"examples/file_reader_can/file-reader-can":{"id":"examples/file_reader_can/file-reader-can","title":"File Reader CAN","description":"Before diving into this example, here\'s a quick overview of what you\'ll need to be familiar with:","sidebar":"examples"},"examples/file_reader_gps/file-reader-gps":{"id":"examples/file_reader_gps/file-reader-gps","title":"File Reader GPS","description":"1. Python Programming: Understanding basic Python programming concepts such as functions, loops,","sidebar":"examples"},"examples/file_reader_headers/file-reader-headers":{"id":"examples/file_reader_headers/file-reader-headers","title":"File Reader Headers","description":"Before diving into this example, here\'s a quick overview of what you\'ll need to be familiar with:","sidebar":"examples"},"examples/file_reader/file-reader":{"id":"examples/file_reader/file-reader","title":"File Reader","description":"Before diving into this example, here\'s a quick overview of what you\'ll need to be familiar with:","sidebar":"examples"},"examples/filter_client/filter-client":{"id":"examples/filter_client/filter-client","title":"Filter Client","description":"Before diving into this code, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/FPV/fpv":{"id":"examples/FPV/fpv","title":"FPV Example","description":"Link to FPV/code.py","sidebar":"examples"},"examples/gps_client/gps-client":{"id":"examples/gps_client/gps-client","title":"GPS Client","description":"Before diving into this code, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/hello_main_loop/hello-world":{"id":"examples/hello_main_loop/hello-world","title":"Hello Main Loop Example","description":"Link to hellomainloop/code.py","sidebar":"examples"},"examples/monitor_app/monitor-app":{"id":"examples/monitor_app/monitor-app","title":"Monitor App","description":"Before diving into this code, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/motor_state/motor-state":{"id":"examples/motor_state/motor-state","title":"Motor State","description":"Before diving into this code, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/multi_client_geoimage/multi-client-geoimage":{"id":"examples/multi_client_geoimage/multi-client-geoimage","title":"Multi Client GeoImage","description":"Before diving into this code, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/multi_client_subscriber/multi-client-subscriber":{"id":"examples/multi_client_subscriber/multi-client-subscriber","title":"Multi Client Subscriber","description":"Before diving into this code, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/pendant_state/pendant-state":{"id":"examples/pendant_state/pendant-state","title":"Pendant State","description":"Before diving into this code, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/service_client/service-client":{"id":"examples/service_client/service-client","title":"Service Client","description":"Before diving into this code, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/service_counter/service-counter":{"id":"examples/service_counter/service-counter","title":"Service Counter","description":"Before diving into this code, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/service_propagation/service-propagation":{"id":"examples/service_propagation/service-propagation","title":"Service Propagation","description":"Before diving into this code, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/square_track/square-track":{"id":"examples/square_track/square-track","title":"Drive a Square","description":"Before diving into this code, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/tool_control/tool-control":{"id":"examples/tool_control/tool-control","title":"Tool Control","description":"Running this example has minimum release versions of:","sidebar":"examples"},"examples/track_follower/track-follower":{"id":"examples/track_follower/track-follower","title":"Follow a Track","description":"Before diving into this code, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/track_planner/track-planner":{"id":"examples/track_planner/track-planner","title":"Track Planner","description":"Before diving into this code, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/track_plotter/track-plotter":{"id":"examples/track_plotter/track-plotter","title":"Plot a Track","description":"Before diving into this code, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/track_recorder/track-recorder":{"id":"examples/track_recorder/track-recorder","title":"Record a Track","description":"Before diving into this code, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/vehicle_twist/vehicle-twist":{"id":"examples/vehicle_twist/vehicle-twist","title":"Vehicle Twist","description":"Before diving into this code, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/vnc_viewer/vnc-viewer":{"id":"examples/vnc_viewer/vnc-viewer","title":"Using a VNC Viewer","description":"If you want to see the screen of the Amiga and interact with it from a laptop or dev station,","sidebar":"Developer"},"farm-tools/three-point":{"id":"farm-tools/three-point","title":"Installation Guide","description":"This guide is a step by step instruction on how to assemble the farm-ng three","sidebar":"User Manual"},"getting-started":{"id":"getting-started","title":"Introduction","description":"Welcome to the Amiga Development Kit"},"hardware-tools/etools":{"id":"hardware-tools/etools","title":"Basic Electronics Tool Kit","description":"Basic recommended tool kit for hardware hacking"},"hardware-tools/recommended-tools":{"id":"hardware-tools/recommended-tools","title":"Recommended Tools","description":"Basic recommended tool kit for hardware hacking","sidebar":"Resources/Support"},"intelligence-kit/brain/brain-v2":{"id":"intelligence-kit/brain/brain-v2","title":"Brain v2.0","description":"The Brain v2.0 tag here refers to the hardware version of the brain","sidebar":"User Manual"},"intelligence-kit/overview-intel":{"id":"intelligence-kit/overview-intel","title":"Intelligence Kit Overview","description":"DSCF8544","sidebar":"User Manual"},"mcu_kit/microcontroller-kit":{"id":"mcu_kit/microcontroller-kit","title":"Microcontroller Kit","description":"We sell a complete kit containing all necessary components on the Amiga shop website: farm-ng microcontroller kit","sidebar":"Developer"},"pendant/pendant":{"id":"pendant/pendant","title":"Pendant Overview","description":"pendant 3","sidebar":"User Manual"},"reference/brain/canbus/packet":{"id":"reference/brain/canbus/packet","title":"canbus.packet","description":"AmigaControlState Objects","sidebar":"Developer"},"reference/brain/track/utils":{"id":"reference/brain/track/utils","title":"track.utils","description":"filter\\\\track\\\\to\\\\_track"},"reference/circuitpy/utils/can":{"id":"reference/circuitpy/utils/can","title":"utils.can","description":"setup\\\\can\\\\default","sidebar":"Developer"},"reference/circuitpy/utils/cobid":{"id":"reference/circuitpy/utils/cobid","title":"utils.cobid","description":"CanOpenObject Objects","sidebar":"Developer"},"reference/circuitpy/utils/debug_packet":{"id":"reference/circuitpy/utils/debug_packet","title":"utils.debug_packet","description":"FarmngDebugMemory Objects","sidebar":"Developer"},"reference/circuitpy/utils/farmng_sdo":{"id":"reference/circuitpy/utils/farmng_sdo","title":"utils.farmng_sdo","description":"ReqRepOpIds Objects","sidebar":"Developer"},"reference/circuitpy/utils/general":{"id":"reference/circuitpy/utils/general","title":"utils.general","description":"path\\\\_dirname","sidebar":"Developer"},"reference/circuitpy/utils/io":{"id":"reference/circuitpy/utils/io","title":"utils.io","description":"sense","sidebar":"Developer"},"reference/circuitpy/utils/main_loop":{"id":"reference/circuitpy/utils/main_loop","title":"utils.main_loop","description":"get\\\\node\\\\id","sidebar":"Developer"},"reference/circuitpy/utils/nvm":{"id":"reference/circuitpy/utils/nvm","title":"utils.nvm","description":"nvm\\\\node\\\\id","sidebar":"Developer"},"reference/circuitpy/utils/packet":{"id":"reference/circuitpy/utils/packet","title":"utils.packet","description":"PendantButtons Objects","sidebar":"Developer"},"reference/circuitpy/utils/ticks":{"id":"reference/circuitpy/utils/ticks","title":"utils.ticks","description":"ticks\\\\_ms","sidebar":"Developer"},"reference/circuitpy/utils/version":{"id":"reference/circuitpy/utils/version","title":"utils.version","description":"Update values following semantic versioning convention.","sidebar":"Developer"},"reference/faq":{"id":"reference/faq","title":"Frequently Asked Questions","description":"Using the REPL","sidebar":"Resources/Support"},"release-notes/release-01":{"id":"release-notes/release-01","title":"AmigaOS 1.0 Artichoke Release Notes","description":"At farm-ng we love making tools for engineers, hackers, building","sidebar":"Resources/Support"},"release-notes/release-02":{"id":"release-notes/release-02","title":"AmigaOS 2.0 Barley Release Notes","description":"barley-logo","sidebar":"Resources/Support"},"release-notes/release-021":{"id":"release-notes/release-021","title":"AmigaOS 2.1 Clementine Release Notes","description":"We\'re excited to announce the launch of AmigaOS 2.1 \u201cClementine,\u201d a significant update packed with","sidebar":"Resources/Support"},"release-notes/release-022":{"id":"release-notes/release-022","title":"AmigaOS 2.2 Dragon Fruit Release Notes","description":"We\'re excited to announce the launch of AmigaOS 2.2 \u201cDragon Fruit!\u201d This is a","sidebar":"Resources/Support"},"ssh/ssh":{"id":"ssh/ssh","title":"Access and Develop on the Brain","description":"Users can remotely access and start developing on the brain via SSH access.","sidebar":"Developer"},"support/github-101":{"id":"support/github-101","title":"GitHub 101","description":"Welcome to GitHub 101!","sidebar":"Resources/Support"},"support/support":{"id":"support/support","title":"Support","description":"Check our FAQ\'s"},"tutorials/camera_streamer/camera-stream":{"id":"tutorials/camera_streamer/camera-stream","title":"02 - Python Implementation","description":"Similar to the last tutorial, this will give a break down of the most important features of the","sidebar":"examples"},"tutorials/camera_streamer/camera-streamer-overview":{"id":"tutorials/camera_streamer/camera-streamer-overview","title":"00 - Camera Streamer Overview","description":"This tutorial builds off of the","sidebar":"examples"},"tutorials/camera_streamer/kivy-definition":{"id":"tutorials/camera_streamer/kivy-definition","title":"01 - Kivy Definition","description":"In this tutorial, we will be adding a few new elements to our app, a Tabbed Panel and Images","sidebar":"examples"},"tutorials/introduction/getting-started-kivy":{"id":"tutorials/introduction/getting-started-kivy","title":"01 - Installing Templates","description":"In this tutorial we will show you how to develop a custom Kivy application for the Amiga Brain.","sidebar":"examples"},"tutorials/introduction/template-overview":{"id":"tutorials/introduction/template-overview","title":"02 - Template Overview","description":"This section describes the Python and kivy code in the","sidebar":"examples"},"tutorials/introduction/tutorial-introduction":{"id":"tutorials/introduction/tutorial-introduction","title":"00 - Introduction","description":"This is a three part tutorial designed to walk you through the process of","sidebar":"examples"},"tutorials/virtual_joystick/device-streams":{"id":"tutorials/virtual_joystick/device-streams","title":"02 - Main Implementation","description":"Kivy","sidebar":"examples"},"tutorials/virtual_joystick/further-exercises":{"id":"tutorials/virtual_joystick/further-exercises","title":"03 - Further Exercises","description":"Optionally, go beyond the tutorial and try to add features to this example.","sidebar":"examples"},"tutorials/virtual_joystick/virtual-joystick-overview":{"id":"tutorials/virtual_joystick/virtual-joystick-overview","title":"00 - Virtual Joystick Overview","description":"This tutorial builds off of the","sidebar":"examples"},"tutorials/virtual_joystick/virtual-joystick-widget":{"id":"tutorials/virtual_joystick/virtual-joystick-widget","title":"01 - Widget","description":"We will begin by defining a custom widget, the VirtualJoystickWidget,","sidebar":"examples"}}}')}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.713d9b7b.js b/assets/js/935f2afb.713d9b7b.js deleted file mode 100644 index 74d3fe4ef..000000000 --- a/assets/js/935f2afb.713d9b7b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkamiga_developers_website=self.webpackChunkamiga_developers_website||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"User Manual":[{"type":"link","label":"Quick Start Guide","href":"/docs/amiga_quick_start/amiga-quick-start","docId":"amiga_quick_start/amiga-quick-start","unlisted":false},{"items":[{"type":"link","label":"Dashboard Overview","href":"/docs/dashboard/dashboard-overview","docId":"dashboard/dashboard-overview","unlisted":false},{"type":"link","label":"Dashboard User Guide","href":"/docs/dashboard/dashboard-user-guide","docId":"dashboard/dashboard-user-guide","unlisted":false},{"type":"link","label":"Amiga Control States","href":"/docs/dashboard/control-states","docId":"dashboard/control-states","unlisted":false},{"type":"link","label":"Dashboard Firmware Updates","href":"/docs/dashboard/dashboard-fw","docId":"dashboard/dashboard-fw","unlisted":false},{"type":"link","label":"Debugging error codes","href":"/docs/dashboard/dashboard-debugging","docId":"dashboard/dashboard-debugging","unlisted":false}],"label":"Dashboard","type":"category","collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"Pendant Overview","href":"/docs/pendant/","docId":"pendant/pendant","unlisted":false}],"label":"Pendant","type":"category","collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"Intelligence Kit Overview","href":"/docs/intelligence-kit/overview-intel","docId":"intelligence-kit/overview-intel","unlisted":false},{"type":"link","label":"Brain v2.0","href":"/docs/intelligence-kit/brain/brain-v2","docId":"intelligence-kit/brain/brain-v2","unlisted":false}],"label":"Intelligence Kit","type":"category","collapsed":true,"collapsible":true},{"type":"category","label":"App Overviews","items":[{"type":"link","label":"Filter App","href":"/docs/apps/filter_app/","docId":"apps/filter_app/filter-app","unlisted":false},{"type":"link","label":"Autoplot App","href":"/docs/apps/autoplot_app/","docId":"apps/autoplot_app/autoplot-app","unlisted":false},{"type":"link","label":"Recorder App","href":"/docs/apps/recorder_app/","docId":"apps/recorder_app/recorder-app","unlisted":false},{"type":"link","label":"File Manager App","href":"/docs/apps/file_manager_app/","docId":"apps/file_manager_app/file-manager-app","unlisted":false},{"type":"link","label":"Camera App","href":"/docs/apps/camera_app/","docId":"apps/camera_app/camera-app","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Farm Tools","items":[{"items":[{"type":"link","label":"Installation Guide","href":"/docs/farm-tools/three-point","docId":"farm-tools/three-point","unlisted":false}],"label":"Three Point Hitch","type":"category","collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true}],"Developer":[{"type":"link","label":"Concepts Index","href":"/docs/concepts/","docId":"concepts/concepts-index","unlisted":false},{"type":"category","label":"Getting Started","items":[{"type":"link","label":"Access and Develop on the Brain","href":"/docs/ssh/","docId":"ssh/ssh","unlisted":false},{"type":"link","label":"Brain ADK Install","href":"/docs/brain/brain-install","docId":"brain/brain-install","unlisted":false},{"type":"link","label":"Next Steps","href":"/docs/brain/next-steps","docId":"brain/next-steps","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Fundamental Concepts","items":[{"type":"link","label":"Amiga Development 101","href":"/docs/concepts/system_overview/","docId":"concepts/system_overview/amiga-dev","unlisted":false},{"type":"link","label":"Transforms & Poses","href":"/docs/concepts/transforms_and_poses/","docId":"concepts/transforms_and_poses/transforms-and-poses","unlisted":false},{"type":"link","label":"Tracks & Waypoints","href":"/docs/concepts/tracks_and_waypoints/","docId":"concepts/tracks_and_waypoints/tracks-and-waypoints","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Custom Applications","items":[{"type":"link","label":"Custom Applications (ReactJS)","href":"/docs/brain/brain-apps","docId":"brain/brain-apps","unlisted":false},{"type":"link","label":"Custom Applications (Kivy)","href":"/docs/brain/brain-apps-kivy","docId":"brain/brain-apps-kivy","unlisted":false},{"type":"link","label":"Custom Applications Manifest","href":"/docs/brain/brain-apps-manifest","docId":"brain/brain-apps-manifest","unlisted":false},{"type":"link","label":"Custom Apps / Services Ownership","href":"/docs/brain/app-ownership","docId":"brain/app-ownership","unlisted":false},{"type":"link","label":"Custom Apps / Services Troubleshooting","href":"/docs/brain/custom-troubleshooting","docId":"brain/custom-troubleshooting","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"link","label":"Migration Guide to Amiga OS 2.0","href":"/docs/brain/sdk-barley-migration","docId":"brain/sdk-barley-migration","unlisted":false},{"type":"link","label":"Amiga ROS Bridge","href":"/docs/brain/ros-bridge","docId":"brain/ros-bridge","unlisted":false},{"type":"link","label":"Using a VNC Viewer","href":"/docs/examples/vnc_viewer/","docId":"examples/vnc_viewer/vnc-viewer","unlisted":false},{"type":"category","label":"Service Overviews","items":[{"type":"link","label":"Canbus","href":"/docs/concepts/canbus_service/","docId":"concepts/canbus_service/canbus-overview","unlisted":false},{"type":"link","label":"Oak","href":"/docs/concepts/oak_service/","docId":"concepts/oak_service/oak-overview","unlisted":false},{"type":"link","label":"GPS","href":"/docs/concepts/gps_service/","docId":"concepts/gps_service/gps-overview","unlisted":false},{"type":"link","label":"Recorder","href":"/docs/concepts/recorder_service/","docId":"concepts/recorder_service/recorder-overview","unlisted":false},{"type":"link","label":"Filter","href":"/docs/concepts/filter_service/","docId":"concepts/filter_service/filter-overview","unlisted":false},{"type":"link","label":"Track Follower","href":"/docs/concepts/track_follower_service/","docId":"concepts/track_follower_service/track-follower-overview","unlisted":false}],"collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"Microcontroller Kit Overview","href":"/docs/mcu_kit/","docId":"mcu_kit/microcontroller-kit","unlisted":false},{"type":"link","label":"Debug Cable Overview","href":"/docs/debug_cable/","docId":"debug_cable/debug-cable","unlisted":false},{"type":"link","label":"Service Cable Overview","href":"/docs/debug_cable/service-cable","docId":"debug_cable/service-cable","unlisted":false}],"label":"Microcontroller Kit","type":"category","collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"API Index","href":"/docs/api/","docId":"api/api-index","unlisted":false},{"type":"category","label":"Microcontroller API","items":[{"items":[{"type":"link","label":"can","href":"/docs/reference/circuitpy/utils/can","docId":"reference/circuitpy/utils/can","unlisted":false},{"type":"link","label":"cobid","href":"/docs/reference/circuitpy/utils/cobid","docId":"reference/circuitpy/utils/cobid","unlisted":false},{"type":"link","label":"debug_packet","href":"/docs/reference/circuitpy/utils/debug_packet","docId":"reference/circuitpy/utils/debug_packet","unlisted":false},{"type":"link","label":"farmng_sdo","href":"/docs/reference/circuitpy/utils/farmng_sdo","docId":"reference/circuitpy/utils/farmng_sdo","unlisted":false},{"type":"link","label":"general","href":"/docs/reference/circuitpy/utils/general","docId":"reference/circuitpy/utils/general","unlisted":false},{"type":"link","label":"io","href":"/docs/reference/circuitpy/utils/io","docId":"reference/circuitpy/utils/io","unlisted":false},{"type":"link","label":"main_loop","href":"/docs/reference/circuitpy/utils/main_loop","docId":"reference/circuitpy/utils/main_loop","unlisted":false},{"type":"link","label":"nvm","href":"/docs/reference/circuitpy/utils/nvm","docId":"reference/circuitpy/utils/nvm","unlisted":false},{"type":"link","label":"packet","href":"/docs/reference/circuitpy/utils/packet","docId":"reference/circuitpy/utils/packet","unlisted":false},{"type":"link","label":"ticks","href":"/docs/reference/circuitpy/utils/ticks","docId":"reference/circuitpy/utils/ticks","unlisted":false},{"type":"link","label":"version","href":"/docs/reference/circuitpy/utils/version","docId":"reference/circuitpy/utils/version","unlisted":false}],"label":"utils","type":"category","collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"type":"category","label":"Brain API","items":[{"items":[{"type":"link","label":"packet","href":"/docs/reference/brain/canbus/packet","docId":"reference/brain/canbus/packet","unlisted":false}],"label":"canbus","type":"category","collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true}],"label":"APIs","type":"category","collapsed":true,"collapsible":true}],"Resources/Support":[{"type":"link","label":"Recommended Tools","href":"/docs/hardware-tools/recommended-tools","docId":"hardware-tools/recommended-tools","unlisted":false},{"type":"link","label":"Frequently Asked Questions","href":"/docs/reference/faq","docId":"reference/faq","unlisted":false},{"type":"link","label":"GitHub 101","href":"/docs/support/github-101","docId":"support/github-101","unlisted":false},{"type":"link","label":"Brain v1.0","href":"/docs/brain/","docId":"brain/brain","unlisted":false},{"items":[{"type":"link","label":"AmigaOS 2.2 Dragon Fruit Release Notes","href":"/docs/release-notes/release-022","docId":"release-notes/release-022","unlisted":false},{"type":"link","label":"AmigaOS 2.1 Clementine Release Notes","href":"/docs/release-notes/release-021","docId":"release-notes/release-021","unlisted":false},{"type":"link","label":"AmigaOS 2.0 Barley Release Notes","href":"/docs/release-notes/release-02","docId":"release-notes/release-02","unlisted":false},{"type":"link","label":"AmigaOS 1.0 Artichoke Release Notes","href":"/docs/release-notes/release-01","docId":"release-notes/release-01","unlisted":false}],"label":"Release Notes","type":"category","collapsed":true,"collapsible":true}],"examples":[{"type":"link","label":"Examples Index","href":"/docs/examples/examples-index","docId":"examples/examples-index","unlisted":false},{"type":"category","label":"Microcontroller Examples","items":[{"type":"link","label":"Hello Main Loop Example","href":"/docs/examples/hello_main_loop/","docId":"examples/hello_main_loop/hello-world","unlisted":false},{"type":"link","label":"Cansniffer Example","href":"/docs/examples/cansniffer/","docId":"examples/cansniffer/cansniffer","unlisted":false},{"type":"link","label":"FPV Example","href":"/docs/examples/FPV/","docId":"examples/FPV/fpv","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Brain Examples","items":[{"items":[{"type":"link","label":"Events Recorder","href":"/docs/examples/events_recorder/","docId":"examples/events_recorder/events-recorder","unlisted":false}],"label":"Data Recording Examples","type":"category","collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"File Reader","href":"/docs/examples/file_reader/","docId":"examples/file_reader/file-reader","unlisted":false},{"type":"link","label":"File Converter","href":"/docs/examples/file_converter/","docId":"examples/file_converter/file-converter","unlisted":false},{"type":"link","label":"File Reader CAN","href":"/docs/examples/file_reader_can/","docId":"examples/file_reader_can/file-reader-can","unlisted":false},{"type":"link","label":"File Reader GPS","href":"/docs/examples/file_reader_gps/","docId":"examples/file_reader_gps/file-reader-gps","unlisted":false},{"type":"link","label":"File Reader Headers","href":"/docs/examples/file_reader_headers/","docId":"examples/file_reader_headers/file-reader-headers","unlisted":false}],"label":"Playback Examples","type":"category","collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"Camera Client","href":"/docs/examples/camera_client/","docId":"examples/camera_client/camera-client","unlisted":false},{"type":"link","label":"Camera Settings","href":"/docs/examples/camera_settings/","docId":"examples/camera_settings/camera-settings","unlisted":false},{"type":"link","label":"Camera Calibration","href":"/docs/examples/camera_calibration/","docId":"examples/camera_calibration/camera-calibration","unlisted":false},{"type":"link","label":"Camera Aruco Detector","href":"/docs/examples/camera_aruco_detector/","docId":"examples/camera_aruco_detector/camera-aruco-detector","unlisted":false},{"type":"link","label":"Camera Pointcloud","href":"/docs/examples/camera_pointcloud/","docId":"examples/camera_pointcloud/camera-pointcloud","unlisted":false}],"label":"Camera Examples","type":"category","collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"Motor State","href":"/docs/examples/motor_state/","docId":"examples/motor_state/motor-state","unlisted":false},{"type":"link","label":"Pendant State","href":"/docs/examples/pendant_state/","docId":"examples/pendant_state/pendant-state","unlisted":false},{"type":"link","label":"Vehicle Twist","href":"/docs/examples/vehicle_twist/","docId":"examples/vehicle_twist/vehicle-twist","unlisted":false},{"type":"link","label":"Tool Control","href":"/docs/examples/tool_control/","docId":"examples/tool_control/tool-control","unlisted":false},{"type":"link","label":"Dashboard Settings","href":"/docs/examples/dashboard_settings/","docId":"examples/dashboard_settings/dashboard-settings","unlisted":false},{"type":"link","label":"File Reader CAN","href":"/docs/examples/file_reader_can/","docId":"examples/file_reader_can/file-reader-can","unlisted":false}],"label":"CAN Bus Examples","type":"category","collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"GPS Client","href":"/docs/examples/gps_client/","docId":"examples/gps_client/gps-client","unlisted":false},{"type":"link","label":"File Reader GPS","href":"/docs/examples/file_reader_gps/","docId":"examples/file_reader_gps/file-reader-gps","unlisted":false}],"label":"GPS Examples","type":"category","collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"Filter Client","href":"/docs/examples/filter_client/","docId":"examples/filter_client/filter-client","unlisted":false}],"label":"State Estimation Examples","type":"category","collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"Record a Track","href":"/docs/examples/track_recorder/","docId":"examples/track_recorder/track-recorder","unlisted":false},{"type":"link","label":"Plot a Track","href":"/docs/examples/track_plotter/","docId":"examples/track_plotter/track-plotter","unlisted":false},{"type":"link","label":"Follow a Track","href":"/docs/examples/track_follower/","docId":"examples/track_follower/track-follower","unlisted":false},{"type":"link","label":"Track Planner","href":"/docs/examples/track_planner/","docId":"examples/track_planner/track-planner","unlisted":false},{"type":"link","label":"Drive a Square","href":"/docs/examples/square_track/","docId":"examples/square_track/square-track","unlisted":false}],"label":"Track Follower Examples","type":"category","collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"Multi Client Subscriber","href":"/docs/examples/multi_client_subscriber/","docId":"examples/multi_client_subscriber/multi-client-subscriber","unlisted":false},{"type":"link","label":"Multi Client GeoImage","href":"/docs/examples/multi_client_geoimage/","docId":"examples/multi_client_geoimage/multi-client-geoimage","unlisted":false}],"label":"Multi Client Examples","type":"category","collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"Service Client","href":"/docs/examples/service_client/","docId":"examples/service_client/service-client","unlisted":false},{"type":"link","label":"Service Counter","href":"/docs/examples/service_counter/","docId":"examples/service_counter/service-counter","unlisted":false},{"type":"link","label":"Service Propagation","href":"/docs/examples/service_propagation/","docId":"examples/service_propagation/service-propagation","unlisted":false}],"label":"Custom Service Examples","type":"category","collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"Monitor App","href":"/docs/examples/monitor_app/","docId":"examples/monitor_app/monitor-app","unlisted":false}],"label":"App Examples","type":"category","collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"type":"category","label":"Kivy App Examples","items":[{"type":"category","label":"00 -Introduction","items":[{"type":"link","label":"00 - Introduction","href":"/docs/tutorials/introduction/tutorial-introduction","docId":"tutorials/introduction/tutorial-introduction","unlisted":false},{"type":"link","label":"01 - Installing Templates","href":"/docs/tutorials/introduction/getting-started-kivy","docId":"tutorials/introduction/getting-started-kivy","unlisted":false},{"type":"link","label":"02 - Template Overview","href":"/docs/tutorials/introduction/template-overview","docId":"tutorials/introduction/template-overview","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"01 - Camera Streamer Example","items":[{"type":"link","label":"00 - Camera Streamer Overview","href":"/docs/tutorials/camera_streamer/camera-streamer-overview","docId":"tutorials/camera_streamer/camera-streamer-overview","unlisted":false},{"type":"link","label":"01 - Kivy Definition","href":"/docs/tutorials/camera_streamer/kivy-definition","docId":"tutorials/camera_streamer/kivy-definition","unlisted":false},{"type":"link","label":"02 - Python Implementation","href":"/docs/tutorials/camera_streamer/camera-stream","docId":"tutorials/camera_streamer/camera-stream","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"02 - Virtual Joystick Example","items":[{"type":"link","label":"00 - Virtual Joystick Overview","href":"/docs/tutorials/virtual_joystick/virtual-joystick-overview","docId":"tutorials/virtual_joystick/virtual-joystick-overview","unlisted":false},{"type":"link","label":"01 - Widget","href":"/docs/tutorials/virtual_joystick/virtual-joystick-widget","docId":"tutorials/virtual_joystick/virtual-joystick-widget","unlisted":false},{"type":"link","label":"02 - Main Implementation","href":"/docs/tutorials/virtual_joystick/device-streams","docId":"tutorials/virtual_joystick/device-streams","unlisted":false},{"type":"link","label":"03 - Further Exercises","href":"/docs/tutorials/virtual_joystick/further-exercises","docId":"tutorials/virtual_joystick/further-exercises","unlisted":false}],"collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true}]},"docs":{"amiga_quick_start/amiga-quick-start":{"id":"amiga_quick_start/amiga-quick-start","title":"Quick Start Guide","description":"Welcome to the Amiga Quick Start Guide","sidebar":"User Manual"},"api/api-index":{"id":"api/api-index","title":"API Index","description":"There are two distinct, yet compatible, APIs.","sidebar":"Developer"},"apps/autoplot_app/autoplot-app":{"id":"apps/autoplot_app/autoplot-app","title":"Autoplot App","description":"The Autoplot app is an advanced control interface for your Amiga, offering multiple modes of","sidebar":"User Manual"},"apps/camera_app/camera-app":{"id":"apps/camera_app/camera-app","title":"Camera App","description":"The Camera App is your centralized solution for configuring oak cameras and monitoring real-time","sidebar":"User Manual"},"apps/file_manager_app/file-manager-app":{"id":"apps/file_manager_app/file-manager-app","title":"File Manager App","description":"The File Manager app is an essential utility for the effective management of log files on your Amiga.","sidebar":"User Manual"},"apps/filter_app/filter-app":{"id":"apps/filter_app/filter-app","title":"Filter App","description":"Calibration","sidebar":"User Manual"},"apps/recorder_app/recorder-app":{"id":"apps/recorder_app/recorder-app","title":"Recorder App","description":"This guide will walk you through how to record field data and","sidebar":"User Manual"},"brain/app-ownership":{"id":"brain/app-ownership","title":"Custom Apps / Services Ownership","description":"\x3c!-- NOTE: Name kept as app-ownership to not break the link","sidebar":"Developer"},"brain/brain":{"id":"brain/brain","title":"Brain v1.0","description":"The Brain v1.0 tag here refers to the hardware version of the brain","sidebar":"Resources/Support"},"brain/brain-apps":{"id":"brain/brain-apps","title":"Custom Applications (ReactJS)","description":"Create an app","sidebar":"Developer"},"brain/brain-apps-kivy":{"id":"brain/brain-apps-kivy","title":"Custom Applications (Kivy)","description":"In this tutorial we will show you how to develop a custom Kivy application for the Amiga Brain.","sidebar":"Developer"},"brain/brain-apps-manifest":{"id":"brain/brain-apps-manifest","title":"Custom Applications Manifest","description":"As explained in the brain apps section, the brain apps and services are a way to extend the functionality of the brain.","sidebar":"Developer"},"brain/brain-install":{"id":"brain/brain-install","title":"Brain ADK Install","description":"PyPI version","sidebar":"Developer"},"brain/custom-troubleshooting":{"id":"brain/custom-troubleshooting","title":"Custom Apps / Services Troubleshooting","description":"Single Owner Limitation: When a custom app or service is registered via the manifest.json,","sidebar":"Developer"},"brain/next-steps":{"id":"brain/next-steps","title":"Next Steps","description":"You will not be able to follow the examples and tutorials listed","sidebar":"Developer"},"brain/ros-bridge":{"id":"brain/ros-bridge","title":"Amiga ROS Bridge","description":"This is out-of-date for brains running v2.x Amiga OS software.","sidebar":"Developer"},"brain/sdk-barley-migration":{"id":"brain/sdk-barley-migration","title":"Migration Guide to Amiga OS 2.0","description":"Preamble","sidebar":"Developer"},"concepts/canbus_service/canbus-overview":{"id":"concepts/canbus_service/canbus-overview","title":"Canbus","description":"The Canbus service is an integral component of the Amiga platform.","sidebar":"Developer"},"concepts/concepts-index":{"id":"concepts/concepts-index","title":"Concepts Index","description":"Fundamental Concepts","sidebar":"Developer"},"concepts/filter_service/filter-overview":{"id":"concepts/filter_service/filter-overview","title":"Filter","description":"The Filter service is the state estimation core of the Amiga, crucial for understanding the robot\'s","sidebar":"Developer"},"concepts/gps_service/gps-overview":{"id":"concepts/gps_service/gps-overview","title":"GPS","description":"The GPS service is an integral component of the Amiga\'s navigation system, utilizing a","sidebar":"Developer"},"concepts/oak_service/oak-overview":{"id":"concepts/oak_service/oak-overview","title":"Oak","description":"The OAK service is a versatile component in the Amiga ecosystem, providing valuable data streams","sidebar":"Developer"},"concepts/recorder_service/recorder-overview":{"id":"concepts/recorder_service/recorder-overview","title":"Recorder","description":"The Recorder App/Service is the backbone of the Amiga\'s data logging and playback functionality.","sidebar":"Developer"},"concepts/system_overview/amiga-dev":{"id":"concepts/system_overview/amiga-dev","title":"Amiga Development 101","description":"Welcome to the world of Amiga robot development!","sidebar":"Developer"},"concepts/track_follower_service/track-follower-overview":{"id":"concepts/track_follower_service/track-follower-overview","title":"Track Follower","description":"The Track Follower is the autonomy hub of the Amiga.","sidebar":"Developer"},"concepts/tracks_and_waypoints/tracks-and-waypoints":{"id":"concepts/tracks_and_waypoints/tracks-and-waypoints","title":"Tracks & Waypoints","description":"Understanding Transforms & Poses","sidebar":"Developer"},"concepts/transforms_and_poses/transforms-and-poses":{"id":"concepts/transforms_and_poses/transforms-and-poses","title":"Transforms & Poses","description":"Fundamental Concepts","sidebar":"Developer"},"contribute/contribute-website":{"id":"contribute/contribute-website","title":"Documentation","description":"This page contains instructions for developers who want to contribute to the Amiga Development Kit documentation."},"dashboard/control-states":{"id":"dashboard/control-states","title":"Amiga Control States","description":"Amiga control states","sidebar":"User Manual"},"dashboard/dashboard-debugging":{"id":"dashboard/dashboard-debugging","title":"Debugging error codes","description":"This section is intended for the dashboard firmware v0.3.0 and older.","sidebar":"User Manual"},"dashboard/dashboard-fw":{"id":"dashboard/dashboard-fw","title":"Dashboard Firmware Updates","description":"Dashboard firmware updates","sidebar":"User Manual"},"dashboard/dashboard-overview":{"id":"dashboard/dashboard-overview","title":"Dashboard Overview","description":"DSCF6570-2-16x9-aspect-reduced","sidebar":"User Manual"},"dashboard/dashboard-user-guide":{"id":"dashboard/dashboard-user-guide","title":"Dashboard User Guide","description":"This guide is subject to change with each new update to the Dashboard.","sidebar":"User Manual"},"debug_cable/debug-cable":{"id":"debug_cable/debug-cable","title":"Debug Cable Overview","description":"image","sidebar":"Developer"},"debug_cable/service-cable":{"id":"debug_cable/service-cable","title":"Service Cable Overview","description":"IMG-9583","sidebar":"Developer"},"examples/camera_aruco_detector/camera-aruco-detector":{"id":"examples/camera_aruco_detector/camera-aruco-detector","title":"Camera Aruco Detector","description":"Before diving into this code, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/camera_calibration/camera-calibration":{"id":"examples/camera_calibration/camera-calibration","title":"Camera Calibration","description":"Before diving into this code, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/camera_client/camera-client":{"id":"examples/camera_client/camera-client","title":"Camera Client","description":"Before diving into this code, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/camera_pointcloud/camera-pointcloud":{"id":"examples/camera_pointcloud/camera-pointcloud","title":"Camera Pointcloud","description":"Before diving into this code, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/camera_settings/camera-settings":{"id":"examples/camera_settings/camera-settings","title":"Camera Settings","description":"Before diving into this code, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/cansniffer/cansniffer":{"id":"examples/cansniffer/cansniffer","title":"Cansniffer Example","description":"Link to cansniffer/code.py","sidebar":"examples"},"examples/dashboard_settings/dashboard-settings":{"id":"examples/dashboard_settings/dashboard-settings","title":"Dashboard Settings","description":"Before diving into this code, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/events_recorder/events-recorder":{"id":"examples/events_recorder/events-recorder","title":"Events Recorder","description":"Before diving into this example, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/examples-index":{"id":"examples/examples-index","title":"Examples Index","description":"Microcontroller Examples","sidebar":"examples"},"examples/file_converter/file-converter":{"id":"examples/file_converter/file-converter","title":"File Converter","description":"Before diving into this example, here\'s a quick overview of what you\'ll need to be familiar with:","sidebar":"examples"},"examples/file_reader_can/file-reader-can":{"id":"examples/file_reader_can/file-reader-can","title":"File Reader CAN","description":"Before diving into this example, here\'s a quick overview of what you\'ll need to be familiar with:","sidebar":"examples"},"examples/file_reader_gps/file-reader-gps":{"id":"examples/file_reader_gps/file-reader-gps","title":"File Reader GPS","description":"1. Python Programming: Understanding basic Python programming concepts such as functions, loops,","sidebar":"examples"},"examples/file_reader_headers/file-reader-headers":{"id":"examples/file_reader_headers/file-reader-headers","title":"File Reader Headers","description":"Before diving into this example, here\'s a quick overview of what you\'ll need to be familiar with:","sidebar":"examples"},"examples/file_reader/file-reader":{"id":"examples/file_reader/file-reader","title":"File Reader","description":"Before diving into this example, here\'s a quick overview of what you\'ll need to be familiar with:","sidebar":"examples"},"examples/filter_client/filter-client":{"id":"examples/filter_client/filter-client","title":"Filter Client","description":"Before diving into this code, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/FPV/fpv":{"id":"examples/FPV/fpv","title":"FPV Example","description":"Link to FPV/code.py","sidebar":"examples"},"examples/gps_client/gps-client":{"id":"examples/gps_client/gps-client","title":"GPS Client","description":"Before diving into this code, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/hello_main_loop/hello-world":{"id":"examples/hello_main_loop/hello-world","title":"Hello Main Loop Example","description":"Link to hellomainloop/code.py","sidebar":"examples"},"examples/monitor_app/monitor-app":{"id":"examples/monitor_app/monitor-app","title":"Monitor App","description":"Before diving into this code, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/motor_state/motor-state":{"id":"examples/motor_state/motor-state","title":"Motor State","description":"Before diving into this code, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/multi_client_geoimage/multi-client-geoimage":{"id":"examples/multi_client_geoimage/multi-client-geoimage","title":"Multi Client GeoImage","description":"Before diving into this code, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/multi_client_subscriber/multi-client-subscriber":{"id":"examples/multi_client_subscriber/multi-client-subscriber","title":"Multi Client Subscriber","description":"Before diving into this code, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/pendant_state/pendant-state":{"id":"examples/pendant_state/pendant-state","title":"Pendant State","description":"Before diving into this code, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/service_client/service-client":{"id":"examples/service_client/service-client","title":"Service Client","description":"Before diving into this code, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/service_counter/service-counter":{"id":"examples/service_counter/service-counter","title":"Service Counter","description":"Before diving into this code, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/service_propagation/service-propagation":{"id":"examples/service_propagation/service-propagation","title":"Service Propagation","description":"Before diving into this code, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/square_track/square-track":{"id":"examples/square_track/square-track","title":"Drive a Square","description":"Before diving into this code, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/tool_control/tool-control":{"id":"examples/tool_control/tool-control","title":"Tool Control","description":"Running this example has minimum release versions of:","sidebar":"examples"},"examples/track_follower/track-follower":{"id":"examples/track_follower/track-follower","title":"Follow a Track","description":"Before diving into this code, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/track_planner/track-planner":{"id":"examples/track_planner/track-planner","title":"Track Planner","description":"Before diving into this code, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/track_plotter/track-plotter":{"id":"examples/track_plotter/track-plotter","title":"Plot a Track","description":"Before diving into this code, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/track_recorder/track-recorder":{"id":"examples/track_recorder/track-recorder","title":"Record a Track","description":"Before diving into this code, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/vehicle_twist/vehicle-twist":{"id":"examples/vehicle_twist/vehicle-twist","title":"Vehicle Twist","description":"Before diving into this code, here\'s a quick heads-up on what you\'ll need to be familiar with:","sidebar":"examples"},"examples/vnc_viewer/vnc-viewer":{"id":"examples/vnc_viewer/vnc-viewer","title":"Using a VNC Viewer","description":"If you want to see the screen of the Amiga and interact with it from a laptop or dev station,","sidebar":"Developer"},"farm-tools/three-point":{"id":"farm-tools/three-point","title":"Installation Guide","description":"This guide is a step by step instruction on how to assemble the farm-ng three","sidebar":"User Manual"},"getting-started":{"id":"getting-started","title":"Introduction","description":"Welcome to the Amiga Development Kit"},"hardware-tools/etools":{"id":"hardware-tools/etools","title":"Basic Electronics Tool Kit","description":"Basic recommended tool kit for hardware hacking"},"hardware-tools/recommended-tools":{"id":"hardware-tools/recommended-tools","title":"Recommended Tools","description":"Basic recommended tool kit for hardware hacking","sidebar":"Resources/Support"},"intelligence-kit/brain/brain-v2":{"id":"intelligence-kit/brain/brain-v2","title":"Brain v2.0","description":"The Brain v2.0 tag here refers to the hardware version of the brain","sidebar":"User Manual"},"intelligence-kit/overview-intel":{"id":"intelligence-kit/overview-intel","title":"Intelligence Kit Overview","description":"DSCF8544","sidebar":"User Manual"},"mcu_kit/microcontroller-kit":{"id":"mcu_kit/microcontroller-kit","title":"Microcontroller Kit Overview","description":"We sell a complete kit containing all necessary components on the Amiga shop website: farm-ng microcontroller kit","sidebar":"Developer"},"pendant/pendant":{"id":"pendant/pendant","title":"Pendant Overview","description":"pendant 3","sidebar":"User Manual"},"reference/brain/canbus/packet":{"id":"reference/brain/canbus/packet","title":"canbus.packet","description":"AmigaControlState Objects","sidebar":"Developer"},"reference/brain/track/utils":{"id":"reference/brain/track/utils","title":"track.utils","description":"filter\\\\track\\\\to\\\\_track"},"reference/circuitpy/utils/can":{"id":"reference/circuitpy/utils/can","title":"utils.can","description":"setup\\\\can\\\\default","sidebar":"Developer"},"reference/circuitpy/utils/cobid":{"id":"reference/circuitpy/utils/cobid","title":"utils.cobid","description":"CanOpenObject Objects","sidebar":"Developer"},"reference/circuitpy/utils/debug_packet":{"id":"reference/circuitpy/utils/debug_packet","title":"utils.debug_packet","description":"FarmngDebugMemory Objects","sidebar":"Developer"},"reference/circuitpy/utils/farmng_sdo":{"id":"reference/circuitpy/utils/farmng_sdo","title":"utils.farmng_sdo","description":"ReqRepOpIds Objects","sidebar":"Developer"},"reference/circuitpy/utils/general":{"id":"reference/circuitpy/utils/general","title":"utils.general","description":"path\\\\_dirname","sidebar":"Developer"},"reference/circuitpy/utils/io":{"id":"reference/circuitpy/utils/io","title":"utils.io","description":"sense","sidebar":"Developer"},"reference/circuitpy/utils/main_loop":{"id":"reference/circuitpy/utils/main_loop","title":"utils.main_loop","description":"get\\\\node\\\\id","sidebar":"Developer"},"reference/circuitpy/utils/nvm":{"id":"reference/circuitpy/utils/nvm","title":"utils.nvm","description":"nvm\\\\node\\\\id","sidebar":"Developer"},"reference/circuitpy/utils/packet":{"id":"reference/circuitpy/utils/packet","title":"utils.packet","description":"PendantButtons Objects","sidebar":"Developer"},"reference/circuitpy/utils/ticks":{"id":"reference/circuitpy/utils/ticks","title":"utils.ticks","description":"ticks\\\\_ms","sidebar":"Developer"},"reference/circuitpy/utils/version":{"id":"reference/circuitpy/utils/version","title":"utils.version","description":"Update values following semantic versioning convention.","sidebar":"Developer"},"reference/faq":{"id":"reference/faq","title":"Frequently Asked Questions","description":"Using the REPL","sidebar":"Resources/Support"},"release-notes/release-01":{"id":"release-notes/release-01","title":"AmigaOS 1.0 Artichoke Release Notes","description":"At farm-ng we love making tools for engineers, hackers, building","sidebar":"Resources/Support"},"release-notes/release-02":{"id":"release-notes/release-02","title":"AmigaOS 2.0 Barley Release Notes","description":"barley-logo","sidebar":"Resources/Support"},"release-notes/release-021":{"id":"release-notes/release-021","title":"AmigaOS 2.1 Clementine Release Notes","description":"We\'re excited to announce the launch of AmigaOS 2.1 \u201cClementine,\u201d a significant update packed with","sidebar":"Resources/Support"},"release-notes/release-022":{"id":"release-notes/release-022","title":"AmigaOS 2.2 Dragon Fruit Release Notes","description":"We\'re excited to announce the launch of AmigaOS 2.2 \u201cDragon Fruit!\u201d This is a","sidebar":"Resources/Support"},"ssh/ssh":{"id":"ssh/ssh","title":"Access and Develop on the Brain","description":"Users can remotely access and start developing on the brain via SSH access.","sidebar":"Developer"},"support/github-101":{"id":"support/github-101","title":"GitHub 101","description":"Welcome to GitHub 101!","sidebar":"Resources/Support"},"support/support":{"id":"support/support","title":"Support","description":"Check our FAQ\'s"},"tutorials/camera_streamer/camera-stream":{"id":"tutorials/camera_streamer/camera-stream","title":"02 - Python Implementation","description":"Similar to the last tutorial, this will give a break down of the most important features of the","sidebar":"examples"},"tutorials/camera_streamer/camera-streamer-overview":{"id":"tutorials/camera_streamer/camera-streamer-overview","title":"00 - Camera Streamer Overview","description":"This tutorial builds off of the","sidebar":"examples"},"tutorials/camera_streamer/kivy-definition":{"id":"tutorials/camera_streamer/kivy-definition","title":"01 - Kivy Definition","description":"In this tutorial, we will be adding a few new elements to our app, a Tabbed Panel and Images","sidebar":"examples"},"tutorials/introduction/getting-started-kivy":{"id":"tutorials/introduction/getting-started-kivy","title":"01 - Installing Templates","description":"In this tutorial we will show you how to develop a custom Kivy application for the Amiga Brain.","sidebar":"examples"},"tutorials/introduction/template-overview":{"id":"tutorials/introduction/template-overview","title":"02 - Template Overview","description":"This section describes the Python and kivy code in the","sidebar":"examples"},"tutorials/introduction/tutorial-introduction":{"id":"tutorials/introduction/tutorial-introduction","title":"00 - Introduction","description":"This is a three part tutorial designed to walk you through the process of","sidebar":"examples"},"tutorials/virtual_joystick/device-streams":{"id":"tutorials/virtual_joystick/device-streams","title":"02 - Main Implementation","description":"Kivy","sidebar":"examples"},"tutorials/virtual_joystick/further-exercises":{"id":"tutorials/virtual_joystick/further-exercises","title":"03 - Further Exercises","description":"Optionally, go beyond the tutorial and try to add features to this example.","sidebar":"examples"},"tutorials/virtual_joystick/virtual-joystick-overview":{"id":"tutorials/virtual_joystick/virtual-joystick-overview","title":"00 - Virtual Joystick Overview","description":"This tutorial builds off of the","sidebar":"examples"},"tutorials/virtual_joystick/virtual-joystick-widget":{"id":"tutorials/virtual_joystick/virtual-joystick-widget","title":"01 - Widget","description":"We will begin by defining a custom widget, the VirtualJoystickWidget,","sidebar":"examples"}}}')}}]); \ No newline at end of file diff --git a/assets/js/982ac012.102d8be9.js b/assets/js/982ac012.102d8be9.js deleted file mode 100644 index fc157e36b..000000000 --- a/assets/js/982ac012.102d8be9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkamiga_developers_website=self.webpackChunkamiga_developers_website||[]).push([[6983],{3306:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>s,default:()=>h,frontMatter:()=>o,metadata:()=>c,toc:()=>l});var i=t(5893),r=t(1151);const o={id:"api-index",title:"API Index"},s=void 0,c={id:"api/api-index",title:"API Index",description:"There are two distinct, yet compatible, APIs.",source:"@site/docs/api/README.md",sourceDirName:"api",slug:"/api/",permalink:"/docs/api/",draft:!1,unlisted:!1,editUrl:"https://github.com/farm-ng/amiga-dev-kit/tree/main/website/docs/api/README.md",tags:[],version:"current",frontMatter:{id:"api-index",title:"API Index"},sidebar:"Developer",previous:{title:"Service Cable Overview",permalink:"/docs/debug_cable/service-cable"},next:{title:"can",permalink:"/docs/reference/circuitpy/utils/can"}},a={},l=[{value:"Microcontroller API",id:"microcontroller-api",level:2},{value:"Brain API",id:"brain-api",level:2},{value:"Not seeing what you need?",id:"not-seeing-what-you-need",level:2}];function d(e){const n={a:"a",h2:"h2",p:"p",strong:"strong",...(0,r.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.p,{children:"There are two distinct, yet compatible, APIs."}),"\n",(0,i.jsx)(n.h2,{id:"microcontroller-api",children:"Microcontroller API"}),"\n",(0,i.jsxs)(n.p,{children:["This is the API of the farm-ng microcontroller development kit and is used in the\n",(0,i.jsx)(n.a,{href:"/docs/examples/examples-index#microcontroller-examples",children:(0,i.jsx)(n.strong,{children:"Microcontroller Examples"})}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["This is ",(0,i.jsx)(n.a,{href:"https://circuitpython.org/",children:(0,i.jsx)(n.strong,{children:"CircuitPython"})})," and is\nfor running directly on micro-controllers,\nlike the ",(0,i.jsx)(n.a,{href:"/docs/mcu_kit/",children:(0,i.jsx)(n.strong,{children:"farm-ng microcontroller kit"})}),".\nIf you intend to use your own micro-controller or computer to\ninteract directly with the Amiga through the CAN bus, you should use this API."]}),"\n",(0,i.jsx)(n.h2,{id:"brain-api",children:"Brain API"}),"\n",(0,i.jsxs)(n.p,{children:["This is the API of the farm-ng Brain development kit and is used in the\n",(0,i.jsx)(n.a,{href:"/docs/examples/examples-index#brain-adk-examples",children:(0,i.jsx)(n.strong,{children:"Brain ADK Examples"})}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["This is for running directly on the\n",(0,i.jsx)(n.a,{href:"/docs/intelligence-kit/brain/brain-v2/",children:(0,i.jsx)(n.strong,{children:"farm-ng Brain"})}),"\nor for interacting with the gRPC services running on the brain\nfrom another computer."]}),"\n",(0,i.jsx)(n.h2,{id:"not-seeing-what-you-need",children:"Not seeing what you need?"}),"\n",(0,i.jsxs)(n.p,{children:["Reach out to us by creating a ",(0,i.jsx)(n.a,{href:"/docs/support/#documentation-request",children:"Documentation Request"}),"\nbased on the instructions on our support page."]})]})}function h(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>c,a:()=>s});var i=t(7294);const r={},o=i.createContext(r);function s(e){const n=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/982ac012.9dc873c6.js b/assets/js/982ac012.9dc873c6.js new file mode 100644 index 000000000..d7c9d9463 --- /dev/null +++ b/assets/js/982ac012.9dc873c6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkamiga_developers_website=self.webpackChunkamiga_developers_website||[]).push([[6983],{3306:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>s,default:()=>h,frontMatter:()=>o,metadata:()=>c,toc:()=>l});var i=t(5893),r=t(1151);const o={id:"api-index",title:"API Index"},s=void 0,c={id:"api/api-index",title:"API Index",description:"There are two distinct, yet compatible, APIs.",source:"@site/docs/api/README.md",sourceDirName:"api",slug:"/api/",permalink:"/docs/api/",draft:!1,unlisted:!1,editUrl:"https://github.com/farm-ng/amiga-dev-kit/tree/main/website/docs/api/README.md",tags:[],version:"current",frontMatter:{id:"api-index",title:"API Index"},sidebar:"Developer",previous:{title:"Microcontroller Kit",permalink:"/docs/mcu_kit/"},next:{title:"can",permalink:"/docs/reference/circuitpy/utils/can"}},a={},l=[{value:"Microcontroller API",id:"microcontroller-api",level:2},{value:"Brain API",id:"brain-api",level:2},{value:"Not seeing what you need?",id:"not-seeing-what-you-need",level:2}];function d(e){const n={a:"a",h2:"h2",p:"p",strong:"strong",...(0,r.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.p,{children:"There are two distinct, yet compatible, APIs."}),"\n",(0,i.jsx)(n.h2,{id:"microcontroller-api",children:"Microcontroller API"}),"\n",(0,i.jsxs)(n.p,{children:["This is the API of the farm-ng microcontroller development kit and is used in the\n",(0,i.jsx)(n.a,{href:"/docs/examples/examples-index#microcontroller-examples",children:(0,i.jsx)(n.strong,{children:"Microcontroller Examples"})}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["This is ",(0,i.jsx)(n.a,{href:"https://circuitpython.org/",children:(0,i.jsx)(n.strong,{children:"CircuitPython"})})," and is\nfor running directly on micro-controllers,\nlike the ",(0,i.jsx)(n.a,{href:"/docs/mcu_kit/",children:(0,i.jsx)(n.strong,{children:"farm-ng microcontroller kit"})}),".\nIf you intend to use your own micro-controller or computer to\ninteract directly with the Amiga through the CAN bus, you should use this API."]}),"\n",(0,i.jsx)(n.h2,{id:"brain-api",children:"Brain API"}),"\n",(0,i.jsxs)(n.p,{children:["This is the API of the farm-ng Brain development kit and is used in the\n",(0,i.jsx)(n.a,{href:"/docs/examples/examples-index#brain-adk-examples",children:(0,i.jsx)(n.strong,{children:"Brain ADK Examples"})}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["This is for running directly on the\n",(0,i.jsx)(n.a,{href:"/docs/intelligence-kit/brain/brain-v2/",children:(0,i.jsx)(n.strong,{children:"farm-ng Brain"})}),"\nor for interacting with the gRPC services running on the brain\nfrom another computer."]}),"\n",(0,i.jsx)(n.h2,{id:"not-seeing-what-you-need",children:"Not seeing what you need?"}),"\n",(0,i.jsxs)(n.p,{children:["Reach out to us by creating a ",(0,i.jsx)(n.a,{href:"/docs/support/#documentation-request",children:"Documentation Request"}),"\nbased on the instructions on our support page."]})]})}function h(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>c,a:()=>s});var i=t(7294);const r={},o=i.createContext(r);function s(e){const n=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/fd7e5383.1078015c.js b/assets/js/fd7e5383.1078015c.js deleted file mode 100644 index 831ad7236..000000000 --- a/assets/js/fd7e5383.1078015c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkamiga_developers_website=self.webpackChunkamiga_developers_website||[]).push([[7282],{1023:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>c,default:()=>h,frontMatter:()=>s,metadata:()=>d,toc:()=>l});var r=t(5893),i=t(1151);const s={id:"service-cable",title:"Service Cable Overview"},c=void 0,d={id:"debug_cable/service-cable",title:"Service Cable Overview",description:"IMG-9583",source:"@site/docs/debug_cable/service_cable.md",sourceDirName:"debug_cable",slug:"/debug_cable/service-cable",permalink:"/docs/debug_cable/service-cable",draft:!1,unlisted:!1,editUrl:"https://github.com/farm-ng/amiga-dev-kit/tree/main/website/docs/debug_cable/service_cable.md",tags:[],version:"current",frontMatter:{id:"service-cable",title:"Service Cable Overview"},sidebar:"Developer",previous:{title:"Debug Cable Overview",permalink:"/docs/debug_cable/"},next:{title:"API Index",permalink:"/docs/api/"}},o={},l=[{value:"Overview",id:"overview",level:2},{value:"Product specific uses",id:"product-specific-uses",level:3},{value:"Dashboard",id:"dashboard",level:4},{value:"How to connect",id:"how-to-connect",level:3},{value:"REPL for BOOTLOADER State",id:"repl-for-bootloader-state",level:4},{value:"On Linux/ WSL",id:"on-linux-wsl",level:5},{value:"Pinout",id:"pinout",level:2}];function a(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",h4:"h4",h5:"h5",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{src:"https://user-images.githubusercontent.com/64480560/205402624-fa7d8a61-4017-4691-9d24-d6d3ebdeb359.jpg",alt:"IMG-9583"})}),"\n",(0,r.jsx)(n.h2,{id:"overview",children:"Overview"}),"\n",(0,r.jsx)(n.p,{children:"Cable used to update and service farm-ng products.\nIt includes reset functionality and USB communication."}),"\n",(0,r.jsx)(n.admonition,{type:"caution",children:(0,r.jsx)(n.p,{children:"It is required to have a data USB-C cable and not a charge only USB-C cable\nwhen connecting to the debug or service cable."})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{src:"https://user-images.githubusercontent.com/64480560/205402615-a182d74f-ea46-437b-ad3f-f02f4efbb28d.jpg",alt:"IMG-9585"})}),"\n",(0,r.jsx)(n.h3,{id:"product-specific-uses",children:"Product specific uses"}),"\n",(0,r.jsx)(n.h4,{id:"dashboard",children:"Dashboard"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"USB interface is for REPL, filesystem access as well as\nupdating firmware and applications,"}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"how-to-connect",children:"How to connect"}),"\n",(0,r.jsx)(n.p,{children:"Connect cable to the debug port on the back of the dashboard"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{src:"https://user-images.githubusercontent.com/64480560/206007745-b36c59c7-22dd-4435-9cae-8503956174f3.png",alt:"187535995-d4ad8c7c-05a0-482b-8be9-6b6fb6b87ac3"})}),"\n",(0,r.jsx)(n.h4,{id:"repl-for-bootloader-state",children:"REPL for BOOTLOADER State"}),"\n",(0,r.jsx)(n.p,{children:"These commands from the REPL will put the device into the\nbootloader state the same way the double press reset on would."}),"\n",(0,r.jsx)(n.h5,{id:"on-linux-wsl",children:"On Linux/ WSL"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"sudo screen /dev/ttyACM0\n\nimport microcontroller\nmicrocontroller.on_next_reset(microcontroller.RunMode.BOOTLOADER)\nmicrocontroller.reset()\n"})}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"See update process documentation for more information"}),"\n",(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.a,{href:"/docs/dashboard/dashboard-fw",children:"here"})})]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"See flashing and operating system documentation for more"}),"\n",(0,r.jsxs)(n.strong,{children:["information ",(0,r.jsx)(n.a,{href:"//docs/intelligence-kit/brain/brain-v2/",children:"here"})]})]}),"\n",(0,r.jsx)(n.h2,{id:"pinout",children:"Pinout"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"PIN"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Typical Wire Color"}),(0,r.jsx)(n.th,{children:"Notes"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"1"}),(0,r.jsx)(n.td,{children:"USB D-"}),(0,r.jsx)(n.td,{children:"Yellow"}),(0,r.jsx)(n.td,{})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"2"}),(0,r.jsx)(n.td,{children:"USB D+"}),(0,r.jsx)(n.td,{children:"Gray"}),(0,r.jsx)(n.td,{})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"3"}),(0,r.jsx)(n.td,{children:"USB VBUS"}),(0,r.jsx)(n.td,{children:"Pink"}),(0,r.jsx)(n.td,{})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"4"}),(0,r.jsx)(n.td,{children:"NC"}),(0,r.jsx)(n.td,{children:"Blue"}),(0,r.jsx)(n.td,{})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"5"}),(0,r.jsx)(n.td,{children:"GND"}),(0,r.jsx)(n.td,{children:"Black"}),(0,r.jsx)(n.td,{})]})]})]})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>d,a:()=>c});var r=t(7294);const i={},s=r.createContext(i);function c(e){const n=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:c(e.components),r.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/fd7e5383.1894dc18.js b/assets/js/fd7e5383.1894dc18.js new file mode 100644 index 000000000..def58cf1e --- /dev/null +++ b/assets/js/fd7e5383.1894dc18.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkamiga_developers_website=self.webpackChunkamiga_developers_website||[]).push([[7282],{1023:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>c,default:()=>h,frontMatter:()=>s,metadata:()=>d,toc:()=>l});var r=n(5893),i=n(1151);const s={id:"service-cable",title:"Service Cable Overview"},c=void 0,d={id:"debug_cable/service-cable",title:"Service Cable Overview",description:"IMG-9583",source:"@site/docs/debug_cable/service_cable.md",sourceDirName:"debug_cable",slug:"/debug_cable/service-cable",permalink:"/docs/debug_cable/service-cable",draft:!1,unlisted:!1,editUrl:"https://github.com/farm-ng/amiga-dev-kit/tree/main/website/docs/debug_cable/service_cable.md",tags:[],version:"current",frontMatter:{id:"service-cable",title:"Service Cable Overview"},sidebar:"User Manual",previous:{title:"Installation Guide",permalink:"/docs/farm-tools/three-point"},next:{title:"Debug Cable Overview",permalink:"/docs/debug_cable/"}},o={},l=[{value:"Overview",id:"overview",level:2},{value:"Product specific uses",id:"product-specific-uses",level:3},{value:"Dashboard",id:"dashboard",level:4},{value:"How to connect",id:"how-to-connect",level:3},{value:"REPL for BOOTLOADER State",id:"repl-for-bootloader-state",level:4},{value:"On Linux/ WSL",id:"on-linux-wsl",level:5},{value:"Pinout",id:"pinout",level:2}];function a(e){const t={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",h4:"h4",h5:"h5",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.p,{children:(0,r.jsx)(t.img,{src:"https://user-images.githubusercontent.com/64480560/205402624-fa7d8a61-4017-4691-9d24-d6d3ebdeb359.jpg",alt:"IMG-9583"})}),"\n",(0,r.jsx)(t.h2,{id:"overview",children:"Overview"}),"\n",(0,r.jsx)(t.p,{children:"Cable used to update and service farm-ng products.\nIt includes reset functionality and USB communication."}),"\n",(0,r.jsx)(t.admonition,{type:"caution",children:(0,r.jsx)(t.p,{children:"It is required to have a data USB-C cable and not a charge only USB-C cable\nwhen connecting to the debug or service cable."})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.img,{src:"https://user-images.githubusercontent.com/64480560/205402615-a182d74f-ea46-437b-ad3f-f02f4efbb28d.jpg",alt:"IMG-9585"})}),"\n",(0,r.jsx)(t.h3,{id:"product-specific-uses",children:"Product specific uses"}),"\n",(0,r.jsx)(t.h4,{id:"dashboard",children:"Dashboard"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"USB interface is for REPL, filesystem access as well as\nupdating firmware and applications,"}),"\n"]}),"\n",(0,r.jsx)(t.h3,{id:"how-to-connect",children:"How to connect"}),"\n",(0,r.jsx)(t.p,{children:"Connect cable to the debug port on the back of the dashboard"}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.img,{src:"https://user-images.githubusercontent.com/64480560/206007745-b36c59c7-22dd-4435-9cae-8503956174f3.png",alt:"187535995-d4ad8c7c-05a0-482b-8be9-6b6fb6b87ac3"})}),"\n",(0,r.jsx)(t.h4,{id:"repl-for-bootloader-state",children:"REPL for BOOTLOADER State"}),"\n",(0,r.jsx)(t.p,{children:"These commands from the REPL will put the device into the\nbootloader state the same way the double press reset on would."}),"\n",(0,r.jsx)(t.h5,{id:"on-linux-wsl",children:"On Linux/ WSL"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"sudo screen /dev/ttyACM0\n\nimport microcontroller\nmicrocontroller.on_next_reset(microcontroller.RunMode.BOOTLOADER)\nmicrocontroller.reset()\n"})}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"See update process documentation for more information"}),"\n",(0,r.jsx)(t.strong,{children:(0,r.jsx)(t.a,{href:"/docs/dashboard/dashboard-fw",children:"here"})})]}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"See flashing and operating system documentation for more"}),"\n",(0,r.jsxs)(t.strong,{children:["information ",(0,r.jsx)(t.a,{href:"//docs/intelligence-kit/brain/brain-v2/",children:"here"})]})]}),"\n",(0,r.jsx)(t.h2,{id:"pinout",children:"Pinout"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"PIN"}),(0,r.jsx)(t.th,{children:"Description"}),(0,r.jsx)(t.th,{children:"Typical Wire Color"}),(0,r.jsx)(t.th,{children:"Notes"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"1"}),(0,r.jsx)(t.td,{children:"USB D-"}),(0,r.jsx)(t.td,{children:"Yellow"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"2"}),(0,r.jsx)(t.td,{children:"USB D+"}),(0,r.jsx)(t.td,{children:"Gray"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"3"}),(0,r.jsx)(t.td,{children:"USB VBUS"}),(0,r.jsx)(t.td,{children:"Pink"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"4"}),(0,r.jsx)(t.td,{children:"NC"}),(0,r.jsx)(t.td,{children:"Blue"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"5"}),(0,r.jsx)(t.td,{children:"GND"}),(0,r.jsx)(t.td,{children:"Black"}),(0,r.jsx)(t.td,{})]})]})]})]})}function h(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>d,a:()=>c});var r=n(7294);const i={},s=r.createContext(i);function c(e){const t=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:c(e.components),r.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/main.7e844e23.js b/assets/js/main.7e844e23.js deleted file mode 100644 index 9b2e494c6..000000000 --- a/assets/js/main.7e844e23.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see main.7e844e23.js.LICENSE.txt */ -(self.webpackChunkamiga_developers_website=self.webpackChunkamiga_developers_website||[]).push([[179],{830:(e,t,n)=>{"use strict";n.d(t,{W:()=>a});var r=n(7294);function a(){return r.createElement("svg",{width:"20",height:"20",className:"DocSearch-Search-Icon",viewBox:"0 0 20 20"},r.createElement("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}},723:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});n(7294);var r=n(8356),a=n.n(r),o=n(6887);const i={"017af9a4":[()=>n.e(9380).then(n.bind(n,3777)),"@site/docs/examples/multi_client_subscriber/README.md",3777],"01a85c17":[()=>Promise.all([n.e(532),n.e(4013)]).then(n.bind(n,4524)),"@theme/BlogTagsListPage",4524],"02365777":[()=>n.e(2708).then(n.bind(n,7146)),"@site/docs/concepts/README.md",7146],"037ab9b9":[()=>n.e(3442).then(n.t.bind(n,7085,19)),"/home/runner/work/amiga-dev-kit/amiga-dev-kit/website/.docusaurus/docusaurus-theme-search-algolia/default/plugin-route-context-module-100.json",7085],"08736445":[()=>n.e(1238).then(n.bind(n,450)),"@site/docs/examples/track_recorder/README.md",450],"08fbdc4b":[()=>n.e(7700).then(n.bind(n,7362)),"@site/docs/tutorials/virtual_joystick/02_main_implementation.md",7362],"09e49901":[()=>n.e(7470).then(n.bind(n,8537)),"@site/docs/examples/camera_client/README.md",8537],"0aa3af30":[()=>n.e(2764).then(n.bind(n,7425)),"@site/docs/reference/circuitpy/utils/debug_packet.md",7425],"0c0027a6":[()=>n.e(1077).then(n.bind(n,6614)),"@site/docs/examples/service_client/README.md",6614],"0f1dd641":[()=>n.e(6287).then(n.bind(n,5576)),"@site/docs/reference/circuitpy/utils/can.md",5576],"14a70713":[()=>n.e(1399).then(n.bind(n,494)),"@site/docs/tutorials/virtual_joystick/01_virtual_joystick_widget.md",494],16345591:[()=>n.e(1615).then(n.t.bind(n,3529,19)),"~docs/default/tag-docs-tags-announcement-450.json",3529],"16601c76":[()=>n.e(3010).then(n.bind(n,817)),"@site/blog/2023-02-17-version-100.md",817],"17196cf9":[()=>n.e(4377).then(n.bind(n,8199)),"@site/docs/examples/service_propagation/README.md",8199],"1755b190":[()=>n.e(1520).then(n.bind(n,7048)),"@site/docs/reference/circuitpy/utils/packet.md",7048],17896441:[()=>Promise.all([n.e(532),n.e(2459),n.e(7918)]).then(n.bind(n,8945)),"@theme/DocItem",8945],"18a524a5":[()=>n.e(3425).then(n.bind(n,9199)),"@site/docs/examples/hello_main_loop/README.md",9199],"1a4e3797":[()=>Promise.all([n.e(532),n.e(7920)]).then(n.bind(n,9172)),"@theme/SearchPage",9172],"1f391b9e":[()=>Promise.all([n.e(532),n.e(2459),n.e(3085)]).then(n.bind(n,4247)),"@theme/MDXPage",4247],20881552:[()=>n.e(136).then(n.bind(n,5902)),"@site/docs/concepts/track_follower_service/README.md",5902],"248c4e50":[()=>n.e(3318).then(n.bind(n,6109)),"@site/docs/tutorials/camera_streamer/00_intro.md",6109],"25248eb7":[()=>n.e(2341).then(n.bind(n,8115)),"@site/docs/reference/circuitpy/utils/cobid.md",8115],"25f67766":[()=>n.e(1471).then(n.bind(n,2572)),"@site/docs/concepts/system_overview/README.md",2572],"27e82f7d":[()=>n.e(1334).then(n.bind(n,1477)),"@site/docs/hardware-tools/farm-ng_electronics_tools.md",1477],"283e63f8":[()=>n.e(4157).then(n.t.bind(n,2844,19)),"~blog/default/blog-tags-announcement-752.json",2844],"28d467d5":[()=>Promise.all([n.e(532),n.e(3542)]).then(n.bind(n,7190)),"@site/docs/mcu_kit/README.mdx",7190],"28ef4102":[()=>n.e(3914).then(n.bind(n,9746)),"@site/docs/apps/camera_app/README.md",9746],"2a6f4879":[()=>n.e(4149).then(n.bind(n,770)),"@site/docs/debug_cable/README.md",770],"2f6ec8d9":[()=>n.e(1388).then(n.t.bind(n,3769,19)),"/home/runner/work/amiga-dev-kit/amiga-dev-kit/website/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",3769],"31bfd28b":[()=>n.e(4370).then(n.bind(n,5856)),"@site/docs/concepts/canbus_service/README.md",5856],"31c9729e":[()=>n.e(6740).then(n.bind(n,9197)),"@site/docs/examples/filter_client/README.md",9197],"31f45b52":[()=>n.e(2686).then(n.bind(n,6045)),"@site/docs/reference/circuitpy/utils/ticks.md",6045],"332d8fe2":[()=>n.e(5042).then(n.bind(n,5460)),"@site/docs/apps/autoplot_app/README.md",5460],"3720c009":[()=>Promise.all([n.e(532),n.e(3751)]).then(n.bind(n,727)),"@theme/DocTagsListPage",727],"393be207":[()=>n.e(7414).then(n.bind(n,1181)),"@site/src/pages/markdown-page.md",1181],"3d5c94ed":[()=>n.e(4406).then(n.bind(n,7143)),"@site/docs/tutorials/virtual_joystick/03_further_exercises.md",7143],"3ebcbd7e":[()=>n.e(2148).then(n.bind(n,3864)),"@site/docs/brain/custom-applications-manifest.mdx",3864],"42274c0f":[()=>n.e(6493).then(n.bind(n,2907)),"@site/docs/examples/file_reader_headers/README.md",2907],"42a531d3":[()=>n.e(6114).then(n.bind(n,7140)),"@site/docs/examples/dashboard_settings/README.md",7140],44438822:[()=>n.e(6986).then(n.bind(n,3822)),"@site/docs/release-notes/2024-01-17-version-220.md",3822],46688559:[()=>n.e(9653).then(n.bind(n,6982)),"@site/docs/concepts/transforms_and_poses/README.md",6982],"4e9fc795":[()=>n.e(8685).then(n.bind(n,4432)),"@site/docs/examples/file_reader_can/README.md",4432],"4f204c8f":[()=>n.e(6639).then(n.bind(n,967)),"@site/docs/support/github-101.md",967],"5097f00d":[()=>n.e(9480).then(n.bind(n,1282)),"@site/docs/release-notes/2023-11-15-version-200.md",1282],"5248a5e3":[()=>n.e(2614).then(n.bind(n,3036)),"@site/docs/examples/tool_control/README.md",3036],"5276cdbe":[()=>n.e(3763).then(n.bind(n,8499)),"@site/docs/apps/file_manager_app/README.md",8499],"55960ee5":[()=>n.e(4121).then(n.t.bind(n,8070,19)),"~docs/default/tags-list-current-prop-15a.json",8070],"59c2e5f5":[()=>n.e(4271).then(n.bind(n,4220)),"@site/docs/examples/camera_aruco_detector/README.md",4220],"5aa65751":[()=>n.e(5666).then(n.bind(n,6488)),"@site/docs/farm-tools/three-point.md",6488],"5ab20b11":[()=>n.e(5246).then(n.bind(n,5239)),"@site/docs/examples/track_planner/README.md",5239],"5c808265":[()=>n.e(3490).then(n.bind(n,2811)),"@site/docs/examples/service_counter/README.md",2811],"5e95c892":[()=>n.e(9661).then(n.bind(n,1892)),"@theme/DocsRoot",1892],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,6809)),"@generated/docusaurus.config",6809],"5ecff173":[()=>n.e(2989).then(n.bind(n,2461)),"@site/docs/tutorials/camera_streamer/03_camera_stream.md",2461],"5f19c161":[()=>Promise.all([n.e(532),n.e(4884)]).then(n.bind(n,7456)),"@site/docs/contribute/website.mdx",7456],62005459:[()=>n.e(8446).then(n.bind(n,8159)),"@site/docs/reference/brain/canbus/packet.md",8159],63097759:[()=>n.e(1455).then(n.bind(n,5528)),"@site/docs/examples/file_reader/README.md",5528],"630bf199":[()=>n.e(4654).then(n.bind(n,1212)),"@site/docs/brain/brain-next-steps.md",1212],"63ffe4b0":[()=>n.e(7018).then(n.bind(n,2498)),"@site/docs/intelligence-kit/brain/brain-v2.md",2498],64638251:[()=>n.e(1149).then(n.bind(n,151)),"@site/docs/examples/pendant_state/README.md",151],"6481ea79":[()=>n.e(1292).then(n.bind(n,109)),"@site/docs/dashboard/control_states.mdx",109],"6487a5c3":[()=>n.e(4731).then(n.bind(n,8627)),"@site/docs/examples/multi_client_geoimage/README.md",8627],"649f5488":[()=>n.e(3487).then(n.bind(n,6518)),"@site/docs/amiga_quick_start/amiga-quick-start.md",6518],"65608a03":[()=>n.e(7139).then(n.bind(n,8152)),"@site/docs/reference/faq.md",8152],"65c61ae9":[()=>n.e(2483).then(n.bind(n,1554)),"@site/docs/reference/circuitpy/utils/main_loop.md",1554],"6875c492":[()=>Promise.all([n.e(532),n.e(2459),n.e(9677),n.e(8610)]).then(n.bind(n,1714)),"@theme/BlogTagsPostsPage",1714],"696bcda8":[()=>n.e(7256).then(n.bind(n,7312)),"@site/docs/concepts/recorder_service/README.md",7312],"6a1b0507":[()=>n.e(6441).then(n.bind(n,8492)),"@site/docs/examples/examples_index.md",8492],"707d1d87":[()=>n.e(3418).then(n.bind(n,8727)),"@site/docs/examples/track_plotter/README.md",8727],"733f8ea4":[()=>n.e(1085).then(n.t.bind(n,7552,19)),"~docs/default/tag-docs-tags-release-c76.json",7552],77363477:[()=>n.e(803).then(n.bind(n,3015)),"@site/docs/examples/FPV/README.mdx",3015],"77bfdb01":[()=>n.e(8246).then(n.bind(n,1942)),"@site/docs/release-notes/2023-02-17-version-100.md",1942],"7ea92410":[()=>n.e(437).then(n.bind(n,6068)),"@site/docs/examples/track_follower/README.md",6068],"814f3328":[()=>n.e(2535).then(n.t.bind(n,5641,19)),"~blog/default/blog-post-list-prop-default.json",5641],82487722:[()=>n.e(3068).then(n.bind(n,924)),"@site/docs/examples/vehicle_twist/README.md",924],"83d480e9":[()=>n.e(205).then(n.t.bind(n,3672,19)),"~blog/default/blog-tags-release-b5c.json",3672],"8542e1eb":[()=>Promise.all([n.e(532),n.e(9790)]).then(n.bind(n,6812)),"@site/docs/examples/vnc_viewer/README.md",6812],"85f96761":[()=>n.e(6150).then(n.bind(n,5389)),"@site/docs/reference/circuitpy/utils/version.md",5389],"8ae14039":[()=>n.e(9482).then(n.bind(n,8445)),"@site/docs/examples/camera_calibration/README.md",8445],"8bb37ca2":[()=>n.e(3253).then(n.bind(n,3037)),"@site/docs/dashboard/fw_updates.md",3037],"8c1f8f8c":[()=>n.e(8950).then(n.bind(n,8597)),"@site/docs/examples/camera_settings/README.md",8597],"90782b6e":[()=>n.e(9945).then(n.bind(n,459)),"@site/docs/brain/custom-applications.mdx",459],"90c1d685":[()=>n.e(3363).then(n.bind(n,4562)),"@site/docs/tutorials/virtual_joystick/00_overview.md",4562],"935f2afb":[()=>n.e(53).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],"94905b36":[()=>n.e(4994).then(n.bind(n,7999)),"@site/docs/reference/brain/track/utils.md",7999],"982ac012":[()=>n.e(6983).then(n.bind(n,3306)),"@site/docs/api/README.md",3306],"9c021584":[()=>n.e(7438).then(n.t.bind(n,8055,19)),"~blog/default/blog-tags-release-b5c-list.json",8055],"9d06307a":[()=>n.e(6724).then(n.bind(n,1632)),"@site/docs/concepts/filter_service/README.md",1632],"9e4087bc":[()=>n.e(3608).then(n.bind(n,3169)),"@theme/BlogArchivePage",3169],"9f03ef16":[()=>n.e(7085).then(n.bind(n,3443)),"@site/docs/examples/monitor_app/README.md",3443],a1e533ff:[()=>n.e(6193).then(n.bind(n,7366)),"@site/docs/examples/file_converter/README.md",7366],a480bfc2:[()=>n.e(925).then(n.bind(n,1709)),"@site/docs/concepts/oak_service/README.md",1709],a6aa9e1f:[()=>Promise.all([n.e(532),n.e(2459),n.e(9677),n.e(3089)]).then(n.bind(n,46)),"@theme/BlogListPage",46],a6d99bb7:[()=>n.e(9462).then(n.bind(n,6777)),"@site/docs/concepts/gps_service/README.md",6777],a7023ddc:[()=>n.e(1713).then(n.t.bind(n,3457,19)),"~blog/default/blog-tags-tags-4c2.json",3457],a7bd4aaa:[()=>n.e(8518).then(n.bind(n,8564)),"@theme/DocVersionRoot",8564],a94703ab:[()=>Promise.all([n.e(532),n.e(4368)]).then(n.bind(n,2674)),"@theme/DocRoot",2674],ab02a1a7:[()=>n.e(9389).then(n.bind(n,4164)),"@site/docs/dashboard/dashboar_overview.md",4164],ab0c67b7:[()=>n.e(5358).then(n.bind(n,4858)),"@site/docs/brain/README.md",4858],ab1fde8c:[()=>n.e(3975).then(n.bind(n,2069)),"@site/blog/2023-02-17-version-100.md?truncated=true",2069],ab50c39c:[()=>n.e(8269).then(n.bind(n,3837)),"@site/docs/tutorials/introduction/00_tutorial_intro.md",3837],af96ff05:[()=>n.e(3635).then(n.bind(n,3329)),"@site/docs/pendant/pendant.md",3329],b2b675dd:[()=>n.e(533).then(n.t.bind(n,8017,19)),"~blog/default/blog-c06.json",8017],b2f554cd:[()=>n.e(1477).then(n.t.bind(n,10,19)),"~blog/default/blog-archive-80c.json",10],b47790e8:[()=>n.e(8624).then(n.bind(n,7565)),"@site/docs/dashboard/debugging.md",7565],b6a7a10b:[()=>n.e(7124).then(n.bind(n,9519)),"@site/docs/examples/file_reader_gps/README.md",9519],b819b42b:[()=>n.e(2881).then(n.bind(n,1718)),"@site/docs/examples/camera_pointcloud/README.md",1718],b872a128:[()=>n.e(6102).then(n.bind(n,7471)),"@site/docs/reference/circuitpy/utils/io.md",7471],bbecab28:[()=>n.e(3824).then(n.t.bind(n,5745,19)),"/home/runner/work/amiga-dev-kit/amiga-dev-kit/website/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",5745],bcfca9a1:[()=>n.e(5301).then(n.bind(n,2935)),"@site/docs/examples/square_track/README.md",2935],c1f94867:[()=>n.e(2307).then(n.bind(n,1099)),"@site/docs/release-notes/2023-12-11.md",1099],c4f5d8e4:[()=>Promise.all([n.e(532),n.e(4195)]).then(n.bind(n,3261)),"@site/src/pages/index.js",3261],c582042f:[()=>n.e(9955).then(n.bind(n,6105)),"@site/docs/support/support.md",6105],c8a20f2f:[()=>Promise.all([n.e(532),n.e(2232)]).then(n.bind(n,7929)),"@site/docs/ssh/README.md",7929],c930ceb7:[()=>n.e(3882).then(n.t.bind(n,4469,19)),"/home/runner/work/amiga-dev-kit/amiga-dev-kit/website/.docusaurus/docusaurus-plugin-content-blog/default/plugin-route-context-module-100.json",4469],ca9189be:[()=>n.e(4022).then(n.bind(n,4214)),"@site/docs/hardware-tools/recommended_tools.md",4214],ccc49370:[()=>Promise.all([n.e(532),n.e(2459),n.e(9677),n.e(6103)]).then(n.bind(n,5203)),"@theme/BlogPostPage",5203],d11a4e92:[()=>n.e(5658).then(n.bind(n,8801)),"@site/docs/intelligence-kit/overview-intel.md",8801],d16ae423:[()=>n.e(3834).then(n.bind(n,1008)),"@site/docs/concepts/tracks_and_waypoints/README.md",1008],d18ac987:[()=>n.e(4735).then(n.bind(n,2427)),"@site/docs/brain/ros-bridge.md",2427],d41c5275:[()=>n.e(2083).then(n.bind(n,5837)),"@site/docs/tutorials/introduction/02_template_overview.md",5837],d4f15f2f:[()=>n.e(793).then(n.bind(n,4037)),"@site/docs/tutorials/introduction/01_getting_started.mdx",4037],d5141a5a:[()=>Promise.all([n.e(532),n.e(1493)]).then(n.bind(n,6242)),"@site/docs/brain/brain-install.md",6242],d571f4a4:[()=>n.e(2267).then(n.bind(n,2594)),"@site/docs/reference/circuitpy/utils/farmng_sdo.md",2594],d589d3a7:[()=>n.e(7162).then(n.bind(n,6443)),"@site/docs/getting-started.md",6443],df203c0f:[()=>Promise.all([n.e(532),n.e(9924)]).then(n.bind(n,491)),"@theme/DocTagDocListPage",491],dff0b824:[()=>n.e(9680).then(n.bind(n,3722)),"@site/docs/dashboard/dashboard_user_guide.md",3722],e1197922:[()=>n.e(6353).then(n.bind(n,3042)),"@site/docs/examples/motor_state/README.md",3042],e6b8c514:[()=>n.e(1078).then(n.bind(n,2592)),"@site/docs/reference/circuitpy/utils/nvm.md",2592],e7cb8e0b:[()=>n.e(9851).then(n.bind(n,9994)),"@site/docs/brain/app-ownership.md",9994],ece86388:[()=>n.e(4832).then(n.t.bind(n,2747,19)),"~blog/default/blog-tags-announcement-752-list.json",2747],eef0346b:[()=>n.e(3050).then(n.bind(n,1876)),"@site/docs/apps/recorder_app/README.md",1876],f0acf4ba:[()=>Promise.all([n.e(532),n.e(8721)]).then(n.bind(n,1751)),"@site/docs/brain/custom-applications-kivy.mdx",1751],f0ea17f2:[()=>n.e(7383).then(n.bind(n,4611)),"@site/docs/apps/filter_app/README.md",4611],f14b63eb:[()=>n.e(4306).then(n.bind(n,9508)),"@site/docs/examples/gps_client/README.md",9508],f7e7bb57:[()=>n.e(6760).then(n.bind(n,1668)),"@site/docs/brain/custom-troubleshooting.md",1668],f96cfd04:[()=>n.e(346).then(n.bind(n,5032)),"@site/docs/reference/circuitpy/utils/general.md",5032],fb63b99b:[()=>n.e(3943).then(n.bind(n,2852)),"@site/docs/tutorials/camera_streamer/02_kivy_definition.md",2852],fc578d2a:[()=>n.e(8901).then(n.bind(n,8678)),"@site/docs/brain/sdk-barley-migration.mdx",8678],fd7e5383:[()=>n.e(7282).then(n.bind(n,1023)),"@site/docs/debug_cable/service_cable.md",1023],febb55c6:[()=>n.e(384).then(n.bind(n,4126)),"@site/docs/examples/events_recorder/README.md",4126],ffef86fa:[()=>n.e(5958).then(n.bind(n,1692)),"@site/docs/examples/cansniffer/README.md",1692]};var s=n(5893);function l(e){let{error:t,retry:n,pastDelay:r}=e;return t?(0,s.jsxs)("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"},children:[(0,s.jsx)("p",{children:String(t)}),(0,s.jsx)("div",{children:(0,s.jsx)("button",{type:"button",onClick:n,children:"Retry"})})]}):r?(0,s.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,s.jsx)("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb",children:(0,s.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,s.jsx)("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})})]})})}):null}var c=n(9670),u=n(226);function d(e,t){if("*"===e)return a()({loading:l,loader:()=>n.e(1772).then(n.bind(n,1772)),modules:["@theme/NotFound"],webpack:()=>[1772],render(e,t){const n=e.default;return(0,s.jsx)(u.z,{value:{plugin:{name:"native",id:"default"}},children:(0,s.jsx)(n,{...t})})}});const r=o[`${e}-${t}`],d={},p=[],f=[],m=(0,c.Z)(r);return Object.entries(m).forEach((e=>{let[t,n]=e;const r=i[n];r&&(d[t]=r[0],p.push(r[1]),f.push(r[2]))})),a().Map({loading:l,loader:d,modules:p,webpack:()=>f,render(t,n){const a=JSON.parse(JSON.stringify(r));Object.entries(t).forEach((t=>{let[n,r]=t;const o=r.default;if(!o)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof o&&"function"!=typeof o||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{o[e]=r[e]}));let i=a;const s=n.split(".");s.slice(0,-1).forEach((e=>{i=i[e]})),i[s[s.length-1]]=o}));const o=a.__comp;delete a.__comp;const i=a.__context;return delete a.__context,(0,s.jsx)(u.z,{value:i,children:(0,s.jsx)(o,{...a,...n})})}})}const p=[{path:"/blog",component:d("/blog","a56"),exact:!0},{path:"/blog/2023/02/17/version-100",component:d("/blog/2023/02/17/version-100","733"),exact:!0},{path:"/blog/archive",component:d("/blog/archive","6cf"),exact:!0},{path:"/blog/tags",component:d("/blog/tags","414"),exact:!0},{path:"/blog/tags/announcement",component:d("/blog/tags/announcement","44d"),exact:!0},{path:"/blog/tags/release",component:d("/blog/tags/release","19d"),exact:!0},{path:"/markdown-page",component:d("/markdown-page","b78"),exact:!0},{path:"/search",component:d("/search","688"),exact:!0},{path:"/docs",component:d("/docs","55a"),routes:[{path:"/docs",component:d("/docs","0c4"),routes:[{path:"/docs/tags",component:d("/docs/tags","0cc"),exact:!0},{path:"/docs/tags/announcement",component:d("/docs/tags/announcement","897"),exact:!0},{path:"/docs/tags/release",component:d("/docs/tags/release","efe"),exact:!0},{path:"/docs",component:d("/docs","3c8"),routes:[{path:"/docs/amiga_quick_start/amiga-quick-start",component:d("/docs/amiga_quick_start/amiga-quick-start","861"),exact:!0,sidebar:"User Manual"},{path:"/docs/api/",component:d("/docs/api/","2e3"),exact:!0,sidebar:"Developer"},{path:"/docs/apps/autoplot_app/",component:d("/docs/apps/autoplot_app/","a14"),exact:!0,sidebar:"User Manual"},{path:"/docs/apps/camera_app/",component:d("/docs/apps/camera_app/","c07"),exact:!0,sidebar:"User Manual"},{path:"/docs/apps/file_manager_app/",component:d("/docs/apps/file_manager_app/","98f"),exact:!0,sidebar:"User Manual"},{path:"/docs/apps/filter_app/",component:d("/docs/apps/filter_app/","66d"),exact:!0,sidebar:"User Manual"},{path:"/docs/apps/recorder_app/",component:d("/docs/apps/recorder_app/","c77"),exact:!0,sidebar:"User Manual"},{path:"/docs/brain/",component:d("/docs/brain/","82b"),exact:!0,sidebar:"Resources/Support"},{path:"/docs/brain/app-ownership",component:d("/docs/brain/app-ownership","ee7"),exact:!0,sidebar:"Developer"},{path:"/docs/brain/brain-apps",component:d("/docs/brain/brain-apps","bfb"),exact:!0,sidebar:"Developer"},{path:"/docs/brain/brain-apps-kivy",component:d("/docs/brain/brain-apps-kivy","1b4"),exact:!0,sidebar:"Developer"},{path:"/docs/brain/brain-apps-manifest",component:d("/docs/brain/brain-apps-manifest","6b1"),exact:!0,sidebar:"Developer"},{path:"/docs/brain/brain-install",component:d("/docs/brain/brain-install","89e"),exact:!0,sidebar:"Developer"},{path:"/docs/brain/custom-troubleshooting",component:d("/docs/brain/custom-troubleshooting","8ce"),exact:!0,sidebar:"Developer"},{path:"/docs/brain/next-steps",component:d("/docs/brain/next-steps","d20"),exact:!0,sidebar:"Developer"},{path:"/docs/brain/ros-bridge",component:d("/docs/brain/ros-bridge","9be"),exact:!0,sidebar:"Developer"},{path:"/docs/brain/sdk-barley-migration",component:d("/docs/brain/sdk-barley-migration","0ff"),exact:!0,sidebar:"Developer"},{path:"/docs/concepts/",component:d("/docs/concepts/","4a3"),exact:!0,sidebar:"Developer"},{path:"/docs/concepts/canbus_service/",component:d("/docs/concepts/canbus_service/","290"),exact:!0,sidebar:"Developer"},{path:"/docs/concepts/filter_service/",component:d("/docs/concepts/filter_service/","b01"),exact:!0,sidebar:"Developer"},{path:"/docs/concepts/gps_service/",component:d("/docs/concepts/gps_service/","ce4"),exact:!0,sidebar:"Developer"},{path:"/docs/concepts/oak_service/",component:d("/docs/concepts/oak_service/","39d"),exact:!0,sidebar:"Developer"},{path:"/docs/concepts/recorder_service/",component:d("/docs/concepts/recorder_service/","935"),exact:!0,sidebar:"Developer"},{path:"/docs/concepts/system_overview/",component:d("/docs/concepts/system_overview/","7aa"),exact:!0,sidebar:"Developer"},{path:"/docs/concepts/track_follower_service/",component:d("/docs/concepts/track_follower_service/","7e8"),exact:!0,sidebar:"Developer"},{path:"/docs/concepts/tracks_and_waypoints/",component:d("/docs/concepts/tracks_and_waypoints/","011"),exact:!0,sidebar:"Developer"},{path:"/docs/concepts/transforms_and_poses/",component:d("/docs/concepts/transforms_and_poses/","f4e"),exact:!0,sidebar:"Developer"},{path:"/docs/contribute/contribute-website",component:d("/docs/contribute/contribute-website","76f"),exact:!0},{path:"/docs/dashboard/control-states",component:d("/docs/dashboard/control-states","29d"),exact:!0,sidebar:"User Manual"},{path:"/docs/dashboard/dashboard-debugging",component:d("/docs/dashboard/dashboard-debugging","625"),exact:!0,sidebar:"User Manual"},{path:"/docs/dashboard/dashboard-fw",component:d("/docs/dashboard/dashboard-fw","c5b"),exact:!0,sidebar:"User Manual"},{path:"/docs/dashboard/dashboard-overview",component:d("/docs/dashboard/dashboard-overview","c8b"),exact:!0,sidebar:"User Manual"},{path:"/docs/dashboard/dashboard-user-guide",component:d("/docs/dashboard/dashboard-user-guide","226"),exact:!0,sidebar:"User Manual"},{path:"/docs/debug_cable/",component:d("/docs/debug_cable/","6e7"),exact:!0,sidebar:"Developer"},{path:"/docs/debug_cable/service-cable",component:d("/docs/debug_cable/service-cable","1e1"),exact:!0,sidebar:"Developer"},{path:"/docs/examples/camera_aruco_detector/",component:d("/docs/examples/camera_aruco_detector/","5b6"),exact:!0,sidebar:"examples"},{path:"/docs/examples/camera_calibration/",component:d("/docs/examples/camera_calibration/","fcc"),exact:!0,sidebar:"examples"},{path:"/docs/examples/camera_client/",component:d("/docs/examples/camera_client/","858"),exact:!0,sidebar:"examples"},{path:"/docs/examples/camera_pointcloud/",component:d("/docs/examples/camera_pointcloud/","f47"),exact:!0,sidebar:"examples"},{path:"/docs/examples/camera_settings/",component:d("/docs/examples/camera_settings/","cec"),exact:!0,sidebar:"examples"},{path:"/docs/examples/cansniffer/",component:d("/docs/examples/cansniffer/","9d2"),exact:!0,sidebar:"examples"},{path:"/docs/examples/dashboard_settings/",component:d("/docs/examples/dashboard_settings/","475"),exact:!0,sidebar:"examples"},{path:"/docs/examples/events_recorder/",component:d("/docs/examples/events_recorder/","e62"),exact:!0,sidebar:"examples"},{path:"/docs/examples/examples-index",component:d("/docs/examples/examples-index","212"),exact:!0,sidebar:"examples"},{path:"/docs/examples/file_converter/",component:d("/docs/examples/file_converter/","04a"),exact:!0,sidebar:"examples"},{path:"/docs/examples/file_reader_can/",component:d("/docs/examples/file_reader_can/","275"),exact:!0,sidebar:"examples"},{path:"/docs/examples/file_reader_gps/",component:d("/docs/examples/file_reader_gps/","8b6"),exact:!0,sidebar:"examples"},{path:"/docs/examples/file_reader_headers/",component:d("/docs/examples/file_reader_headers/","657"),exact:!0,sidebar:"examples"},{path:"/docs/examples/file_reader/",component:d("/docs/examples/file_reader/","4aa"),exact:!0,sidebar:"examples"},{path:"/docs/examples/filter_client/",component:d("/docs/examples/filter_client/","2c3"),exact:!0,sidebar:"examples"},{path:"/docs/examples/FPV/",component:d("/docs/examples/FPV/","02b"),exact:!0,sidebar:"examples"},{path:"/docs/examples/gps_client/",component:d("/docs/examples/gps_client/","257"),exact:!0,sidebar:"examples"},{path:"/docs/examples/hello_main_loop/",component:d("/docs/examples/hello_main_loop/","bfa"),exact:!0,sidebar:"examples"},{path:"/docs/examples/monitor_app/",component:d("/docs/examples/monitor_app/","05f"),exact:!0,sidebar:"examples"},{path:"/docs/examples/motor_state/",component:d("/docs/examples/motor_state/","e2f"),exact:!0,sidebar:"examples"},{path:"/docs/examples/multi_client_geoimage/",component:d("/docs/examples/multi_client_geoimage/","fe5"),exact:!0,sidebar:"examples"},{path:"/docs/examples/multi_client_subscriber/",component:d("/docs/examples/multi_client_subscriber/","5d0"),exact:!0,sidebar:"examples"},{path:"/docs/examples/pendant_state/",component:d("/docs/examples/pendant_state/","8f9"),exact:!0,sidebar:"examples"},{path:"/docs/examples/service_client/",component:d("/docs/examples/service_client/","93f"),exact:!0,sidebar:"examples"},{path:"/docs/examples/service_counter/",component:d("/docs/examples/service_counter/","979"),exact:!0,sidebar:"examples"},{path:"/docs/examples/service_propagation/",component:d("/docs/examples/service_propagation/","5a8"),exact:!0,sidebar:"examples"},{path:"/docs/examples/square_track/",component:d("/docs/examples/square_track/","03f"),exact:!0,sidebar:"examples"},{path:"/docs/examples/tool_control/",component:d("/docs/examples/tool_control/","b97"),exact:!0,sidebar:"examples"},{path:"/docs/examples/track_follower/",component:d("/docs/examples/track_follower/","c00"),exact:!0,sidebar:"examples"},{path:"/docs/examples/track_planner/",component:d("/docs/examples/track_planner/","ac3"),exact:!0,sidebar:"examples"},{path:"/docs/examples/track_plotter/",component:d("/docs/examples/track_plotter/","4ff"),exact:!0,sidebar:"examples"},{path:"/docs/examples/track_recorder/",component:d("/docs/examples/track_recorder/","344"),exact:!0,sidebar:"examples"},{path:"/docs/examples/vehicle_twist/",component:d("/docs/examples/vehicle_twist/","8ce"),exact:!0,sidebar:"examples"},{path:"/docs/examples/vnc_viewer/",component:d("/docs/examples/vnc_viewer/","865"),exact:!0,sidebar:"Developer"},{path:"/docs/farm-tools/three-point",component:d("/docs/farm-tools/three-point","6f8"),exact:!0,sidebar:"User Manual"},{path:"/docs/getting-started",component:d("/docs/getting-started","ef6"),exact:!0},{path:"/docs/hardware-tools/etools",component:d("/docs/hardware-tools/etools","69a"),exact:!0},{path:"/docs/hardware-tools/recommended-tools",component:d("/docs/hardware-tools/recommended-tools","799"),exact:!0,sidebar:"Resources/Support"},{path:"/docs/intelligence-kit/brain/brain-v2",component:d("/docs/intelligence-kit/brain/brain-v2","88a"),exact:!0,sidebar:"User Manual"},{path:"/docs/intelligence-kit/overview-intel",component:d("/docs/intelligence-kit/overview-intel","2d3"),exact:!0,sidebar:"User Manual"},{path:"/docs/mcu_kit/",component:d("/docs/mcu_kit/","ce3"),exact:!0,sidebar:"Developer"},{path:"/docs/pendant/",component:d("/docs/pendant/","0e8"),exact:!0,sidebar:"User Manual"},{path:"/docs/reference/brain/canbus/packet",component:d("/docs/reference/brain/canbus/packet","814"),exact:!0,sidebar:"Developer"},{path:"/docs/reference/brain/track/utils",component:d("/docs/reference/brain/track/utils","dc3"),exact:!0},{path:"/docs/reference/circuitpy/utils/can",component:d("/docs/reference/circuitpy/utils/can","599"),exact:!0,sidebar:"Developer"},{path:"/docs/reference/circuitpy/utils/cobid",component:d("/docs/reference/circuitpy/utils/cobid","885"),exact:!0,sidebar:"Developer"},{path:"/docs/reference/circuitpy/utils/debug_packet",component:d("/docs/reference/circuitpy/utils/debug_packet","85d"),exact:!0,sidebar:"Developer"},{path:"/docs/reference/circuitpy/utils/farmng_sdo",component:d("/docs/reference/circuitpy/utils/farmng_sdo","297"),exact:!0,sidebar:"Developer"},{path:"/docs/reference/circuitpy/utils/general",component:d("/docs/reference/circuitpy/utils/general","c59"),exact:!0,sidebar:"Developer"},{path:"/docs/reference/circuitpy/utils/io",component:d("/docs/reference/circuitpy/utils/io","d1b"),exact:!0,sidebar:"Developer"},{path:"/docs/reference/circuitpy/utils/main_loop",component:d("/docs/reference/circuitpy/utils/main_loop","187"),exact:!0,sidebar:"Developer"},{path:"/docs/reference/circuitpy/utils/nvm",component:d("/docs/reference/circuitpy/utils/nvm","f4b"),exact:!0,sidebar:"Developer"},{path:"/docs/reference/circuitpy/utils/packet",component:d("/docs/reference/circuitpy/utils/packet","b57"),exact:!0,sidebar:"Developer"},{path:"/docs/reference/circuitpy/utils/ticks",component:d("/docs/reference/circuitpy/utils/ticks","04c"),exact:!0,sidebar:"Developer"},{path:"/docs/reference/circuitpy/utils/version",component:d("/docs/reference/circuitpy/utils/version","99b"),exact:!0,sidebar:"Developer"},{path:"/docs/reference/faq",component:d("/docs/reference/faq","434"),exact:!0,sidebar:"Resources/Support"},{path:"/docs/release-notes/release-01",component:d("/docs/release-notes/release-01","207"),exact:!0,sidebar:"Resources/Support"},{path:"/docs/release-notes/release-02",component:d("/docs/release-notes/release-02","210"),exact:!0,sidebar:"Resources/Support"},{path:"/docs/release-notes/release-021",component:d("/docs/release-notes/release-021","1ea"),exact:!0,sidebar:"Resources/Support"},{path:"/docs/release-notes/release-022",component:d("/docs/release-notes/release-022","121"),exact:!0,sidebar:"Resources/Support"},{path:"/docs/ssh/",component:d("/docs/ssh/","684"),exact:!0,sidebar:"Developer"},{path:"/docs/support/",component:d("/docs/support/","894"),exact:!0},{path:"/docs/support/github-101",component:d("/docs/support/github-101","32f"),exact:!0,sidebar:"Resources/Support"},{path:"/docs/tutorials/camera_streamer/camera-stream",component:d("/docs/tutorials/camera_streamer/camera-stream","869"),exact:!0,sidebar:"examples"},{path:"/docs/tutorials/camera_streamer/camera-streamer-overview",component:d("/docs/tutorials/camera_streamer/camera-streamer-overview","3e9"),exact:!0,sidebar:"examples"},{path:"/docs/tutorials/camera_streamer/kivy-definition",component:d("/docs/tutorials/camera_streamer/kivy-definition","a1a"),exact:!0,sidebar:"examples"},{path:"/docs/tutorials/introduction/getting-started-kivy",component:d("/docs/tutorials/introduction/getting-started-kivy","da1"),exact:!0,sidebar:"examples"},{path:"/docs/tutorials/introduction/template-overview",component:d("/docs/tutorials/introduction/template-overview","a82"),exact:!0,sidebar:"examples"},{path:"/docs/tutorials/introduction/tutorial-introduction",component:d("/docs/tutorials/introduction/tutorial-introduction","0f2"),exact:!0,sidebar:"examples"},{path:"/docs/tutorials/virtual_joystick/device-streams",component:d("/docs/tutorials/virtual_joystick/device-streams","aa5"),exact:!0,sidebar:"examples"},{path:"/docs/tutorials/virtual_joystick/further-exercises",component:d("/docs/tutorials/virtual_joystick/further-exercises","624"),exact:!0,sidebar:"examples"},{path:"/docs/tutorials/virtual_joystick/virtual-joystick-overview",component:d("/docs/tutorials/virtual_joystick/virtual-joystick-overview","476"),exact:!0,sidebar:"examples"},{path:"/docs/tutorials/virtual_joystick/virtual-joystick-widget",component:d("/docs/tutorials/virtual_joystick/virtual-joystick-widget","995"),exact:!0,sidebar:"examples"}]}]}]},{path:"/",component:d("/","339"),exact:!0},{path:"*",component:d("*")}]},8934:(e,t,n)=>{"use strict";n.d(t,{_:()=>o,t:()=>i});var r=n(7294),a=n(5893);const o=r.createContext(!1);function i(e){let{children:t}=e;const[n,i]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{i(!0)}),[]),(0,a.jsx)(o.Provider,{value:n,children:t})}},7221:(e,t,n)=>{"use strict";var r=n(7294),a=n(745),o=n(3727),i=n(405),s=n(412);const l=[n(4367),n(2497),n(3310),n(8320),n(2295)];var c=n(723),u=n(6550),d=n(8790),p=n(5893);function f(e){let{children:t}=e;return(0,p.jsx)(p.Fragment,{children:t})}var m=n(5742),h=n(2263),g=n(4996),b=n(6668),y=n(833),v=n(4711),w=n(9727),k=n(3320),x=n(8780),_=n(197);function S(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,h.Z)(),r=(0,v.l)(),a=n[e].htmlLang,o=e=>e.replace("-","_");return(0,p.jsxs)(m.Z,{children:[Object.entries(n).map((e=>{let[t,{htmlLang:n}]=e;return(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:n},t)})),(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,p.jsx)("meta",{property:"og:locale",content:o(a)}),Object.values(n).filter((e=>a!==e.htmlLang)).map((e=>(0,p.jsx)("meta",{property:"og:locale:alternate",content:o(e.htmlLang)},`meta-og-${e.htmlLang}`)))]})}function E(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,h.Z)(),r=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,h.Z)(),{pathname:r}=(0,u.TH)();return e+(0,x.applyTrailingSlash)((0,g.Z)(r),{trailingSlash:n,baseUrl:t})}(),a=t?`${n}${t}`:r;return(0,p.jsxs)(m.Z,{children:[(0,p.jsx)("meta",{property:"og:url",content:a}),(0,p.jsx)("link",{rel:"canonical",href:a})]})}function C(){const{i18n:{currentLocale:e}}=(0,h.Z)(),{metadata:t,image:n}=(0,b.L)();return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(m.Z,{children:[(0,p.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,p.jsx)("body",{className:w.h})]}),n&&(0,p.jsx)(y.d,{image:n}),(0,p.jsx)(E,{}),(0,p.jsx)(S,{}),(0,p.jsx)(_.Z,{tag:k.HX,locale:e}),(0,p.jsx)(m.Z,{children:t.map(((e,t)=>(0,p.jsx)("meta",{...e},t)))})]})}const T=new Map;function A(e){if(T.has(e.pathname))return{...e,pathname:T.get(e.pathname)};if((0,d.f)(c.Z,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return T.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return T.set(e.pathname,t),{...e,pathname:t}}var j=n(8934),R=n(8940),L=n(469);function D(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>a.forEach((e=>e?.()))}const P=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,L.Z)((()=>{r!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,a=t.hash===n.hash,o=t.search===n.search;if(r&&a&&!o)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:r}),D("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function N(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,d.f)(c.Z,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class O extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=s.Z.canUseDOM?D("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=D("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),N(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return(0,p.jsx)(P,{previousLocation:this.previousLocation,location:t,children:(0,p.jsx)(u.AW,{location:t,render:()=>e})})}}const M=O,I="__docusaurus-base-url-issue-banner-container",F="__docusaurus-base-url-issue-banner",B="__docusaurus-base-url-issue-banner-suggestion-container";function z(e){return`\ndocument.addEventListener('DOMContentLoaded', function maybeInsertBanner() {\n var shouldInsert = typeof window['docusaurus'] === 'undefined';\n shouldInsert && insertBanner();\n});\n\nfunction insertBanner() {\n var bannerContainer = document.createElement('div');\n bannerContainer.id = '${I}';\n var bannerHtml = ${JSON.stringify(function(e){return`\n
\n

Your Docusaurus site did not load properly.

\n

A very common reason is a wrong site baseUrl configuration.

\n

Current configured baseUrl = ${e} ${"/"===e?" (default value)":""}

\n

We suggest trying baseUrl =

\n
\n`}(e)).replace(/{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const a=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;a?.appendChild(r)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var Q=n(9670);const Y=new Set,X=new Set,J=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ee={prefetch(e){if(!(e=>!J()&&!X.has(e)&&!Y.has(e))(e))return!1;Y.add(e);const t=(0,d.f)(c.Z,e).flatMap((e=>{return t=e.route.path,Object.entries(W).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,Q.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?K(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!J()&&!X.has(e))(e)&&(X.add(e),N(e))},te=Object.freeze(ee),ne=Boolean(!0);if(s.Z.canUseDOM){window.docusaurus=te;const e=document.getElementById("__docusaurus"),t=(0,p.jsx)(i.B6,{children:(0,p.jsx)(o.VK,{children:(0,p.jsx)(G,{})})}),n=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},s=()=>{if(ne)r.startTransition((()=>{a.hydrateRoot(e,t,{onRecoverableError:n})}));else{const o=a.createRoot(e,{onRecoverableError:n});r.startTransition((()=>{o.render(t)}))}};N(window.location.pathname).then(s)}},8940:(e,t,n)=>{"use strict";n.d(t,{_:()=>d,M:()=>p});var r=n(7294),a=n(6809);const o=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/docs","versions":[{"name":"current","label":"Next","isLast":true,"path":"/docs","mainDocId":"amiga_quick_start/amiga-quick-start","docs":[{"id":"amiga_quick_start/amiga-quick-start","path":"/docs/amiga_quick_start/amiga-quick-start","sidebar":"User Manual"},{"id":"api/api-index","path":"/docs/api/","sidebar":"Developer"},{"id":"apps/autoplot_app/autoplot-app","path":"/docs/apps/autoplot_app/","sidebar":"User Manual"},{"id":"apps/camera_app/camera-app","path":"/docs/apps/camera_app/","sidebar":"User Manual"},{"id":"apps/file_manager_app/file-manager-app","path":"/docs/apps/file_manager_app/","sidebar":"User Manual"},{"id":"apps/filter_app/filter-app","path":"/docs/apps/filter_app/","sidebar":"User Manual"},{"id":"apps/recorder_app/recorder-app","path":"/docs/apps/recorder_app/","sidebar":"User Manual"},{"id":"brain/app-ownership","path":"/docs/brain/app-ownership","sidebar":"Developer"},{"id":"brain/brain","path":"/docs/brain/","sidebar":"Resources/Support"},{"id":"brain/brain-apps","path":"/docs/brain/brain-apps","sidebar":"Developer"},{"id":"brain/brain-apps-kivy","path":"/docs/brain/brain-apps-kivy","sidebar":"Developer"},{"id":"brain/brain-apps-manifest","path":"/docs/brain/brain-apps-manifest","sidebar":"Developer"},{"id":"brain/brain-install","path":"/docs/brain/brain-install","sidebar":"Developer"},{"id":"brain/custom-troubleshooting","path":"/docs/brain/custom-troubleshooting","sidebar":"Developer"},{"id":"brain/next-steps","path":"/docs/brain/next-steps","sidebar":"Developer"},{"id":"brain/ros-bridge","path":"/docs/brain/ros-bridge","sidebar":"Developer"},{"id":"brain/sdk-barley-migration","path":"/docs/brain/sdk-barley-migration","sidebar":"Developer"},{"id":"concepts/canbus_service/canbus-overview","path":"/docs/concepts/canbus_service/","sidebar":"Developer"},{"id":"concepts/concepts-index","path":"/docs/concepts/","sidebar":"Developer"},{"id":"concepts/filter_service/filter-overview","path":"/docs/concepts/filter_service/","sidebar":"Developer"},{"id":"concepts/gps_service/gps-overview","path":"/docs/concepts/gps_service/","sidebar":"Developer"},{"id":"concepts/oak_service/oak-overview","path":"/docs/concepts/oak_service/","sidebar":"Developer"},{"id":"concepts/recorder_service/recorder-overview","path":"/docs/concepts/recorder_service/","sidebar":"Developer"},{"id":"concepts/system_overview/amiga-dev","path":"/docs/concepts/system_overview/","sidebar":"Developer"},{"id":"concepts/track_follower_service/track-follower-overview","path":"/docs/concepts/track_follower_service/","sidebar":"Developer"},{"id":"concepts/tracks_and_waypoints/tracks-and-waypoints","path":"/docs/concepts/tracks_and_waypoints/","sidebar":"Developer"},{"id":"concepts/transforms_and_poses/transforms-and-poses","path":"/docs/concepts/transforms_and_poses/","sidebar":"Developer"},{"id":"contribute/contribute-website","path":"/docs/contribute/contribute-website"},{"id":"dashboard/control-states","path":"/docs/dashboard/control-states","sidebar":"User Manual"},{"id":"dashboard/dashboard-debugging","path":"/docs/dashboard/dashboard-debugging","sidebar":"User Manual"},{"id":"dashboard/dashboard-fw","path":"/docs/dashboard/dashboard-fw","sidebar":"User Manual"},{"id":"dashboard/dashboard-overview","path":"/docs/dashboard/dashboard-overview","sidebar":"User Manual"},{"id":"dashboard/dashboard-user-guide","path":"/docs/dashboard/dashboard-user-guide","sidebar":"User Manual"},{"id":"debug_cable/debug-cable","path":"/docs/debug_cable/","sidebar":"Developer"},{"id":"debug_cable/service-cable","path":"/docs/debug_cable/service-cable","sidebar":"Developer"},{"id":"examples/camera_aruco_detector/camera-aruco-detector","path":"/docs/examples/camera_aruco_detector/","sidebar":"examples"},{"id":"examples/camera_calibration/camera-calibration","path":"/docs/examples/camera_calibration/","sidebar":"examples"},{"id":"examples/camera_client/camera-client","path":"/docs/examples/camera_client/","sidebar":"examples"},{"id":"examples/camera_pointcloud/camera-pointcloud","path":"/docs/examples/camera_pointcloud/","sidebar":"examples"},{"id":"examples/camera_settings/camera-settings","path":"/docs/examples/camera_settings/","sidebar":"examples"},{"id":"examples/cansniffer/cansniffer","path":"/docs/examples/cansniffer/","sidebar":"examples"},{"id":"examples/dashboard_settings/dashboard-settings","path":"/docs/examples/dashboard_settings/","sidebar":"examples"},{"id":"examples/events_recorder/events-recorder","path":"/docs/examples/events_recorder/","sidebar":"examples"},{"id":"examples/examples-index","path":"/docs/examples/examples-index","sidebar":"examples"},{"id":"examples/file_converter/file-converter","path":"/docs/examples/file_converter/","sidebar":"examples"},{"id":"examples/file_reader_can/file-reader-can","path":"/docs/examples/file_reader_can/","sidebar":"examples"},{"id":"examples/file_reader_gps/file-reader-gps","path":"/docs/examples/file_reader_gps/","sidebar":"examples"},{"id":"examples/file_reader_headers/file-reader-headers","path":"/docs/examples/file_reader_headers/","sidebar":"examples"},{"id":"examples/file_reader/file-reader","path":"/docs/examples/file_reader/","sidebar":"examples"},{"id":"examples/filter_client/filter-client","path":"/docs/examples/filter_client/","sidebar":"examples"},{"id":"examples/FPV/fpv","path":"/docs/examples/FPV/","sidebar":"examples"},{"id":"examples/gps_client/gps-client","path":"/docs/examples/gps_client/","sidebar":"examples"},{"id":"examples/hello_main_loop/hello-world","path":"/docs/examples/hello_main_loop/","sidebar":"examples"},{"id":"examples/monitor_app/monitor-app","path":"/docs/examples/monitor_app/","sidebar":"examples"},{"id":"examples/motor_state/motor-state","path":"/docs/examples/motor_state/","sidebar":"examples"},{"id":"examples/multi_client_geoimage/multi-client-geoimage","path":"/docs/examples/multi_client_geoimage/","sidebar":"examples"},{"id":"examples/multi_client_subscriber/multi-client-subscriber","path":"/docs/examples/multi_client_subscriber/","sidebar":"examples"},{"id":"examples/pendant_state/pendant-state","path":"/docs/examples/pendant_state/","sidebar":"examples"},{"id":"examples/service_client/service-client","path":"/docs/examples/service_client/","sidebar":"examples"},{"id":"examples/service_counter/service-counter","path":"/docs/examples/service_counter/","sidebar":"examples"},{"id":"examples/service_propagation/service-propagation","path":"/docs/examples/service_propagation/","sidebar":"examples"},{"id":"examples/square_track/square-track","path":"/docs/examples/square_track/","sidebar":"examples"},{"id":"examples/tool_control/tool-control","path":"/docs/examples/tool_control/","sidebar":"examples"},{"id":"examples/track_follower/track-follower","path":"/docs/examples/track_follower/","sidebar":"examples"},{"id":"examples/track_planner/track-planner","path":"/docs/examples/track_planner/","sidebar":"examples"},{"id":"examples/track_plotter/track-plotter","path":"/docs/examples/track_plotter/","sidebar":"examples"},{"id":"examples/track_recorder/track-recorder","path":"/docs/examples/track_recorder/","sidebar":"examples"},{"id":"examples/vehicle_twist/vehicle-twist","path":"/docs/examples/vehicle_twist/","sidebar":"examples"},{"id":"examples/vnc_viewer/vnc-viewer","path":"/docs/examples/vnc_viewer/","sidebar":"Developer"},{"id":"farm-tools/three-point","path":"/docs/farm-tools/three-point","sidebar":"User Manual"},{"id":"getting-started","path":"/docs/getting-started"},{"id":"hardware-tools/etools","path":"/docs/hardware-tools/etools"},{"id":"hardware-tools/recommended-tools","path":"/docs/hardware-tools/recommended-tools","sidebar":"Resources/Support"},{"id":"intelligence-kit/brain/brain-v2","path":"/docs/intelligence-kit/brain/brain-v2","sidebar":"User Manual"},{"id":"intelligence-kit/overview-intel","path":"/docs/intelligence-kit/overview-intel","sidebar":"User Manual"},{"id":"mcu_kit/microcontroller-kit","path":"/docs/mcu_kit/","sidebar":"Developer"},{"id":"pendant/pendant","path":"/docs/pendant/","sidebar":"User Manual"},{"id":"reference/brain/canbus/packet","path":"/docs/reference/brain/canbus/packet","sidebar":"Developer"},{"id":"reference/brain/track/utils","path":"/docs/reference/brain/track/utils"},{"id":"reference/circuitpy/utils/can","path":"/docs/reference/circuitpy/utils/can","sidebar":"Developer"},{"id":"reference/circuitpy/utils/cobid","path":"/docs/reference/circuitpy/utils/cobid","sidebar":"Developer"},{"id":"reference/circuitpy/utils/debug_packet","path":"/docs/reference/circuitpy/utils/debug_packet","sidebar":"Developer"},{"id":"reference/circuitpy/utils/farmng_sdo","path":"/docs/reference/circuitpy/utils/farmng_sdo","sidebar":"Developer"},{"id":"reference/circuitpy/utils/general","path":"/docs/reference/circuitpy/utils/general","sidebar":"Developer"},{"id":"reference/circuitpy/utils/io","path":"/docs/reference/circuitpy/utils/io","sidebar":"Developer"},{"id":"reference/circuitpy/utils/main_loop","path":"/docs/reference/circuitpy/utils/main_loop","sidebar":"Developer"},{"id":"reference/circuitpy/utils/nvm","path":"/docs/reference/circuitpy/utils/nvm","sidebar":"Developer"},{"id":"reference/circuitpy/utils/packet","path":"/docs/reference/circuitpy/utils/packet","sidebar":"Developer"},{"id":"reference/circuitpy/utils/ticks","path":"/docs/reference/circuitpy/utils/ticks","sidebar":"Developer"},{"id":"reference/circuitpy/utils/version","path":"/docs/reference/circuitpy/utils/version","sidebar":"Developer"},{"id":"reference/faq","path":"/docs/reference/faq","sidebar":"Resources/Support"},{"id":"release-notes/release-01","path":"/docs/release-notes/release-01","sidebar":"Resources/Support"},{"id":"release-notes/release-02","path":"/docs/release-notes/release-02","sidebar":"Resources/Support"},{"id":"release-notes/release-021","path":"/docs/release-notes/release-021","sidebar":"Resources/Support"},{"id":"release-notes/release-022","path":"/docs/release-notes/release-022","sidebar":"Resources/Support"},{"id":"ssh/ssh","path":"/docs/ssh/","sidebar":"Developer"},{"id":"support/github-101","path":"/docs/support/github-101","sidebar":"Resources/Support"},{"id":"support/support","path":"/docs/support/"},{"id":"tutorials/camera_streamer/camera-stream","path":"/docs/tutorials/camera_streamer/camera-stream","sidebar":"examples"},{"id":"tutorials/camera_streamer/camera-streamer-overview","path":"/docs/tutorials/camera_streamer/camera-streamer-overview","sidebar":"examples"},{"id":"tutorials/camera_streamer/kivy-definition","path":"/docs/tutorials/camera_streamer/kivy-definition","sidebar":"examples"},{"id":"tutorials/introduction/getting-started-kivy","path":"/docs/tutorials/introduction/getting-started-kivy","sidebar":"examples"},{"id":"tutorials/introduction/template-overview","path":"/docs/tutorials/introduction/template-overview","sidebar":"examples"},{"id":"tutorials/introduction/tutorial-introduction","path":"/docs/tutorials/introduction/tutorial-introduction","sidebar":"examples"},{"id":"tutorials/virtual_joystick/device-streams","path":"/docs/tutorials/virtual_joystick/device-streams","sidebar":"examples"},{"id":"tutorials/virtual_joystick/further-exercises","path":"/docs/tutorials/virtual_joystick/further-exercises","sidebar":"examples"},{"id":"tutorials/virtual_joystick/virtual-joystick-overview","path":"/docs/tutorials/virtual_joystick/virtual-joystick-overview","sidebar":"examples"},{"id":"tutorials/virtual_joystick/virtual-joystick-widget","path":"/docs/tutorials/virtual_joystick/virtual-joystick-widget","sidebar":"examples"}],"draftIds":[],"sidebars":{"User Manual":{"link":{"path":"/docs/amiga_quick_start/amiga-quick-start","label":"amiga_quick_start/amiga-quick-start"}},"Developer":{"link":{"path":"/docs/concepts/","label":"concepts/concepts-index"}},"Resources/Support":{"link":{"path":"/docs/hardware-tools/recommended-tools","label":"hardware-tools/recommended-tools"}},"examples":{"link":{"path":"/docs/examples/examples-index","label":"examples/examples-index"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var s=n(7529);const l=JSON.parse('{"docusaurusVersion":"3.0.0","siteVersion":"2.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"3.0.0"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"3.0.0"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"3.0.0"},"docusaurus-plugin-google-analytics":{"type":"package","name":"@docusaurus/plugin-google-analytics","version":"3.0.0"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"3.0.0"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"3.0.0"},"docusaurus-theme-search-algolia":{"type":"package","name":"@docusaurus/theme-search-algolia","version":"3.0.0"}}}');var c=n(5893);const u={siteConfig:a.default,siteMetadata:l,globalData:o,i18n:i,codeTranslations:s},d=r.createContext(u);function p(e){let{children:t}=e;return(0,c.jsx)(d.Provider,{value:u,children:t})}},4763:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(7294),a=n(412),o=n(5742),i=n(8780),s=n(7452),l=n(5893);function c(e){let{error:t,tryAgain:n}=e;return(0,l.jsxs)("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"},children:[(0,l.jsx)("h1",{style:{fontSize:"3rem"},children:"This page crashed"}),(0,l.jsx)("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"},children:"Try again"}),(0,l.jsx)(u,{error:t})]})}function u(e){let{error:t}=e;const n=(0,i.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,l.jsx)("p",{style:{whiteSpace:"pre-wrap"},children:n})}function d(e){let{error:t,tryAgain:n}=e;return(0,l.jsxs)(f,{fallback:()=>(0,l.jsx)(c,{error:t,tryAgain:n}),children:[(0,l.jsx)(o.Z,{children:(0,l.jsx)("title",{children:"Page Error"})}),(0,l.jsx)(s.Z,{children:(0,l.jsx)(c,{error:t,tryAgain:n})})]})}const p=e=>(0,l.jsx)(d,{...e});class f extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){a.Z.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??p)(e)}return e??null}}},412:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,a={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},5742:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});n(7294);var r=n(405),a=n(5893);function o(e){return(0,a.jsx)(r.ql,{...e})}},9960:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(7294),a=n(3727),o=n(8780),i=n(2263),s=n(3919),l=n(412),c=n(5893);const u=r.createContext({collectLink:()=>{}});var d=n(4996);function p(e,t){let{isNavLink:n,to:p,href:f,activeClassName:m,isActive:h,"data-noBrokenLinkCheck":g,autoAddBaseUrl:b=!0,...y}=e;const{siteConfig:{trailingSlash:v,baseUrl:w}}=(0,i.Z)(),{withBaseUrl:k}=(0,d.C)(),x=(0,r.useContext)(u),_=(0,r.useRef)(null);(0,r.useImperativeHandle)(t,(()=>_.current));const S=p||f;const E=(0,s.Z)(S),C=S?.replace("pathname://","");let T=void 0!==C?(A=C,b&&(e=>e.startsWith("/"))(A)?k(A):A):void 0;var A;T&&E&&(T=(0,o.applyTrailingSlash)(T,{trailingSlash:v,baseUrl:w}));const j=(0,r.useRef)(!1),R=n?a.OL:a.rU,L=l.Z.canUseIntersectionObserver,D=(0,r.useRef)(),P=()=>{j.current||null==T||(window.docusaurus.preload(T),j.current=!0)};(0,r.useEffect)((()=>(!L&&E&&null!=T&&window.docusaurus.prefetch(T),()=>{L&&D.current&&D.current.disconnect()})),[D,T,L,E]);const N=T?.startsWith("#")??!1,O=!T||!E||N;return O||g||x.collectLink(T),O?(0,c.jsx)("a",{ref:_,href:T,...S&&!E&&{target:"_blank",rel:"noopener noreferrer"},...y}):(0,c.jsx)(R,{...y,onMouseEnter:P,onTouchStart:P,innerRef:e=>{_.current=e,L&&e&&E&&(D.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(D.current.unobserve(e),D.current.disconnect(),null!=T&&window.docusaurus.prefetch(T))}))})),D.current.observe(e))},to:T,...n&&{isActive:h,activeClassName:m}})}const f=r.forwardRef(p)},5999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c,I:()=>l});var r=n(7294),a=n(5893);function o(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var i=n(7529);function s(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return i[t??n]??n??t}function l(e,t){let{message:n,id:r}=e;return o(s({message:n,id:r}),t)}function c(e){let{children:t,id:n,values:r}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const i=s({message:t,id:n});return(0,a.jsx)(a.Fragment,{children:o(i,r)})}},9935:(e,t,n)=>{"use strict";n.d(t,{m:()=>r});const r="default"},3919:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function a(e){return void 0!==e&&!r(e)}n.d(t,{Z:()=>a,b:()=>r})},4996:(e,t,n)=>{"use strict";n.d(t,{C:()=>i,Z:()=>s});var r=n(7294),a=n(2263),o=n(3919);function i(){const{siteConfig:{baseUrl:e,url:t}}=(0,a.Z)(),n=(0,r.useCallback)(((n,r)=>function(e,t,n,r){let{forcePrependBaseUrl:a=!1,absolute:i=!1}=void 0===r?{}:r;if(!n||n.startsWith("#")||(0,o.b)(n))return n;if(a)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const s=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+s:s}(t,e,n,r)),[t,e]);return{withBaseUrl:n}}function s(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},2263:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(8940);function o(){return(0,r.useContext)(a._)}},2389:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(8934);function o(){return(0,r.useContext)(a._)}},469:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(7294);const a=n(412).Z.canUseDOM?r.useLayoutEffect:r.useEffect},9670:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function a(e){const t={};return function e(n,a){Object.entries(n).forEach((n=>{let[o,i]=n;const s=a?`${a}.${o}`:o;r(i)?e(i,s):t[s]=i}))}(e),t}},226:(e,t,n)=>{"use strict";n.d(t,{_:()=>o,z:()=>i});var r=n(7294),a=n(5893);const o=r.createContext(null);function i(e){let{children:t,value:n}=e;const i=r.useContext(o),s=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...n?.data};return{plugin:t.plugin,data:r}}({parent:i,value:n})),[i,n]);return(0,a.jsx)(o.Provider,{value:s,children:t})}},143:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>b,gA:()=>f,WS:()=>m,_r:()=>d,Jo:()=>y,zh:()=>p,yW:()=>g,gB:()=>h});var r=n(6550),a=n(2263),o=n(9935);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,a.Z)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const s=e=>e.versions.find((e=>e.isLast));function l(e,t){const n=s(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.LX)(t,{path:e.path,exact:!1,strict:!1})))}function c(e,t){const n=l(e,t),a=n?.docs.find((e=>!!(0,r.LX)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:a,alternateDocVersions:a?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(a.id):{}}}const u={},d=()=>i("docusaurus-plugin-content-docs")??u,p=e=>function(e,t,n){void 0===t&&(t=o.m),void 0===n&&(n={});const r=i(e),a=r?.[t];if(!a&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return a}("docusaurus-plugin-content-docs",e,{failfast:!0});function f(e){void 0===e&&(e={});const t=d(),{pathname:n}=(0,r.TH)();return function(e,t,n){void 0===n&&(n={});const a=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.LX)(t,{path:n.path,exact:!1,strict:!1})})),o=a?{pluginId:a[0],pluginData:a[1]}:void 0;if(!o&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return o}(t,n,e)}function m(e){void 0===e&&(e={});const t=f(e),{pathname:n}=(0,r.TH)();if(!t)return;return{activePlugin:t,activeVersion:l(t.pluginData,n)}}function h(e){return p(e).versions}function g(e){const t=p(e);return s(t)}function b(e){const t=p(e),{pathname:n}=(0,r.TH)();return c(t,n)}function y(e){const t=p(e),{pathname:n}=(0,r.TH)();return function(e,t){const n=s(e);return{latestDocSuggestion:c(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},4367:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r});const r={onRouteDidUpdate(e){let{location:t,previousLocation:n}=e;!n||t.pathname===n.pathname&&t.search===n.search&&t.hash===n.hash||(window.ga("set","page",t.pathname+t.search+t.hash),window.ga("send","pageview"))}}},8320:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(4865),a=n.n(r);a().configure({showSpinner:!1});const o={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{a().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){a().done()}}},3310:(e,t,n)=>{"use strict";n.r(t);var r=n(2573),a=n(6809);!function(e){const{themeConfig:{prism:t}}=a.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{"php"===e&&n(6854),n(6726)(`./prism-${e}`)})),delete globalThis.Prism}(r.p1)},2503:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});n(7294);var r=n(6010),a=n(5999),o=n(6668),i=n(9960);const s={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};var l=n(5893);function c(e){let{as:t,id:n,...c}=e;const{navbar:{hideOnScroll:u}}=(0,o.L)();if("h1"===t||!n)return(0,l.jsx)(t,{...c,id:void 0});const d=(0,a.I)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof c.children?c.children:n});return(0,l.jsxs)(t,{...c,className:(0,r.Z)("anchor",u?s.anchorWithHideOnScrollNavbar:s.anchorWithStickyNavbar,c.className),id:n,children:[c.children,(0,l.jsx)(i.Z,{className:"hash-link",to:`#${n}`,"aria-label":d,title:d,children:"\u200b"})]})}},9471:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});n(7294);const r={iconExternalLink:"iconExternalLink_nPIU"};var a=n(5893);function o(e){let{width:t=13.5,height:n=13.5}=e;return(0,a.jsx)("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:r.iconExternalLink,children:(0,a.jsx)("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"})})}},7452:(e,t,n)=>{"use strict";n.d(t,{Z:()=>Lt});var r=n(7294),a=n(6010),o=n(4763),i=n(833),s=n(6550),l=n(5999),c=n(5936),u=n(5893);const d="__docusaurus_skipToContent_fallback";function p(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function f(){const e=(0,r.useRef)(null),{action:t}=(0,s.k6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&p(t)}),[]);return(0,c.S)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&p(e.current)})),{containerRef:e,onClick:n}}const m=(0,l.I)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function h(e){const t=e.children??m,{containerRef:n,onClick:r}=f();return(0,u.jsx)("div",{ref:n,role:"region","aria-label":m,children:(0,u.jsx)("a",{...e,href:`#${d}`,onClick:r,children:t})})}var g=n(5281),b=n(9727);const y={skipToContent:"skipToContent_fXgn"};function v(){return(0,u.jsx)(h,{className:y.skipToContent})}var w=n(6668),k=n(9689);function x(e){let{width:t=21,height:n=21,color:r="currentColor",strokeWidth:a=1.2,className:o,...i}=e;return(0,u.jsx)("svg",{viewBox:"0 0 15 15",width:t,height:n,...i,children:(0,u.jsx)("g",{stroke:r,strokeWidth:a,children:(0,u.jsx)("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})})})}const _={closeButton:"closeButton_CVFx"};function S(e){return(0,u.jsx)("button",{type:"button","aria-label":(0,l.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"}),...e,className:(0,a.Z)("clean-btn close",_.closeButton,e.className),children:(0,u.jsx)(x,{width:14,height:14,strokeWidth:3.1})})}const E={content:"content_knG7"};function C(e){const{announcementBar:t}=(0,w.L)(),{content:n}=t;return(0,u.jsx)("div",{...e,className:(0,a.Z)(E.content,e.className),dangerouslySetInnerHTML:{__html:n}})}const T={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function A(){const{announcementBar:e}=(0,w.L)(),{isActive:t,close:n}=(0,k.nT)();if(!t)return null;const{backgroundColor:r,textColor:a,isCloseable:o}=e;return(0,u.jsxs)("div",{className:T.announcementBar,style:{backgroundColor:r,color:a},role:"banner",children:[o&&(0,u.jsx)("div",{className:T.announcementBarPlaceholder}),(0,u.jsx)(C,{className:T.announcementBarContent}),o&&(0,u.jsx)(S,{onClick:n,className:T.announcementBarClose})]})}var j=n(3163),R=n(2466);var L=n(902),D=n(3102);const P=r.createContext(null);function N(e){let{children:t}=e;const n=function(){const e=(0,j.e)(),t=(0,D.HY)(),[n,a]=(0,r.useState)(!1),o=null!==t.component,i=(0,L.D9)(o);return(0,r.useEffect)((()=>{o&&!i&&a(!0)}),[o,i]),(0,r.useEffect)((()=>{o?e.shown||a(!0):a(!1)}),[e.shown,o]),(0,r.useMemo)((()=>[n,a]),[n])}();return(0,u.jsx)(P.Provider,{value:n,children:t})}function O(e){if(e.component){const t=e.component;return(0,u.jsx)(t,{...e.props})}}function M(){const e=(0,r.useContext)(P);if(!e)throw new L.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,a=(0,r.useCallback)((()=>n(!1)),[n]),o=(0,D.HY)();return(0,r.useMemo)((()=>({shown:t,hide:a,content:O(o)})),[a,o,t])}function I(e){let{header:t,primaryMenu:n,secondaryMenu:r}=e;const{shown:o}=M();return(0,u.jsxs)("div",{className:"navbar-sidebar",children:[t,(0,u.jsxs)("div",{className:(0,a.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":o}),children:[(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:n}),(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:r})]})]})}var F=n(2949),B=n(2389);function z(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"})})}function U(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"})})}const $={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function q(e){let{className:t,buttonClassName:n,value:r,onChange:o}=e;const i=(0,B.Z)(),s=(0,l.I)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===r?(0,l.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,l.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return(0,u.jsx)("div",{className:(0,a.Z)($.toggle,t),children:(0,u.jsxs)("button",{className:(0,a.Z)("clean-btn",$.toggleButton,!i&&$.toggleButtonDisabled,n),type:"button",onClick:()=>o("dark"===r?"light":"dark"),disabled:!i,title:s,"aria-label":s,"aria-live":"polite",children:[(0,u.jsx)(z,{className:(0,a.Z)($.toggleIcon,$.lightToggleIcon)}),(0,u.jsx)(U,{className:(0,a.Z)($.toggleIcon,$.darkToggleIcon)})]})})}const H=r.memo(q),Z={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function V(e){let{className:t}=e;const n=(0,w.L)().navbar.style,r=(0,w.L)().colorMode.disableSwitch,{colorMode:a,setColorMode:o}=(0,F.I)();return r?null:(0,u.jsx)(H,{className:t,buttonClassName:"dark"===n?Z.darkNavbarColorModeToggle:void 0,value:a,onChange:o})}var G=n(1327);function W(){return(0,u.jsx)(G.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function K(){const e=(0,j.e)();return(0,u.jsx)("button",{type:"button","aria-label":(0,l.I)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle(),children:(0,u.jsx)(x,{color:"var(--ifm-color-emphasis-600)"})})}function Q(){return(0,u.jsxs)("div",{className:"navbar-sidebar__brand",children:[(0,u.jsx)(W,{}),(0,u.jsx)(V,{className:"margin-right--md"}),(0,u.jsx)(K,{})]})}var Y=n(9960),X=n(4996),J=n(3919),ee=n(8022),te=n(9471);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:r,href:a,label:o,html:i,isDropdownLink:s,prependBaseUrlToHref:l,...c}=e;const d=(0,X.Z)(r),p=(0,X.Z)(t),f=(0,X.Z)(a,{forcePrependBaseUrl:!0}),m=o&&a&&!(0,J.Z)(a),h=i?{dangerouslySetInnerHTML:{__html:i}}:{children:(0,u.jsxs)(u.Fragment,{children:[o,m&&(0,u.jsx)(te.Z,{...s&&{width:12,height:12}})]})};return a?(0,u.jsx)(Y.Z,{href:l?f:a,...c,...h}):(0,u.jsx)(Y.Z,{to:d,isNavLink:!0,...(t||n)&&{isActive:(e,t)=>n?(0,ee.F)(n,t.pathname):t.pathname.startsWith(p)},...c,...h})}function re(e){let{className:t,isDropdownItem:n=!1,...r}=e;const o=(0,u.jsx)(ne,{className:(0,a.Z)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n,...r});return n?(0,u.jsx)("li",{children:o}):o}function ae(e){let{className:t,isDropdownItem:n,...r}=e;return(0,u.jsx)("li",{className:"menu__list-item",children:(0,u.jsx)(ne,{className:(0,a.Z)("menu__link",t),...r})})}function oe(e){let{mobile:t=!1,position:n,...r}=e;const a=t?ae:re;return(0,u.jsx)(a,{...r,activeClassName:r.activeClassName??(t?"menu__link--active":"navbar__link--active")})}var ie=n(6043),se=n(8596),le=n(2263);function ce(e,t){return e.some((e=>function(e,t){return!!(0,se.Mg)(e.to,t)||!!(0,ee.F)(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function ue(e){let{items:t,position:n,className:o,onClick:i,...s}=e;const l=(0,r.useRef)(null),[c,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{l.current&&!l.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[l]),(0,u.jsxs)("div",{ref:l,className:(0,a.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":c}),children:[(0,u.jsx)(ne,{"aria-haspopup":"true","aria-expanded":c,role:"button",href:s.to?void 0:"#",className:(0,a.Z)("navbar__link",o),...s,onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!c))},children:s.children??s.label}),(0,u.jsx)("ul",{className:"dropdown__menu",children:t.map(((e,t)=>(0,r.createElement)(qe,{isDropdownItem:!0,activeClassName:"dropdown__link--active",...e,key:t})))})]})}function de(e){let{items:t,className:n,position:o,onClick:i,...l}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,le.Z)(),{pathname:t}=(0,s.TH)();return t.replace(e,"/")}(),d=ce(t,c),{collapsed:p,toggleCollapsed:f,setCollapsed:m}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&m(!d)}),[c,d,m]),(0,u.jsxs)("li",{className:(0,a.Z)("menu__list-item",{"menu__list-item--collapsed":p}),children:[(0,u.jsx)(ne,{role:"button",className:(0,a.Z)("menu__link menu__link--sublist menu__link--sublist-caret",n),...l,onClick:e=>{e.preventDefault(),f()},children:l.children??l.label}),(0,u.jsx)(ie.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:p,children:t.map(((e,t)=>(0,r.createElement)(qe,{mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active",...e,key:t})))})]})}function pe(e){let{mobile:t=!1,...n}=e;const r=t?de:ue;return(0,u.jsx)(r,{...n})}var fe=n(4711);function me(e){let{width:t=20,height:n=20,...r}=e;return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0,...r,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"})})}const he="iconLanguage_nlXk";function ge(){return r.createElement("svg",{width:"15",height:"15",className:"DocSearch-Control-Key-Icon"},r.createElement("path",{d:"M4.505 4.496h2M5.505 5.496v5M8.216 4.496l.055 5.993M10 7.5c.333.333.5.667.5 1v2M12.326 4.5v5.996M8.384 4.496c1.674 0 2.116 0 2.116 1.5s-.442 1.5-2.116 1.5M3.205 9.303c-.09.448-.277 1.21-1.241 1.203C1 10.5.5 9.513.5 8V7c0-1.57.5-2.5 1.464-2.494.964.006 1.134.598 1.24 1.342M12.553 10.5h1.953",strokeWidth:"1.2",stroke:"currentColor",fill:"none",strokeLinecap:"square"}))}var be=n(830),ye=["translations"];function ve(){return ve=Object.assign||function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var _e="Ctrl";var Se=r.forwardRef((function(e,t){var n=e.translations,a=void 0===n?{}:n,o=xe(e,ye),i=a.buttonText,s=void 0===i?"Search":i,l=a.buttonAriaLabel,c=void 0===l?"Search":l,u=we((0,r.useState)(null),2),d=u[0],p=u[1];return(0,r.useEffect)((function(){"undefined"!=typeof navigator&&(/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?p("\u2318"):p(_e))}),[]),r.createElement("button",ve({type:"button",className:"DocSearch DocSearch-Button","aria-label":c},o,{ref:t}),r.createElement("span",{className:"DocSearch-Button-Container"},r.createElement(be.W,null),r.createElement("span",{className:"DocSearch-Button-Placeholder"},s)),r.createElement("span",{className:"DocSearch-Button-Keys"},null!==d&&r.createElement(r.Fragment,null,r.createElement("kbd",{className:"DocSearch-Button-Key"},d===_e?r.createElement(ge,null):d),r.createElement("kbd",{className:"DocSearch-Button-Key"},"K"))))})),Ee=n(5742),Ce=n(6177),Te=n(239),Ae=n(3320);var je=n(3935);const Re={button:{buttonText:(0,l.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),buttonAriaLabel:(0,l.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"})},modal:{searchBox:{resetButtonTitle:(0,l.I)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),resetButtonAriaLabel:(0,l.I)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),cancelButtonText:(0,l.I)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"}),cancelButtonAriaLabel:(0,l.I)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"})},startScreen:{recentSearchesTitle:(0,l.I)({id:"theme.SearchModal.startScreen.recentSearchesTitle",message:"Recent",description:"The title for recent searches"}),noRecentSearchesText:(0,l.I)({id:"theme.SearchModal.startScreen.noRecentSearchesText",message:"No recent searches",description:"The text when no recent searches"}),saveRecentSearchButtonTitle:(0,l.I)({id:"theme.SearchModal.startScreen.saveRecentSearchButtonTitle",message:"Save this search",description:"The label for save recent search button"}),removeRecentSearchButtonTitle:(0,l.I)({id:"theme.SearchModal.startScreen.removeRecentSearchButtonTitle",message:"Remove this search from history",description:"The label for remove recent search button"}),favoriteSearchesTitle:(0,l.I)({id:"theme.SearchModal.startScreen.favoriteSearchesTitle",message:"Favorite",description:"The title for favorite searches"}),removeFavoriteSearchButtonTitle:(0,l.I)({id:"theme.SearchModal.startScreen.removeFavoriteSearchButtonTitle",message:"Remove this search from favorites",description:"The label for remove favorite search button"})},errorScreen:{titleText:(0,l.I)({id:"theme.SearchModal.errorScreen.titleText",message:"Unable to fetch results",description:"The title for error screen of search modal"}),helpText:(0,l.I)({id:"theme.SearchModal.errorScreen.helpText",message:"You might want to check your network connection.",description:"The help text for error screen of search modal"})},footer:{selectText:(0,l.I)({id:"theme.SearchModal.footer.selectText",message:"to select",description:"The explanatory text of the action for the enter key"}),selectKeyAriaLabel:(0,l.I)({id:"theme.SearchModal.footer.selectKeyAriaLabel",message:"Enter key",description:"The ARIA label for the Enter key button that makes the selection"}),navigateText:(0,l.I)({id:"theme.SearchModal.footer.navigateText",message:"to navigate",description:"The explanatory text of the action for the Arrow up and Arrow down key"}),navigateUpKeyAriaLabel:(0,l.I)({id:"theme.SearchModal.footer.navigateUpKeyAriaLabel",message:"Arrow up",description:"The ARIA label for the Arrow up key button that makes the navigation"}),navigateDownKeyAriaLabel:(0,l.I)({id:"theme.SearchModal.footer.navigateDownKeyAriaLabel",message:"Arrow down",description:"The ARIA label for the Arrow down key button that makes the navigation"}),closeText:(0,l.I)({id:"theme.SearchModal.footer.closeText",message:"to close",description:"The explanatory text of the action for Escape key"}),closeKeyAriaLabel:(0,l.I)({id:"theme.SearchModal.footer.closeKeyAriaLabel",message:"Escape key",description:"The ARIA label for the Escape key button that close the modal"}),searchByText:(0,l.I)({id:"theme.SearchModal.footer.searchByText",message:"Search by",description:"The text explain that the search is making by Algolia"})},noResultsScreen:{noResultsText:(0,l.I)({id:"theme.SearchModal.noResultsScreen.noResultsText",message:"No results for",description:"The text explains that there are no results for the following search"}),suggestedQueryText:(0,l.I)({id:"theme.SearchModal.noResultsScreen.suggestedQueryText",message:"Try searching for",description:"The text for the suggested query when no results are found for the following search"}),reportMissingResultsText:(0,l.I)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsText",message:"Believe this query should return results?",description:"The text for the question where the user thinks there are missing results"}),reportMissingResultsLinkText:(0,l.I)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsLinkText",message:"Let us know.",description:"The text for the link to report missing results"})}},placeholder:(0,l.I)({id:"theme.SearchModal.placeholder",message:"Search docs",description:"The placeholder of the input of the DocSearch pop-up modal"})};let Le=null;function De(e){let{hit:t,children:n}=e;return(0,u.jsx)(Y.Z,{to:t.url,children:n})}function Pe(e){let{state:t,onClose:n}=e;const r=(0,Ce.M)();return(0,u.jsx)(Y.Z,{to:r(t.query),onClick:n,children:(0,u.jsx)(l.Z,{id:"theme.SearchBar.seeAll",values:{count:t.context.nbHits},children:"See all {count} results"})})}function Ne(e){let{contextualSearch:t,externalUrlRegex:a,...o}=e;const{siteMetadata:i}=(0,le.Z)(),l=(0,Te.l)(),c=function(){const{locale:e,tags:t}=(0,Ae._q)();return[`language:${e}`,t.map((e=>`docusaurus_tag:${e}`))]}(),d=o.searchParameters?.facetFilters??[],p=t?function(e,t){const n=e=>"string"==typeof e?[e]:e;return[...n(e),...n(t)]}(c,d):d,f={...o.searchParameters,facetFilters:p},m=(0,s.k6)(),h=(0,r.useRef)(null),g=(0,r.useRef)(null),[b,y]=(0,r.useState)(!1),[v,w]=(0,r.useState)(void 0),k=(0,r.useCallback)((()=>Le?Promise.resolve():Promise.all([n.e(1426).then(n.bind(n,1426)),Promise.all([n.e(532),n.e(6945)]).then(n.bind(n,6945)),Promise.all([n.e(532),n.e(8894)]).then(n.bind(n,8894))]).then((e=>{let[{DocSearchModal:t}]=e;Le=t}))),[]),x=(0,r.useCallback)((()=>{k().then((()=>{h.current=document.createElement("div"),document.body.insertBefore(h.current,document.body.firstChild),y(!0)}))}),[k,y]),_=(0,r.useCallback)((()=>{y(!1),h.current?.remove()}),[y]),S=(0,r.useCallback)((e=>{k().then((()=>{y(!0),w(e.key)}))}),[k,y,w]),E=(0,r.useRef)({navigate(e){let{itemUrl:t}=e;(0,ee.F)(a,t)?window.location.href=t:m.push(t)}}).current,C=(0,r.useRef)((e=>o.transformItems?o.transformItems(e):e.map((e=>({...e,url:l(e.url)}))))).current,T=(0,r.useMemo)((()=>e=>(0,u.jsx)(Pe,{...e,onClose:_})),[_]),A=(0,r.useCallback)((e=>(e.addAlgoliaAgent("docusaurus",i.docusaurusVersion),e)),[i.docusaurusVersion]);return function(e){var t=e.isOpen,n=e.onOpen,a=e.onClose,o=e.onInput,i=e.searchButtonRef;r.useEffect((function(){function e(e){var r;(27===e.keyCode&&t||"k"===(null===(r=e.key)||void 0===r?void 0:r.toLowerCase())&&(e.metaKey||e.ctrlKey)||!function(e){var t=e.target,n=t.tagName;return t.isContentEditable||"INPUT"===n||"SELECT"===n||"TEXTAREA"===n}(e)&&"/"===e.key&&!t)&&(e.preventDefault(),t?a():document.body.classList.contains("DocSearch--active")||document.body.classList.contains("DocSearch--active")||n()),i&&i.current===document.activeElement&&o&&/[a-zA-Z0-9]/.test(String.fromCharCode(e.keyCode))&&o(e)}return window.addEventListener("keydown",e),function(){window.removeEventListener("keydown",e)}}),[t,n,a,o,i])}({isOpen:b,onOpen:x,onClose:_,onInput:S,searchButtonRef:g}),(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(Ee.Z,{children:(0,u.jsx)("link",{rel:"preconnect",href:`https://${o.appId}-dsn.algolia.net`,crossOrigin:"anonymous"})}),(0,u.jsx)(Se,{onTouchStart:k,onFocus:k,onMouseOver:k,onClick:x,ref:g,translations:Re.button}),b&&Le&&h.current&&(0,je.createPortal)((0,u.jsx)(Le,{onClose:_,initialScrollY:window.scrollY,initialQuery:v,navigator:E,transformItems:C,hitComponent:De,transformSearchClient:A,...o.searchPagePath&&{resultsFooterComponent:T},...o,searchParameters:f,placeholder:Re.placeholder,translations:Re.modal}),h.current)]})}function Oe(){const{siteConfig:e}=(0,le.Z)();return(0,u.jsx)(Ne,{...e.themeConfig.algolia})}const Me={navbarSearchContainer:"navbarSearchContainer_Bca1"};function Ie(e){let{children:t,className:n}=e;return(0,u.jsx)("div",{className:(0,a.Z)(n,Me.navbarSearchContainer),children:t})}var Fe=n(143),Be=n(3438);var ze=n(373);const Ue=e=>e.docs.find((t=>t.id===e.mainDocId));const $e={default:oe,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:r,queryString:a="",...o}=e;const{i18n:{currentLocale:i,locales:c,localeConfigs:d}}=(0,le.Z)(),p=(0,fe.l)(),{search:f,hash:m}=(0,s.TH)(),h=[...n,...c.map((e=>{const n=`${`pathname://${p.createUrl({locale:e,fullyQualified:!1})}`}${f}${m}${a}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...r],g=t?(0,l.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return(0,u.jsx)(pe,{...o,mobile:t,label:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(me,{className:he}),g]}),items:h})},search:function(e){let{mobile:t,className:n}=e;return t?null:(0,u.jsx)(Ie,{className:n,children:(0,u.jsx)(Oe,{})})},dropdown:pe,html:function(e){let{value:t,className:n,mobile:r=!1,isDropdownItem:o=!1}=e;const i=o?"li":"div";return(0,u.jsx)(i,{className:(0,a.Z)({navbar__item:!r&&!o,"menu__list-item":r},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:r,...a}=e;const{activeDoc:o}=(0,Fe.Iw)(r),i=(0,Be.vY)(t,r),s=o?.path===i?.path;return null===i||i.unlisted&&!s?null:(0,u.jsx)(oe,{exact:!0,...a,isActive:()=>s||!!o?.sidebar&&o.sidebar===i.sidebar,label:n??i.id,to:i.path})},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:r,...a}=e;const{activeDoc:o}=(0,Fe.Iw)(r),i=(0,Be.oz)(t,r).link;if(!i)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return(0,u.jsx)(oe,{exact:!0,...a,isActive:()=>o?.sidebar===t,label:n??i.label,to:i.path})},docsVersion:function(e){let{label:t,to:n,docsPluginId:r,...a}=e;const o=(0,Be.lO)(r)[0],i=t??o.label,s=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(o).path;return(0,u.jsx)(oe,{...a,label:i,to:s})},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:r,dropdownItemsBefore:a,dropdownItemsAfter:o,...i}=e;const{search:c,hash:d}=(0,s.TH)(),p=(0,Fe.Iw)(n),f=(0,Fe.gB)(n),{savePreferredVersionName:m}=(0,ze.J)(n),h=[...a,...f.map((e=>{const t=p.alternateDocVersions[e.name]??Ue(e);return{label:e.label,to:`${t.path}${c}${d}`,isActive:()=>e===p.activeVersion,onClick:()=>m(e.name)}})),...o],g=(0,Be.lO)(n)[0],b=t&&h.length>1?(0,l.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):g.label,y=t&&h.length>1?void 0:Ue(g).path;return h.length<=1?(0,u.jsx)(oe,{...i,mobile:t,label:b,to:y,isActive:r?()=>!1:void 0}):(0,u.jsx)(pe,{...i,mobile:t,label:b,to:y,items:h,isActive:r?()=>!1:void 0})}};function qe(e){let{type:t,...n}=e;const r=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),a=$e[r];if(!a)throw new Error(`No NavbarItem component found for type "${t}".`);return(0,u.jsx)(a,{...n})}function He(){const e=(0,j.e)(),t=(0,w.L)().navbar.items;return(0,u.jsx)("ul",{className:"menu__list",children:t.map(((t,n)=>(0,r.createElement)(qe,{mobile:!0,...t,onClick:()=>e.toggle(),key:n})))})}function Ze(e){return(0,u.jsx)("button",{...e,type:"button",className:"clean-btn navbar-sidebar__back",children:(0,u.jsx)(l.Z,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)",children:"\u2190 Back to main menu"})})}function Ve(){const e=0===(0,w.L)().navbar.items.length,t=M();return(0,u.jsxs)(u.Fragment,{children:[!e&&(0,u.jsx)(Ze,{onClick:()=>t.hide()}),t.content]})}function Ge(){const e=(0,j.e)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?(0,u.jsx)(I,{header:(0,u.jsx)(Q,{}),primaryMenu:(0,u.jsx)(He,{}),secondaryMenu:(0,u.jsx)(Ve,{})}):null}const We={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Ke(e){return(0,u.jsx)("div",{role:"presentation",...e,className:(0,a.Z)("navbar-sidebar__backdrop",e.className)})}function Qe(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:o}}=(0,w.L)(),i=(0,j.e)(),{navbarRef:s,isNavbarVisible:d}=function(e){const[t,n]=(0,r.useState)(e),a=(0,r.useRef)(!1),o=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(o.current=e.getBoundingClientRect().height)}),[]);return(0,R.RF)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i=s?n(!1):i+c{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return a.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return(0,u.jsxs)("nav",{ref:s,"aria-label":(0,l.I)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,a.Z)("navbar","navbar--fixed-top",n&&[We.navbarHideable,!d&&We.navbarHidden],{"navbar--dark":"dark"===o,"navbar--primary":"primary"===o,"navbar-sidebar--show":i.shown}),children:[t,(0,u.jsx)(Ke,{onClick:i.toggle}),(0,u.jsx)(Ge,{})]})}var Ye=n(8780);const Xe={errorBoundaryError:"errorBoundaryError_a6uf",errorBoundaryFallback:"errorBoundaryFallback_VBag"};function Je(e){return(0,u.jsx)("button",{type:"button",...e,children:(0,u.jsx)(l.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error",children:"Try again"})})}function et(e){let{error:t}=e;const n=(0,Ye.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,u.jsx)("p",{className:Xe.errorBoundaryError,children:n})}class tt extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const nt="right";function rt(e){let{width:t=30,height:n=30,className:r,...a}=e;return(0,u.jsx)("svg",{className:r,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true",...a,children:(0,u.jsx)("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"})})}function at(){const{toggle:e,shown:t}=(0,j.e)();return(0,u.jsx)("button",{onClick:e,"aria-label":(0,l.I)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button",children:(0,u.jsx)(rt,{})})}const ot={colorModeToggle:"colorModeToggle_DEke"};function it(e){let{items:t}=e;return(0,u.jsx)(u.Fragment,{children:t.map(((e,t)=>(0,u.jsx)(tt,{onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t}),children:(0,u.jsx)(qe,{...e})},t)))})}function st(e){let{left:t,right:n}=e;return(0,u.jsxs)("div",{className:"navbar__inner",children:[(0,u.jsx)("div",{className:"navbar__items",children:t}),(0,u.jsx)("div",{className:"navbar__items navbar__items--right",children:n})]})}function lt(){const e=(0,j.e)(),t=(0,w.L)().navbar.items,[n,r]=function(e){function t(e){return"left"===(e.position??nt)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),a=t.find((e=>"search"===e.type));return(0,u.jsx)(st,{left:(0,u.jsxs)(u.Fragment,{children:[!e.disabled&&(0,u.jsx)(at,{}),(0,u.jsx)(W,{}),(0,u.jsx)(it,{items:n})]}),right:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(it,{items:r}),(0,u.jsx)(V,{className:ot.colorModeToggle}),!a&&(0,u.jsx)(Ie,{children:(0,u.jsx)(Oe,{})})]})})}function ct(){return(0,u.jsx)(Qe,{children:(0,u.jsx)(lt,{})})}function ut(e){let{item:t}=e;const{to:n,href:r,label:a,prependBaseUrlToHref:o,...i}=t,s=(0,X.Z)(n),l=(0,X.Z)(r,{forcePrependBaseUrl:!0});return(0,u.jsxs)(Y.Z,{className:"footer__link-item",...r?{href:o?l:r}:{to:s},...i,children:[a,r&&!(0,J.Z)(r)&&(0,u.jsx)(te.Z,{})]})}function dt(e){let{item:t}=e;return t.html?(0,u.jsx)("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)("li",{className:"footer__item",children:(0,u.jsx)(ut,{item:t})},t.href??t.to)}function pt(e){let{column:t}=e;return(0,u.jsxs)("div",{className:"col footer__col",children:[(0,u.jsx)("div",{className:"footer__title",children:t.title}),(0,u.jsx)("ul",{className:"footer__items clean-list",children:t.items.map(((e,t)=>(0,u.jsx)(dt,{item:e},t)))})]})}function ft(e){let{columns:t}=e;return(0,u.jsx)("div",{className:"row footer__links",children:t.map(((e,t)=>(0,u.jsx)(pt,{column:e},t)))})}function mt(){return(0,u.jsx)("span",{className:"footer__link-separator",children:"\xb7"})}function ht(e){let{item:t}=e;return t.html?(0,u.jsx)("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)(ut,{item:t})}function gt(e){let{links:t}=e;return(0,u.jsx)("div",{className:"footer__links text--center",children:(0,u.jsx)("div",{className:"footer__links",children:t.map(((e,n)=>(0,u.jsxs)(r.Fragment,{children:[(0,u.jsx)(ht,{item:e}),t.length!==n+1&&(0,u.jsx)(mt,{})]},n)))})})}function bt(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?(0,u.jsx)(ft,{columns:t}):(0,u.jsx)(gt,{links:t})}var yt=n(9965);const vt={footerLogoLink:"footerLogoLink_BH7S"};function wt(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.C)(),r={light:n(t.src),dark:n(t.srcDark??t.src)};return(0,u.jsx)(yt.Z,{className:(0,a.Z)("footer__logo",t.className),alt:t.alt,sources:r,width:t.width,height:t.height,style:t.style})}function kt(e){let{logo:t}=e;return t.href?(0,u.jsx)(Y.Z,{href:t.href,className:vt.footerLogoLink,target:t.target,children:(0,u.jsx)(wt,{logo:t})}):(0,u.jsx)(wt,{logo:t})}function xt(e){let{copyright:t}=e;return(0,u.jsx)("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function _t(e){let{style:t,links:n,logo:r,copyright:o}=e;return(0,u.jsx)("footer",{className:(0,a.Z)("footer",{"footer--dark":"dark"===t}),children:(0,u.jsxs)("div",{className:"container container-fluid",children:[n,(r||o)&&(0,u.jsxs)("div",{className:"footer__bottom text--center",children:[r&&(0,u.jsx)("div",{className:"margin-bottom--sm",children:r}),o]})]})})}function St(){const{footer:e}=(0,w.L)();if(!e)return null;const{copyright:t,links:n,logo:r,style:a}=e;return(0,u.jsx)(_t,{style:a,links:n&&n.length>0&&(0,u.jsx)(bt,{links:n}),logo:r&&(0,u.jsx)(kt,{logo:r}),copyright:t&&(0,u.jsx)(xt,{copyright:t})})}const Et=r.memo(St),Ct=(0,L.Qc)([F.S,k.pl,R.OC,ze.L5,i.VC,function(e){let{children:t}=e;return(0,u.jsx)(D.n2,{children:(0,u.jsx)(j.M,{children:(0,u.jsx)(N,{children:t})})})}]);function Tt(e){let{children:t}=e;return(0,u.jsx)(Ct,{children:t})}var At=n(2503);function jt(e){let{error:t,tryAgain:n}=e;return(0,u.jsx)("main",{className:"container margin-vert--xl",children:(0,u.jsx)("div",{className:"row",children:(0,u.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,u.jsx)(At.Z,{as:"h1",className:"hero__title",children:(0,u.jsx)(l.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed",children:"This page crashed."})}),(0,u.jsx)("div",{className:"margin-vert--lg",children:(0,u.jsx)(Je,{onClick:n,className:"button button--primary shadow--lw"})}),(0,u.jsx)("hr",{}),(0,u.jsx)("div",{className:"margin-vert--md",children:(0,u.jsx)(et,{error:t})})]})})})}const Rt={mainWrapper:"mainWrapper_z2l0"};function Lt(e){const{children:t,noFooter:n,wrapperClassName:r,title:s,description:l}=e;return(0,b.t)(),(0,u.jsxs)(Tt,{children:[(0,u.jsx)(i.d,{title:s,description:l}),(0,u.jsx)(v,{}),(0,u.jsx)(A,{}),(0,u.jsx)(ct,{}),(0,u.jsx)("div",{id:d,className:(0,a.Z)(g.k.wrapper.main,Rt.mainWrapper,r),children:(0,u.jsx)(o.Z,{fallback:e=>(0,u.jsx)(jt,{...e}),children:t})}),!n&&(0,u.jsx)(Et,{})]})}},1327:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});n(7294);var r=n(9960),a=n(4996),o=n(2263),i=n(6668),s=n(9965),l=n(5893);function c(e){let{logo:t,alt:n,imageClassName:r}=e;const o={light:(0,a.Z)(t.src),dark:(0,a.Z)(t.srcDark||t.src)},i=(0,l.jsx)(s.Z,{className:t.className,sources:o,height:t.height,width:t.width,alt:n,style:t.style});return r?(0,l.jsx)("div",{className:r,children:i}):i}function u(e){const{siteConfig:{title:t}}=(0,o.Z)(),{navbar:{title:n,logo:s}}=(0,i.L)(),{imageClassName:u,titleClassName:d,...p}=e,f=(0,a.Z)(s?.href||"/"),m=n?"":t,h=s?.alt??m;return(0,l.jsxs)(r.Z,{to:f,...p,...s?.target&&{target:s.target},children:[s&&(0,l.jsx)(c,{logo:s,alt:h,imageClassName:u}),null!=n&&(0,l.jsx)("b",{className:d,children:n})]})}},197:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});n(7294);var r=n(5742),a=n(5893);function o(e){let{locale:t,version:n,tag:o}=e;const i=t;return(0,a.jsxs)(r.Z,{children:[t&&(0,a.jsx)("meta",{name:"docusaurus_locale",content:t}),n&&(0,a.jsx)("meta",{name:"docusaurus_version",content:n}),o&&(0,a.jsx)("meta",{name:"docusaurus_tag",content:o}),i&&(0,a.jsx)("meta",{name:"docsearch:language",content:i}),n&&(0,a.jsx)("meta",{name:"docsearch:version",content:n}),o&&(0,a.jsx)("meta",{name:"docsearch:docusaurus_tag",content:o})]})}},9965:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var r=n(7294),a=n(6010),o=n(2389),i=n(2949);const s={themedComponent:"themedComponent_mlkZ","themedComponent--light":"themedComponent--light_NVdE","themedComponent--dark":"themedComponent--dark_xIcU"};var l=n(5893);function c(e){let{className:t,children:n}=e;const c=(0,o.Z)(),{colorMode:u}=(0,i.I)();return(0,l.jsx)(l.Fragment,{children:(c?"dark"===u?["dark"]:["light"]:["light","dark"]).map((e=>{const o=n({theme:e,className:(0,a.Z)(t,s.themedComponent,s[`themedComponent--${e}`])});return(0,l.jsx)(r.Fragment,{children:o},e)}))})}function u(e){const{sources:t,className:n,alt:r,...a}=e;return(0,l.jsx)(c,{className:n,children:e=>{let{theme:n,className:o}=e;return(0,l.jsx)("img",{src:t[n],alt:r,className:o,...a})}})}},6043:(e,t,n)=>{"use strict";n.d(t,{u:()=>c,z:()=>b});var r=n(7294),a=n(412),o=n(469),i=n(1442),s=n(5893);const l="ease-in-out";function c(e){let{initialState:t}=e;const[n,a]=(0,r.useState)(t??!1),o=(0,r.useCallback)((()=>{a((e=>!e))}),[]);return{collapsed:n,setCollapsed:a,toggleCollapsed:o}}const u={display:"none",overflow:"hidden",height:"0px"},d={display:"block",overflow:"visible",height:"auto"};function p(e,t){const n=t?u:d;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function f(e){let{collapsibleRef:t,collapsed:n,animation:a}=e;const o=(0,r.useRef)(!1);(0,r.useEffect)((()=>{const e=t.current;function r(){const t=e.scrollHeight,n=a?.duration??function(e){if((0,i.n)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${a?.easing??l}`,height:`${t}px`}}function s(){const t=r();e.style.transition=t.transition,e.style.height=t.height}if(!o.current)return p(e,n),void(o.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(s(),requestAnimationFrame((()=>{e.style.height=u.height,e.style.overflow=u.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{s()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,a])}function m(e){if(!a.Z.canUseDOM)return e?u:d}function h(e){let{as:t="div",collapsed:n,children:a,animation:o,onCollapseTransitionEnd:i,className:l,disableSSRStyle:c}=e;const u=(0,r.useRef)(null);return f({collapsibleRef:u,collapsed:n,animation:o}),(0,s.jsx)(t,{ref:u,style:c?void 0:m(n),onTransitionEnd:e=>{"height"===e.propertyName&&(p(u.current,n),i?.(n))},className:l,children:a})}function g(e){let{collapsed:t,...n}=e;const[a,i]=(0,r.useState)(!t),[l,c]=(0,r.useState)(t);return(0,o.Z)((()=>{t||i(!0)}),[t]),(0,o.Z)((()=>{a&&c(t)}),[a,t]),a?(0,s.jsx)(h,{...n,collapsed:l}):null}function b(e){let{lazy:t,...n}=e;const r=t?g:h;return(0,s.jsx)(r,{...n})}},9689:(e,t,n)=>{"use strict";n.d(t,{nT:()=>h,pl:()=>m});var r=n(7294),a=n(2389),o=n(12),i=n(902),s=n(6668),l=n(5893);const c=(0,o.WA)("docusaurus.announcement.dismiss"),u=(0,o.WA)("docusaurus.announcement.id"),d=()=>"true"===c.get(),p=e=>c.set(String(e)),f=r.createContext(null);function m(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,s.L)(),t=(0,a.Z)(),[n,o]=(0,r.useState)((()=>!!t&&d()));(0,r.useEffect)((()=>{o(d())}),[]);const i=(0,r.useCallback)((()=>{p(!0),o(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=u.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;u.set(t),r&&p(!1),!r&&d()||o(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return(0,l.jsx)(f.Provider,{value:n,children:t})}function h(){const e=(0,r.useContext)(f);if(!e)throw new i.i6("AnnouncementBarProvider");return e}},2949:(e,t,n)=>{"use strict";n.d(t,{I:()=>b,S:()=>g});var r=n(7294),a=n(412),o=n(902),i=n(12),s=n(6668),l=n(5893);const c=r.createContext(void 0),u="theme",d=(0,i.WA)(u),p={light:"light",dark:"dark"},f=e=>e===p.dark?p.dark:p.light,m=e=>a.Z.canUseDOM?f(document.documentElement.getAttribute("data-theme")):f(e),h=e=>{d.set(f(e))};function g(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,s.L)(),[a,o]=(0,r.useState)(m(e));(0,r.useEffect)((()=>{t&&d.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:a=!0}=r;t?(o(t),a&&h(t)):(o(n?window.matchMedia("(prefers-color-scheme: dark)").matches?p.dark:p.light:e),d.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",f(a))}),[a]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==u)return;const t=d.get();null!==t&&i(f(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const l=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||l.current?l.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:a,setColorMode:i,get isDarkTheme(){return a===p.dark},setLightTheme(){i(p.light)},setDarkTheme(){i(p.dark)}})),[a,i])}();return(0,l.jsx)(c.Provider,{value:n,children:t})}function b(){const e=(0,r.useContext)(c);if(null==e)throw new o.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},373:(e,t,n)=>{"use strict";n.d(t,{J:()=>v,L5:()=>b,Oh:()=>w});var r=n(7294),a=n(143),o=n(9935),i=n(6668),s=n(3438),l=n(902),c=n(12),u=n(5893);const d=e=>`docs-preferred-version-${e}`,p={save:(e,t,n)=>{(0,c.WA)(d(e),{persistence:t}).set(n)},read:(e,t)=>(0,c.WA)(d(e),{persistence:t}).get(),clear:(e,t)=>{(0,c.WA)(d(e),{persistence:t}).del()}},f=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const m=r.createContext(null);function h(){const e=(0,a._r)(),t=(0,i.L)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[o,s]=(0,r.useState)((()=>f(n)));(0,r.useEffect)((()=>{s(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function a(e){const t=p.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(p.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,a(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[o,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){p.save(e,t,n),s((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function g(e){let{children:t}=e;const n=h();return(0,u.jsx)(m.Provider,{value:n,children:t})}function b(e){let{children:t}=e;return s.cE?(0,u.jsx)(g,{children:t}):(0,u.jsx)(u.Fragment,{children:t})}function y(){const e=(0,r.useContext)(m);if(!e)throw new l.i6("DocsPreferredVersionContextProvider");return e}function v(e){void 0===e&&(e=o.m);const t=(0,a.zh)(e),[n,i]=y(),{preferredVersionName:s}=n[e];return{preferredVersion:t.versions.find((e=>e.name===s))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}function w(){const e=(0,a._r)(),[t]=y();function n(n){const r=e[n],{preferredVersionName:a}=t[n];return r.versions.find((e=>e.name===a))??null}const r=Object.keys(e);return Object.fromEntries(r.map((e=>[e,n(e)])))}},1116:(e,t,n)=>{"use strict";n.d(t,{V:()=>c,b:()=>l});var r=n(7294),a=n(902),o=n(5893);const i=Symbol("EmptyContext"),s=r.createContext(i);function l(e){let{children:t,name:n,items:a}=e;const i=(0,r.useMemo)((()=>n&&a?{name:n,items:a}:null),[n,a]);return(0,o.jsx)(s.Provider,{value:i,children:t})}function c(){const e=(0,r.useContext)(s);if(e===i)throw new a.i6("DocsSidebarProvider");return e}},4477:(e,t,n)=>{"use strict";n.d(t,{E:()=>l,q:()=>s});var r=n(7294),a=n(902),o=n(5893);const i=r.createContext(null);function s(e){let{children:t,version:n}=e;return(0,o.jsx)(i.Provider,{value:n,children:t})}function l(){const e=(0,r.useContext)(i);if(null===e)throw new a.i6("DocsVersionProvider");return e}},3163:(e,t,n)=>{"use strict";n.d(t,{M:()=>p,e:()=>f});var r=n(7294),a=n(3102),o=n(7524),i=n(1980),s=n(6668),l=n(902),c=n(5893);const u=r.createContext(void 0);function d(){const e=function(){const e=(0,a.HY)(),{items:t}=(0,s.L)().navbar;return 0===t.length&&!e.component}(),t=(0,o.i)(),n=!e&&"mobile"===t,[l,c]=(0,r.useState)(!1);(0,i.Rb)((()=>{if(l)return c(!1),!1}));const u=(0,r.useCallback)((()=>{c((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&c(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:u,shown:l})),[e,n,u,l])}function p(e){let{children:t}=e;const n=d();return(0,c.jsx)(u.Provider,{value:n,children:t})}function f(){const e=r.useContext(u);if(void 0===e)throw new l.i6("NavbarMobileSidebarProvider");return e}},3102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>l,Zo:()=>c,n2:()=>s});var r=n(7294),a=n(902),o=n(5893);const i=r.createContext(null);function s(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return(0,o.jsx)(i.Provider,{value:n,children:t})}function l(){const e=(0,r.useContext)(i);if(!e)throw new a.i6("NavbarSecondaryMenuContentProvider");return e[0]}function c(e){let{component:t,props:n}=e;const o=(0,r.useContext)(i);if(!o)throw new a.i6("NavbarSecondaryMenuContentProvider");const[,s]=o,l=(0,a.Ql)(n);return(0,r.useEffect)((()=>{s({component:t,props:l})}),[s,t,l]),(0,r.useEffect)((()=>()=>s({component:null,props:null})),[s]),null}},9727:(e,t,n)=>{"use strict";n.d(t,{h:()=>a,t:()=>o});var r=n(7294);const a="navigation-with-keyboard";function o(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(a),"mousedown"===e.type&&document.body.classList.remove(a)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(a),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},6177:(e,t,n)=>{"use strict";n.d(t,{K:()=>s,M:()=>l});var r=n(7294),a=n(2263),o=n(1980);const i="q";function s(){return(0,o.Nc)(i)}function l(){const{siteConfig:{baseUrl:e,themeConfig:t}}=(0,a.Z)(),{algolia:{searchPagePath:n}}=t;return(0,r.useCallback)((t=>`${e}${n}?${i}=${encodeURIComponent(t)}`),[e,n])}},7524:(e,t,n)=>{"use strict";n.d(t,{i:()=>s});var r=n(7294),a=n(412);const o={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function s(){const[e,t]=(0,r.useState)((()=>"ssr"));return(0,r.useEffect)((()=>{function e(){t(function(){if(!a.Z.canUseDOM)throw new Error("getWindowSize() should only be called after React hydration");return window.innerWidth>i?o.desktop:o.mobile}())}return e(),window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),[]),e}},5281:(e,t,n)=>{"use strict";n.d(t,{k:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",unlistedBanner:"theme-unlisted-banner",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{}}},1442:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{n:()=>r})},3438:(e,t,n)=>{"use strict";n.d(t,{LM:()=>f,SN:()=>S,_F:()=>g,cE:()=>p,f:()=>y,lO:()=>k,oz:()=>x,s1:()=>w,vY:()=>_});var r=n(7294),a=n(6550),o=n(8790),i=n(143),s=n(373),l=n(4477),c=n(1116),u=n(7392),d=n(8596);const p=!!i._r;function f(e){return"link"!==e.type||e.unlisted?"category"===e.type?function(e){if(e.href&&!e.linkUnlisted)return e.href;for(const t of e.items){const e=f(t);if(e)return e}}(e):void 0:e.href}const m=(e,t)=>void 0!==e&&(0,d.Mg)(e,t),h=(e,t)=>e.some((e=>g(e,t)));function g(e,t){return"link"===e.type?m(e.href,t):"category"===e.type&&(m(e.href,t)||h(e.items,t))}function b(e,t){switch(e.type){case"category":return g(e,t)||e.items.some((e=>b(e,t)));case"link":return!e.unlisted||g(e,t);default:return!1}}function y(e,t){return(0,r.useMemo)((()=>e.filter((e=>b(e,t)))),[e,t])}function v(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const a=[];return function e(t){for(const o of t)if("category"===o.type&&((0,d.Mg)(o.href,n)||e(o.items))||"link"===o.type&&(0,d.Mg)(o.href,n)){return r&&"category"!==o.type||a.unshift(o),!0}return!1}(t),a}function w(){const e=(0,c.V)(),{pathname:t}=(0,a.TH)(),n=(0,i.gA)()?.pluginData.breadcrumbs;return!1!==n&&e?v({sidebarItems:e.items,pathname:t}):null}function k(e){const{activeVersion:t}=(0,i.Iw)(e),{preferredVersion:n}=(0,s.J)(e),a=(0,i.yW)(e);return(0,r.useMemo)((()=>(0,u.j)([t,n,a].filter(Boolean))),[t,n,a])}function x(e,t){const n=k(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).join("\n- ")}`);return r[1]}),[e,n])}function _(e,t){const n=k(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${(0,u.j)(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function S(e){let{route:t}=e;const n=(0,a.TH)(),r=(0,l.E)(),i=t.routes,s=i.find((e=>(0,a.LX)(n.pathname,e)));if(!s)return null;const c=s.sidebar,u=c?r.docsSidebars[c]:void 0;return{docElement:(0,o.H)(i),sidebarName:c,sidebarItems:u}}},2128:(e,t,n)=>{"use strict";n.d(t,{p:()=>a});var r=n(2263);function a(e){const{siteConfig:t}=(0,r.Z)(),{title:n,titleDelimiter:a}=t;return e?.trim().length?`${e.trim()} ${a} ${n}`:n}},1980:(e,t,n)=>{"use strict";n.d(t,{Nc:()=>l,Rb:()=>i,_X:()=>s});var r=n(7294),a=n(6550),o=n(902);function i(e){!function(e){const t=(0,a.k6)(),n=(0,o.zX)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}function s(e){return function(e){const t=(0,a.k6)();return(0,r.useSyncExternalStore)(t.listen,(()=>e(t)),(()=>e(t)))}((t=>null===e?null:new URLSearchParams(t.location.search).get(e)))}function l(e){const t=s(e)??"",n=function(){const e=(0,a.k6)();return(0,r.useCallback)(((t,n,r)=>{const a=new URLSearchParams(e.location.search);n?a.set(t,n):a.delete(t),(r?.push?e.push:e.replace)({search:a.toString()})}),[e])}();return[t,(0,r.useCallback)(((t,r)=>{n(e,t,r)}),[n,e])]}},7392:(e,t,n)=>{"use strict";function r(e,t){return void 0===t&&(t=(e,t)=>e===t),e.filter(((n,r)=>e.findIndex((e=>t(e,n)))!==r))}function a(e){return Array.from(new Set(e))}n.d(t,{j:()=>a,l:()=>r})},833:(e,t,n)=>{"use strict";n.d(t,{FG:()=>f,d:()=>d,VC:()=>m});var r=n(7294),a=n(6010),o=n(5742),i=n(226);function s(){const e=r.useContext(i._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var l=n(4996),c=n(2128),u=n(5893);function d(e){let{title:t,description:n,keywords:r,image:a,children:i}=e;const s=(0,c.p)(t),{withBaseUrl:d}=(0,l.C)(),p=a?d(a,{absolute:!0}):void 0;return(0,u.jsxs)(o.Z,{children:[t&&(0,u.jsx)("title",{children:s}),t&&(0,u.jsx)("meta",{property:"og:title",content:s}),n&&(0,u.jsx)("meta",{name:"description",content:n}),n&&(0,u.jsx)("meta",{property:"og:description",content:n}),r&&(0,u.jsx)("meta",{name:"keywords",content:Array.isArray(r)?r.join(","):r}),p&&(0,u.jsx)("meta",{property:"og:image",content:p}),p&&(0,u.jsx)("meta",{name:"twitter:image",content:p}),i]})}const p=r.createContext(void 0);function f(e){let{className:t,children:n}=e;const i=r.useContext(p),s=(0,a.Z)(i,t);return(0,u.jsxs)(p.Provider,{value:s,children:[(0,u.jsx)(o.Z,{children:(0,u.jsx)("html",{className:s})}),n]})}function m(e){let{children:t}=e;const n=s(),r=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const o=`plugin-id-${n.plugin.id}`;return(0,u.jsx)(f,{className:(0,a.Z)(r,o),children:t})}},902:(e,t,n)=>{"use strict";n.d(t,{D9:()=>s,Qc:()=>u,Ql:()=>c,i6:()=>l,zX:()=>i});var r=n(7294),a=n(469),o=n(5893);function i(e){const t=(0,r.useRef)(e);return(0,a.Z)((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function s(e){const t=(0,r.useRef)();return(0,a.Z)((()=>{t.current=e})),t.current}class l extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function c(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function u(e){return t=>{let{children:n}=t;return(0,o.jsx)(o.Fragment,{children:e.reduceRight(((e,t)=>(0,o.jsx)(t,{children:e})),n)})}}},8022:(e,t,n)=>{"use strict";function r(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}n.d(t,{F:()=>r})},8596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>i,Ns:()=>s});var r=n(7294),a=n(723),o=n(2263);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function s(){const{baseUrl:e}=(0,o.Z)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function a(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(a).flatMap((e=>e.routes??[])))}(n)}({routes:a.Z,baseUrl:e})),[e])}},2466:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>h,OC:()=>u,RF:()=>f,o5:()=>m});var r=n(7294),a=n(412),o=n(2389),i=n(469),s=n(902),l=n(5893);const c=r.createContext(void 0);function u(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return(0,l.jsx)(c.Provider,{value:n,children:t})}function d(){const e=(0,r.useContext)(c);if(null==e)throw new s.i6("ScrollControllerProvider");return e}const p=()=>a.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function f(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=d(),a=(0,r.useRef)(p()),o=(0,s.zX)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=p();o(e,a.current),a.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[o,n,...t])}function m(){const e=d(),t=function(){const e=(0,r.useRef)({elem:null,top:0}),t=(0,r.useCallback)((t=>{e.current={elem:t,top:t.getBoundingClientRect().top}}),[]),n=(0,r.useCallback)((()=>{const{current:{elem:t,top:n}}=e;if(!t)return{restored:!1};const r=t.getBoundingClientRect().top-n;return r&&window.scrollBy({left:0,top:r}),e.current={elem:null,top:0},{restored:0!==r}}),[]);return(0,r.useMemo)((()=>({save:t,restore:n})),[n,t])}(),n=(0,r.useRef)(void 0),a=(0,r.useCallback)((r=>{t.save(r),e.disableScrollEvents(),n.current=()=>{const{restored:r}=t.restore();if(n.current=void 0,r){const t=()=>{e.enableScrollEvents(),window.removeEventListener("scroll",t)};window.addEventListener("scroll",t)}else e.enableScrollEvents()}}),[e,t]);return(0,i.Z)((()=>{queueMicrotask((()=>n.current?.()))})),{blockElementScrollPositionUntilNextRender:a}}function h(){const e=(0,r.useRef)(null),t=(0,o.Z)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const a=document.documentElement.scrollTop;(n&&a>e||!n&&at&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},3320:(e,t,n)=>{"use strict";n.d(t,{HX:()=>i,_q:()=>l,os:()=>s});var r=n(143),a=n(2263),o=n(373);const i="default";function s(e,t){return`docs-${e}-${t}`}function l(){const{i18n:e}=(0,a.Z)(),t=(0,r._r)(),n=(0,r.WS)(),l=(0,o.Oh)();const c=[i,...Object.keys(t).map((function(e){const r=n?.activePlugin.pluginId===e?n.activeVersion:void 0,a=l[e],o=t[e].versions.find((e=>e.isLast));return s(e,(r??a??o).name)}))];return{locale:e.currentLocale,tags:c}}},12:(e,t,n)=>{"use strict";n.d(t,{Nk:()=>u,WA:()=>c});var r=n(7294);const a="localStorage";function o(e){let{key:t,oldValue:n,newValue:r,storage:a}=e;if(n===r)return;const o=document.createEvent("StorageEvent");o.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,a),window.dispatchEvent(o)}function i(e){if(void 0===e&&(e=a),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,s||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),s=!0),null}var t}let s=!1;const l={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function c(e,t){if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(e);const n=i(t?.persistence);return null===n?l:{get:()=>{try{return n.getItem(e)}catch(t){return console.error(`Docusaurus storage error, can't get key=${e}`,t),null}},set:t=>{try{const r=n.getItem(e);n.setItem(e,t),o({key:e,oldValue:r,newValue:t,storage:n})}catch(r){console.error(`Docusaurus storage error, can't set ${e}=${t}`,r)}},del:()=>{try{const t=n.getItem(e);n.removeItem(e),o({key:e,oldValue:t,newValue:null,storage:n})}catch(t){console.error(`Docusaurus storage error, can't delete key=${e}`,t)}},listen:t=>{try{const r=r=>{r.storageArea===n&&r.key===e&&t(r)};return window.addEventListener("storage",r),()=>window.removeEventListener("storage",r)}catch(r){return console.error(`Docusaurus storage error, can't listen for changes of key=${e}`,r),()=>{}}}}}function u(e,t){const n=(0,r.useRef)((()=>null===e?l:c(e,t))).current(),a=(0,r.useCallback)((e=>"undefined"==typeof window?()=>{}:n.listen(e)),[n]);return[(0,r.useSyncExternalStore)(a,(()=>"undefined"==typeof window?null:n.get()),(()=>null)),n]}},4711:(e,t,n)=>{"use strict";n.d(t,{l:()=>i});var r=n(2263),a=n(6550),o=n(8780);function i(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:i,currentLocale:s}}=(0,r.Z)(),{pathname:l}=(0,a.TH)(),c=(0,o.applyTrailingSlash)(l,{trailingSlash:n,baseUrl:e}),u=s===i?e:e.replace(`/${s}/`,"/"),d=c.replace(e,"");return{createUrl:function(e){let{locale:n,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===i?`${u}`:`${u}${e}/`}(n)}${d}`}}}},5936:(e,t,n)=>{"use strict";n.d(t,{S:()=>i});var r=n(7294),a=n(6550),o=n(902);function i(e){const t=(0,a.TH)(),n=(0,o.D9)(t),i=(0,o.zX)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},6668:(e,t,n)=>{"use strict";n.d(t,{L:()=>a});var r=n(2263);function a(){return(0,r.Z)().siteConfig.themeConfig}},6278:(e,t,n)=>{"use strict";n.d(t,{L:()=>a});var r=n(2263);function a(){const{siteConfig:{themeConfig:e}}=(0,r.Z)();return e}},239:(e,t,n)=>{"use strict";n.d(t,{l:()=>s});var r=n(7294),a=n(8022),o=n(4996),i=n(6278);function s(){const{withBaseUrl:e}=(0,o.C)(),{algolia:{externalUrlRegex:t,replaceSearchResultPathname:n}}=(0,i.L)();return(0,r.useCallback)((r=>{const o=new URL(r);if((0,a.F)(t,o.href))return r;const i=`${o.pathname+o.hash}`;return e(function(e,t){return t?e.replaceAll(new RegExp(t.from,"g"),t.to):e}(i,n))}),[e,t,n])}},8802:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[a]=e.split(/[#?]/),o="/"===a||a===r?a:(i=a,n?function(e){return e.endsWith("/")?e:`${e}/`}(i):function(e){return e.endsWith("/")?e.slice(0,-1):e}(i));var i;return e.replace(a,o)}},4143:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=void 0,t.getErrorCausalChain=function e(t){return t.cause?[t,...e(t.cause)]:[t]}},8780:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="__blog-post-container";var a=n(8802);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(a).default}});var o=n(4143);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return o.getErrorCausalChain}})},6010:(e,t,n)=>{"use strict";function r(e){var t,n,a="";if("string"==typeof e||"number"==typeof e)a+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;ta});const a=function(){for(var e,t,n=0,a="";n{"use strict";n.d(t,{lX:()=>_,q_:()=>j,ob:()=>h,PP:()=>L,Ep:()=>m,Hp:()=>g});var r=n(3117);function a(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,r=n+1,a=e.length;r=0;p--){var f=i[p];"."===f?o(i,p):".."===f?(o(i,p),d++):d&&(o(i,p),d--)}if(!c)for(;d--;d)i.unshift("..");!c||""===i[0]||i[0]&&a(i[0])||i.unshift("");var m=i.join("/");return n&&"/"!==m.substr(-1)&&(m+="/"),m};function s(e){return e.valueOf?e.valueOf():Object.prototype.valueOf.call(e)}const l=function e(t,n){if(t===n)return!0;if(null==t||null==n)return!1;if(Array.isArray(t))return Array.isArray(n)&&t.length===n.length&&t.every((function(t,r){return e(t,n[r])}));if("object"==typeof t||"object"==typeof n){var r=s(t),a=s(n);return r!==t||a!==n?e(r,a):Object.keys(Object.assign({},t,n)).every((function(r){return e(t[r],n[r])}))}return!1};var c=n(2177);function u(e){return"/"===e.charAt(0)?e:"/"+e}function d(e){return"/"===e.charAt(0)?e.substr(1):e}function p(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function f(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function m(e){var t=e.pathname,n=e.search,r=e.hash,a=t||"/";return n&&"?"!==n&&(a+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(a+="#"===r.charAt(0)?r:"#"+r),a}function h(e,t,n,a){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",r="",a=t.indexOf("#");-1!==a&&(r=t.substr(a),t=t.substr(0,a));var o=t.indexOf("?");return-1!==o&&(n=t.substr(o),t=t.substr(0,o)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),o.state=t):(void 0===(o=(0,r.Z)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(s){throw s instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):s}return n&&(o.key=n),a?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=i(o.pathname,a.pathname)):o.pathname=a.pathname:o.pathname||(o.pathname="/"),o}function g(e,t){return e.pathname===t.pathname&&e.search===t.search&&e.hash===t.hash&&e.key===t.key&&l(e.state,t.state)}function b(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,a){if(null!=e){var o="function"==typeof e?e(t,n):e;"string"==typeof o?"function"==typeof r?r(o,a):a(!0):a(!1!==o)}else a(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,a):n.push(a),d({action:r,location:a,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",a=h(e,t,p(),w.location);u.confirmTransitionTo(a,r,n,(function(e){e&&(w.entries[w.index]=a,d({action:r,location:a}))}))},go:v,goBack:function(){v(-1)},goForward:function(){v(1)},canGo:function(e){var t=w.index+e;return t>=0&&t{"use strict";var r=n(9864),a={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},s={};function l(e){return r.isMemo(e)?i:s[e.$$typeof]||a}s[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},s[r.Memo]=i;var c=Object.defineProperty,u=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var a=f(n);a&&a!==m&&e(t,a,r)}var i=u(n);d&&(i=i.concat(d(n)));for(var s=l(t),h=l(n),g=0;g{"use strict";e.exports=function(e,t,n,r,a,o,i,s){if(!e){var l;if(void 0===t)l=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[n,r,a,o,i,s],u=0;(l=new Error(t.replace(/%s/g,(function(){return c[u++]})))).name="Invariant Violation"}throw l.framesToPop=1,l}}},5826:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},2497:(e,t,n)=>{"use strict";n.r(t)},2295:(e,t,n)=>{"use strict";n.r(t)},4865:function(e,t,n){var r,a;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};function a(e,t,n){return en?n:e}function o(e){return 100*(-1+e)}function i(e,t,n){var a;return(a="translate3d"===r.positionUsing?{transform:"translate3d("+o(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+o(e)+"%,0)"}:{"margin-left":o(e)+"%"}).transition="all "+t+"ms "+n,a}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=a(e,r.minimum,1),n.status=1===e?null:e;var o=n.render(!t),c=o.querySelector(r.barSelector),u=r.speed,d=r.easing;return o.offsetWidth,s((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),l(c,i(e,u,d)),1===e?(l(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){l(o,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),u)}),u)):setTimeout(t,u)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*a(Math.random()*t,.1,.95)),t=a(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var a,i=t.querySelector(r.barSelector),s=e?"-100":o(n.status||0),c=document.querySelector(r.parent);return l(i,{transition:"all 0 linear",transform:"translate3d("+s+"%,0,0)"}),r.showSpinner||(a=t.querySelector(r.spinnerSelector))&&f(a),c!=document.body&&u(c,"nprogress-custom-parent"),c.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&f(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var s=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),l=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,a=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);a--;)if((r=e[a]+o)in n)return r;return t}function a(e){return e=n(e),t[e]||(t[e]=r(e))}function o(e,t,n){t=a(t),e.style[t]=n}return function(e,t){var n,r,a=arguments;if(2==a.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&o(e,n,r);else o(e,a[1],a[2])}}();function c(e,t){return("string"==typeof e?e:p(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=p(e),r=n+t;c(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=p(e);c(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function p(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function f(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(a="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=a)},9901:e=>{e.exports&&(e.exports={core:{meta:{path:"components/prism-core.js",option:"mandatory"},core:"Core"},themes:{meta:{path:"themes/{id}.css",link:"index.html?theme={id}",exclusive:!0},prism:{title:"Default",option:"default"},"prism-dark":"Dark","prism-funky":"Funky","prism-okaidia":{title:"Okaidia",owner:"ocodia"},"prism-twilight":{title:"Twilight",owner:"remybach"},"prism-coy":{title:"Coy",owner:"tshedor"},"prism-solarizedlight":{title:"Solarized Light",owner:"hectormatos2011 "},"prism-tomorrow":{title:"Tomorrow Night",owner:"Rosey"}},languages:{meta:{path:"components/prism-{id}",noCSS:!0,examplesPath:"examples/prism-{id}",addCheckAll:!0},markup:{title:"Markup",alias:["html","xml","svg","mathml","ssml","atom","rss"],aliasTitles:{html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",ssml:"SSML",atom:"Atom",rss:"RSS"},option:"default"},css:{title:"CSS",option:"default",modify:"markup"},clike:{title:"C-like",option:"default"},javascript:{title:"JavaScript",require:"clike",modify:"markup",optional:"regex",alias:"js",option:"default"},abap:{title:"ABAP",owner:"dellagustin"},abnf:{title:"ABNF",owner:"RunDevelopment"},actionscript:{title:"ActionScript",require:"javascript",modify:"markup",owner:"Golmote"},ada:{title:"Ada",owner:"Lucretia"},agda:{title:"Agda",owner:"xy-ren"},al:{title:"AL",owner:"RunDevelopment"},antlr4:{title:"ANTLR4",alias:"g4",owner:"RunDevelopment"},apacheconf:{title:"Apache Configuration",owner:"GuiTeK"},apex:{title:"Apex",require:["clike","sql"],owner:"RunDevelopment"},apl:{title:"APL",owner:"ngn"},applescript:{title:"AppleScript",owner:"Golmote"},aql:{title:"AQL",owner:"RunDevelopment"},arduino:{title:"Arduino",require:"cpp",alias:"ino",owner:"dkern"},arff:{title:"ARFF",owner:"Golmote"},armasm:{title:"ARM Assembly",alias:"arm-asm",owner:"RunDevelopment"},arturo:{title:"Arturo",alias:"art",optional:["bash","css","javascript","markup","markdown","sql"],owner:"drkameleon"},asciidoc:{alias:"adoc",title:"AsciiDoc",owner:"Golmote"},aspnet:{title:"ASP.NET (C#)",require:["markup","csharp"],owner:"nauzilus"},asm6502:{title:"6502 Assembly",owner:"kzurawel"},asmatmel:{title:"Atmel AVR Assembly",owner:"cerkit"},autohotkey:{title:"AutoHotkey",owner:"aviaryan"},autoit:{title:"AutoIt",owner:"Golmote"},avisynth:{title:"AviSynth",alias:"avs",owner:"Zinfidel"},"avro-idl":{title:"Avro IDL",alias:"avdl",owner:"RunDevelopment"},awk:{title:"AWK",alias:"gawk",aliasTitles:{gawk:"GAWK"},owner:"RunDevelopment"},bash:{title:"Bash",alias:["sh","shell"],aliasTitles:{sh:"Shell",shell:"Shell"},owner:"zeitgeist87"},basic:{title:"BASIC",owner:"Golmote"},batch:{title:"Batch",owner:"Golmote"},bbcode:{title:"BBcode",alias:"shortcode",aliasTitles:{shortcode:"Shortcode"},owner:"RunDevelopment"},bbj:{title:"BBj",owner:"hyyan"},bicep:{title:"Bicep",owner:"johnnyreilly"},birb:{title:"Birb",require:"clike",owner:"Calamity210"},bison:{title:"Bison",require:"c",owner:"Golmote"},bnf:{title:"BNF",alias:"rbnf",aliasTitles:{rbnf:"RBNF"},owner:"RunDevelopment"},bqn:{title:"BQN",owner:"yewscion"},brainfuck:{title:"Brainfuck",owner:"Golmote"},brightscript:{title:"BrightScript",owner:"RunDevelopment"},bro:{title:"Bro",owner:"wayward710"},bsl:{title:"BSL (1C:Enterprise)",alias:"oscript",aliasTitles:{oscript:"OneScript"},owner:"Diversus23"},c:{title:"C",require:"clike",owner:"zeitgeist87"},csharp:{title:"C#",require:"clike",alias:["cs","dotnet"],owner:"mvalipour"},cpp:{title:"C++",require:"c",owner:"zeitgeist87"},cfscript:{title:"CFScript",require:"clike",alias:"cfc",owner:"mjclemente"},chaiscript:{title:"ChaiScript",require:["clike","cpp"],owner:"RunDevelopment"},cil:{title:"CIL",owner:"sbrl"},cilkc:{title:"Cilk/C",require:"c",alias:"cilk-c",owner:"OpenCilk"},cilkcpp:{title:"Cilk/C++",require:"cpp",alias:["cilk-cpp","cilk"],owner:"OpenCilk"},clojure:{title:"Clojure",owner:"troglotit"},cmake:{title:"CMake",owner:"mjrogozinski"},cobol:{title:"COBOL",owner:"RunDevelopment"},coffeescript:{title:"CoffeeScript",require:"javascript",alias:"coffee",owner:"R-osey"},concurnas:{title:"Concurnas",alias:"conc",owner:"jasontatton"},csp:{title:"Content-Security-Policy",owner:"ScottHelme"},cooklang:{title:"Cooklang",owner:"ahue"},coq:{title:"Coq",owner:"RunDevelopment"},crystal:{title:"Crystal",require:"ruby",owner:"MakeNowJust"},"css-extras":{title:"CSS Extras",require:"css",modify:"css",owner:"milesj"},csv:{title:"CSV",owner:"RunDevelopment"},cue:{title:"CUE",owner:"RunDevelopment"},cypher:{title:"Cypher",owner:"RunDevelopment"},d:{title:"D",require:"clike",owner:"Golmote"},dart:{title:"Dart",require:"clike",owner:"Golmote"},dataweave:{title:"DataWeave",owner:"machaval"},dax:{title:"DAX",owner:"peterbud"},dhall:{title:"Dhall",owner:"RunDevelopment"},diff:{title:"Diff",owner:"uranusjr"},django:{title:"Django/Jinja2",require:"markup-templating",alias:"jinja2",owner:"romanvm"},"dns-zone-file":{title:"DNS zone file",owner:"RunDevelopment",alias:"dns-zone"},docker:{title:"Docker",alias:"dockerfile",owner:"JustinBeckwith"},dot:{title:"DOT (Graphviz)",alias:"gv",optional:"markup",owner:"RunDevelopment"},ebnf:{title:"EBNF",owner:"RunDevelopment"},editorconfig:{title:"EditorConfig",owner:"osipxd"},eiffel:{title:"Eiffel",owner:"Conaclos"},ejs:{title:"EJS",require:["javascript","markup-templating"],owner:"RunDevelopment",alias:"eta",aliasTitles:{eta:"Eta"}},elixir:{title:"Elixir",owner:"Golmote"},elm:{title:"Elm",owner:"zwilias"},etlua:{title:"Embedded Lua templating",require:["lua","markup-templating"],owner:"RunDevelopment"},erb:{title:"ERB",require:["ruby","markup-templating"],owner:"Golmote"},erlang:{title:"Erlang",owner:"Golmote"},"excel-formula":{title:"Excel Formula",alias:["xlsx","xls"],owner:"RunDevelopment"},fsharp:{title:"F#",require:"clike",owner:"simonreynolds7"},factor:{title:"Factor",owner:"catb0t"},false:{title:"False",owner:"edukisto"},"firestore-security-rules":{title:"Firestore security rules",require:"clike",owner:"RunDevelopment"},flow:{title:"Flow",require:"javascript",owner:"Golmote"},fortran:{title:"Fortran",owner:"Golmote"},ftl:{title:"FreeMarker Template Language",require:"markup-templating",owner:"RunDevelopment"},gml:{title:"GameMaker Language",alias:"gamemakerlanguage",require:"clike",owner:"LiarOnce"},gap:{title:"GAP (CAS)",owner:"RunDevelopment"},gcode:{title:"G-code",owner:"RunDevelopment"},gdscript:{title:"GDScript",owner:"RunDevelopment"},gedcom:{title:"GEDCOM",owner:"Golmote"},gettext:{title:"gettext",alias:"po",owner:"RunDevelopment"},gherkin:{title:"Gherkin",owner:"hason"},git:{title:"Git",owner:"lgiraudel"},glsl:{title:"GLSL",require:"c",owner:"Golmote"},gn:{title:"GN",alias:"gni",owner:"RunDevelopment"},"linker-script":{title:"GNU Linker Script",alias:"ld",owner:"RunDevelopment"},go:{title:"Go",require:"clike",owner:"arnehormann"},"go-module":{title:"Go module",alias:"go-mod",owner:"RunDevelopment"},gradle:{title:"Gradle",require:"clike",owner:"zeabdelkhalek-badido18"},graphql:{title:"GraphQL",optional:"markdown",owner:"Golmote"},groovy:{title:"Groovy",require:"clike",owner:"robfletcher"},haml:{title:"Haml",require:"ruby",optional:["css","css-extras","coffeescript","erb","javascript","less","markdown","scss","textile"],owner:"Golmote"},handlebars:{title:"Handlebars",require:"markup-templating",alias:["hbs","mustache"],aliasTitles:{mustache:"Mustache"},owner:"Golmote"},haskell:{title:"Haskell",alias:"hs",owner:"bholst"},haxe:{title:"Haxe",require:"clike",optional:"regex",owner:"Golmote"},hcl:{title:"HCL",owner:"outsideris"},hlsl:{title:"HLSL",require:"c",owner:"RunDevelopment"},hoon:{title:"Hoon",owner:"matildepark"},http:{title:"HTTP",optional:["csp","css","hpkp","hsts","javascript","json","markup","uri"],owner:"danielgtaylor"},hpkp:{title:"HTTP Public-Key-Pins",owner:"ScottHelme"},hsts:{title:"HTTP Strict-Transport-Security",owner:"ScottHelme"},ichigojam:{title:"IchigoJam",owner:"BlueCocoa"},icon:{title:"Icon",owner:"Golmote"},"icu-message-format":{title:"ICU Message Format",owner:"RunDevelopment"},idris:{title:"Idris",alias:"idr",owner:"KeenS",require:"haskell"},ignore:{title:".ignore",owner:"osipxd",alias:["gitignore","hgignore","npmignore"],aliasTitles:{gitignore:".gitignore",hgignore:".hgignore",npmignore:".npmignore"}},inform7:{title:"Inform 7",owner:"Golmote"},ini:{title:"Ini",owner:"aviaryan"},io:{title:"Io",owner:"AlesTsurko"},j:{title:"J",owner:"Golmote"},java:{title:"Java",require:"clike",owner:"sherblot"},javadoc:{title:"JavaDoc",require:["markup","java","javadoclike"],modify:"java",optional:"scala",owner:"RunDevelopment"},javadoclike:{title:"JavaDoc-like",modify:["java","javascript","php"],owner:"RunDevelopment"},javastacktrace:{title:"Java stack trace",owner:"RunDevelopment"},jexl:{title:"Jexl",owner:"czosel"},jolie:{title:"Jolie",require:"clike",owner:"thesave"},jq:{title:"JQ",owner:"RunDevelopment"},jsdoc:{title:"JSDoc",require:["javascript","javadoclike","typescript"],modify:"javascript",optional:["actionscript","coffeescript"],owner:"RunDevelopment"},"js-extras":{title:"JS Extras",require:"javascript",modify:"javascript",optional:["actionscript","coffeescript","flow","n4js","typescript"],owner:"RunDevelopment"},json:{title:"JSON",alias:"webmanifest",aliasTitles:{webmanifest:"Web App Manifest"},owner:"CupOfTea696"},json5:{title:"JSON5",require:"json",owner:"RunDevelopment"},jsonp:{title:"JSONP",require:"json",owner:"RunDevelopment"},jsstacktrace:{title:"JS stack trace",owner:"sbrl"},"js-templates":{title:"JS Templates",require:"javascript",modify:"javascript",optional:["css","css-extras","graphql","markdown","markup","sql"],owner:"RunDevelopment"},julia:{title:"Julia",owner:"cdagnino"},keepalived:{title:"Keepalived Configure",owner:"dev-itsheng"},keyman:{title:"Keyman",owner:"mcdurdin"},kotlin:{title:"Kotlin",alias:["kt","kts"],aliasTitles:{kts:"Kotlin Script"},require:"clike",owner:"Golmote"},kumir:{title:"KuMir (\u041a\u0443\u041c\u0438\u0440)",alias:"kum",owner:"edukisto"},kusto:{title:"Kusto",owner:"RunDevelopment"},latex:{title:"LaTeX",alias:["tex","context"],aliasTitles:{tex:"TeX",context:"ConTeXt"},owner:"japborst"},latte:{title:"Latte",require:["clike","markup-templating","php"],owner:"nette"},less:{title:"Less",require:"css",optional:"css-extras",owner:"Golmote"},lilypond:{title:"LilyPond",require:"scheme",alias:"ly",owner:"RunDevelopment"},liquid:{title:"Liquid",require:"markup-templating",owner:"cinhtau"},lisp:{title:"Lisp",alias:["emacs","elisp","emacs-lisp"],owner:"JuanCaicedo"},livescript:{title:"LiveScript",owner:"Golmote"},llvm:{title:"LLVM IR",owner:"porglezomp"},log:{title:"Log file",optional:"javastacktrace",owner:"RunDevelopment"},lolcode:{title:"LOLCODE",owner:"Golmote"},lua:{title:"Lua",owner:"Golmote"},magma:{title:"Magma (CAS)",owner:"RunDevelopment"},makefile:{title:"Makefile",owner:"Golmote"},markdown:{title:"Markdown",require:"markup",optional:"yaml",alias:"md",owner:"Golmote"},"markup-templating":{title:"Markup templating",require:"markup",owner:"Golmote"},mata:{title:"Mata",owner:"RunDevelopment"},matlab:{title:"MATLAB",owner:"Golmote"},maxscript:{title:"MAXScript",owner:"RunDevelopment"},mel:{title:"MEL",owner:"Golmote"},mermaid:{title:"Mermaid",owner:"RunDevelopment"},metafont:{title:"METAFONT",owner:"LaeriExNihilo"},mizar:{title:"Mizar",owner:"Golmote"},mongodb:{title:"MongoDB",owner:"airs0urce",require:"javascript"},monkey:{title:"Monkey",owner:"Golmote"},moonscript:{title:"MoonScript",alias:"moon",owner:"RunDevelopment"},n1ql:{title:"N1QL",owner:"TMWilds"},n4js:{title:"N4JS",require:"javascript",optional:"jsdoc",alias:"n4jsd",owner:"bsmith-n4"},"nand2tetris-hdl":{title:"Nand To Tetris HDL",owner:"stephanmax"},naniscript:{title:"Naninovel Script",owner:"Elringus",alias:"nani"},nasm:{title:"NASM",owner:"rbmj"},neon:{title:"NEON",owner:"nette"},nevod:{title:"Nevod",owner:"nezaboodka"},nginx:{title:"nginx",owner:"volado"},nim:{title:"Nim",owner:"Golmote"},nix:{title:"Nix",owner:"Golmote"},nsis:{title:"NSIS",owner:"idleberg"},objectivec:{title:"Objective-C",require:"c",alias:"objc",owner:"uranusjr"},ocaml:{title:"OCaml",owner:"Golmote"},odin:{title:"Odin",owner:"edukisto"},opencl:{title:"OpenCL",require:"c",modify:["c","cpp"],owner:"Milania1"},openqasm:{title:"OpenQasm",alias:"qasm",owner:"RunDevelopment"},oz:{title:"Oz",owner:"Golmote"},parigp:{title:"PARI/GP",owner:"Golmote"},parser:{title:"Parser",require:"markup",owner:"Golmote"},pascal:{title:"Pascal",alias:"objectpascal",aliasTitles:{objectpascal:"Object Pascal"},owner:"Golmote"},pascaligo:{title:"Pascaligo",owner:"DefinitelyNotAGoat"},psl:{title:"PATROL Scripting Language",owner:"bertysentry"},pcaxis:{title:"PC-Axis",alias:"px",owner:"RunDevelopment"},peoplecode:{title:"PeopleCode",alias:"pcode",owner:"RunDevelopment"},perl:{title:"Perl",owner:"Golmote"},php:{title:"PHP",require:"markup-templating",owner:"milesj"},phpdoc:{title:"PHPDoc",require:["php","javadoclike"],modify:"php",owner:"RunDevelopment"},"php-extras":{title:"PHP Extras",require:"php",modify:"php",owner:"milesj"},"plant-uml":{title:"PlantUML",alias:"plantuml",owner:"RunDevelopment"},plsql:{title:"PL/SQL",require:"sql",owner:"Golmote"},powerquery:{title:"PowerQuery",alias:["pq","mscript"],owner:"peterbud"},powershell:{title:"PowerShell",owner:"nauzilus"},processing:{title:"Processing",require:"clike",owner:"Golmote"},prolog:{title:"Prolog",owner:"Golmote"},promql:{title:"PromQL",owner:"arendjr"},properties:{title:".properties",owner:"Golmote"},protobuf:{title:"Protocol Buffers",require:"clike",owner:"just-boris"},pug:{title:"Pug",require:["markup","javascript"],optional:["coffeescript","ejs","handlebars","less","livescript","markdown","scss","stylus","twig"],owner:"Golmote"},puppet:{title:"Puppet",owner:"Golmote"},pure:{title:"Pure",optional:["c","cpp","fortran"],owner:"Golmote"},purebasic:{title:"PureBasic",require:"clike",alias:"pbfasm",owner:"HeX0R101"},purescript:{title:"PureScript",require:"haskell",alias:"purs",owner:"sriharshachilakapati"},python:{title:"Python",alias:"py",owner:"multipetros"},qsharp:{title:"Q#",require:"clike",alias:"qs",owner:"fedonman"},q:{title:"Q (kdb+ database)",owner:"Golmote"},qml:{title:"QML",require:"javascript",owner:"RunDevelopment"},qore:{title:"Qore",require:"clike",owner:"temnroegg"},r:{title:"R",owner:"Golmote"},racket:{title:"Racket",require:"scheme",alias:"rkt",owner:"RunDevelopment"},cshtml:{title:"Razor C#",alias:"razor",require:["markup","csharp"],optional:["css","css-extras","javascript","js-extras"],owner:"RunDevelopment"},jsx:{title:"React JSX",require:["markup","javascript"],optional:["jsdoc","js-extras","js-templates"],owner:"vkbansal"},tsx:{title:"React TSX",require:["jsx","typescript"]},reason:{title:"Reason",require:"clike",owner:"Golmote"},regex:{title:"Regex",owner:"RunDevelopment"},rego:{title:"Rego",owner:"JordanSh"},renpy:{title:"Ren'py",alias:"rpy",owner:"HyuchiaDiego"},rescript:{title:"ReScript",alias:"res",owner:"vmarcosp"},rest:{title:"reST (reStructuredText)",owner:"Golmote"},rip:{title:"Rip",owner:"ravinggenius"},roboconf:{title:"Roboconf",owner:"Golmote"},robotframework:{title:"Robot Framework",alias:"robot",owner:"RunDevelopment"},ruby:{title:"Ruby",require:"clike",alias:"rb",owner:"samflores"},rust:{title:"Rust",owner:"Golmote"},sas:{title:"SAS",optional:["groovy","lua","sql"],owner:"Golmote"},sass:{title:"Sass (Sass)",require:"css",optional:"css-extras",owner:"Golmote"},scss:{title:"Sass (SCSS)",require:"css",optional:"css-extras",owner:"MoOx"},scala:{title:"Scala",require:"java",owner:"jozic"},scheme:{title:"Scheme",owner:"bacchus123"},"shell-session":{title:"Shell session",require:"bash",alias:["sh-session","shellsession"],owner:"RunDevelopment"},smali:{title:"Smali",owner:"RunDevelopment"},smalltalk:{title:"Smalltalk",owner:"Golmote"},smarty:{title:"Smarty",require:"markup-templating",optional:"php",owner:"Golmote"},sml:{title:"SML",alias:"smlnj",aliasTitles:{smlnj:"SML/NJ"},owner:"RunDevelopment"},solidity:{title:"Solidity (Ethereum)",alias:"sol",require:"clike",owner:"glachaud"},"solution-file":{title:"Solution file",alias:"sln",owner:"RunDevelopment"},soy:{title:"Soy (Closure Template)",require:"markup-templating",owner:"Golmote"},sparql:{title:"SPARQL",require:"turtle",owner:"Triply-Dev",alias:"rq"},"splunk-spl":{title:"Splunk SPL",owner:"RunDevelopment"},sqf:{title:"SQF: Status Quo Function (Arma 3)",require:"clike",owner:"RunDevelopment"},sql:{title:"SQL",owner:"multipetros"},squirrel:{title:"Squirrel",require:"clike",owner:"RunDevelopment"},stan:{title:"Stan",owner:"RunDevelopment"},stata:{title:"Stata Ado",require:["mata","java","python"],owner:"RunDevelopment"},iecst:{title:"Structured Text (IEC 61131-3)",owner:"serhioromano"},stylus:{title:"Stylus",owner:"vkbansal"},supercollider:{title:"SuperCollider",alias:"sclang",owner:"RunDevelopment"},swift:{title:"Swift",owner:"chrischares"},systemd:{title:"Systemd configuration file",owner:"RunDevelopment"},"t4-templating":{title:"T4 templating",owner:"RunDevelopment"},"t4-cs":{title:"T4 Text Templates (C#)",require:["t4-templating","csharp"],alias:"t4",owner:"RunDevelopment"},"t4-vb":{title:"T4 Text Templates (VB)",require:["t4-templating","vbnet"],owner:"RunDevelopment"},tap:{title:"TAP",owner:"isaacs",require:"yaml"},tcl:{title:"Tcl",owner:"PeterChaplin"},tt2:{title:"Template Toolkit 2",require:["clike","markup-templating"],owner:"gflohr"},textile:{title:"Textile",require:"markup",optional:"css",owner:"Golmote"},toml:{title:"TOML",owner:"RunDevelopment"},tremor:{title:"Tremor",alias:["trickle","troy"],owner:"darach",aliasTitles:{trickle:"trickle",troy:"troy"}},turtle:{title:"Turtle",alias:"trig",aliasTitles:{trig:"TriG"},owner:"jakubklimek"},twig:{title:"Twig",require:"markup-templating",owner:"brandonkelly"},typescript:{title:"TypeScript",require:"javascript",optional:"js-templates",alias:"ts",owner:"vkbansal"},typoscript:{title:"TypoScript",alias:"tsconfig",aliasTitles:{tsconfig:"TSConfig"},owner:"dkern"},unrealscript:{title:"UnrealScript",alias:["uscript","uc"],owner:"RunDevelopment"},uorazor:{title:"UO Razor Script",owner:"jaseowns"},uri:{title:"URI",alias:"url",aliasTitles:{url:"URL"},owner:"RunDevelopment"},v:{title:"V",require:"clike",owner:"taggon"},vala:{title:"Vala",require:"clike",optional:"regex",owner:"TemplarVolk"},vbnet:{title:"VB.Net",require:"basic",owner:"Bigsby"},velocity:{title:"Velocity",require:"markup",owner:"Golmote"},verilog:{title:"Verilog",owner:"a-rey"},vhdl:{title:"VHDL",owner:"a-rey"},vim:{title:"vim",owner:"westonganger"},"visual-basic":{title:"Visual Basic",alias:["vb","vba"],aliasTitles:{vba:"VBA"},owner:"Golmote"},warpscript:{title:"WarpScript",owner:"RunDevelopment"},wasm:{title:"WebAssembly",owner:"Golmote"},"web-idl":{title:"Web IDL",alias:"webidl",owner:"RunDevelopment"},wgsl:{title:"WGSL",owner:"Dr4gonthree"},wiki:{title:"Wiki markup",require:"markup",owner:"Golmote"},wolfram:{title:"Wolfram language",alias:["mathematica","nb","wl"],aliasTitles:{mathematica:"Mathematica",nb:"Mathematica Notebook"},owner:"msollami"},wren:{title:"Wren",owner:"clsource"},xeora:{title:"Xeora",require:"markup",alias:"xeoracube",aliasTitles:{xeoracube:"XeoraCube"},owner:"freakmaxi"},"xml-doc":{title:"XML doc (.net)",require:"markup",modify:["csharp","fsharp","vbnet"],owner:"RunDevelopment"},xojo:{title:"Xojo (REALbasic)",owner:"Golmote"},xquery:{title:"XQuery",require:"markup",owner:"Golmote"},yaml:{title:"YAML",alias:"yml",owner:"hason"},yang:{title:"YANG",owner:"RunDevelopment"},zig:{title:"Zig",owner:"RunDevelopment"}},plugins:{meta:{path:"plugins/{id}/prism-{id}",link:"plugins/{id}/"},"line-highlight":{title:"Line Highlight",description:"Highlights specific lines and/or line ranges."},"line-numbers":{title:"Line Numbers",description:"Line number at the beginning of code lines.",owner:"kuba-kubula"},"show-invisibles":{title:"Show Invisibles",description:"Show hidden characters such as tabs and line breaks.",optional:["autolinker","data-uri-highlight"]},autolinker:{title:"Autolinker",description:"Converts URLs and emails in code to clickable links. Parses Markdown links in comments."},wpd:{title:"WebPlatform Docs",description:'Makes tokens link to WebPlatform.org documentation. The links open in a new tab.'},"custom-class":{title:"Custom Class",description:"This plugin allows you to prefix Prism's default classes (.comment can become .namespace--comment) or replace them with your defined ones (like .editor__comment). You can even add new classes.",owner:"dvkndn",noCSS:!0},"file-highlight":{title:"File Highlight",description:"Fetch external files and highlight them with Prism. Used on the Prism website itself.",noCSS:!0},"show-language":{title:"Show Language",description:"Display the highlighted language in code blocks (inline code does not show the label).",owner:"nauzilus",noCSS:!0,require:"toolbar"},"jsonp-highlight":{title:"JSONP Highlight",description:"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).",noCSS:!0,owner:"nauzilus"},"highlight-keywords":{title:"Highlight Keywords",description:"Adds special CSS classes for each keyword for fine-grained highlighting.",owner:"vkbansal",noCSS:!0},"remove-initial-line-feed":{title:"Remove initial line feed",description:"Removes the initial line feed in code blocks.",owner:"Golmote",noCSS:!0},"inline-color":{title:"Inline color",description:"Adds a small inline preview for colors in style sheets.",require:"css-extras",owner:"RunDevelopment"},previewers:{title:"Previewers",description:"Previewers for angles, colors, gradients, easing and time.",require:"css-extras",owner:"Golmote"},autoloader:{title:"Autoloader",description:"Automatically loads the needed languages to highlight the code blocks.",owner:"Golmote",noCSS:!0},"keep-markup":{title:"Keep Markup",description:"Prevents custom markup from being dropped out during highlighting.",owner:"Golmote",optional:"normalize-whitespace",noCSS:!0},"command-line":{title:"Command Line",description:"Display a command line with a prompt and, optionally, the output/response from the commands.",owner:"chriswells0"},"unescaped-markup":{title:"Unescaped Markup",description:"Write markup without having to escape anything."},"normalize-whitespace":{title:"Normalize Whitespace",description:"Supports multiple operations to normalize whitespace in code blocks.",owner:"zeitgeist87",optional:"unescaped-markup",noCSS:!0},"data-uri-highlight":{title:"Data-URI Highlight",description:"Highlights data-URI contents.",owner:"Golmote",noCSS:!0},toolbar:{title:"Toolbar",description:"Attach a toolbar for plugins to easily register buttons on the top of a code block.",owner:"mAAdhaTTah"},"copy-to-clipboard":{title:"Copy to Clipboard Button",description:"Add a button that copies the code block to the clipboard when clicked.",owner:"mAAdhaTTah",require:"toolbar",noCSS:!0},"download-button":{title:"Download Button",description:"A button in the toolbar of a code block adding a convenient way to download a code file.",owner:"Golmote",require:"toolbar",noCSS:!0},"match-braces":{title:"Match braces",description:"Highlights matching braces.",owner:"RunDevelopment"},"diff-highlight":{title:"Diff Highlight",description:"Highlights the code inside diff blocks.",owner:"RunDevelopment",require:"diff"},"filter-highlight-all":{title:"Filter highlightAll",description:"Filters the elements the highlightAll and highlightAllUnder methods actually highlight.",owner:"RunDevelopment",noCSS:!0},treeview:{title:"Treeview",description:"A language with special styles to highlight file system tree structures.",owner:"Golmote"}}})},2885:(e,t,n)=>{const r=n(9901),a=n(9642),o=new Set;function i(e){void 0===e?e=Object.keys(r.languages).filter((e=>"meta"!=e)):Array.isArray(e)||(e=[e]);const t=[...o,...Object.keys(Prism.languages)];a(r,e,t).load((e=>{if(!(e in r.languages))return void(i.silent||console.warn("Language does not exist: "+e));const t="./prism-"+e;delete n.c[n(6500).resolve(t)],delete Prism.languages[e],n(6500)(t),o.add(e)}))}i.silent=!1,e.exports=i},6854:()=>{!function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,a,o){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(a,(function(e){if("function"==typeof o&&!o(e))return e;for(var a,s=i.length;-1!==n.code.indexOf(a=t(r,s));)++s;return i[s]=e,a})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var a=0,o=Object.keys(n.tokenStack);!function i(s){for(var l=0;l=o.length);l++){var c=s[l];if("string"==typeof c||c.content&&"string"==typeof c.content){var u=o[a],d=n.tokenStack[u],p="string"==typeof c?c:c.content,f=t(r,u),m=p.indexOf(f);if(m>-1){++a;var h=p.substring(0,m),g=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=p.substring(m+f.length),y=[];h&&y.push.apply(y,i([h])),y.push(g),b&&y.push.apply(y,i([b])),"string"==typeof c?s.splice.apply(s,[l,1].concat(y)):c.content=y}}else c.content&&i(c.content)}return s}(n.tokens)}}}})}(Prism)},6726:(e,t,n)=>{var r={"./":2885};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=6726},6500:(e,t,n)=>{var r={"./":2885};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=6500},9642:e=>{"use strict";var t=function(){var e=function(){};function t(e,t){Array.isArray(e)?e.forEach(t):null!=e&&t(e,0)}function n(e){for(var t={},n=0,r=e.length;n "));var s={},l=e[r];if(l){function c(t){if(!(t in e))throw new Error(r+" depends on an unknown component "+t);if(!(t in s))for(var i in a(t,o),s[t]=!0,n[t])s[i]=!0}t(l.require,c),t(l.optional,c),t(l.modify,c)}n[r]=s,o.pop()}}return function(e){var t=n[e];return t||(a(e,r),t=n[e]),t}}function a(e){for(var t in e)return!0;return!1}return function(o,i,s){var l=function(e){var t={};for(var n in e){var r=e[n];for(var a in r)if("meta"!=a){var o=r[a];t[a]="string"==typeof o?{title:o}:o}}return t}(o),c=function(e){var n;return function(r){if(r in e)return r;if(!n)for(var a in n={},e){var o=e[a];t(o&&o.alias,(function(t){if(t in n)throw new Error(t+" cannot be alias for both "+a+" and "+n[t]);if(t in e)throw new Error(t+" cannot be alias of "+a+" because it is a component.");n[t]=a}))}return n[r]||r}}(l);i=i.map(c),s=(s||[]).map(c);var u=n(i),d=n(s);i.forEach((function e(n){var r=l[n];t(r&&r.require,(function(t){t in d||(u[t]=!0,e(t))}))}));for(var p,f=r(l),m=u;a(m);){for(var h in p={},m){var g=l[h];t(g&&g.modify,(function(e){e in d&&(p[e]=!0)}))}for(var b in d)if(!(b in u))for(var y in f(b))if(y in u){p[b]=!0;break}for(var v in m=p)u[v]=!0}var w={getIds:function(){var e=[];return w.load((function(t){e.push(t)})),e},load:function(t,n){return function(t,n,r,a){var o=a?a.series:void 0,i=a?a.parallel:e,s={},l={};function c(e){if(e in s)return s[e];l[e]=!0;var a,u=[];for(var d in t(e))d in n&&u.push(d);if(0===u.length)a=r(e);else{var p=i(u.map((function(e){var t=c(e);return delete l[e],t})));o?a=o(p,(function(){return r(e)})):r(e)}return s[e]=a}for(var u in n)c(u);var d=[];for(var p in l)d.push(s[p]);return i(d)}(f,u,t,n)}};return w}}();e.exports=t},2703:(e,t,n)=>{"use strict";var r=n(414);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,o,i){if(i!==r){var s=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name="Invariant Violation",s}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:a};return n.PropTypes=n,n}},5697:(e,t,n)=>{e.exports=n(2703)()},414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},4448:(e,t,n)=>{"use strict";var r=n(7294),a=n(3840);function o(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n